M20: LAN-Scanner umbenannt + Netzwerk-Tools (Ping/Traceroute/DNS/Port-Scan)

Tab "Geräte" -> "LAN-Scanner", Refresh-Button "Neu scannen" + prominenter
Stil. Neues Netzwerk-Tools-Menü: Ping/Traceroute/DNS-Auflösung über
NetworkToolsService (eigene SSH-Verbindung, wie Backup/InterfaceTraffic-
Monitor), mit Zeichen-Validierung gegen Command-Injection ueber einen
boeswilligen DHCP-Hostnamen. Port-Scan laeuft direkt von diesem Mac ueber
Network.framework (RouterOS hat kein eingebautes Portscan-Tool) - dabei
einen echten NWConnection-Bug gefunden (verweigerte Verbindung meldet sich
ueber .waiting, nicht .failed) und per Unit-Test gegen einen Loopback-Port
aufgedeckt und gefixt.

Zusaetzlich: Warnhinweis bei "Feste IP zuweisen" erklaert jetzt den
Rueckweg. DE/EN-Umschalter zeigt Landesflaggen statt Text.

92 Tests gruen. HANDOFF.md/README.md (inkl. Mermaid-Diagramm)/Manual.md/
CHATLOG.md aktualisiert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YDmUd93KxsYGr2kLTotWnG
This commit is contained in:
Kay
2026-09-15 22:41:23 +02:00
co-authored by Claude Sonnet 5
parent b5933fa44b
commit 04325e3bbd
15 changed files with 801 additions and 64 deletions
+65
View File
@@ -1204,6 +1204,71 @@ grün, wartet auf Test durch den Nutzer in Xcode):
("das vierschieben funktioniert super, die Linien folgen auch" /
"ok, der button ist da und funktioniert" / "funktioniert").
- ✅ M20: LAN-Scanner-Umbau — Umbenennung, Netzwerk-Tools, mehrere kleine
UX-Nachbesserungen.
- **Tab umbenannt**: "Geräte" → "LAN-Scanner" (Nutzerwunsch, "oder
ähnliches"), Toolbar-Button "Aktualisieren" → "Neu scannen"
(macht exakt dasselbe — DHCP-Leases/ARP/Bridge-Host neu abfragen —,
Umbenennung passt nur besser zum "Scanner"-Namen).
- **Netzwerk-Tools-Untermenü** beim Rechtsklick auf ein Gerät:
Ping/Traceroute/DNS-Auflösung (nslookup) — alle drei vom Router aus
über eine neue dedizierte SSH-Verbindung (`NetworkToolsService`,
gleiches Muster wie `BackupService`/`InterfaceTrafficMonitor`, da
`/ping`/`/tool traceroute`/`/resolve` reine CLI-Befehle ohne REST-
Äquivalent sind). Ergebnis als Rohtext im Sheet gezeigt statt
geparst — das genaue Ausgabeformat dieser Tools ist nicht gegen
echte Hardware verifiziert, nach den Parser-Überraschungen bei M18
bewusst vorsichtig. Sicherheitsmaßnahme: IP/Hostname eines Geräts
stammen letztlich aus dessen eigener (potenziell manipulierbarer)
DHCP-Anfrage — vor dem Einsetzen in den RouterOS-Befehlsstring auf
ein sicheres Zeichen-Set geprüft (`NetworkToolsService.sanitized`),
da RouterOS' Konsole ";" als Befehlstrenner behandelt und ein
böswillig gesetzter Hostname sonst einen zweiten Befehl einschleusen
könnte.
- **Port-Scan** (Nutzerwunsch: "Offene Ports rot, geschlossene grün,
nicht erreichbare grau") — läuft bewusst NICHT über den Router
(RouterOS hat kein eingebautes Portscan-Tool), sondern direkt von
diesem Mac per `Network.framework`/`NWConnection` gegen ~19 gängige
TCP-Ports parallel. **Live-Bug gefunden und gefixt**: eine
verweigerte Verbindung (Port zu, TCP RST) meldet sich bei
`NWConnection` über den `.waiting`-Zustand, nicht über `.failed` —
der ursprüngliche Code prüfte nur `.failed`, wartete bei einer
Ablehnung also den vollen Timeout aus und meldete fälschlich
"nicht erreichbar" statt "geschlossen". Test hat das direkt gegen
einen echten (aber garantiert nicht belegten) Loopback-Port
aufgedeckt, kein Rätselraten nötig.
- **Warnhinweis "Feste IP-Adresse zuweisen?" erweitert** (Nutzerwunsch:
"der Hinweis, wie die Adresse wieder in dynamisch gemacht werden
kann") — nennt jetzt explizit den Rückweg (Rechtsklick → "Feste
Zuweisung entfernen" im selben Tab) und dass das Gerät danach die
Verbindung kurz trennen/neu aufbauen muss.
- **"Neu scannen"-Button prominenter gemacht** (Nutzerwunsch: "wird
übersehen") — `.buttonStyle(.borderedProminent)` statt eines reinen
Icon-Buttons.
- **DE/EN-Umschalter zeigt jetzt Landesflaggen** (🇬🇧/🇩🇪) statt
"EN"/"DE"-Text — zeigt die Flagge der Sprache, zu der ein Klick
wechselt, exakt dieselbe "switch to"-Logik wie vorher.
- 92 Tests grün (6 neue `PortScannerTests`, 6 neue
`NetworkToolsServiceTests` für die Zeichen-Validierung). **Alle
Teile live bestätigt** ("funktioniert" / "sieht gut aus und
funktioniert").
- Nebenbei: großer `.alert`/`.confirmationDialog`/`.sheet`-Modifier-
Stapel in `DevicesView.swift` löste erneut Bug 19 aus ("compiler is
unable to type-check this expression in reasonable time") — nach
demselben, bereits etablierten Muster in zwei `View`-Extension-
Funktionen aufgeteilt (`withStaticAssignmentDialogs`/
`withDeviceDetailSheets`).
**Nutzerfrage, keine Umsetzung** (2026-09-15): ob es Sinn macht, weitere
Sprachen "per Plugin" zu importieren. Antwort: für 1-2 weitere feste
Sprachen passt das bestehende `L10n.swift`-Dictionary-Muster gut; ein
echtes ladbares Plugin-System wäre für dieses Nischen-Tool vermutlich
Overkill ohne konkrete Nachfrage. Nutzer bleibt vorerst bei DE/EN, hat
aber erwähnt, dass Spanisch (und evtl. Hindi/indischer Markt, unklar)
später dazukommen könnte, da MikroTik-Router in ärmeren Ländern
(Brasilien, spanischsprachige Länder) stark verbreitet sind — siehe
Claude-Memory `future-language-support.md` für Details.
## Nächste Schritte
1. ~~M16: restliche `RouterOSSchemaCatalog.swift`-Sektionen übersetzen~~