Add explicit Django model fields for global and host backup settings, including SSH, rsync, source, excludes, and retention configuration. Populate them from legacy JSON during migration, make the config repository prefer structured fields, and update import/admin/tests around the SQL-first configuration model.
82 lines
3.9 KiB
Python
82 lines
3.9 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
from django.conf import settings
|
|
from django.core.management.base import BaseCommand, CommandError
|
|
|
|
from pobsync.config.load import load_global_config, load_host_config
|
|
from pobsync.paths import PobsyncPaths
|
|
from pobsync_backend.models import GlobalConfig, HostConfig
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "Import pobsync YAML configs into the Django database."
|
|
|
|
def add_arguments(self, parser) -> None:
|
|
parser.add_argument("--prefix", default=settings.POBSYNC_HOME, help="Pobsync home directory")
|
|
|
|
def handle(self, *args: Any, **options: Any) -> None:
|
|
paths = PobsyncPaths(home=Path(options["prefix"]))
|
|
if not paths.global_config_path.exists():
|
|
raise CommandError(f"Missing global config: {paths.global_config_path}")
|
|
|
|
global_cfg = load_global_config(paths.global_config_path)
|
|
global_ssh = global_cfg.get("ssh") or {}
|
|
global_rsync = global_cfg.get("rsync") or {}
|
|
global_defaults = global_cfg.get("defaults") or {}
|
|
retention_defaults = global_cfg.get("retention_defaults") or {}
|
|
GlobalConfig.objects.update_or_create(
|
|
name="default",
|
|
defaults={
|
|
"backup_root": global_cfg["backup_root"],
|
|
"pobsync_home": global_cfg.get("pobsync_home", str(paths.home)),
|
|
"ssh_user": global_ssh.get("user") or "root",
|
|
"ssh_port": global_ssh.get("port") or 22,
|
|
"ssh_options": global_ssh.get("options") or [],
|
|
"rsync_binary": global_rsync.get("binary") or "rsync",
|
|
"rsync_args": global_rsync.get("args") or [],
|
|
"rsync_extra_args": global_rsync.get("extra_args") or [],
|
|
"rsync_timeout_seconds": global_rsync.get("timeout_seconds") or 0,
|
|
"rsync_bwlimit_kbps": global_rsync.get("bwlimit_kbps") or 0,
|
|
"default_source_root": global_defaults.get("source_root") or "/",
|
|
"default_destination_subdir": global_defaults.get("destination_subdir") or "",
|
|
"excludes_default": global_cfg.get("excludes_default") or [],
|
|
"retention_daily": retention_defaults.get("daily", 14),
|
|
"retention_weekly": retention_defaults.get("weekly", 8),
|
|
"retention_monthly": retention_defaults.get("monthly", 12),
|
|
"retention_yearly": retention_defaults.get("yearly", 0),
|
|
"data": global_cfg,
|
|
},
|
|
)
|
|
|
|
count = 0
|
|
for host_path in sorted(paths.hosts_dir.glob("*.yaml")):
|
|
host_cfg = load_host_config(host_path)
|
|
host_ssh = host_cfg.get("ssh") or {}
|
|
host_rsync = host_cfg.get("rsync") or {}
|
|
host_retention = host_cfg.get("retention") or {}
|
|
HostConfig.objects.update_or_create(
|
|
host=host_cfg["host"],
|
|
defaults={
|
|
"address": host_cfg["address"],
|
|
"ssh_user": host_ssh.get("user") or "",
|
|
"ssh_port": host_ssh.get("port"),
|
|
"source_root": host_cfg.get("source_root") or "",
|
|
"includes": host_cfg.get("includes") or [],
|
|
"excludes_add": host_cfg.get("excludes_add") or [],
|
|
"excludes_replace": host_cfg.get("excludes_replace"),
|
|
"rsync_extra_args": host_rsync.get("extra_args") or [],
|
|
"retention_daily": host_retention.get("daily", 14),
|
|
"retention_weekly": host_retention.get("weekly", 8),
|
|
"retention_monthly": host_retention.get("monthly", 12),
|
|
"retention_yearly": host_retention.get("yearly", 0),
|
|
"config": host_cfg,
|
|
"enabled": True,
|
|
},
|
|
)
|
|
count += 1
|
|
|
|
self.stdout.write(self.style.SUCCESS(f"Imported global config and {count} host config(s)."))
|