|
|
@@ -47,7 +47,14 @@ def backup_custom_dir(job, instance, backup_dir):
|
|
|
|
|
|
result = subprocess.run(rsync_cmd, capture_output=True, text=True, timeout=7200)
|
|
|
log = (result.stdout + result.stderr).strip()
|
|
|
- if result.returncode != 0:
|
|
|
+ # Codes 23/24 : transfert partiel (ex. fichiers illisibles comme des
|
|
|
+ # montages rclone) — on continue avec ce qui a pu être copié plutôt
|
|
|
+ # que de faire échouer tout le job.
|
|
|
+ warning = False
|
|
|
+ if result.returncode in (23, 24):
|
|
|
+ warning = True
|
|
|
+ log = f"⚠ rsync : transfert partiel (code {result.returncode}) :\n{log}"
|
|
|
+ elif result.returncode != 0:
|
|
|
raise RuntimeError(f"rsync a échoué (code {result.returncode}) :\n{log}")
|
|
|
|
|
|
# backup.csv (requis YunoHost)
|
|
|
@@ -110,7 +117,7 @@ def backup_custom_dir(job, instance, backup_dir):
|
|
|
finally:
|
|
|
subprocess.run(["sudo", "rm", "-rf", tmpdir], check=False)
|
|
|
|
|
|
- return archive_name, log or "rsync terminé sans sortie."
|
|
|
+ return archive_name, log or "rsync terminé sans sortie.", warning
|
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
@@ -155,9 +162,15 @@ def restore_custom_dir(archive_name, backup_dir):
|
|
|
extracted_data + "/", source_path + "/"],
|
|
|
capture_output=True, text=True, timeout=7200,
|
|
|
)
|
|
|
- if result.returncode != 0:
|
|
|
+ if result.returncode in (23, 24):
|
|
|
+ log_lines.append(
|
|
|
+ f"⚠ Fichiers restaurés vers {source_path} avec transfert partiel "
|
|
|
+ f"(code {result.returncode}) : {result.stderr.strip()}"
|
|
|
+ )
|
|
|
+ elif result.returncode != 0:
|
|
|
raise RuntimeError(f"rsync restore a échoué : {result.stderr.strip()}")
|
|
|
- log_lines.append(f"Fichiers restaurés vers {source_path}.")
|
|
|
+ else:
|
|
|
+ log_lines.append(f"Fichiers restaurés vers {source_path}.")
|
|
|
|
|
|
# User système
|
|
|
user_cfg = restore_cfg.get("system_user", {})
|