From 0b9b92a22876d1d1b198f189a0dece75f2ba44fb Mon Sep 17 00:00:00 2001 From: alientim Date: Thu, 13 Aug 2026 23:55:56 +0200 Subject: [PATCH] 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). --- srv/tesm/app.py | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/srv/tesm/app.py b/srv/tesm/app.py index 57243ff..6a3ddc6 100644 --- a/srv/tesm/app.py +++ b/srv/tesm/app.py @@ -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)}"