backups: в нотификацию попадают все забекапленные приложения
- список строится по backup-targets, а не только по успешным скриптам дампа, поэтому приложения с бекапом одних данных (calibre, goatcounter, tududi, tuwunel) больше не теряются - отсутствие backup.sh при наличии backup-targets — штатный случай, теперь это info, а warning остался только когда бекапить нечего вообще
This commit is contained in:
+28
-13
@@ -438,7 +438,7 @@ class BackupManager:
|
||||
):
|
||||
self.errors: List[str] = []
|
||||
self.warnings: List[str] = []
|
||||
self.successful_backups: List[str] = []
|
||||
self.backed_up_apps: List[str] = []
|
||||
self.config = config
|
||||
self.storages = storages
|
||||
self.notifiers = notifiers
|
||||
@@ -468,17 +468,33 @@ class BackupManager:
|
||||
for app in applications:
|
||||
app_dir = str(app.path)
|
||||
username = app.owner
|
||||
logger.info(f"Processing backup for app: {app_dir} (user {username})")
|
||||
app_name = app.path.name
|
||||
|
||||
if app.backup_script is None:
|
||||
warning_msg = (
|
||||
f"No backup script found for app: {app_dir} (user {username})"
|
||||
)
|
||||
logger.warning(warning_msg)
|
||||
self.warnings.append(warning_msg)
|
||||
if app.backup_targets:
|
||||
# Приложение без дампа: restic забирает его данные как есть,
|
||||
# отдельный шаг архивации ему не нужен.
|
||||
logger.info(
|
||||
f"No backup script for app: {app_dir} (user {username}), "
|
||||
f"data directories go to restic as is"
|
||||
)
|
||||
self.backed_up_apps.append(app_name)
|
||||
else:
|
||||
warning_msg = (
|
||||
f"Nothing to back up for app: {app_dir} (user {username}): "
|
||||
f"no backup script and no backup targets"
|
||||
)
|
||||
logger.warning(warning_msg)
|
||||
self.warnings.append(warning_msg)
|
||||
continue
|
||||
|
||||
self._run_app_backup(str(app.backup_script), app_dir, username)
|
||||
logger.info(f"Processing backup for app: {app_dir} (user {username})")
|
||||
if not self._run_app_backup(str(app.backup_script), app_dir, username):
|
||||
continue
|
||||
# Дамп сделан, но в restic он попадёт только если есть цели бекапа;
|
||||
# об их отсутствии уже предупредил ApplicationFinder.
|
||||
if app.backup_targets:
|
||||
self.backed_up_apps.append(app_name)
|
||||
else:
|
||||
logger.info("Backup phase not active, skipping per-app archive scripts")
|
||||
self.archive_duration = time.monotonic() - archive_start
|
||||
@@ -567,7 +583,6 @@ class BackupManager:
|
||||
|
||||
if result.returncode == 0:
|
||||
logger.info(f"Backup script for {username} completed successfully")
|
||||
self.successful_backups.append(username)
|
||||
return True
|
||||
else:
|
||||
error_msg = f"Backup script {script_path} failed with return code {result.returncode}"
|
||||
@@ -597,15 +612,15 @@ class BackupManager:
|
||||
if success and not self.errors:
|
||||
title = f"{host}: бекап успешно завершен"
|
||||
message = f"<p><b>{host}</b>: бекап успешно завершен!</p>"
|
||||
if self.successful_backups:
|
||||
items = "".join(f"<li>{b}</li>" for b in self.successful_backups)
|
||||
if self.backed_up_apps:
|
||||
items = "".join(f"<li>{b}</li>" for b in self.backed_up_apps)
|
||||
message += f"<p>Успешные бекапы:</p><ul>{items}</ul>"
|
||||
else:
|
||||
title = f"{host}: бекап завершен с ошибками ({len(self.errors)})"
|
||||
message = f"<p><b>{host}</b>: бекап завершен с ошибками!</p>"
|
||||
|
||||
if self.successful_backups:
|
||||
items = "".join(f"<li>{b}</li>" for b in self.successful_backups)
|
||||
if self.backed_up_apps:
|
||||
items = "".join(f"<li>{b}</li>" for b in self.backed_up_apps)
|
||||
message += f"<p>✅ Успешные бекапы:</p><ul>{items}</ul>"
|
||||
|
||||
if self.warnings:
|
||||
|
||||
Reference in New Issue
Block a user