From d3ab05416d8560665a59d5f661c08b2554f19826 Mon Sep 17 00:00:00 2001 From: kyle Date: Wed, 7 Oct 2026 01:36:10 +0000 Subject: [PATCH] Update manage.py --- backend/manage.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/backend/manage.py b/backend/manage.py index b4189db..978ab6f 100644 --- a/backend/manage.py +++ b/backend/manage.py @@ -1,5 +1,9 @@ #!/usr/bin/env python3 -"""Admin CLI. Uses the same BACKUP_DASH_DB env var as the API. +"""Admin CLI. Finds the database the same way the API does: BACKUP_DASH_DB from the environment, +else from /etc/backup-dashboard/backup-dashboard.env, else ./backup-dashboard.db (dev). +Run it as the service user so files it creates stay writable by the API: + + sudo -u backupdash /opt/backup-dashboard/venv/bin/python manage.py create-key veeam-acme python manage.py create-key veeam-acme # prints the key once python manage.py list-keys @@ -7,17 +11,19 @@ python manage.py list-jobs python manage.py delete-job 12 # e.g. a decommissioned job stuck as Overdue python manage.py seed-demo # 30 days of fake history for trying the UI + python manage.py --db ./dev.db --create seed-demo """ import argparse import random import sys from datetime import timedelta +from pathlib import Path from app import db, repo from app.auth import generate_key, hash_key from app.models import IngestIn -from app.settings import load_settings +from app.settings import DEFAULT_ENV_FILE, load_settings from app.timeutil import to_db, utcnow @@ -94,6 +100,8 @@ def seed_demo(conn, args): def main(): p = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + p.add_argument("--db", type=Path, help="database file (overrides BACKUP_DASH_DB and the env file)") + p.add_argument("--create", action="store_true", help="create the database if it doesn't exist") sub = p.add_subparsers(required=True) s = sub.add_parser("create-key"); s.add_argument("name"); s.set_defaults(fn=create_key) s = sub.add_parser("list-keys"); s.set_defaults(fn=list_keys) @@ -103,9 +111,18 @@ def main(): s = sub.add_parser("seed-demo"); s.set_defaults(fn=seed_demo) args = p.parse_args() - settings = load_settings() - db.init_db(settings.db_path) - conn = db.connect(settings.db_path) + db_path = args.db or load_settings().db_path + # Refuse to silently create a fresh DB: that almost always means we're looking in the wrong + # place, and anything written there (like a new API key) would be invisible to the service. + if not db_path.exists() and not args.create: + sys.exit( + f"Database not found: {db_path.resolve()}\n" + f"Set BACKUP_DASH_DB in {DEFAULT_ENV_FILE} (or pass --db), " + "or add --create to start a new database there." + ) + print(f"Using database {db_path.resolve()}", file=sys.stderr) + db.init_db(db_path) + conn = db.connect(db_path) try: args.fn(conn, args) finally: