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 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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user