M13: Backup-Wiederherstellung, mit Modell-Schutz und Login-Erhalt

Letzter offener Punkt aus HANDOFF.md: gespeicherte .rsc-Backups lassen
sich jetzt wieder einspielen. Weg: Backup-Datei per SFTP auf den Router
hochladen (Citadel, die bereits eingebundene SSH-Bibliothek, hat einen
SFTP-Client), dann RouterOS' offiziell dokumentierter Restore-Weg in
einem Rutsch: /system reset-configuration no-defaults=yes
run-after-reset=<datei> (kompletter Wipe + sofortiges Wiederanwenden,
sicherer als ein Re-Import auf eine bestehende, andere Config).

Vor dem Bestätigungsdialog wird das Routermodell abgeglichen
(/system routerboard prints "model"-Feld gegen die "# model = ..."-
Kopfzeile der Sicherung) und bei Mismatch komplett blockiert, um ein
Brick-Risiko durch falsches Modell zu vermeiden - der Dialog selbst warnt
zusaetzlich prominent davor.

Ein ernster Bug live gefunden und gefixt: der erste echte Restore-Test
sperrte den Router komplett aus (RouterOS exportiert nie Passwoerter,
no-defaults=yes loescht zusaetzlich den Werks-Admin-Account), nur per
Hardware-Reset behebbar. Fix: das aktuell verwendete App-Login wird jetzt
vorne ins Restore-Skript eingefuegt, noch vor dem eigentlichen
Sicherungsinhalt, da RouterOS den Import beim ersten Fehler irgendwo im
Skript komplett abbricht. Zwei Tests fuer die Escaping-Logik ergaenzt.

Nebenbei: BackupListView mit den neuen Restore-Dialogen liess sich nicht
mehr kompilieren (SwiftUI-Typpruefung timeoutete bei der langen
Modifier-Kette) - Restore-Dialoge in eine eigene @ViewBuilder-Property
ausgelagert.

