Wartung/Update: MODULES=most beim apt upgrade + autoremove/clean danach

_apt_upgrade_command() setzt jetzt zusaetzlich MODULES=most (initramfs-
tools) fuer den Update-Aufruf -- falls dabei ein neuer Kernel installiert
und ein initramfs neu gebaut wird, landen vorsorglich ALLE verfuegbaren
Treiber darin statt nur die per Abhaengigkeitserkennung ('dep') erkannten,
damit der Client nach einem Kernel-Wechsel zuverlaessig bootet. Am Ende
zusaetzlich 'apt-get autoremove'/'apt-get clean', damit nicht mehr
benoetigte Kernel/Pakete sowie der .deb-Cache nicht auf jedem Client
unbegrenzt Platz belegen. Live gegen einen echten Ubuntu-Client
verifiziert (Exit-Code 0, komplette Kette lief durch).
This commit is contained in:
2026-08-13 23:55:56 +02:00
parent 2a092af508
commit 0b9b92a228
+41 -4
View File
@@ -509,6 +509,30 @@ def inject_current_year():
return {"current_year": datetime.now().year}
def _read_tesm_version():
"""Liest die Versionsnummer aus VERSION (im Repo neben app.py, wird von
install.sh 1:1 nach /srv/tesm mitkopiert). Fehlt die Datei (z.B. lokale
Entwicklung ohne vollständigen Checkout), lieber "unbekannt" anzeigen
als die App deswegen abstürzen zu lassen."""
try:
with open(os.path.join(BASE_DIR, "VERSION"), "r", encoding="utf-8") as f:
return f.read().strip() or "unbekannt"
except OSError:
return "unbekannt"
TESM_VERSION = _read_tesm_version()
@app.context_processor
def inject_tesm_version():
"""Für die Versionsanzeige im Sidebar-Footer (siehe base.html) — beim
Modulimport einmalig gelesen (Neustart des Dienstes nach einem Update
erforderlich, damit eine neue Versionsnummer sichtbar wird geschieht
ohnehin bei jedem install.sh/update.sh-Lauf)."""
return {"tesm_version": TESM_VERSION}
@app.context_processor
def inject_nav():
if not current_user.is_authenticated:
@@ -6089,11 +6113,24 @@ def _apt_upgrade_command():
DEBIAN_FRONTEND=noninteractive plus --force-confdef/--force-confold
verhindern, dass ein Paket-Postinst-Skript auf eine Konfig-Datei-
Rückfrage wartet, die nie kommt (das Kommando würde sonst ohne PTY
unbeaufsichtigt hängen bleiben, bis der Timeout zuschlägt)."""
unbeaufsichtigt hängen bleiben, bis der Timeout zuschlägt).
MODULES=most (initramfs-tools) wird nur für diesen einen Aufruf per
Umgebungsvariable gesetzt, nicht dauerhaft in /etc/initramfs-tools/
initramfs.conf geändert -- falls das Update einen neuen Kernel mitbringt
und dabei ein initramfs neu gebaut wird, landen so vorsorglich ALLE
verfügbaren Treiber darin (statt nur die per "dep" erkannten), damit das
Gerät nach einem Kernel-Wechsel zuverlässig bootet, auch wenn sich z.B.
Storage-/Netzwerk-Hardware nicht sauber per Abhängigkeitserkennung
ermitteln lässt. Am Ende noch "apt-get autoremove"/"apt-get clean", damit
nicht mehr benötigte Kernel/Pakete sowie der heruntergeladene .deb-Cache
nicht auf jedem Client unbegrenzt Platz belegen."""
inner = (
"env DEBIAN_FRONTEND=noninteractive apt-get update && "
'env DEBIAN_FRONTEND=noninteractive apt-get -y '
'-o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade'
"env DEBIAN_FRONTEND=noninteractive MODULES=most apt-get update && "
'env DEBIAN_FRONTEND=noninteractive MODULES=most apt-get -y '
'-o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade && '
"env DEBIAN_FRONTEND=noninteractive apt-get -y autoremove && "
"apt-get clean"
)
return f"sudo -S -p '' bash -c {shlex.quote(inner)}"