generated from Dicken/dickendock
round16: Geraete-Erkennung per ID statt IP fixen, Schwelle konfigurierbar, Icons auf Font Awesome umgestellt
This commit is contained in:
@@ -3,6 +3,7 @@ import * as deviceRepo from "../db/repositories/devices.js";
|
||||
import * as serviceRepo from "../db/repositories/services.js";
|
||||
import * as categoryRepo from "../db/repositories/categories.js";
|
||||
import * as logRepo from "../db/repositories/logs.js";
|
||||
import * as settingsRepo from "../db/repositories/settings.js";
|
||||
import { scanDeviceServices } from "../scanner/networkScanner.js";
|
||||
import { fetchFritzBoxHosts, type FritzBoxHost } from "../scanner/fritzbox.js";
|
||||
|
||||
@@ -208,20 +209,29 @@ export async function scanRoutes(app: FastifyInstance): Promise<void> {
|
||||
);
|
||||
|
||||
// Geräte, die die FritzBox früher gemeldet hatte, diesmal aber nicht
|
||||
// mehr in der Liste sind – werden erst nach mindestens 7 Tagen
|
||||
// Abwesenheit zur Durchsicht vorgeschlagen (nicht schon beim ersten
|
||||
// verpassten Scan), damit ein kurzzeitig offline/im Standby befindliches
|
||||
// Gerät (Reboot, WLAN-Aussetzer, Nacht-Standby) nicht sofort zum
|
||||
// Löschen vorgeschlagen wird. lastScan wird bei jedem Fund aktualisiert
|
||||
// (siehe upsertDeviceFromScan) - bleibt es stehen, war das Gerät seither
|
||||
// nicht mehr da.
|
||||
const SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;
|
||||
// mehr in der Liste sind – werden erst nach mindestens
|
||||
// staleDeviceThresholdDays Tagen Abwesenheit zur Durchsicht
|
||||
// vorgeschlagen (nicht schon beim ersten verpassten Scan), damit ein
|
||||
// kurzzeitig offline/im Standby befindliches Gerät (Reboot,
|
||||
// WLAN-Aussetzer, Nacht-Standby) nicht sofort zum Löschen
|
||||
// vorgeschlagen wird. lastScan wird bei jedem Fund aktualisiert (siehe
|
||||
// upsertDeviceFromScan) - bleibt es stehen, war das Gerät seither nicht
|
||||
// mehr da.
|
||||
//
|
||||
// "Gefunden" wird über die ID der in DIESEM Scan tatsächlich
|
||||
// upgeserteten Geräte geprüft (nicht über einen IP-Abgleich!): ändert
|
||||
// sich die IP eines Geräts (z. B. DHCP-Neuvergabe), wird es trotzdem
|
||||
// korrekt über seine MAC wiedererkannt und upgeserted - ein reiner
|
||||
// IP-Vergleich hätte es fälschlich als "nicht mehr gefunden" gemeldet,
|
||||
// obwohl es im selben Scan noch da war, nur unter neuer IP.
|
||||
const foundDeviceIds = new Set(devices.map((d) => d.id));
|
||||
const staleDeviceThresholdDays = Number(settingsRepo.listSettings().staleDeviceThresholdDays ?? 7);
|
||||
const staleThresholdMs = staleDeviceThresholdDays * 24 * 60 * 60 * 1000;
|
||||
const now = Date.now();
|
||||
const foundIps = new Set(hosts.map((h) => h.ip));
|
||||
const staleDevices = devicesBeforeScan.filter((d) => {
|
||||
if (foundIps.has(d.ip)) return false;
|
||||
if (foundDeviceIds.has(d.id)) return false;
|
||||
const lastSeen = d.lastScan ? new Date(d.lastScan).getTime() : 0;
|
||||
return now - lastSeen >= SEVEN_DAYS_MS;
|
||||
return now - lastSeen >= staleThresholdMs;
|
||||
});
|
||||
|
||||
logRepo.logScan({
|
||||
|
||||
Reference in New Issue
Block a user