Backups: add backup-targets file support

This commit is contained in:
2025-12-20 10:32:00 +03:00
parent 392938d0fb
commit 11e5b5752e

View File

@@ -14,7 +14,6 @@ from pathlib import Path
from typing import List, Tuple, Optional from typing import List, Tuple, Optional
import requests import requests
import configparser import configparser
import itertools
# Configure logging # Configure logging
@@ -126,14 +125,60 @@ class BackupManager:
return False return False
def get_backup_directories(self) -> List[str]: def get_backup_directories(self) -> List[str]:
"""Get all backup directories that exist""" """Collect backup targets according to backup-targets rules"""
backup_dirs = [] backup_dirs: List[str] = []
app_dirs = self.get_application_directories() app_dirs = self.get_application_directories()
for app_dir, _ in app_dirs: def parse_targets_file(targets_file: Path) -> List[str]:
backup_path = os.path.join(app_dir, "backups") """Parse backup-targets file, skipping comments and empty lines."""
if os.path.exists(backup_path) and os.path.isdir(backup_path): targets: List[str] = []
backup_dirs.append(backup_path) try:
for raw_line in targets_file.read_text(encoding="utf-8").splitlines():
line = raw_line.strip()
if not line or line.startswith("#"):
continue
targets.append(line)
except OSError as e:
warning_msg = f"Could not read backup targets file {targets_file}: {e}"
logger.warning(warning_msg)
self.warnings.append(warning_msg)
return targets
for app_dir_str, _ in app_dirs:
app_dir = Path(app_dir_str)
targets_file = app_dir / "backup-targets"
resolved_targets: List[Path] = []
if targets_file.exists():
# Read custom targets defined by the application.
for target_line in parse_targets_file(targets_file):
target_path = Path(target_line)
if not target_path.is_absolute():
target_path = (app_dir / target_path).resolve()
else:
target_path = target_path.resolve()
if target_path.exists():
resolved_targets.append(target_path)
else:
warning_msg = (
f"Backup target does not exist for {app_dir}: {target_path}"
)
logger.warning(warning_msg)
self.warnings.append(warning_msg)
else:
# Fallback to default backups directory when no list is provided.
default_target = (app_dir / "backups").resolve()
if default_target.exists():
resolved_targets.append(default_target)
else:
warning_msg = f"Default backup path does not exist for {app_dir}: {default_target}"
logger.warning(warning_msg)
self.warnings.append(warning_msg)
for target in resolved_targets:
target_str = str(target)
if target_str not in backup_dirs:
backup_dirs.append(target_str)
return backup_dirs return backup_dirs