round28: Portscan-Retry fuer bekannte Dienste (Echo/Samsung-Falschmeldungen behoben), 7-Tage-Schwelle jetzt auch fuer einzelne Dienste, geraeteuebergreifender Scan-Status in der Navigation

This commit is contained in:
2026-07-24 12:49:26 +02:00
parent 430b79763c
commit f5845ec762
7 changed files with 116 additions and 8 deletions

View File

@@ -78,7 +78,8 @@ export interface DeviceScanResult {
*/
export async function scanDeviceServices(
device: ScanTarget,
extraPorts: number[] = TYPICAL_PORTS
extraPorts: number[] = TYPICAL_PORTS,
priorityPorts: number[] = []
): Promise<DeviceScanResult> {
const dnsResult = await resolveHostname(device.hostname);
// Fällt auf die IP zurück, falls keine DNS-Variante auflösbar ist.
@@ -90,7 +91,7 @@ export async function scanDeviceServices(
// gemeldeten Namen ein.
const suggestedHostname = dnsResult ? null : await reverseLookup(device.ip);
const candidatePorts = Array.from(new Set([80, 443, ...extraPorts]));
const candidatePorts = Array.from(new Set([80, 443, ...extraPorts, ...priorityPorts]));
// Die offenen Ports werden PARALLEL geprüft, nicht nacheinander - bei
// einem nicht erreichbaren/gefilterten Gerät (z. B. ein schlafender
@@ -102,7 +103,21 @@ export async function scanDeviceServices(
const openChecks = await Promise.all(
candidatePorts.map(async (port) => ({ port, open: await isPortOpen(device.ip, port) }))
);
const openPorts = openChecks.filter((c) => c.open).map((c) => c.port);
let openPorts = openChecks.filter((c) => c.open).map((c) => c.port);
// Bereits bekannte Dienst-Ports (priorityPorts, vom Aufrufer übergeben -
// siehe scan.ts), die im ersten, stark parallelen Durchlauf NICHT als
// offen erkannt wurden, bekommen einen zweiten, einzelnen Versuch mit
// etwas mehr Zeit. Grund: ~20 gleichzeitige Verbindungsversuche können
// schwächere Geräte (z. B. Echo-Lautsprecher, Smart-TVs) kurzzeitig
// überfordern und dabei ausgerechnet den einen tatsächlich offenen Port
// verpassen - das führte zu falschen "nicht mehr gefunden"-Meldungen,
// obwohl sich am Gerät nichts geändert hatte.
const missedPriorityPorts = priorityPorts.filter((p) => !openPorts.includes(p));
for (const port of missedPriorityPorts) {
const open = await isPortOpen(device.ip, port, 1500);
if (open) openPorts.push(port);
}
const found: DiscoveredService[] = [];