/** * Tool: Durchsatz-Test — misst die Bandbreite gegen eine Gegenstelle. * * ACHTUNG: Der Test spricht **kein** iperf3-Protokoll. Nativ wird schlicht auf * einen TCP-Socket geschrieben bzw. von ihm gelesen — ohne Cookie, ohne * Parameterblock, ohne Zustandsautomat. Gegen einen echten iperf3-Server bricht * die Verbindung deshalb ab; er braucht eine einfache TCP-Sink/Source-Gegenstelle. * Umbau (eigenes Protokoll oder mitgeliefertes iperf3-Binary) steht in * ROADMAP_UMSETZUNG.md Phase 1. */ import { scanner } from '../../scanner'; import type { MeasureStatus, Tool } from '../types'; export const iperfTool: Tool = { id: 'iperf', category: 'internet', name: 'Durchsatz-Test', icon: 'gauge-circle', description: 'Misst Down-/Upload-Bandbreite gegen eine Gegenstelle.', scope: 'protocol', params: [ { key: 'host', label: 'Gegenstelle (IP)', type: 'text', placeholder: '192.168.1.20' }, { key: 'port', label: 'Port', type: 'number', default: 5201 }, { key: 'duration', label: 'Dauer (Sek.)', type: 'select', default: '10', options: [ { value: '5', label: '5 Sekunden' }, { value: '10', label: '10 Sekunden' }, { value: '30', label: '30 Sekunden' }, ], }, ], async run(ctx) { const host = String(ctx.params.host ?? ''); if (!host) throw new Error('Keine Gegenstelle angegeben'); const port = Number(ctx.params.port || 5201); const durationSec = Number(ctx.params.duration || 10); const res = await scanner.throughput({ host, port, durationSec }); // Kein einziges Byte übertragen = es gab keine Messung. Daraus „0 Mbit/s" // in Rot zu machen wäre eine Aussage über das Kundennetz, die die Messung // gar nicht hergibt — meist fehlt schlicht die Gegenstelle. if (res.measured === false) { return { label: `${host}:${port} — keine Gegenstelle`, result: { gegenstelle: `${host}:${port}`, hinweis: 'Es wurden keine Daten übertragen. Der Test braucht eine Gegenstelle, ' + 'die auf diesem Port Daten annimmt und sendet. Ein echter iperf3-Server ' + 'funktioniert hier NICHT (siehe Modul-Doku).', }, measureStatus: 3, // nicht messbar }; } let status: MeasureStatus = 0; if (res.downMbps < 100) status = 1; if (res.downMbps < 10) status = 2; return { label: `↓ ${res.downMbps} Mbit/s · ↑ ${res.upMbps} Mbit/s`, result: { gegenstelle: `${host}:${port}`, downloadMbps: res.downMbps, uploadMbps: res.upMbps, dauerSekunden: durationSec, }, measureStatus: status, }; }, };