forked from kay/RouterOS
RouterOS bringt eine eigene Standardkonfiguration mit, wiederherstellbar über /system reset-configuration no-defaults=no -- restauriert die vom Hersteller ausgelieferte Konfiguration (nicht eine leere), RouterOS legt dabei selbst zusätzlich ein Backup an (skip-backup=no, Standard). FactoryResetService läuft wie BackupService immer über eine eigene SSH-Verbindung (kein verifiziertes REST-Äquivalent, passt nicht ins add/set-Modell von RouterOSCommand). Vor dem Zurücksetzen erstellt die App zusätzlich selbst ein Backup (best-effort). Verbindung zum Router bricht durch den Reboot erwartungsgemäß ab -- wird nicht als Fehler behandelt, ConnectionService trennt sich danach selbst. UI: rot markierte "Gefahrenzone" im Sicherungen-Tab, destruktiver Bestätigungsdialog vor dem Ausführen, klarer Hinweistext was verloren geht. Außerdem .gitignore um /Backups/ und *.rsc ergänzt -- beim Testen des wählbaren Backup-Ordners landete ein echter Router-Export im Projektordner, gehört nicht ins Repo. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HReLXMbmPvtQ23p1iWiJNW
67 lines
2.2 KiB
Swift
67 lines
2.2 KiB
Swift
import Foundation
|
|
|
|
@MainActor
|
|
final class BackupViewModel: ObservableObject {
|
|
@Published private(set) var backups: [BackupRecord] = []
|
|
@Published private(set) var isCreatingBackup = false
|
|
@Published var errorMessage: String?
|
|
@Published private(set) var backupDirectoryPath: String = BackupService.customDirectoryURL?.path
|
|
?? BackupService.defaultDirectoryURL.path
|
|
|
|
@Published private(set) var isResettingToFactoryDefaults = false
|
|
@Published var resetError: String?
|
|
@Published private(set) var didSendFactoryReset = false
|
|
|
|
private let backupService = BackupService()
|
|
private let factoryResetService = FactoryResetService()
|
|
|
|
func load() {
|
|
backups = backupService.listBackups()
|
|
}
|
|
|
|
func setBackupDirectory(_ url: URL) {
|
|
BackupService.customDirectoryURL = url
|
|
backupDirectoryPath = url.path
|
|
load()
|
|
}
|
|
|
|
func resetBackupDirectoryToDefault() {
|
|
BackupService.customDirectoryURL = nil
|
|
backupDirectoryPath = BackupService.defaultDirectoryURL.path
|
|
load()
|
|
}
|
|
|
|
func createBackup(for credentials: RouterOSCredentials) {
|
|
isCreatingBackup = true
|
|
errorMessage = nil
|
|
Task {
|
|
do {
|
|
_ = try await backupService.createBackup(for: credentials)
|
|
load()
|
|
} catch {
|
|
errorMessage = error.localizedDescription
|
|
}
|
|
isCreatingBackup = false
|
|
}
|
|
}
|
|
|
|
/// Backs up first (best-effort — a failed backup shouldn't block the reset itself, since
|
|
/// RouterOS makes its own backup as part of the reset anyway), then restores the router's
|
|
/// vendor-default configuration and reboots it.
|
|
func resetToFactoryDefaults(for credentials: RouterOSCredentials) {
|
|
isResettingToFactoryDefaults = true
|
|
resetError = nil
|
|
didSendFactoryReset = false
|
|
Task {
|
|
do {
|
|
_ = try? await backupService.createBackup(for: credentials)
|
|
try await factoryResetService.resetToVendorDefaults(for: credentials)
|
|
didSendFactoryReset = true
|
|
} catch {
|
|
resetError = error.localizedDescription
|
|
}
|
|
isResettingToFactoryDefaults = false
|
|
}
|
|
}
|
|
}
|