diff --git a/migrabrator.py b/migrabrator.py index d2beca1..9512ce5 100755 --- a/migrabrator.py +++ b/migrabrator.py @@ -5,32 +5,34 @@ import subprocess import json import os import tempfile +import tarfile from shutil import copyfile, rmtree from pathlib import Path @click.command() @click.option('-l', '--log', 'loglevel') -@click.option('source_app', '--source_app', '-s') -@click.option('target_app', '--target_app', '-t') -@click.option('backupbot', '--backupbot', '-b') -def main(loglevel, source_app, target_app, backupbot): +@click.argument('source_app') +@click.option('dst_domain', '--dst_domain', '-d') +@click.option('target_server', '--target_server', '-s') +@click.option('move_volumes', '--move-volumes', '-m', is_flag=True) +def main(loglevel, source_app, dst_domain, target_server, move_volumes): if loglevel: numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level) - # backup(source_app, backupbot) + move_app(source_app, target_server, dst_domain, move_volumes) -def move_app(source_app, target_server=False, target_domain=False): - backup(source_app) - copy_volumes(source_app, target_server, target_domain) +def move_app(source_app, target_server=False, target_domain=False, move_vols=False): + #backup(source_app) + copy_volumes(source_app, target_server, target_domain, move_vols) copy_configs(source_app, target_server, target_domain) copy_secrets(source_app, target_domain) def backup(app): # TODO: replace with abra app backup command - backupbot = get_backupbot(source_app) + backupbot = get_backupbot(app) output = abra('app', 'run', backupbot, 'app', '--', 'backup', '-h', app, 'create') print(output) @@ -72,8 +74,7 @@ def copy_volumes(source_app, target_server=False, target_domain=False, move=Fals 'At leat one of target_domain or target_app need to be speicified') exit(1) source_server = get_server(source_app) - source_domain = get_domain(source_app) - source_service = source_domain.replace(".", "_") + source_service = source_app.replace(".", "_") volume_dir = f'/var/lib/docker/volumes/{source_service}_*' target_dir = f'/var/lib/docker/volumes' if target_server: @@ -90,6 +91,9 @@ def copy_volumes(source_app, target_server=False, target_domain=False, move=Fals cmd = 'mv' if target_domain: paths = run_ssh(server, f'echo {volume_dir}', True).split() + if paths[0] == volume_dir: + logging.error(f"Path {volume_dir} does not exists") + return target_service = target_domain.replace(".", "_") for old_path in paths: container = old_path.split('_')[-1] @@ -162,12 +166,15 @@ def copy_secrets(source_app, target_domain): def get_secrets(source_app): # TODO: replace with abra app backup command backupbot = get_backupbot(source_app) - output = subprocess.run(['abra', 'app', 'run', backupbot, 'app', '--', - 'backup', '-h', source_app, 'download', '--secrets'], capture_output=True, text=True) - secret_path = output.stdout.strip() - output = subprocess.run( - ['abra', 'app', 'cp', backupbot, f"app:{secret_path}", "/tmp"]) - with open(secret_path) as file: + subprocess.run(['abra', 'app', 'run', backupbot, 'app', '--', 'backup', '-h', + source_app, 'download', '--secrets']) + output = subprocess.run(['abra', 'app', 'cp', backupbot, f"app:/tmp/backup.tar.gz", "/tmp"]) + if output.returncode: + logging.error(f"Could not dump secrets for {source_app}") + exit() + with tarfile.open('/tmp/backup.tar.gz') as tar: + source_service = source_app.replace(".", "_") + file = tar.extractfile(f"{source_service}.json") secrets = json.load(file) return secrets