homelab: Images ohne Container sind kein Docker-Update; neuer Kernel heißt Neustart

Nach dem ersten echten „Alle aktualisieren“ (25.09., 8 Schritte grün):
- 9 veraltete Images, die kein Container benutzt (Basis-Images für Builds/CI),
  blieben für immer „neu“ – Arcanes Updater tauscht nur Container. Sie zählen
  jetzt nicht mehr, der Grund nennt sie als Aufräum-Hinweis.
- Proxmox legt bei Kernel-Updates kein /var/run/reboot-required an: 7.0.14-19
  war installiert, 7.0.14-12 lief, kein Neustart-Knopf. Der Ausführer vergleicht
  jetzt den neuesten installierten (oder festgepinnten) Kernel mit dem laufenden.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-09-25 11:46:26 +02:00
co-authored by Claude Opus 5.5
parent 903fbbfbb9
commit 17d4ee3ea8
3 changed files with 57 additions and 0 deletions
+17
View File
@@ -637,9 +637,26 @@ def _host() -> dict:
host["fehler"] = str(exc)[:200]
code, kernel = _laufen(["uname", "-r"], 5)
host["kernel"] = kernel if code == 0 else None
vorhanden = [os.path.basename(p)[len("vmlinuz-"):] for p in glob.glob("/boot/vmlinuz-*")]
host["kernel_neu"] = neuer_kernel(host["kernel"], vorhanden, _lesen("/etc/kernel/proxmox-boot-pin").strip() or None)
host["neustart_noetig"] = host["neustart_noetig"] or bool(host["kernel_neu"])
return host
def _versionsschluessel(version: str) -> tuple[int, ...]:
return tuple(int(x) for x in re.findall(r"\d+", version))
def neuer_kernel(laufend: str | None, vorhanden: list[str], pin: str | None = None) -> str | None:
"""Der Kernel, mit dem der Host beim nächsten Start hochkäme, wenn es nicht der laufende ist (ein festgepinnter
geht vor). Proxmox legt bei Kernel-Updates keine /var/run/reboot-required an — am 25.09.2026 war 7.0.14-19
installiert, 7.0.14-12 lief, und nichts zeigte einen Neustart an."""
if not laufend or not vorhanden:
return None
naechster = pin if pin in vorhanden else max(vorhanden, key=_versionsschluessel)
return None if naechster == laufend else naechster
def bericht() -> dict:
speicher = _speicher_liste()
arten = {s["storage"]: s.get("type") for s in speicher}