""" Fleet Status Orchestrator Collects monitoring data from all sources: - Docker containers (14 total) - WireGuard tunnel - Restic backups - Disk space - Services health Returns unified status dict for GUI/alerts. """ from typing import Dict from datetime import datetime from .docker_monitor import DockerMonitor from .tunnel_monitor import TunnelMonitor from .backup_monitor import BackupMonitor from .disk_monitor import DiskMonitor class FleetStatus: """Unified fleet monitoring""" def __init__(self): self.docker = DockerMonitor() self.tunnel = TunnelMonitor() self.backup = BackupMonitor() self.disk = DiskMonitor() def get_status(self) -> Dict: """ Get complete fleet status. Returns: { 'overall': 'healthy' | 'warning' | 'critical', 'docker': {...}, 'tunnel': {...}, 'backup': {...}, 'disk': {...}, 'timestamp': '...' } """ status = { 'docker': self.docker.check(), 'tunnel': self.tunnel.check(), 'backup': self.backup.check(), 'disk': self.disk.check(), 'timestamp': datetime.now().isoformat() } # Determine overall health status['overall'] = self._determine_overall_health(status) return status def _determine_overall_health(self, status: Dict) -> str: """ Determine overall fleet health from individual checks. Rules: - critical: if any monitor is 'critical' - warning: if any monitor is 'warning' - healthy: if all monitors are 'healthy' """ statuses = [ status['docker'].get('status', 'warning'), status['tunnel'].get('status', 'warning'), status['backup'].get('status', 'warning'), status['disk'].get('status', 'warning') ] if 'critical' in statuses: return 'critical' elif 'warning' in statuses: return 'warning' else: return 'healthy'