# retoor <retoor@molodetz.nl>
import sys
from devplacepy.cli._shared import _audit_cli
def cmd_backups_list(args):
from devplacepy.services.backup import store
backups = store.list_backups()
if not backups:
print("No backups recorded")
return
for backup in backups:
size = store.human_bytes(int(backup.get("size_bytes") or 0))
print(
f"{backup['uid']} {backup.get('target', ''):<9} "
f"{backup.get('status', ''):<8} {size:>10} "
f"{backup.get('created_at', '')} {backup.get('filename', '')}"
)
def cmd_backups_run(args):
from devplacepy.services.backup import store
from devplacepy.services.jobs import queue
if not store.is_valid_target(args.target):
print(f"Unknown target '{args.target}'. Choose one of: {', '.join(store.BACKUP_TARGETS)}")
sys.exit(1)
job_uid = queue.enqueue(
"backup",
{"target": args.target, "schedule_uid": "", "created_by": "cli"},
owner_kind="system",
owner_id="cli",
preferred_name=f"{store.target_label(args.target)} (cli)",
)
store.create_backup(target=args.target, created_by="cli", job_uid=job_uid)
_audit_cli(
"cli.backups.run",
f"CLI enqueued {args.target} backup",
metadata={"target": args.target, "job_uid": job_uid},
)
print(f"Enqueued {args.target} backup job {job_uid} (processed by the running server)")
def cmd_backups_prune(args):
from devplacepy.services.backup import store
removed = store.prune_orphans()
_audit_cli("cli.backups.prune", f"CLI pruned {removed} orphan backups", metadata={"count": removed})
print(f"Pruned {removed} orphan backup record(s)")
def cmd_backups_clear(args):
from devplacepy.services.backup import store
removed = store.clear_all()
_audit_cli("cli.backups.clear", f"CLI cleared all backups ({removed})", metadata={"count": removed})
print(f"Cleared {removed} backup(s) and their archives")
def register_backups(subparsers):
backups = subparsers.add_parser("backups", help="Backup management")
backups_sub = backups.add_subparsers(title="action", dest="action")
backups_sub.add_parser("list", help="List recorded backups").set_defaults(
func=cmd_backups_list
)
backups_run = backups_sub.add_parser(
"run", help="Enqueue a backup (processed by the running server)"
)
backups_run.add_argument(
"target",
choices=["database", "uploads", "keys", "full"],
help="What to back up",
)
backups_run.set_defaults(func=cmd_backups_run)
backups_sub.add_parser(
"prune", help="Remove backup records whose archive file is missing"
).set_defaults(func=cmd_backups_prune)
backups_sub.add_parser(
"clear", help="Delete every backup archive and record"
).set_defaults(func=cmd_backups_clear)