fix: select correct latest snapshot to restore
This commit is contained in:
parent
4054d3417e
commit
2f965a93dc
24
backupbot.py
24
backupbot.py
@ -107,24 +107,26 @@ def create(retries):
|
|||||||
|
|
||||||
|
|
||||||
@cli.command()
|
@cli.command()
|
||||||
@click.option('snapshot', '--snapshot', '-s', envvar='SNAPSHOT', default='latest')
|
@click.option('snapshot_id', '--snapshot', '-s', envvar='SNAPSHOT', default='latest')
|
||||||
@click.option('target', '--target', '-t', envvar='TARGET', default='/')
|
@click.option('target', '--target', '-t', envvar='TARGET', default='/')
|
||||||
@click.option('noninteractive', '--noninteractive', envvar='NONINTERACTIVE', is_flag=True)
|
@click.option('noninteractive', '--noninteractive', envvar='NONINTERACTIVE', is_flag=True)
|
||||||
@click.option('volumes', '--volumes', '-v', envvar='VOLUMES', multiple=True)
|
@click.option('volumes', '--volumes', '-v', envvar='VOLUMES', multiple=True)
|
||||||
@click.option('container', '--container', '-c', envvar='CONTAINER', multiple=True)
|
@click.option('container', '--container', '-c', envvar='CONTAINER', multiple=True)
|
||||||
@click.option('no_commands', '--no-commands', envvar='NO_COMMANDS', is_flag=True)
|
@click.option('no_commands', '--no-commands', envvar='NO_COMMANDS', is_flag=True)
|
||||||
def restore(snapshot, target, noninteractive, volumes, container, no_commands):
|
def restore(snapshot_id, target, noninteractive, volumes, container, no_commands):
|
||||||
app_settings = parse_backup_labels('restore', container)
|
app_settings = parse_backup_labels('restore', container)
|
||||||
if SERVICE != 'ALL':
|
if SERVICE != 'ALL':
|
||||||
app_settings = {SERVICE: app_settings[SERVICE]}
|
app_settings = {SERVICE: app_settings[SERVICE]}
|
||||||
pre_commands, post_commands, backup_paths, apps_versions = get_backup_details(app_settings, volumes)
|
pre_commands, post_commands, backup_paths, apps_versions = get_backup_details(app_settings, volumes)
|
||||||
snapshots = get_snapshots(snapshot_id=snapshot)
|
snapshots = get_snapshots(snapshot_id)
|
||||||
if not snapshot:
|
if not snapshots:
|
||||||
logger.error(f"No Snapshots with ID {snapshots} for {apps_versions.keys()} found.")
|
logger.error(f"No Snapshots with ID {snapshot_id} for {apps_versions.keys()} found.")
|
||||||
exit(1)
|
exit(1)
|
||||||
|
snapshot = snapshots[0]
|
||||||
|
snapshot_id = snapshot['short_id']
|
||||||
if not noninteractive:
|
if not noninteractive:
|
||||||
print(f"Snapshot to restore: \t{snapshot}")
|
print(f"Snapshot to restore: \t{snapshot_id}")
|
||||||
restore_app_versions = app_versions_from_tags(snapshots[0].get('tags'))
|
restore_app_versions = app_versions_from_tags(snapshot.get('tags'))
|
||||||
print("Apps:")
|
print("Apps:")
|
||||||
for app, version in apps_versions.items():
|
for app, version in apps_versions.items():
|
||||||
restore_version = restore_app_versions.get(app)
|
restore_version = restore_app_versions.get(app)
|
||||||
@ -138,7 +140,7 @@ def restore(snapshot, target, noninteractive, volumes, container, no_commands):
|
|||||||
print("The following commands will be executed:")
|
print("The following commands will be executed:")
|
||||||
for container, cmd in list(pre_commands.items()) + list(post_commands.items()):
|
for container, cmd in list(pre_commands.items()) + list(post_commands.items()):
|
||||||
print(f"\t{container.labels['com.docker.swarm.service.name']}:\t{cmd}")
|
print(f"\t{container.labels['com.docker.swarm.service.name']}:\t{cmd}")
|
||||||
snapshot_date = datetime.fromisoformat(snapshots[0]['time'])
|
snapshot_date = datetime.fromisoformat(snapshot['time'])
|
||||||
delta = datetime.now(tz=timezone.utc) - snapshot_date
|
delta = datetime.now(tz=timezone.utc) - snapshot_date
|
||||||
print(f"This snapshot is {delta} old")
|
print(f"This snapshot is {delta} old")
|
||||||
print("\nTHIS COMMAND WILL IRREVERSIBLY OVERWRITES FILES")
|
print("\nTHIS COMMAND WILL IRREVERSIBLY OVERWRITES FILES")
|
||||||
@ -146,18 +148,18 @@ def restore(snapshot, target, noninteractive, volumes, container, no_commands):
|
|||||||
if prompt != 'YES':
|
if prompt != 'YES':
|
||||||
logger.error("Restore aborted")
|
logger.error("Restore aborted")
|
||||||
exit(1)
|
exit(1)
|
||||||
print(f"Restoring Snapshot {snapshot} at {target}")
|
print(f"Restoring Snapshot {snapshot_id} at {target}")
|
||||||
if not no_commands and pre_commands:
|
if not no_commands and pre_commands:
|
||||||
print(f"Run pre commands.")
|
print(f"Run pre commands.")
|
||||||
run_commands(pre_commands)
|
run_commands(pre_commands)
|
||||||
result = restic_restore(snapshot_id=snapshot, include=backup_paths, target_dir=target)
|
result = restic_restore(snapshot_id=snapshot_id, include=backup_paths, target_dir=target)
|
||||||
if not no_commands and post_commands:
|
if not no_commands and post_commands:
|
||||||
print(f"Run post commands.")
|
print(f"Run post commands.")
|
||||||
run_commands(post_commands)
|
run_commands(post_commands)
|
||||||
logger.debug(result)
|
logger.debug(result)
|
||||||
|
|
||||||
|
|
||||||
def restic_restore(snapshot_id='latest', include=[], target_dir=None):
|
def restic_restore(snapshot_id, include=[], target_dir=None):
|
||||||
cmd = restic.cat.base_command() + ['restore', snapshot_id]
|
cmd = restic.cat.base_command() + ['restore', snapshot_id]
|
||||||
for path in include:
|
for path in include:
|
||||||
cmd.extend(['--include', path])
|
cmd.extend(['--include', path])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user