summaryrefslogtreecommitdiff
path: root/playbooks/roles/backup/templates/volumes/scripts/backup.py
diff options
context:
space:
mode:
authorElizabeth Hunt <me@liz.coffee>2025-10-04 16:25:00 -0700
committerElizabeth Hunt <me@liz.coffee>2025-10-04 16:25:25 -0700
commit0ba6199538478b22763cc4c768c775a9c20baac9 (patch)
treee5f97e9d382b6a869e74b0ec37670fc4cc04770c /playbooks/roles/backup/templates/volumes/scripts/backup.py
parenta59455fe4f0d06f85800117d7871496ff9fa916f (diff)
downloadinfra-0ba6199538478b22763cc4c768c775a9c20baac9.tar.gz
infra-0ba6199538478b22763cc4c768c775a9c20baac9.zip
Fix some stuff
Diffstat (limited to 'playbooks/roles/backup/templates/volumes/scripts/backup.py')
-rw-r--r--playbooks/roles/backup/templates/volumes/scripts/backup.py37
1 files changed, 31 insertions, 6 deletions
diff --git a/playbooks/roles/backup/templates/volumes/scripts/backup.py b/playbooks/roles/backup/templates/volumes/scripts/backup.py
index 8b71e0f..19dafed 100644
--- a/playbooks/roles/backup/templates/volumes/scripts/backup.py
+++ b/playbooks/roles/backup/templates/volumes/scripts/backup.py
@@ -64,7 +64,7 @@ class TaskMonitor:
self.logger = logger
self.active_tasks = {}
self.task_lock = threading.Lock()
- self.stop_monitoring = threading.Event()
+ self._stop_event = threading.Event()
self.monitor_thread = None
def start_task(self, task_id: str, description: str):
@@ -87,21 +87,21 @@ class TaskMonitor:
def start_monitoring(self):
"""Start the periodic status monitoring"""
- self.stop_monitoring.clear()
+ self._stop_event.clear()
self.monitor_thread = threading.Thread(target=self._monitor_loop, daemon=True)
self.monitor_thread.start()
self.logger.info("📊 Task monitoring started")
def stop_monitoring(self):
"""Stop the periodic status monitoring"""
- self.stop_monitoring.set()
+ self._stop_event.set()
if self.monitor_thread:
self.monitor_thread.join()
self.logger.info("📊 Task monitoring stopped")
def _monitor_loop(self):
"""Periodic monitoring loop"""
- while not self.stop_monitoring.wait(5.0): # Check every 5 seconds
+ while not self._stop_event.wait(5.0): # Check every 5 seconds
with self.task_lock:
if self.active_tasks:
now = datetime.now()
@@ -153,11 +153,31 @@ class BackupManager:
self.logger.info(f"Cleaned work directory: {self.work_dir}")
def _is_blocklisted(self, path: Path) -> bool:
- """Check if a path is in the blocklist"""
+ """Check if a path is in the blocklist
+
+ Supports multiple matching modes:
+ - Exact filename match: 'node_modules' matches any dir/file named node_modules
+ - Substring path match: '/docker/ci/' matches /mnt/ceph/docker/ci/volumes/
+ - Path component match: checks if blocked string appears in the full path
+ """
path_str = str(path)
+
for blocked in self.blocklist:
- if blocked in path_str or path.name == blocked:
+ # Exact filename/dirname match
+ if path.name == blocked:
return True
+
+ # Substring match in full path (handles partial paths like /docker/ci/)
+ if blocked in path_str:
+ return True
+
+ # Also check against path components for more flexible matching
+ # e.g. 'ci' would match /path/to/ci/something
+ path_parts = path.parts
+ for part in path_parts:
+ if part == blocked:
+ return True
+
return False
def _update_progress(self, files_copied: int, files_skipped: int, sqlite_found: Set[Path]):
@@ -588,6 +608,11 @@ class BackupManager:
)
if init_result.returncode != 0:
+ # Exit code 2 typically means repository already exists
+ if init_result.returncode == 2 and 'already exists' in init_result.stderr.lower():
+ self.logger.info(f"Borg repository already exists: {borg_repo}")
+ return
+
self.logger.error(f"Failed to initialize Borg repository: {init_result.stderr}")
raise subprocess.CalledProcessError(init_result.returncode, init_cmd)