forked from retoor/devplacepy
refactor: split cli.py into package (ref.md 3.7)
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user