0
0
forked from moritz/migrabrator

first working version

This commit is contained in:
Moritz 2023-10-20 01:59:28 +02:00
parent c671208835
commit c28e44ea0a

View File

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