make backup provider more generic
This commit is contained in:
@@ -9,11 +9,8 @@ from ..machines.machines import Machine
|
||||
|
||||
@dataclass
|
||||
class Backup:
|
||||
archive_id: str
|
||||
date: str
|
||||
provider: str
|
||||
remote_path: str
|
||||
job_name: str
|
||||
name: str
|
||||
job_name: str | None = None
|
||||
|
||||
|
||||
def list_provider(machine: Machine, provider: str) -> list[Backup]:
|
||||
@@ -26,19 +23,14 @@ def list_provider(machine: Machine, provider: str) -> list[Backup]:
|
||||
)
|
||||
if proc.returncode != 0:
|
||||
# TODO this should be a warning, only raise exception if no providers succeed
|
||||
ClanError(f"failed to list backups for provider {provider}")
|
||||
msg = f"failed to list backups for provider {provider}: {proc.stdout}"
|
||||
raise ClanError(msg)
|
||||
else:
|
||||
parsed_json = json.loads(proc.stdout)
|
||||
# TODO move borg specific code to borgbackup.nix
|
||||
for archive in parsed_json["archives"]:
|
||||
backup = Backup(
|
||||
archive_id=archive["archive"],
|
||||
date=archive["time"],
|
||||
provider=provider,
|
||||
remote_path=parsed_json["repository"]["location"],
|
||||
job_name=parsed_json["job-name"],
|
||||
for archive in parsed_json:
|
||||
results.append(
|
||||
Backup(name=archive["name"], job_name=archive.get("job_name"))
|
||||
)
|
||||
results.append(backup)
|
||||
return results
|
||||
|
||||
|
||||
@@ -59,7 +51,7 @@ def list_command(args: argparse.Namespace) -> None:
|
||||
machine = Machine(name=args.machine, flake=args.flake)
|
||||
backups = list_backups(machine=machine, provider=args.provider)
|
||||
for backup in backups:
|
||||
print(backup.archive_id)
|
||||
print(backup.name)
|
||||
|
||||
|
||||
def register_list_parser(parser: argparse.ArgumentParser) -> None:
|
||||
|
||||
@@ -15,11 +15,12 @@ def restore_service(
|
||||
backup_folders = json.loads(machine.eval_nix("config.clanCore.state"))
|
||||
folders = backup_folders[service]["folders"]
|
||||
env = os.environ.copy()
|
||||
env["ARCHIVE_ID"] = backup.archive_id
|
||||
env["LOCATION"] = backup.remote_path
|
||||
env["JOB"] = backup.job_name
|
||||
env["NAME"] = backup.name
|
||||
env["FOLDERS"] = ":".join(folders)
|
||||
|
||||
if backup.job_name is not None:
|
||||
env["JOB_NAME"] = backup.job_name
|
||||
|
||||
proc = machine.target_host.run(
|
||||
[
|
||||
"bash",
|
||||
@@ -67,19 +68,25 @@ def restore_backup(
|
||||
machine: Machine,
|
||||
backups: list[Backup],
|
||||
provider: str,
|
||||
archive_id: str,
|
||||
name: str,
|
||||
service: str | None = None,
|
||||
) -> None:
|
||||
if service is None:
|
||||
for backup in backups:
|
||||
if backup.archive_id == archive_id:
|
||||
if backup.name == name:
|
||||
backup_folders = json.loads(machine.eval_nix("config.clanCore.state"))
|
||||
for _service in backup_folders:
|
||||
restore_service(machine, backup, provider, _service)
|
||||
break
|
||||
else:
|
||||
raise ClanError(f"backup {name} not found")
|
||||
else:
|
||||
for backup in backups:
|
||||
if backup.archive_id == archive_id:
|
||||
if backup.name == name:
|
||||
restore_service(machine, backup, provider, service)
|
||||
break
|
||||
else:
|
||||
raise ClanError(f"backup {name} not found")
|
||||
|
||||
|
||||
def restore_command(args: argparse.Namespace) -> None:
|
||||
@@ -89,7 +96,7 @@ def restore_command(args: argparse.Namespace) -> None:
|
||||
machine=machine,
|
||||
backups=backups,
|
||||
provider=args.provider,
|
||||
archive_id=args.archive_id,
|
||||
name=args.name,
|
||||
service=args.service,
|
||||
)
|
||||
|
||||
@@ -99,6 +106,6 @@ def register_restore_parser(parser: argparse.ArgumentParser) -> None:
|
||||
"machine", type=str, help="machine in the flake to create backups of"
|
||||
)
|
||||
parser.add_argument("provider", type=str, help="backup provider to use")
|
||||
parser.add_argument("archive_id", type=str, help="id of the backup to restore")
|
||||
parser.add_argument("name", type=str, help="Name of the backup to restore")
|
||||
parser.add_argument("--service", type=str, help="name of the service to restore")
|
||||
parser.set_defaults(func=restore_command)
|
||||
|
||||
Reference in New Issue
Block a user