forked from moritz/migrabrator
first working version
This commit is contained in:
parent
c671208835
commit
c28e44ea0a
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue