README: Projektübersicht, Architektur-Diagramm, Meilensteine, Strukturverzeichnis
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CTgRxJTzaQwaRkngbaE1GJ
This commit is contained in:
@@ -0,0 +1,179 @@
|
|||||||
|
# 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. Rein lesend.
|
||||||
|
- **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, "Werksein
|
||||||
|
stellungen wiederherstellen"-Notfallschalter.
|
||||||
|
|
||||||
|
## Architektur
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
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 |
|
||||||
|
|---|---|---|
|
||||||
|
| M1–M4 | 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 | 🔶 gebaut, Hardware-Test läuft |
|
||||||
|
| 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 |
|
||||||
|
|
||||||
|
Ausführlicher Stand inkl. aller gefundenen Bugs, offener Punkte und
|
||||||
|
Session-Verlauf: [`HANDOFF.md`](HANDOFF.md) / [`CHATLOG.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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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.
|
||||||
Reference in New Issue
Block a user