"""Utilities to assess basic hardware health metrics for the diagnostic tool.""" from __future__ import annotations import psutil def _safe_disk_usage_percent(path: str) -> float | None: """Return disk usage percent for path or None when path is unavailable.""" try: return psutil.disk_usage(path).percent except FileNotFoundError: return None except PermissionError: return None def _cpu_temperature_celsius() -> float | None: """Return the current CPU temperature in Celsius if available.""" temps = psutil.sensors_temperatures() if not temps: return None # Sensors differ by platform; look for common CPU entries first. for label in ("coretemp", "cpu-thermal", "cpu-therm", "k10temp", "acpitz"): entries = temps.get(label) if entries: for entry in entries: if entry.current is not None: return float(entry.current) # Fallback: return the first available temperature reading. for entries in temps.values(): for entry in entries: if entry.current is not None: return float(entry.current) return None def check_hardware() -> dict[str, float | None]: """ Gather key hardware health metrics via psutil. Returns: A dictionary containing: - cpu_usage_percent: overall CPU utilization - ram_usage_percent: RAM utilization - disk_usage_percent_ssd: disk usage on /mnt/ssd or None if unavailable - disk_usage_percent_backup: disk usage on /mnt/backup-hdd or None if unavailable - cpu_temperature_celsius: current CPU temp or None if sensors unavailable """ return { "cpu_usage_percent": psutil.cpu_percent(interval=1.0), "ram_usage_percent": psutil.virtual_memory().percent, "disk_usage_percent_ssd": _safe_disk_usage_percent("/mnt/ssd"), "disk_usage_percent_backup": _safe_disk_usage_percent("/mnt/backup-hdd"), "cpu_temperature_celsius": _cpu_temperature_celsius(), }