From 037e0cab9bed49e407daf25aa0733c9782c0eb6b Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Sat, 20 Dec 2025 21:31:39 +0300 Subject: [PATCH] Backup: restic backup refactoring --- files/backups/backup-all.py | 121 ++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 60 deletions(-) diff --git a/files/backups/backup-all.py b/files/backups/backup-all.py index c08154a..a327127 100644 --- a/files/backups/backup-all.py +++ b/files/backups/backup-all.py @@ -93,71 +93,72 @@ class ResticStorage(Storage): if not backup_dirs: logger.warning("No backup directories found") return True - try: - logger.info("Starting restic backup") - logger.info("Destination: %s", self.restic_repository) - - env = os.environ.copy() - env.update( - { - "RESTIC_REPOSITORY": self.restic_repository, - "RESTIC_PASSWORD": self.restic_password, - "AWS_ACCESS_KEY_ID": self.aws_access_key_id, - "AWS_SECRET_ACCESS_KEY": self.aws_secret_access_key, - "AWS_DEFAULT_REGION": self.aws_default_region, - } - ) - - backup_cmd = ["restic", "backup", "--verbose"] + backup_dirs - result = subprocess.run(backup_cmd, env=env, capture_output=True, text=True) - - if result.returncode != 0: - logger.error("Restic backup failed: %s", result.stderr) - return False - - logger.info("Restic backup completed successfully") - - check_cmd = ["restic", "check"] - result = subprocess.run(check_cmd, env=env, capture_output=True, text=True) - - if result.returncode != 0: - logger.error("Restic check failed: %s", result.stderr) - return False - - logger.info("Restic check completed successfully") - - forget_cmd = [ - "restic", - "forget", - "--compact", - "--prune", - "--keep-daily", - "90", - "--keep-monthly", - "36", - ] - result = subprocess.run(forget_cmd, env=env, capture_output=True, text=True) - - if result.returncode != 0: - logger.error("Restic forget/prune failed: %s", result.stderr) - return False - - logger.info("Restic forget/prune completed successfully") - - result = subprocess.run(check_cmd, env=env, capture_output=True, text=True) - - if result.returncode != 0: - logger.error("Final restic check failed: %s", result.stderr) - return False - - logger.info("Final restic check completed successfully") - return True - + return self.__backup_internal(backup_dirs) except Exception as exc: # noqa: BLE001 logger.error("Restic backup process failed: %s", exc) return False + def __backup_internal(self, backup_dirs: List[str]) -> bool: + logger.info("Starting restic backup") + logger.info("Destination: %s", self.restic_repository) + + env = os.environ.copy() + env.update( + { + "RESTIC_REPOSITORY": self.restic_repository, + "RESTIC_PASSWORD": self.restic_password, + "AWS_ACCESS_KEY_ID": self.aws_access_key_id, + "AWS_SECRET_ACCESS_KEY": self.aws_secret_access_key, + "AWS_DEFAULT_REGION": self.aws_default_region, + } + ) + + backup_cmd = ["restic", "backup", "--verbose"] + backup_dirs + result = subprocess.run(backup_cmd, env=env, capture_output=True, text=True) + + if result.returncode != 0: + logger.error("Restic backup failed: %s", result.stderr) + return False + + logger.info("Restic backup completed successfully") + + check_cmd = ["restic", "check"] + result = subprocess.run(check_cmd, env=env, capture_output=True, text=True) + + if result.returncode != 0: + logger.error("Restic check failed: %s", result.stderr) + return False + + logger.info("Restic check completed successfully") + + forget_cmd = [ + "restic", + "forget", + "--compact", + "--prune", + "--keep-daily", + "90", + "--keep-monthly", + "36", + ] + result = subprocess.run(forget_cmd, env=env, capture_output=True, text=True) + + if result.returncode != 0: + logger.error("Restic forget/prune failed: %s", result.stderr) + return False + + logger.info("Restic forget/prune completed successfully") + + result = subprocess.run(check_cmd, env=env, capture_output=True, text=True) + + if result.returncode != 0: + logger.error("Final restic check failed: %s", result.stderr) + return False + + logger.info("Final restic check completed successfully") + return True + class BackupManager: def __init__(self, config: Config, storages: List[Storage]):