/** * Gemeinsame Typen der NetDiag-App. */ /** Angemeldeter Benutzer (aus Dolibarr) */ export interface NetUser { id: number; login: string; name: string; email: string; canWrite: boolean; } /** Kunde (Dolibarr thirdparty) */ export interface Customer { id: number; name: string; code?: string; address?: string; zip?: string; town?: string; phone?: string; email?: string; protocolCount?: number; } /** Auftrag (Dolibarr commande) */ export interface Order { id: number; ref: string; refClient?: string; date?: number; /** Unix-Zeit der letzten Änderung (Dolibarr commande.tms) — Sortierschlüssel der Liste */ tms?: number; /** Dolibarr-Status: -1 storniert, 0 Entwurf, 1 validiert, 2 in Bearbeitung, 3 abgeschlossen */ status: number; /** true wenn Status 0/1/2 (aktiver Auftrag) */ open: boolean; /** Öffentliche Auftragsnotiz — oft die eigentliche Beschreibung */ note?: string; protocolCount?: number; customer?: Partial; } /** Ein im Netzwerk gefundenes Gerät */ export interface Device { /** lokale ID innerhalb des Protokolls (für Offline-Verknüpfung) */ clientId: string; /** Server-Rowid nach Sync, sonst null */ serverId?: number | null; ip: string; mac?: string; hostname?: string; vendor?: string; deviceType?: string; note?: string; /** vom Benutzer als Favorit markiert (bleibt auch ohne gespeicherten Scan erhalten) */ isFavorite?: boolean; /** benutzervergebener Name, überschreibt hostname in der Anzeige */ customName?: string; /** Unix-Zeit der letzten Sichtung im Netz */ lastSeen?: number; /** zuletzt beim Port-Scan gefundene offene Ports */ openPorts?: number[]; /** NetBIOS-Name (UDP-137-Abfrage) */ netbiosName?: string; /** mDNS/Bonjour-Name */ mdnsName?: string; /** angebotene mDNS-Dienste, z.B. ['_printer._tcp', '_googlecast._tcp'] */ mdnsServices?: string[]; } /** Eingefrorener Snapshot eines IP-Scans (wieder aufrufbar) */ export interface SavedScan { id: string; name: string; /** Unix-Zeit der Speicherung */ createdAt: number; subnet: string; devices: Device[]; } /** Ein Ereignis der Geräte-Überwachung */ export interface MonitorEvent { /** Unix-Zeit des Ereignisses */ ts: number; ip: string; type: 'down' | 'up'; /** Dauer des vorangegangenen Ausfalls in Sekunden (nur bei 'up') */ durationSec?: number; } /** Überwachungs-Sitzung des Geräte-Monitors (Kamera-Problem) */ export interface DeviceMonitorSession { id: string; name: string; startedAt: number; endedAt?: number; /** Prüfintervall in Sekunden */ intervalSec: number; /** überwachte Geräte */ targets: { ip: string; label: string }[]; events: MonitorEvent[]; status: 'running' | 'stopped'; /** laufende Plugin-Lauf-ID (für Wiederaufnahme nach Seitenwechsel) */ runId?: string; } /** Aktives Netzwerk-Interface des Geräts (WLAN/Ethernet/Mobilfunk) */ export interface LinkInfo { /** Name des Interfaces, z.B. "wlan0", "eth0", "rndis0" */ iface: string; type: 'wifi' | 'ethernet' | 'cellular' | 'other'; /** USB-RJ45-Adapter erkannt (heuristisch über iface-Name) */ isUsbEthernet?: boolean; /** ist dies das primäre Interface (Standardroute)? */ isDefault?: boolean; ipv4?: string; prefixLength?: number; gateway?: string; dns?: string[]; /** DHCP-Server (nur für WLAN ermittelbar) */ dhcpServer?: string; leaseSec?: number; /** Verbindungsgeschwindigkeit in Mbit/s — WLAN: linkSpeed; Ethernet: /sys/class/net//speed */ linkSpeedMbps?: number; /** Empfangs-Linkspeed (nur WLAN, API 29+) */ rxLinkSpeedMbps?: number; /** WLAN-SSID (nur wenn type='wifi') */ ssid?: string; /** WLAN-BSSID (nur wenn type='wifi') */ bssid?: string; /** Empfangsstärke in dBm (nur wenn type='wifi') */ rssi?: number; } /** Einzelne RSSI-Probe des WLAN-Empfangstrackers */ export interface WifiSignalSample { ts: number; rssi: number; /** woher der Wert kam: 'connected' = Live-RSSI vom verbundenen AP, 'scan' = aus Scan-Ergebnis */ source: 'connected' | 'scan'; } /** Tracker-Session für die WLAN-Empfangsprüfung beim Durchlaufen */ export interface WifiTrackSession { id: string; name: string; startedAt: number; endedAt?: number; bssid: string; ssid: string; band: string; channel: number; samples: WifiSignalSample[]; min?: number; max?: number; avg?: number; status: 'running' | 'stopped'; runId?: string; /** Mess-Modus: live (verbundenes Netz) oder periodischer Scan */ mode?: 'connected' | 'scan'; } /** Ampel-Bewertung einer Messung */ export type MeasureStatus = 0 | 1 | 2; // 0=ok, 1=warn, 2=fail /** Ergebnis eines Tool-Laufs */ export interface Measurement { clientId: string; /** lokale ID des zugehörigen Geräts, falls geräte-bezogen */ deviceClientId?: string | null; tool: string; category: string; label: string; params: Record; result: Record; measureStatus: MeasureStatus; dateMeasure: number; } /** Diagnose-Protokoll (Offline-Datensatz der App) */ export interface Protocol { clientUuid: string; /** Server-Rowid nach Sync */ serverId?: number | null; ref?: string; label: string; socId?: number | null; socName?: string; orderId?: number | null; orderRef?: string; dateDiag: number; location: string; subnet: string; /** 0 = Entwurf, 1 = abgeschlossen */ status: number; note: string; devices: Device[]; measurements: Measurement[]; /** gespeicherte IP-Scan-Snapshots (nur lokal, wird nicht synchronisiert) */ savedScans?: SavedScan[]; /** Geräte-Überwachungs-Sitzungen (nur lokal, wird nicht synchronisiert) */ monitorSessions?: DeviceMonitorSession[]; /** WLAN-Empfangstracker-Sessions (nur lokal, wird nicht synchronisiert) */ wifiTrackSessions?: WifiTrackSession[]; /** true solange noch nicht zum Server synchronisiert */ dirty: boolean; updatedAt: number; }