Files
mission-control-v2/backend/services/homelab/platten.py
T
HitonabiandClaude Opus 5.5 904598031a Später · 18 Plattengesundheit: Proxmox-Host, NAS über SNMP, NVMe der KI-Box
- kern/platten.py: SMART aus pvesh, smartctl und SNMP in einer Form; rot bei SMART FAILED, kritischer Warnung,
  aufgebrauchter Reserve, ≥ 90 % verbraucht; gelb bei ≥ 80 %, Hitze, gewachsenen Fehlerzählern (Ausgangslage je
  Platte, „Zur Kenntnis genommen“ setzt sie neu)
- Ausführer: stündlich disks/list + disks/smart im Bericht (nur lesend)
- services/homelab/nas_snmp.py: kleiner SNMPv2c-GetBulk-Leser ohne neue Abhängigkeit, QNAP hdTable/diskTable,
  Zugang 0600, Einstellungen „Verbindung testen und speichern“
- services/platten.py: NVMe der KI-Box über sudo smartctl (smartmontools am 26.09. nachinstalliert)
- Wächter beider Rollen, Plattenfeld in beiden Cockpits, Doku

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 09:54:38 +02:00

47 lines
2.0 KiB
Python

"""Plattengesundheit im Homelab (Ausbauplan „Später“, Punkt 18, seit 26.09.2026): die Platten des Proxmox-Hosts
(Ausführer, stündlich im Bericht) und die des NAS (SNMP, services/homelab/nas_snmp.py), bewertet mit kern/platten.py.
Der Wächter meldet nur, was schlecht ist oder schlechter wird; „Zur Kenntnis genommen“ macht die heutigen
Fehlerzähler zur neuen Ausgangslage.
"""
from kern import platten as kern_platten
from services.homelab import kanal, nas_snmp
def host_platten() -> list[dict]:
host = ((kanal.bericht() or {}).get("bericht") or {}).get("host") or {}
return [kern_platten.aus_proxmox(e.get("disk") or {}, e.get("smart")) for e in host.get("platten") or []
if isinstance(e, dict) and isinstance(e.get("disk"), dict)]
def lage() -> dict:
"""Für GET /api/homelab/platten."""
nas = nas_snmp.stand()
platten = kern_platten.bewertet(host_platten() + list(nas.get("platten") or []))
return {"platten": platten, "nas": {"eingerichtet": nas["eingerichtet"], "ok": nas.get("ok", False),
"detail": nas.get("detail"), "system": nas.get("system")}}
def hinnehmen(pid: str) -> dict:
return kern_platten.hinnehmen(pid, host_platten() + list(nas_snmp.stand().get("platten") or []))
def pruefe_platten_gesundheit() -> list:
"""Für den Wächter (Rolle homelab)."""
from services.waechter import Befund, _aktion
befunde = []
for p in lage()["platten"]:
if p["stufe"] == "ok":
continue
fehler = any("→" in s for s in p["saetze"])
befunde.append(Befund(
id=f"platte:{p['id']}", stufe=p["stufe"], titel=kern_platten.befund_titel(p),
text="; ".join(p["saetze"]) + ". Die Daten darauf sichern und die Platte bald ersetzen, wenn es weiter "
"schlechter wird.",
quelle=p["id"].split(":")[0] if p["id"].startswith("nas:") else "pve",
aktionen=[_aktion("hinnehmen", "Zur Kenntnis genommen", platte=p["id"])] if fehler else [],
sofort=True))
return befunde