HANDOFF.md/CHATLOG.md aktualisiert: M13, Bug 18+19, "Backup-
Wiederherstellung fehlt" aus den offenen Punkten entfernt, Hinweis auf
den zweiten (ungewollten) Werksreset waehrend der Session.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CTgRxJTzaQwaRkngbaE1GJ
This commit is contained in:
Kay
2026-09-14 15:21:05 +02:00
co-authored by Claude Sonnet 5
parent 8e99ab8e41
commit 20f8d5e0bf
7 changed files with 502 additions and 70 deletions
+73
View File
@@ -557,3 +557,76 @@ offenen Punkte unverändert (siehe HANDOFF.md Nächste Schritte).
(M12-Beschreibung/Nächste-Schritte/Bekannte-Einschränkungen aktualisiert,
"Zurück auf dynamisch" als erledigt markiert) aktualisiert, Commit
erstellt.
## Session: Backup-Wiederherstellung (M13)
- "gut, ich setze den Router wieder auf werkseinstellungen zurück, damit
wir sauber weitermachen können" → "bin wieder verbunden, weiter geht's"
→ "kümmern wir um die Backups. wir haben ja schon einige gemacht. diese
sind aber aktuell nicht wieder einspielbar." — letzter offener Punkt
aus HANDOFF.md.
- Vor dem Bauen per Recherche-Agent gegen die offizielle RouterOS-Doku
geprüft: `/import file-name=...` ist der Restore-Befehl, Dateien müssen
vorher auf den Router (Upload-Weg dort nicht dokumentiert), Re-Import
über eine bestehende Config ist riskant, offizieller Restore-Weg ist
`reset-configuration no-defaults=yes run-after-reset=...`. Citadel
(bereits eingebundene SSH-Bibliothek) hat einen SFTP-Client — direkt im
Quellcode bestätigt statt angenommen.
- Live-Test des Datei-Uploads gemeinsam mit dem Nutzer über mehrere
Runden (`ssh-keygen -R` wegen geändertem Host-Key nach Werksreset,
`sftp`, `/file print`, `/import`) — bestätigt: Dateien landen unter
`flash/`, `/import`/`/file remove` brauchen den vollen `flash/`-Pfad,
bare Dateiname scheitert mit "file does not exist".
- "ja, bau das so, füge im Warnhinweis promiment dazu, das nur die
Backup-Datei für das entsprechende Modell verwendet werden darf, sonst
brick. vielleicht ist es sonnvoll vor dem Einspielen die Routermodelle
... vergleichen" → zweite Recherche-Runde zum Export-Header-Format
(`# model = ...`), währenddessen der Nutzer den echten Header einer
eigenen Backup-Datei direkt gezeigt hat (schneller als die Recherche).
Wichtige Korrektur währenddessen selbst gefunden: die `model`-Zeile
entspricht `/system routerboard print`s `model`-Feld, nicht dem
`board-name`, den die App sonst kennt (oft der Marketing-Name, z.B.
"hEX" statt "RB750Gr3") — ein Vergleich gegen das falsche Feld hätte
selbst beim exakt gleichen Router fälschlich "passt nicht" gemeldet.
- Gebaut: SFTP-Upload + `reset-configuration`+`run-after-reset` in
`SSHTransport`/`BackupService`, Modell-Abgleich vor dem
Bestätigungsdialog (blockt komplett bei Mismatch), Gefahrenzone-Dialog
mit dem geforderten Brick-Warnhinweis. Kompilierfehler unterwegs:
SwiftUI-Typprüfung timeoutete bei der langen `BackupListView`-
Modifier-Kette (Bug 19) — Restore-Dialoge in eine eigene
`@ViewBuilder`-Property ausgelagert.
- "ok, das Backup an sich scheint zu funktionieren, eine verbindung zum
wiederhergestellten Router funktioniert nicht: Flascher Username oder
Passwort. Nur ein Hard-Reset hilft dann noch" — ernster Bug (18):
RouterOS-Exporte enthalten nie Passwörter, `no-defaults=yes` löscht
zusätzlich den Werks-Admin-Account, nach dem Restore also kein Login
mehr vorhanden, nur per Hardware-Reset behebbar. Fix: aktuelles
App-Login wird jetzt vorne ins Restore-Skript eingefügt (vor dem
eigentlichen Sicherungsinhalt, da RouterOS den Import beim ersten
Fehler abbricht), inkl. zwei Tests für die Escaping-Logik.
- "alles gut, ist ja ein Testgerät :)" — Nutzer gelassen trotz
Aussperrung. "gut, das hat funktioniert." — Restore inkl. Login-Erhalt
danach bestätigt.
- "ja, committen und beides aktualisieren" → dieser Eintrag, HANDOFF.md
(Bug 18+19, M13, aktualisierte Bekannte Einschränkungen/Nächste
Schritte inkl. Hinweis auf den zweiten Werksreset/Hardware-Reset
während der Session) aktualisiert, Commit erstellt.
## Stand am Ende dieser Session — Backup-Wiederherstellung (M13)
M13 gebaut und live bestätigt — der letzte seit langem offene Punkt aus
HANDOFF.md ("Backup-Wiederherstellung fehlt komplett") ist erledigt. Der
Weg dahin war der bisher risikoreichste dieser App: ein echter, live
reproduzierter Aussperr-Vorfall (Bug 18), der den Nutzer zu einem
Hardware-Reset zwang, bevor der Fix (Login-Erhalt vorangestellt im
Restore-Skript) das behoben hat. Modell-Abgleich vor dem Restore
(RB750Gr3 vs. "hEX" — wichtige Feld-Verwechslung selbst noch vor dem
Bauen gefunden und vermieden) und der geforderte Brick-Warnhinweis sind
mit drin. Router wurde im Lauf der Session zweimal komplett
zurückgesetzt (einmal gewollt für einen sauberen Stand, einmal
ungewollt durch Bug 18) — alle älteren Hinweise auf spezifische
Test-Konfiguration (`test-vlan`, `dhcp5` etc.) aus früheren Sessions
sind dadurch hinfällig, siehe HANDOFF.md Nächste Schritte. Offen bleibt
weiterhin die `.id`-Positionsüberlagerungs-Frage für den Experte-Tab
(Bug 15) und alle länger schon offenen Punkte (M7-Rest, M8-Hardware-
Test, WLAN/Bonding/PPPoE-Live-Tests).