netdiag-app/tools/pruefe-geraeteaktionen.mjs
Eduard Wisch 7d79358c02 Geraete-Aktionen nach Geraetetyp sortieren statt sie zu verstecken
"SNMP-Switch" stand an jeder IP-Kamera und erzeugte dort zuverlaessig eine
Messung "nicht messbar" im Kundenprotokoll - eine Zeile, die niemandem hilft
und den Abnahmebeleg verwaessert.

Bewusst KEIN hartes Filtern: Device.deviceType ist freier Text aus zwei
unabhaengigen Quellen (Kotlin guessDeviceType, TS typeFromMdns) und wird aus
MAC-Hersteller, mDNS-Diensten und offenen Ports geraten. Ein managed Switch,
der als "Linux-Geraet" durchgeht, verloere beim Filtern ausgerechnet SNMP -
schlimmer als die ueberfluessige Zeile, die wir loswerden wollen. Unpassende
Werkzeuge stehen deshalb nachrangig (kleiner, blasser, mit Titel-Hinweis)
hinter den passenden, statt zu verschwinden. Leerer oder unbekannter Typ:
alles gleichrangig, nie weniger.

Die SNMP-Liste ist absichtlich grosszuegig (Switch, Router, Gateway, NAS,
Drucker, Server, USV, Accesspoint, Firewall) - Drucker sind in der Praxis die
haeufigste SNMP-Quelle ueberhaupt.

tools/pruefe-geraeteaktionen.mjs rechnet 13 Faelle nach und prueft dabei zwei
Zusicherungen: die erwartete Einsortierung UND dass kein Werkzeug verschwindet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-16 23:14:06 +02:00

46 lines
2.4 KiB
JavaScript

/**
* Prueft die Zuordnung Geraetetyp -> Werkzeuge.
*
* Anlass: "SNMP-Switch" stand an jeder IP-Kamera und erzeugte dort eine
* Messung "nicht messbar" im Kundenprotokoll. Wichtiger als das Wegsortieren
* ist aber, dass NICHTS verschwindet: deviceType ist geraten.
*
* Start: node tools/pruefe-geraeteaktionen.mjs
*/
const { passtZuGeraet, teileNachGeraetetyp } =
await import('../src/lib/tools/geraeteaktionen.ts');
const WERKZEUGE = [{ id: 'ping' }, { id: 'portscan' }, { id: 'snmp' }];
const faelle = [
{ typ: 'Kamera', snmpVorn: false, name: 'IP-Kamera -> SNMP nachrangig' },
{ typ: 'IP-Kamera', snmpVorn: false, name: 'Schreibweise mit Praefix' },
{ typ: 'Switch', snmpVorn: true, name: 'Switch -> SNMP vorn' },
{ typ: 'SNMP-Switch', snmpVorn: true, name: 'Teilstring trifft' },
{ typ: 'Drucker', snmpVorn: true, name: 'Drucker koennen SNMP (Toner/Zaehler)' },
{ typ: 'NAS', snmpVorn: true, name: 'NAS -> SNMP vorn' },
{ typ: 'Router', snmpVorn: true, name: 'Router -> SNMP vorn' },
{ typ: 'Windows-PC', snmpVorn: false, name: 'PC -> SNMP nachrangig' },
{ typ: 'Wallbox', snmpVorn: false, name: 'Wallbox spricht Modbus, nicht SNMP' },
{ typ: 'IoT/SPS', snmpVorn: false, name: 'SPS spricht Modbus, nicht SNMP' },
{ typ: '', snmpVorn: true, name: 'LEER -> alles gleichrangig (nie weniger)' },
{ typ: undefined, snmpVorn: true, name: 'UNBEKANNT -> alles gleichrangig' },
{ typ: 'Linux-Gerät', snmpVorn: false, name: 'Linux-Geraet -> nachrangig, aber erreichbar' },
];
let fehler = 0;
for (const f of faelle) {
const { passend, nachrangig } = teileNachGeraetetyp(WERKZEUGE, f.typ);
const snmpVorn = passend.some((t) => t.id === 'snmp');
// Zwei harte Zusicherungen: die erwartete Einsortierung UND dass kein
// Werkzeug verschwindet.
const vollzaehlig = passend.length + nachrangig.length === WERKZEUGE.length;
const pingVorn = passend.some((t) => t.id === 'ping');
const portVorn = passend.some((t) => t.id === 'portscan');
const ok = snmpVorn === f.snmpVorn && vollzaehlig && pingVorn && portVorn;
if (!ok) fehler++;
console.log(`${ok ? 'OK ' : 'FEHL'} ${f.name}`);
console.log(` typ="${f.typ}" vorn=[${passend.map((t) => t.id)}] nachrangig=[${nachrangig.map((t) => t.id)}]`);
}
console.log(fehler === 0 ? 'ALLE FAELLE KORREKT' : `${fehler} FEHLER`);
process.exit(fehler === 0 ? 0 : 1);