diff options
Diffstat (limited to 'playbooks')
| -rw-r--r-- | playbooks/roles/backup/templates/stacks/docker-compose.yml | 2 | ||||
| -rw-r--r-- | playbooks/roles/backup/templates/volumes/scripts/backup.py | 37 |
2 files changed, 32 insertions, 7 deletions
diff --git a/playbooks/roles/backup/templates/stacks/docker-compose.yml b/playbooks/roles/backup/templates/stacks/docker-compose.yml index 9089a8a..85b9c6c 100644 --- a/playbooks/roles/backup/templates/stacks/docker-compose.yml +++ b/playbooks/roles/backup/templates/stacks/docker-compose.yml @@ -4,7 +4,7 @@ services: volumes: - "{{ swarm_base }}:/mnt/source:ro" - "{{ backup_base }}/volumes/backups:/backups" - - "{{ backup_base }}/volumes/work:/work" + - "/var/backups/work:/work" - "{{ backup_base }}/volumes/scripts:/scripts" {% if borg_repo.startswith('ssh://') %} - "{{ backup_base }}/volumes/ssh:/root/.ssh:ro" 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) |
