KayandClaude Sonnet 5 f25d02af17 Bug 27: unveränderter distance=0 einer dynamischen Route beim Set abgelehnt
Gleiche Ursache wie Bug 26, aber bei einem kuratierten statt einem
unkuratierten Feld: eine dynamische/verbundene Route hat distance=0,
RouterOS akzeptiert das nur system-intern, nicht als expliziten Eingabe-
wert für "set" — auch wenn der Wert unverändert zurückgesendet wird
("value of distance out of range (1...255)").

Fix generalisiert das "nur bei Änderung senden"-Prinzip aus Bug 26 von
unkuratierten auf ALLE Felder beim Bearbeiten eines bestehenden Items:
pendingCommand diffed jetzt gegen das ursprünglich geladene Item, statt
kuratierte Felder immer komplett neu zu senden. Deckt implizit auch das
Leeren eines Feldes ab (Bug 25), dessen Sonderfall dadurch überflüssig
wurde und entfernt ist.

Nebenbei: ExpertViewModelTests.swift lief bisher gar nicht mit, weil
nach dem Anlegen der Datei kein "xcodegen generate" lief (Xcodegen
erzeugt die Sources-Dateiliste einmalig beim Generieren). Nach erneutem
Generate 58 Unit-Tests grün.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YDmUd93KxsYGr2kLTotWnG
2026-09-15 13:42:45 +02:00
2026-09-12 21:45:31 +02:00

RouterOS Assistant

Native macOS-App (SwiftUI), die Laien und Fortgeschrittene per geführtem Interview-Wizard durch die häufigsten Mikrotik-RouterOS-Konfigurationen führt — und für alles darüber hinaus generischen, aber sicheren Zugriff auf praktisch jedes RouterOS-Menü bietet.

Worum geht's

Mikrotik-Router sind mächtig, aber die Konfiguration über Winbox oder die CLI ist für Einsteiger:innen nicht immer zugänglich. RouterOS Assistant übersetzt die häufigsten Schritte (Internet-Anschluss, Heimnetz/DHCP, zusätzliche VLAN-Netzwerke, WLAN, Firewall-Grundschutz) in einen geführten Wizard — und bleibt für alles, was darüber hinausgeht, über einen generischen "Experte"-Zugriff auf über 300 RouterOS-Menüs erweiterbar, ohne für jedes einzelne ein eigenes Formular bauen zu müssen.

Verbindet sich per REST-API (RouterOS ≥ 7.1) mit SSH-CLI-Fallback für ältere Geräte/Firmware. Alle Schreibvorgänge zeigen vorher den exakten Befehl, der ausgeführt wird — nichts passiert unangekündigt.

