0
0
Fork 0

first working version

This commit is contained in:
Moritz 2023-10-20 01:59:28 +02:00
parent c671208835
commit c28e44ea0a
1 changed files with 24 additions and 17 deletions

View File

@ -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