round52: Fehler im Sammel-Scan werden jetzt in der UI angezeigt und persistent geloggt statt verschluckt

This commit is contained in:
2026-07-26 11:29:21 +02:00
parent 8dd3115353
commit 2bc5d9550c
2 changed files with 42 additions and 3 deletions

View File

@@ -370,8 +370,20 @@ export async function scanRoutes(app: FastifyInstance): Promise<void> {
allStale.push(...result.staleServices);
allNameChanges.push(...result.nameChanges);
allNew.push(...result.newServices);
} catch {
// einzelnes fehlgeschlagenes Gerät soll den Rest nicht abbrechen
} catch (err) {
// Einzelnes fehlgeschlagenes Gerät soll den Rest nicht
// abbrechen - ABER trotzdem persistent loggen, statt
// stillschweigend zu überspringen. Vorher war das ein
// stummer catch-Block: scheiterte ausgerechnet immer
// dasselbe Gerät (z. B. wegen eines kaputten Hostnamens),
// gab es dafür nie einen sichtbaren Hinweis.
const detail = err instanceof Error ? err.message : String(err);
logRepo.logScan({
type: "device",
targetId: device.id,
level: "error",
message: `${device.hostname} (${device.ip}): Scan im Sammel-Lauf fehlgeschlagen ${detail}`,
});
} finally {
unlockDevice(device.id);
}
@@ -392,7 +404,20 @@ export async function scanRoutes(app: FastifyInstance): Promise<void> {
newServices: allNew,
});
} catch (err) {
failJob("devices", err instanceof Error ? err.message : "Unbekannter Fehler");
// WICHTIG: Vorher wurde ein Abbruch des GESAMTEN Sammel-Scans nur im
// In-Memory-Jobstatus (lastError) vermerkt, nie in der persistenten
// scan_logs-Tabelle - Admin -> Logs blieb dadurch leer, obwohl der
// Scan sichtbar fehlgeschlagen war (Badge in der Seitenleiste
// verschwindet, weil running=false wird, aber ohne jede Erklärung
// warum). Jetzt zusätzlich persistent geloggt.
const detail = err instanceof Error ? err.message : String(err);
logRepo.logScan({
type: "device",
targetId: null,
level: "error",
message: `Sammel-Scan abgebrochen ${detail}`,
});
failJob("devices", detail);
}
})();

View File

@@ -632,6 +632,20 @@ export function ScannerPage() {
queryClient.invalidateQueries({ queryKey: ["devices"] });
queryClient.invalidateQueries({ queryKey: ["services"] });
queryClient.invalidateQueries({ queryKey: ["logs"] });
} else if (
status.lastError &&
status.startedAt !== getHandledResultId("scanner:bulkLastHandledAt")
) {
// WICHTIG: Bisher wurde status.lastError hier NIE geprüft - schlug
// der Sammel-Scan fehl (z. B. eine Ausnahme im Hintergrund-Job),
// blieb der zuletzt gesetzte Text ("Scan gestartet…"/"Scanne
// masscan läuft…") einfach stehen, obwohl der Scan längst beendet
// war (running wird false, das Badge in der Seitenleiste
// verschwindet) - der Fehler selbst blieb dabei komplett
// unsichtbar. Analog zum API- und FritzBox-Scanner jetzt auch hier
// angezeigt.
setHandledResultId("scanner:bulkLastHandledAt", status.startedAt);
setBulkStatus(`Fehlgeschlagen: ${status.lastError}`);
}
} catch {
// Netzwerk-Hänger beim Poll soll nicht die Seite stören - nächster