Migra configurazione robocopy a porta SMB

This commit is contained in:
2026-07-01 12:48:39 +02:00
parent fa556ffbd4
commit 3573b4c149
3 changed files with 59 additions and 4 deletions

View File

@@ -89,7 +89,11 @@ def load_config(path: Path | None = None) -> AppConfig:
def load_config_data(path: Path | None = None) -> dict[str, Any]: def load_config_data(path: Path | None = None) -> dict[str, Any]:
config_path = ensure_default_config(path) config_path = ensure_default_config(path)
return tomllib.loads(config_path.read_text(encoding="utf-8")) data = tomllib.loads(config_path.read_text(encoding="utf-8"))
migrated = migrate_config_data(data)
if migrated:
save_config_data(data, config_path)
return data
def save_config_data(data: dict[str, Any], path: Path | None = None) -> Path: def save_config_data(data: dict[str, Any], path: Path | None = None) -> Path:
@@ -99,6 +103,38 @@ def save_config_data(data: dict[str, Any], path: Path | None = None) -> Path:
return config_path return config_path
def migrate_config_data(data: dict[str, Any]) -> bool:
backup = data.get("backup")
if not isinstance(backup, dict):
return False
changed = False
engine = str(backup.get("engine", "robocopy")).lower()
if "engine" not in backup:
backup["engine"] = engine
changed = True
if engine == "robocopy":
if "robocopy_path" not in backup:
backup["robocopy_path"] = "robocopy"
changed = True
server_check = backup.setdefault("server_check", {})
if isinstance(server_check, dict) and int(server_check.get("port", 22)) == 22:
server_check["port"] = 445
changed = True
destinations = backup.get("remote_destinations")
if not isinstance(destinations, list):
legacy_destination = str(backup.get("remote_destination", "")).strip()
backup["remote_destinations"] = (
[legacy_destination] if _is_windows_destination(legacy_destination) else []
)
changed = True
return changed
def parse_config(data: dict[str, Any], path: Path) -> AppConfig: def parse_config(data: dict[str, Any], path: Path) -> AppConfig:
service = data.get("service", {}) service = data.get("service", {})
tray = data.get("tray", {}) tray = data.get("tray", {})

View File

@@ -175,8 +175,8 @@ class BakRestConfigApp(ctk.CTk):
self.exclude_patterns.set_items(watch.get("exclude_patterns", [])) self.exclude_patterns.set_items(watch.get("exclude_patterns", []))
self.server_host_var.set(str(backup.get("server_host", ""))) self.server_host_var.set(str(backup.get("server_host", "")))
self.server_port_var.set(str(server_check.get("port", 22)))
self.engine_var.set(str(backup.get("engine", "robocopy"))) self.engine_var.set(str(backup.get("engine", "robocopy")))
self.server_port_var.set(str(server_check.get("port", 445 if self.engine_var.get() == "robocopy" else 22)))
self.robocopy_path_var.set(str(backup.get("robocopy_path", "robocopy"))) self.robocopy_path_var.set(str(backup.get("robocopy_path", "robocopy")))
self.remote_destinations.set_items(_configured_destinations(backup)) self.remote_destinations.set_items(_configured_destinations(backup))
self.shutdown_on_success_var.set(bool(backup.get("shutdown_on_success", True))) self.shutdown_on_success_var.set(bool(backup.get("shutdown_on_success", True)))
@@ -197,7 +197,8 @@ class BakRestConfigApp(ctk.CTk):
backup["remote_destinations"] = self.remote_destinations.items() backup["remote_destinations"] = self.remote_destinations.items()
backup["remote_destination"] = backup["remote_destinations"][0] if backup["remote_destinations"] else "" backup["remote_destination"] = backup["remote_destinations"][0] if backup["remote_destinations"] else ""
backup["shutdown_on_success"] = bool(self.shutdown_on_success_var.get()) backup["shutdown_on_success"] = bool(self.shutdown_on_success_var.get())
server_check["port"] = _safe_int(self.server_port_var.get(), 22) default_port = 445 if backup["engine"] == "robocopy" else 22
server_check["port"] = _safe_int(self.server_port_var.get(), default_port)
save_config_data(self.data, self.config_path) save_config_data(self.data, self.config_path)
self.app_config = load_config(self.config_path) self.app_config = load_config(self.config_path)

View File

@@ -2,7 +2,7 @@ from __future__ import annotations
from pathlib import Path from pathlib import Path
from bakrest.config import parse_config from bakrest.config import migrate_config_data, parse_config
from bakrest.filters import WatchFilter from bakrest.filters import WatchFilter
@@ -51,6 +51,24 @@ def test_parse_config_ignores_legacy_rsync_destination_for_robocopy(tmp_path: Pa
assert config.backup.remote_destinations == () assert config.backup.remote_destinations == ()
def test_migrate_legacy_rsync_config_to_robocopy_defaults() -> None:
data = {
"backup": {
"server_host": "backup-server",
"remote_destination": "utente@backup-server:/backup/bak-rest/",
"server_check": {"type": "tcp", "port": 22},
}
}
changed = migrate_config_data(data)
assert changed
assert data["backup"]["engine"] == "robocopy"
assert data["backup"]["robocopy_path"] == "robocopy"
assert data["backup"]["server_check"]["port"] == 445
assert data["backup"]["remote_destinations"] == []
def test_filter_accepts_included_extension(tmp_path: Path) -> None: def test_filter_accepts_included_extension(tmp_path: Path) -> None:
config = parse_config( config = parse_config(
{ {