feat: discover snapshots into Django records

Add a Django-native snapshot discovery service and management command
that scans backup directories, reads snapshot metadata, and idempotently
upserts SnapshotRecord rows. Expose it through the pobsync command
wrapper, update admin/docs, and cover discovery behavior with tests.
This commit is contained in:
2026-05-19 05:18:01 +02:00
parent e564262c72
commit 336fb1a5be
7 changed files with 214 additions and 2 deletions

View File

@@ -0,0 +1,39 @@
from __future__ import annotations
from typing import Any
from django.core.management.base import BaseCommand, CommandError
from pobsync.snapshot_meta import normalize_kind
from pobsync_backend.models import GlobalConfig, HostConfig
from pobsync_backend.snapshot_discovery import discover_snapshots
class Command(BaseCommand):
help = "Discover snapshot metadata on disk and upsert SnapshotRecord rows."
def add_arguments(self, parser) -> None:
parser.add_argument("--host", default=None)
parser.add_argument("--kind", default="all", help="scheduled|manual|incomplete|all")
def handle(self, *args: Any, **options: Any) -> None:
try:
global_config = GlobalConfig.objects.get(name="default")
except GlobalConfig.DoesNotExist as exc:
raise CommandError("Missing GlobalConfig 'default'") from exc
host = None
if options["host"]:
try:
host = HostConfig.objects.get(host=options["host"], enabled=True)
except HostConfig.DoesNotExist as exc:
raise CommandError(f"Missing enabled HostConfig {options['host']!r}") from exc
kind = normalize_kind(options["kind"])
kinds = ["scheduled", "manual", "incomplete"] if kind == "all" else [kind]
result = discover_snapshots(host=host, global_config=global_config, kinds=kinds)
self.stdout.write(
self.style.SUCCESS(
f"Scanned {result['scanned']} snapshot(s), created {result['created']}, updated {result['updated']}."
)
)