from argparse import ArgumentParser from pathlib import Path import toml from openwrt_backup.retrieve import make_backup_on_remote, retrieve_backup_on_remote from openwrt_backup.utils import ( client_from_config, exec_remote, get_new_backup_filepath, ) from openwrt_backup.config import CONFIG_DATA # noqa from openwrt_backup.prune import get_all_but_last_n def do_prune(dest_path: Path, n: int, dry, hostname=None): if dry: to_delete = get_all_but_last_n(dest_path, n - 1, hostname) else: to_delete = get_all_but_last_n(dest_path, n, hostname) for f in to_delete: if dry: print(f"Deleting: {f}") else: f.unlink() def do_backup( config_hostname, ssh_config_root: Path, backup_path: Path, tmp_path: Path, time_format, dry, ): client = client_from_config(config_hostname, ssh_config_root) stdout, stderr = exec_remote(client, "echo $HOSTNAME") hostname = stdout.read().decode().rstrip() dest = get_new_backup_filepath(backup_path, time_format, hostname) if dry: print(f"Making backup {tmp_path / 'backup_latest.openwrt_backup.tar.gz'}") print( f"Copying remote {tmp_path / 'backup_latest.openwrt_backup.tar.gz'} to {dest}" ) else: backup_on_remote = make_backup_on_remote(client, tmp_path) retrieve_backup_on_remote(client, backup_on_remote, dest) return hostname def main(): global CONFIG_DATA parser = ArgumentParser() parser.add_argument( "-d", "--dry", action="store_true", help="Don't do anything but show what would happen", ) parser.add_argument( "-c", "--config", help="config path for backup script", default=None ) subparsers = parser.add_subparsers(dest="action", required=True) p_run = subparsers.add_parser( "run", help=f"Make backup then prune all but the {CONFIG_DATA['backup']['keep']} most recent", ) p_backup = subparsers.add_parser( "backup", help="Same as run but do not delete any backups" ) p_dump_config = subparsers.add_parser( # noqa "dump-config", help="Show config and exit" ) # noqa p_run.add_argument( "name", help="Hostname in ssh_config file for openwrt device we need to backup" ) p_backup.add_argument( "name", help="Hostname in ssh_config file for openwrt device we need to backup" ) args = parser.parse_args() if args.config: with open(args.config) as f: CONFIG_DATA = toml.load(f) if args.action == "dump-config": print(toml.dumps(CONFIG_DATA)) exit(0) hostname = do_backup( args.name, Path(CONFIG_DATA["ssh"]["root"]).expanduser(), Path(CONFIG_DATA["backup"]["path"]).expanduser(), Path(CONFIG_DATA["router"]["temp"]), CONFIG_DATA["backup"]["time_format"], args.dry, ) if args.action != "backup": do_prune( Path(CONFIG_DATA["backup"]["path"]).expanduser(), CONFIG_DATA["backup"]["keep"], args.dry, hostname, )