forked from kay/RouterOS
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:
+73
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user