diff --git a/migrabrator.py b/migrabrator.py index ab30a22..01eae6d 100755 --- a/migrabrator.py +++ b/migrabrator.py @@ -6,6 +6,8 @@ import json import os import tempfile import tarfile +from time import sleep +from icecream import ic from shutil import copyfile, rmtree from pathlib import Path @@ -25,16 +27,19 @@ def main(loglevel, source_app, dst_domain, target_server, move_volumes): def move_app(source_app, target_server=False, target_domain=False, move_vols=False): - #backup(source_app) + backup(source_app) print(abra('app', 'undeploy', '-n', source_app)) + sleep(10) 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): logging.info(f"Start Backup of {app}...") - output = abra('app', 'backup', 'create', app) - print(output) + #output = abra('app', 'backup', 'create', app) + backupbot = get_backupbot(app) + print(f'Run backupbot on {backupbot}') + subprocess.run(['abra', 'app', 'run', backupbot, 'app', '--', 'backup','-m','create']) def copy_files_between_servers(source_server, source_dir, destination_server, destination_dir): # Generate temporary SSH key pair @@ -43,19 +48,20 @@ def copy_files_between_servers(source_server, source_dir, destination_server, de private_key_path = os.path.join(ssh_key_pair_dir, 'id_ed25519') public_key_path = os.path.join(ssh_key_pair_dir, 'id_ed25519.pub') subprocess.run(['ssh-keygen', '-t', 'ed25519', '-N', '', - '-f', private_key_path, '-C', ssh_key_id], check=True) + '-f', private_key_path, '-C', ssh_key_id], check=True, capture_output=True) try: # Copy the private key to the source server source_key_dir = run_ssh(source_server, 'mktemp -d', True) subprocess.run( - ['scp', private_key_path, f'{source_server}:{source_key_dir}'], check=True) + ['scp', private_key_path, f'{source_server}:{source_key_dir}'], check=True, capture_output=True) source_key_file = f'{source_key_dir}/id_ed25519' run_ssh(source_server, f'chmod 600 {source_key_file}') # Add the public key to the authorized hosts of the destination server subprocess.run(['ssh-copy-id', '-i', public_key_path, - destination_server], check=True) + destination_server], check=True, capture_output=True) # Run rsync over SSH on the source server to copy files to the destination server source_rsync_cmd = f'rsync -az -e "ssh -i {source_key_file} -o StrictHostKeyChecking=accept-new" {source_dir} {destination_server}:{destination_dir}' + print(source_rsync_cmd) run_ssh(source_server, source_rsync_cmd) # Remove the SSH key pair from the source server run_ssh(source_server, f'rm -r {source_key_dir}') @@ -67,7 +73,7 @@ def copy_files_between_servers(source_server, source_dir, destination_server, de rmtree(ssh_key_pair_dir) -def copy_volumes(source_app, target_server=False, target_domain=False, move=False): +def copy_volumes(source_app, target_server, target_domain, move=False): if not any([target_domain, target_server]): logging.error( 'At leat one of target_domain or target_app need to be speicified') @@ -76,29 +82,35 @@ def copy_volumes(source_app, target_server=False, target_domain=False, move=Fals source_service = source_app.replace(".", "_") volume_dir = f'/var/lib/docker/volumes/{source_service}_*' target_dir = f'/var/lib/docker/volumes' - if target_server: + if target_server and not target_domain: copy_files_between_servers( source_server, volume_dir, target_server, target_dir) - server = None - if target_server and target_domain: - server = target_server - cmd = 'mv' - elif target_domain: - server = source_server - cmd = 'rsync -a --delete' if move: cmd = 'mv' + else: + cmd = 'rsync -a --delete' + if target_server: + server = target_server + else: + server = source_server if target_domain: - paths = run_ssh(server, f'echo {volume_dir}', True).split() - if paths[0] == volume_dir: + source_paths = run_ssh(source_server, f'echo {volume_dir}', True) + if not source_paths: + logging.error("No path for {volume_dir} found") + exit(1) + source_paths = source_paths.split() + if source_paths[0] == volume_dir: logging.error(f"Path {volume_dir} does not exists") return target_service = target_domain.replace(".", "_") - for old_path in paths: + for old_path in source_paths: new_dir = Path(old_path).name.replace(source_service, target_service) new_path = f'{target_dir}/{new_dir}' print(f'{cmd} {old_path}/ {new_path}') - run_ssh(server, f'{cmd} {old_path}/ {new_path}') + if target_server: + copy_files_between_servers(source_server, f'{old_path}/', target_server, new_path) + else: + run_ssh(server, f'{cmd} {old_path}/ {new_path}') def copy_configs(source_app, target_server=False, target_domain=False): @@ -111,8 +123,10 @@ def copy_configs(source_app, target_server=False, target_domain=False): target_env = target_path.joinpath(f'{target_domain}.env') else: target_env = target_path.joinpath(f'{source_app}.env') + print(f"copy env {source_env} to {target_env}") copy_env(source_env, target_env) if target_domain: + print(f"\t replace {source_app} with {target_domain}") replace_domain(source_app, target_domain, target_env)