import argparse import sys from restic_volume_backup.config import Config from restic_volume_backup.containers import RunningContainers from restic_volume_backup import backup_runner from restic_volume_backup import restic def main(): args = parse_args() config = Config() containers = RunningContainers() if args.action == 'status': status(config, containers) elif args.action == 'backup': backup(config, containers) # Separate command to avoid spawning infinite containers :) elif args.action == 'start-backup-process': start_backup_process(config, containers) def status(config, containers): """Outputs the backup config for the compse setup""" print() print("Backup config for compose project '{}'".format(containers.this_container.project_name)) print("Current service:", containers.this_container.name) print("Backup process :", containers.backup_process_container.name \ if containers.backup_process_container else 'Not Running') print() for container in containers.containers: print('service: {}'.format(container.service_name)) for mount in container.filter_mounts(): print(' - {}'.format(mount.source)) print() def backup(config, containers): """Start backup""" # Make sure we don't spawn multiple backup processes if containers.backup_process_running: raise ValueError("Backup process already running") print("Initializing repository") # TODO: Errors when repo already exists restic.init_repo(config.repository) print("Starting backup container..") backup_runner.run( image=containers.this_container.image, command='restic-volume-backup start-backup-process', volumes=containers.this_container.volumes, enviroment=containers.this_container.environment, labels={ "restic-volume-backup.backup_process": 'True', "com.docker.compose.project": containers.this_container.project_name, }, ) def start_backup_process(config, containers): """Start the backup process container""" if not containers.backup_process_container or containers.this_container == containers.backup_process_container is False: print( "Cannot run backup process in this container. Use backup command instead. " "This will spawn a new container with the necessary mounts." ) return print("start-backup-process") status(config, containers) def parse_args(): parser = argparse.ArgumentParser(prog='restic_volume_backup') parser.add_argument( 'action', choices=['status', 'backup', 'start-backup-process'], ) return parser.parse_args() if __name__ == '__main__': main()