diff --git a/backend/src/media_library_viewer_api/routers/dashboard.py b/backend/src/media_library_viewer_api/routers/dashboard.py index 4d673d6..0e73c6f 100644 --- a/backend/src/media_library_viewer_api/routers/dashboard.py +++ b/backend/src/media_library_viewer_api/routers/dashboard.py @@ -44,7 +44,7 @@ def get_monitoring_overview( ) -> dict[str, Any]: """Return one lightweight monitoring row per configured machine.""" machines = store.list_machines() - rows = [collect_machine_overview(machine) for machine in machines] + rows = [collect_machine_overview(machine, store) for machine in machines] poller = get_monitoring_poller().snapshot() enabled_count = sum(1 for machine in machines if machine.get("enabled")) logger.info("Dashboard monitoring machines=%s enabled=%s", len(machines), enabled_count) diff --git a/backend/src/media_library_viewer_api/services/monitoring_actions.py b/backend/src/media_library_viewer_api/services/monitoring_actions.py index 6709415..afd53f0 100644 --- a/backend/src/media_library_viewer_api/services/monitoring_actions.py +++ b/backend/src/media_library_viewer_api/services/monitoring_actions.py @@ -32,7 +32,7 @@ from media_library_viewer_api.services.settings_store import SettingsStore logger = logging.getLogger(__name__) -def build_machine_client(machine: dict[str, Any]): +def build_machine_client(machine: dict[str, Any], store: SettingsStore): """Build the appropriate command client for a machine definition.""" mode = str(machine.get("mode") or "local").strip().lower() if mode == "local": @@ -41,12 +41,23 @@ def build_machine_client(machine: dict[str, Any]): key_directory = str(machine.get("key_directory") or "").strip() key_name = str(machine.get("key_name") or "").strip() key_path = f"{key_directory}/{key_name}" if key_directory and key_name else None + private_key = str(machine.get("ssh_private_key") or "") + passphrase = str(machine.get("ssh_private_key_passphrase") or "") + ssh_key_id = str(machine.get("ssh_key_id") or "").strip() + if ssh_key_id: + ssh_key = store.get_ssh_key(ssh_key_id) + if ssh_key: + private_key = str(ssh_key.get("private_key") or private_key) + passphrase = str(ssh_key.get("passphrase") or passphrase) + settings = get_settings() return RemoteSSHClient( host=str(machine.get("host") or ""), username=str(machine.get("username") or ""), port=int(machine.get("port") or 22), key_filename=key_path, + private_key=private_key or None, + private_key_passphrase=passphrase or None, password=str(machine.get("password") or "") or None, known_hosts_path=str(settings.ssh_known_hosts_file), ) @@ -96,7 +107,7 @@ def run_machine_operation( ) -> Any: """Run a machine operation, record history, and optionally raise on failure.""" started = time.perf_counter() - client = build_machine_client(machine) + client = build_machine_client(machine, store) try: result = callback(client) duration_ms = int((time.perf_counter() - started) * 1000) @@ -202,7 +213,13 @@ def _summarize_metric_samples(samples: list[dict[str, Any]], field: str) -> dict } -def collect_machine_overview(machine: dict[str, Any], *, metrics_window_seconds: int = 600, metrics_limit: int = 70_000) -> dict[str, Any]: +def collect_machine_overview( + machine: dict[str, Any], + store: SettingsStore, + *, + metrics_window_seconds: int = 600, + metrics_limit: int = 70_000, +) -> dict[str, Any]: """Collect a lightweight machine overview without recording history.""" overview: dict[str, Any] = { "machine": {k: machine.get(k) for k in ("id", "name", "mode", "enabled", "host", "port", "username", "media_root", "path_prefix", "notes")}, @@ -222,7 +239,7 @@ def collect_machine_overview(machine: dict[str, Any], *, metrics_window_seconds: "disk": None, } try: - client: Any = build_machine_client(machine) + client: Any = build_machine_client(machine, store) except Exception as exc: overview["status_error"] = str(exc) overview["metrics_error"] = str(exc)