All checks were successful
Build APK / build-apk (push) Successful in 1m49s
IP-Test: USB-RJ45-Adapter in Netzwerkdose stecken und sofort IP-Adresse, DHCP-Server, Gateway und Link-Geschwindigkeit (10/100/1000 Mbit) ablesen. Auto-Refresh alle 2 s, Speichern mit optionalem Raum/Dose-Name ins Protokoll. WLAN-Empfangstracker: Netz auswählen und beim Durchgehen live RSSI verfolgen. Hybrid-Modus: 500 ms Polling bei verbundenem Netz (kein Scan-Throttling), ~30 s Scan-Sweep bei Fremd-BSSID. Sessions mit Samples, Min/Max/Avg und Sparkline-Verlauf werden im Protokoll gespeichert. Ersetzt DHCP-Info-Tool und WLAN-Scan-Tool (eigene Routen /iptest/ + /wifi/). Kotlin-Plugin: linkInfo(), startWifiScan(), startWifiTrack/stop/status(). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
210 lines
5.8 KiB
TypeScript
210 lines
5.8 KiB
TypeScript
/**
|
|
* 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<Customer>;
|
|
}
|
|
|
|
/** 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/<iface>/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<string, unknown>;
|
|
result: Record<string, unknown>;
|
|
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;
|
|
}
|