homelab: alte Kernel per Knopf entfernen; Systemplatte des Proxmox-Hosts im Blick

User-Wunsch 25.09.: Auf dem Host lagen 25 Kernel (~23 GB), 20 davon hält apt für
entbehrlich (19,7 GB).
- Ausführer: host.kernel_alt/kernel_bleiben aus apt-get -s autoremove (nur
  Kernel, nie laufender, nächster oder festgepinnter), host.systemplatte;
  neue Aktion kernel_aufraeumen bestimmt die Liste selbst und purgt.
- Homelab-Teil: Lauf „kernel“ (Ergebnis aufgeraeumt), POST
  /api/homelab/ziele/pve/kernel-aufraeumen, Vorschlag mit Knopf, Wächter für die
  Systemplatte (80/90 %).
- Oberfläche: Kachel Systemplatte, Knopf „Alte Kernel entfernen“ mit Rückfrage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-09-25 12:16:14 +02:00
co-authored by Claude Opus 5.5
parent 28888890ec
commit 7a456c8efa
36 changed files with 377 additions and 60 deletions
+32
View File
@@ -148,6 +148,8 @@ def _ausfuehrer_spielen(stopp: threading.Event, neue_version: str, protokoll: li
text = ""
if auftrag["aktion"] == "snapshot":
text = "snapshot=mc2-20260924-190000"
elif auftrag["aktion"] == "kernel_aufraeumen":
text = "entfernt=20\nfrei=18300000000\nRemoving proxmox-kernel-6.17.2-1-pve-signed …"
elif auftrag["aktion"] == "bericht":
neu = json.loads(json.dumps(BERICHT))
next(g for g in neu["gaeste"] if g["vmid"] == 104)["app"]["version"] = neue_version
@@ -451,3 +453,33 @@ def test_neuer_kernel_heisst_neustart(daten):
host = {b["id"]: b for b in next(z for z in inventar.ziele()["ziele"] if z["id"] == "pve")["bausteine"]}
assert host["neustart"]["grund"] == "Neuer Kernel 7.0.14-19-pve ist installiert, es läuft noch 7.0.14-12-pve."
assert host["neustart"]["aktion"]["label"] == "Jetzt neu starten"
def test_alte_kernel_nur_auf_knopfdruck(ausfuehrer):
"""25.09.2026: 25 Kernel auf dem Host, 20 davon hielt apt für entbehrlich."""
starten, protokoll, meldungen, verlauf = ausfuehrer
starten("1.27.3")
lauf = _auf_ende(updates.starten("pve", "kernel")["lauf"])
assert (lauf["ergebnis"], protokoll) == ("aufgeraeumt", ["kernel_aufraeumen", "bericht"])
assert meldungen[-1] == ("Proxmox-Host: 20 alte Kernel entfernt, 18,3 GB frei geworden.", False)
assert verlauf[-1][2:4] == ("pve", "aufgeraeumt")
from services.homelab import protokoll as prot
assert prot._lauf(lauf, lambda *a: None) is None or True # Titel-Zweig existiert (kein KeyError)
def test_ausfuehrer_waehlt_alte_kernel_selbst():
a = _ausfuehrer_modul()
simulation = """NOTE: This is only a simulation!
Reading package lists...
The following packages will be REMOVED:
proxmox-kernel-6.14.11-2-pve-signed proxmox-kernel-7.0.14-12-pve-signed libfoo1
Remv proxmox-kernel-6.14.11-2-pve-signed [6.14.11-2]
Remv proxmox-kernel-7.0.14-12-pve-signed [7.0.14-12]
Remv proxmox-kernel-7.0.14-5-pve-signed [7.0.14-5]
Remv proxmox-kernel-6.17 [6.17.13-21]
Remv libfoo1 [1.2-3]
Remv pve-kernel-6.8.12-4-pve [6.8.12-4]
"""
behalten = {"7.0.14-12-pve", "7.0.14-19-pve"}
assert a.alte_kernel(simulation, behalten) == [
"proxmox-kernel-6.14.11-2-pve-signed", "proxmox-kernel-7.0.14-5-pve-signed", "pve-kernel-6.8.12-4-pve"]
+24
View File
@@ -239,3 +239,27 @@ def test_schnittstelle(monkeypatch):
assert daten["bericht"] is True and daten["pools"][0]["stufe"] == "ok"
assert daten["nas"][0]["erreichbar"] is True and daten["sicherungen"]["stufe"] == "ok"
assert daten["empfehlungen"][0]["art"] == "trim-vm"
def test_alte_kernel_mit_knopf_und_systemplatte(monkeypatch):
b = _bericht()
b["host"].update(
kernel_alt=[{"paket": f"proxmox-kernel-6.17.{i}-1-pve-signed", "version": f"6.17.{i}-1-pve", "groesse": 915_000_000}
for i in range(20)],
kernel_bleiben=["6.14.8-2-pve", "6.17.13-21-pve", "7.0.14-12-pve", "7.0.14-19-pve"],
systemplatte={"belegt": 47_000_000_000, "gesamt": 94_000_000_000})
tipps = speicher.empfehlungen(b)
assert [t["art"] for t in tipps] == ["trim-vm", "kernel", "trim", "snapshot"]
kernel = tipps[1]
assert kernel["titel"] == "Proxmox-Host: 20 alte Kernel entfernen" and kernel["platz"] == 18_300_000_000
assert kernel["ort"] == "systemplatte" and kernel["aktion"]["pfad"] == "/api/homelab/ziele/pve/kernel-aufraeumen"
assert "es bleiben 6.14.8-2, 6.17.13-21, 7.0.14-12, 7.0.14-19" in kernel["text"]
assert speicher.systemplatte(b)["stufe"] == "ok"
# Die Systemplatte läuft voll: eigener Hinweis mit dem Kernel-Vorschlag; der Pool-Hinweis nennt ihn nicht.
b["host"]["systemplatte"]["belegt"] = 80_000_000_000
b["host"]["pools"][0]["belegt"] = int(b["host"]["pools"][0]["gesamt"] * 0.95)
monkeypatch.setattr(speicher, "antwortet", lambda s, p: True)
monkeypatch.setattr(speicher, "_bericht", lambda: b)
befunde = {x.id: x for x in speicher.pruefe_speicher(JETZT)}
assert befunde["host-platte"].stufe == "gelb" and "18 GB alte Kernel auf dem Proxmox-Host" in befunde["host-platte"].text
assert "Kernel" not in befunde["pool:local-lvm"].text