Features

  • Verbinden — REST-zuerst/SSH-Fallback-Verbindung, Zertifikats-/ SSH-Hostkey-TOFU, Geräte- und Routerboard-Infos (Modell, Seriennummer, Firmware), RouterOS-Software-Update-Check inkl. Installation, Routerboard-Firmware-Update, Neustart-Button.
  • Einrichten — geführter Wizard (WAN → LAN → VLAN → WLAN → Firewall → Review/Apply) mit Einfach- und Experte-Modus. Mehrere LAN-Interfaces mit eigenem DHCP-Server und optionaler Netzwerk-Isolation (Firewall-Drop-Regeln zwischen Netzen).
  • Übersicht — grafisches Diagramm des kompletten IST-Zustands (Interfaces → IP-Adressen → DHCP/Pools → Routen → Firewall/NAT), mit echten, aus RouterOS' eigenen Referenzfeldern abgeleiteten Verbindungslinien, nach Verbindungsart eingefärbt, Hover/Klick hebt Zusammenhänge hervor, Klick auf eine Verbindungslinie zeigt eine verständliche Erklärung samt Sprung zu den verbundenen Elementen. Ein Knoten (IP-Adresse, Pool, DHCP-Server/-Netzwerk/-Client, Route, Firewall-Filter/-NAT-Regel, WireGuard-Peer) lässt sich direkt über denselben Dialog wie im Experte-Tab bearbeiten und ans Gerät zurückschreiben.
  • Geräte — LAN-Scanner (DHCP-Leases + ARP + Bridge-Host-Tabelle), eine Tabelle pro physischem Port. Rechtsklick weist einem Gerät eine feste IP-Adresse zu (RouterOS' "Make Static") oder entfernt sie wieder.
  • Experte — kuratierte Formulare (mit Tooltips/Warnhinweisen) für die wichtigsten RouterOS-Bereiche (Firewall/NAT/Mangle/Raw komplett, plus Interfaces/IP/VPN/WLAN/Queues/System/Werkzeuge), plus ein generischer "eigener Menüpfad"-Zugriff für alles, was nicht kuratiert ist — kein RouterOS-Menü bleibt unerreichbar.
  • Sicherungen — Konfiguration exportieren und wieder einspielen (SFTP-Upload + RouterOS' dokumentierter Restore-Weg), mit Modell-Abgleich als Brick-Schutz, wählbarer Speicherort, "Werks­ein­ stellungen wiederherstellen"-Notfallschalter.

Architektur

flowchart TD
    subgraph UI["SwiftUI-Tabs"]
        Connect["Verbinden"]
        Setup["Einrichten-Wizard"]
        Overview["Übersicht"]
        Devices["Geräte"]
        Expert["Experte"]
        Backup["Sicherungen"]
    end

    Connect --> CS["ConnectionService<br/>(geteilter State)"]
    Setup --> CS
    Overview --> CS
    Devices --> CS
    Expert --> CS

    CS --> Decision{"REST-API<br/>verfügbar?"}
    Decision -->|ja| REST["RestTransport"]
    Decision -->|nein, Fallback| SSH["SSHTransport"]

    Backup -. "eigene SSH-Verbindung<br/>(Backup/Restore/Werksreset/Update)" .-> SSH2["SSHTransport"]

    REST --> Router[("Mikrotik<br/>RouterOS-Router")]
    SSH --> Router
    SSH2 --> Router

ConnectionService ist der einzige zwischen den Tabs geteilte State (REST-zuerst, SSH-Fallback). Einmalige System-Aktionen (Backup, Wiederherstellung, Werksreset, Updates) laufen bewusst über eine jeweils eigene, dedizierte SSH-Verbindung statt über den aktiven Live-Transport. Ein generischer Menü-Engine (fetchMenuItems/fetchFieldValues) macht praktisch jedes RouterOS-Menü lesbar, auch ohne kuratiertes Schema — darauf bauen Übersicht-, Geräte- und Experte-Tab gemeinsam auf.

Meilensteine

# Feature Status
M1M4 Projektgerüst, Connect, Backup, WAN/LAN/DHCP, VLAN live verifiziert
M5 WLAN-Schritt 🔶 nur "kein WLAN"-Zweig getestet
M6 Firewall-Grundschutz live verifiziert
M7 Härtung (SSH-Hostkey-TOFU) 🔶 TOFU fertig, Rest offen
M8 Mehrere LAN-Interfaces + Netzwerk-Isolation live verifiziert
M9 Einfach/Experte-Modusschalter im Wizard 🔶 gebaut, UI-Test offen
M10 Experte-Tab (generischer RouterOS-Zugriff) live verifiziert
M11 Übersicht-Tab (IST-Zustand-Diagramm) live verifiziert
M12 Geräte-Tab (LAN-Scanner + Static-IP) live verifiziert
M13 Backup-Wiederherstellung live verifiziert
M14 Update-Check (Software + Firmware) live verifiziert
M15 Übersicht-Tab: Diagramm-Fixes + Direktes Bearbeiten live verifiziert

Ausführlicher Stand inkl. aller gefundenen Bugs, offener Punkte und Session-Verlauf: HANDOFF.md / CHATLOG.md.

Projektstruktur

RouterOS/
├── RouterOSAssistant/                 — App-Quellcode (SwiftUI, macOS 14+)
│   ├── App/
│   │   └── RouterOSAssistantApp.swift     — Einstiegspunkt, TabView, geteilter ConnectionService
│   ├── Core/
│   │   ├── Models/
│   │   │   ├── RouterOSCommand.swift          — eine Änderung, vier Operationen (add/set/remove/action)
│   │   │   ├── WanConfig.swift, LanDhcpConfig.swift, VlanEntry.swift,
│   │   │   │   WifiNetworkConfig.swift, FirewallConfig.swift   — bauen je RouterOSCommand-Listen
│   │   │   ├── RouterOSMenuItem.swift         — generisches Item für jeden RouterOS-Menüpfad
│   │   │   ├── RouterOSSchema.swift / RouterOSSchemaCatalog.swift  — kuratierte Formular-Schemas (Experte-Tab)
│   │   │   ├── OverviewGraph.swift            — Knoten/Kanten-Modell fürs Übersicht-Diagramm
│   │   │   ├── LanDevice.swift                — ein Gerät im Geräte-Tab (Lease+ARP+Bridge-Host verschmolzen)
│   │   │   └── RouterOSModels.swift           — Credentials, DeviceInfo, RouterBoardInfo, PackageUpdateInfo, Fehler
│   │   ├── Networking/
│   │   │   ├── RouterOSTransport.swift        — Protocol: connect/fetch.../apply/disconnect
│   │   │   ├── RestTransport.swift            — REST-API (RouterOS ≥7.1)
│   │   │   ├── SSHTransport.swift             — SSH-Fallback via Citadel, generischer CLI-Zugriff, SFTP-Upload
│   │   │   ├── RouterOSCliParser.swift        — parst CLI-Ausgaben generisch
│   │   │   └── CertificateTrustStore.swift / SSHHostKeyTrustStore.swift  — TOFU
│   │   └── Services/
│   │       ├── ConnectionService.swift        — zentraler App-State
│   │       ├── BackupService.swift            — Sicherung erstellen/auflisten/wiederherstellen
│   │       ├── FactoryResetService.swift       — Werksreset ("Gefahrenzone")
│   │       ├── UpdateService.swift             — Software-/Firmware-Update, Neustart
│   │       └── KeychainService.swift           — Passwort-Speicherung
│   ├── Features/
│   │   ├── Wizard/Steps/Connect/               — Verbinden-Tab
│   │   ├── Wizard/Steps/Setup/                 — Einrichten-Tab (Mode→Wan→Lan→Vlan→Wifi→Firewall→Review)
│   │   ├── Overview/                           — Übersicht-Tab
│   │   ├── Devices/                            — Geräte-Tab
│   │   ├── Expert/                             — Experte-Tab
│   │   └── Backup/                             — Sicherungen-Tab
│   └── Resources/Assets.xcassets/              — App-Icon
├── RouterOSAssistantTests/             — Unit-Tests (Command-Builder, CLI-Parser, ViewModels, Mock-Transport)
├── project.yml                         — xcodegen-Projektdefinition (Quelle der Wahrheit, nicht das generierte .xcodeproj editieren)
├── HANDOFF.md                          — detaillierter technischer Stand, alle gefundenen Bugs, offene Punkte
└── CHATLOG.md                          — chronologischer Session-Verlauf

Setup / Bauen

xcodegen generate                 # erzeugt RouterOSAssistant.xcodeproj (nicht in git)
open RouterOSAssistant.xcodeproj   # oder direkt per xcodebuild

# Debug
xcodebuild -project RouterOSAssistant.xcodeproj -scheme RouterOSAssistant \
  -destination 'platform=macOS' build

# Tests
xcodebuild -project RouterOSAssistant.xcodeproj -scheme RouterOSAssistant \
  -destination 'platform=macOS' test

# Release + Deploy nach /Applications
xcodebuild -project RouterOSAssistant.xcodeproj -scheme RouterOSAssistant \
  -configuration Release build

xcodegen ist via Homebrew installiert. .xcodeproj, DerivedData und Router-Backups sind gitignored.

Sicherheit

Jede Schreibaktion zeigt vor der Ausführung den exakten RouterOS-Befehl in einem Bestätigungsdialog. Destruktive Aktionen (Werksreset, Backup- Wiederherstellung) liegen in einer eigenen "Gefahrenzone" mit zusätzlichen Warnhinweisen. Zertifikate und SSH-Hostkeys werden per Trust-on-First-Use (TOFU) behandelt, nicht blind akzeptiert.

S
Description
Native macOS SwiftUI App zur Konfiguration von Mikrotik RouterOS-Routern (Setup-Wizard, Uebersicht, Geraete, Experte, Sicherungen).
Readme
2.6 MiB
Languages
Swift 100%