KayandClaude Sonnet 5 18fefc76a8 Bug 28: dynamische Routen (distance=0) nicht mehr über die Übersicht editierbar
Eine dynamische/verbundene Route (automatisch angelegt durch eine
IP-Adresse auf einem Interface) scheiterte beim Bearbeiten mit "no such
item (4)" — bestätigt per /ip route print detail: D-Flag, distance=0.
RouterOS' "dynamic"-Flag steht nicht zuverlässig in print terse
(dasselbe Problem schon bei DHCP-Leases dokumentiert), aber distance=0
ist ein verlässliches Signal, da keine echte statische Route das je
haben kann. Solche Routen bekommen jetzt kein editTarget mehr — ihre
.id ist ohnehin nicht stabil, RouterOS kann sie jederzeit neu anlegen.

59 Unit-Tests grün (neuer Test OverviewGraphTests.
testDynamicRouteHasNoEditTarget).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YDmUd93KxsYGr2kLTotWnG
2026-09-15 13:54:11 +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%