2026-05-19 04:53:47 +02:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
from typing import Any
|
|
|
|
|
|
|
|
|
|
from django.core.exceptions import ObjectDoesNotExist
|
|
|
|
|
|
|
|
|
|
from pobsync.config.schemas import GLOBAL_SCHEMA, HOST_SCHEMA
|
|
|
|
|
from pobsync.paths import PobsyncPaths
|
|
|
|
|
from pobsync.util import write_yaml_atomic
|
|
|
|
|
from pobsync.validate import validate_dict
|
|
|
|
|
|
|
|
|
|
from .models import GlobalConfig, HostConfig
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ConfigRepositoryError(RuntimeError):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _global_yaml_data(global_config: GlobalConfig) -> dict[str, Any]:
|
|
|
|
|
data = dict(global_config.data or {})
|
|
|
|
|
data["backup_root"] = global_config.backup_root
|
|
|
|
|
data["pobsync_home"] = global_config.pobsync_home
|
|
|
|
|
return validate_dict(data, GLOBAL_SCHEMA, path="global")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _host_yaml_data(host_config: HostConfig) -> dict[str, Any]:
|
|
|
|
|
data = dict(host_config.config or {})
|
|
|
|
|
data["host"] = host_config.host
|
|
|
|
|
data["address"] = host_config.address
|
|
|
|
|
return validate_dict(data, HOST_SCHEMA, path="host")
|
|
|
|
|
|
|
|
|
|
|
2026-05-19 04:57:10 +02:00
|
|
|
def global_config_data(name: str = "default") -> dict[str, Any]:
|
|
|
|
|
try:
|
|
|
|
|
global_config = GlobalConfig.objects.get(name=name)
|
|
|
|
|
except ObjectDoesNotExist as exc:
|
|
|
|
|
raise ConfigRepositoryError(f"Missing GlobalConfig {name!r}") from exc
|
|
|
|
|
return _global_yaml_data(global_config)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def host_config_data(host: str) -> dict[str, Any]:
|
|
|
|
|
try:
|
|
|
|
|
host_config = HostConfig.objects.get(host=host, enabled=True)
|
|
|
|
|
except ObjectDoesNotExist as exc:
|
|
|
|
|
raise ConfigRepositoryError(f"Missing enabled HostConfig {host!r}") from exc
|
|
|
|
|
return _host_yaml_data(host_config)
|
|
|
|
|
|
|
|
|
|
|
2026-05-19 04:53:47 +02:00
|
|
|
def export_global_config(prefix: Path, name: str = "default") -> Path:
|
|
|
|
|
try:
|
|
|
|
|
global_config = GlobalConfig.objects.get(name=name)
|
|
|
|
|
except ObjectDoesNotExist as exc:
|
|
|
|
|
raise ConfigRepositoryError(f"Missing GlobalConfig {name!r}") from exc
|
|
|
|
|
|
|
|
|
|
paths = PobsyncPaths(home=prefix)
|
|
|
|
|
write_yaml_atomic(paths.global_config_path, _global_yaml_data(global_config))
|
|
|
|
|
return paths.global_config_path
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def export_host_config(prefix: Path, host: str) -> Path:
|
|
|
|
|
try:
|
|
|
|
|
host_config = HostConfig.objects.get(host=host, enabled=True)
|
|
|
|
|
except ObjectDoesNotExist as exc:
|
|
|
|
|
raise ConfigRepositoryError(f"Missing enabled HostConfig {host!r}") from exc
|
|
|
|
|
|
|
|
|
|
paths = PobsyncPaths(home=prefix)
|
|
|
|
|
target = paths.hosts_dir / f"{host_config.host}.yaml"
|
|
|
|
|
write_yaml_atomic(target, _host_yaml_data(host_config))
|
|
|
|
|
return target
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def export_runtime_configs(prefix: Path, host: str | None = None) -> list[Path]:
|
|
|
|
|
written = [export_global_config(prefix)]
|
|
|
|
|
hosts = HostConfig.objects.filter(enabled=True).order_by("host")
|
|
|
|
|
if host is not None:
|
|
|
|
|
hosts = hosts.filter(host=host)
|
|
|
|
|
for host_config in hosts:
|
|
|
|
|
written.append(export_host_config(prefix, host_config.host))
|
|
|
|
|
return written
|