from __future__ import annotations import argparse import os from pathlib import Path def _default_repo_name() -> str: """ Derive the repository name from the folder that contains `src/`. Expected layout: /src/baudolo/backup/cli.py => parents[0]=backup, [1]=baudolo, [2]=src, [3]=repo-root """ try: return Path(__file__).resolve().parents[3].name except Exception: return "backup-docker-to-local" def parse_args() -> argparse.Namespace: dirname = os.path.dirname(__file__) default_databases_csv = os.path.join(dirname, "databases.csv") p = argparse.ArgumentParser(description="Backup Docker volumes.") p.add_argument( "--compose-dir", type=str, required=True, help="Path to the parent directory containing docker-compose setups", ) p.add_argument( "--docker-compose-hard-restart-required", nargs="+", default=["mailu"], help="Compose dir names that require 'docker-compose down && up -d' (default: mailu)", ) p.add_argument( "--repo-name", default=_default_repo_name(), help="Backup repo folder name under // (default: git repo folder name)", ) p.add_argument( "--databases-csv", default=default_databases_csv, help=f"Path to databases.csv (default: {default_databases_csv})", ) p.add_argument( "--backups-dir", default="/Backups", help="Backup root directory (default: /Backups)", ) p.add_argument( "--database-containers", nargs="+", required=True, help="Container names treated as special instances for database backups", ) p.add_argument( "--images-no-stop-required", nargs="+", required=True, help="Image name patterns for which containers should not be stopped during file backup", ) p.add_argument( "--images-no-backup-required", nargs="+", default=[], help="Image name patterns for which no backup should be performed", ) p.add_argument( "--everything", action="store_true", help="Force file backup for all volumes and also execute database dumps (like old script)", ) p.add_argument( "--shutdown", action="store_true", help="Do not restart containers after backup", ) p.add_argument( "--dump-only", action="store_true", help="Only create DB dumps (skip ALL file rsync backups)", ) return p.parse_args()