From f16ba7d875107be31a1dc5bb3d287750c58b3316 Mon Sep 17 00:00:00 2001 From: Tim Eertmoed Date: Wed, 9 Sep 2026 00:27:00 +0200 Subject: [PATCH] Version 2.1.2: Wurzelinstanz auch an der Lizenz erkennen --- apps/tesm/pyproject.toml | 2 +- deploy/install.sh | 40 +++++++++++++------ packages/tesm-core/pyproject.toml | 2 +- .../tesm-core/src/tesm_core/app_factory.py | 2 +- packages/tesm-licensing/pyproject.toml | 2 +- 5 files changed, 32 insertions(+), 16 deletions(-) diff --git a/apps/tesm/pyproject.toml b/apps/tesm/pyproject.toml index 2d2ba83..82a9bfc 100644 --- a/apps/tesm/pyproject.toml +++ b/apps/tesm/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm" -version = "2.1.1" +version = "2.1.2" description = "TESM -- Verwaltung und Ueberwachung von PoE-Endgeraeten und Aruba-Switchen" requires-python = ">=3.11" dependencies = [ diff --git a/deploy/install.sh b/deploy/install.sh index 6a4bd06..ea21824 100644 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -94,11 +94,11 @@ bei_fehler() { else warn "Abgebrochen (Code $code). Es gab keinen vorherigen Stand dieser Fassung," warn "also wurde nichts wiederhergestellt und nichts geloescht." - fi - # Nur sagen, was es wirklich gibt: bei einem Abbruch an der Rueckfrage - # existiert das Verzeichnis noch nicht, und die Zeile log dann. - if [[ -n "${ROOT:-}" && -d "${ROOT:-}" ]]; then - warn "Angelegt wurde bis hierhin: $ROOT (Daten unter data/ unberuehrt)." + # Nur sagen, was es wirklich gibt: bei einem Abbruch an der Rueckfrage + # existiert das Verzeichnis noch nicht. + if [[ -n "${ROOT:-}" && -d "${ROOT:-}" ]]; then + warn "Angelegt wurde bis hierhin: $ROOT (Daten unter data/ unberuehrt)." + fi fi fi return "$code" @@ -189,6 +189,9 @@ fi # beim Secure-Flag weiter unten: eine Aktualisierung nimmt nichts weg, was # nicht ausdruecklich neu gesetzt wird. ENV_FILE="$ETC_TESM/$NAME.env" +# Wo die Daten liegen, steht in der Umgebungsdatei; ohne sie beim Vorgabeort. +DATEN_DIR="$(sed -n "s/^${ENV_PREFIX}DATA_DIR=//p" "$ENV_FILE" 2>/dev/null | tail -1)" +DATEN_DIR="${DATEN_DIR:-$ROOT/data}" if [[ -z "$PORT" && -f "$ENV_FILE" ]]; then PORT="$(sed -n "s/^${ENV_PREFIX}BIND=127\.0\.0\.1:\([0-9]\{1,5\}\)$/\1/p" "$ENV_FILE" | head -1)" fi @@ -306,11 +309,28 @@ fi # Abgleich unten laeuft mit --delete und wuerde das Teilpaket entfernen. Danach # gaebe es auf dem Master keinen Weg mehr, eine Master-Lizenz auszustellen -- # und niemand haette es gesagt. -if [[ "$EDITION" == "sub" && -d "$ROOT/$MASTER_TEILPAKET" ]]; then - fail "Hier laeuft die Master-Ausgabe, dieses Paket ist die Ausgabe fuer Sub-Lizenzserver. +# Die Rolle steht in der eingespielten Lizenz. Das ist die zuverlaessigere +# Haelfte der Pruefung: eine Master-Installation aus einer aelteren Fassung +# kennt das Teilpaket noch nicht, ist aber trotzdem eine Wurzelinstanz. +ROLLE_ALT="" +if [[ "$EDITION" == "sub" && -s "$DATEN_DIR/license.json" ]]; then + ROLLE_ALT="$(python3 -c ' +import json, sys +try: + print(json.load(open(sys.argv[1])).get("role", "")) +except Exception: + pass +' "$DATEN_DIR/license.json" 2>/dev/null || true)" +fi + +if [[ "$EDITION" == "sub" && ( -d "$ROOT/$MASTER_TEILPAKET" || "$ROLLE_ALT" == "master" ) ]]; then + fail "Hier laeuft eine Wurzelinstanz${ROLLE_ALT:+ (Lizenz mit Rolle $ROLLE_ALT)}, dieses Paket + ist die Ausgabe fuer Sub-Lizenzserver. Eine Aktualisierung damit wuerde die Master-Ausgabe entfernen. Passendes Paket: Repository tesm-license-master (privat). - Bewusster Rueckbau: $ROOT/$MASTER_TEILPAKET von Hand entfernen, dann erneut." + Bewusster Rueckbau: eine vom Master ausgestellte Lizenz einspielen (Rolle + license_server) und $ROOT/$MASTER_TEILPAKET entfernen -- danach ist dies ein + Sub-Lizenzserver und dieses Paket das richtige." fi # -- Backup ------------------------------------------------------------------ @@ -676,10 +696,6 @@ fi # gleich die eigene Master-Lizenz. Bei einer Aktualisierung nichts davon -- # ein bestehender Schluessel darf nie angetastet werden. if [[ "$APP" == "tesm-license" && $IS_UPDATE -eq 0 ]]; then - # Das Datenverzeichnis steht in der Umgebungsdatei -- es muss nicht - # $ROOT/data sein, wenn jemand es dort umgestellt hat. - DATEN_DIR="$(sed -n "s/^${ENV_PREFIX}DATA_DIR=//p" "$ENV_FILE" | tail -1)" - DATEN_DIR="${DATEN_DIR:-$ROOT/data}" step "Signaturschluessel" if sudo -u "$SERVICE_USER" "/usr/local/bin/$NAME-admin" init-key; then info "Bitte die Datei $DATEN_DIR/master_signing_key.json SOFORT sichern." diff --git a/packages/tesm-core/pyproject.toml b/packages/tesm-core/pyproject.toml index 8b6838c..de32f0a 100644 --- a/packages/tesm-core/pyproject.toml +++ b/packages/tesm-core/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm-core" -version = "2.1.1" +version = "2.1.2" description = "Gemeinsames Anwendungsgeruest (Auth, RBAC, Navigation, Design-System, Migrationen) fuer TESM und TESM-Lizenzserver" requires-python = ">=3.11" dependencies = [ diff --git a/packages/tesm-core/src/tesm_core/app_factory.py b/packages/tesm-core/src/tesm_core/app_factory.py index 9935672..9283ee5 100644 --- a/packages/tesm-core/src/tesm_core/app_factory.py +++ b/packages/tesm-core/src/tesm_core/app_factory.py @@ -134,7 +134,7 @@ def create_base_app( #: Wortmarke, ohne Zeile darunter; die Marke selbst zeigen beide #: Anwendungen. auth_tagline: str = "", - app_version: str = "2.1.1", + app_version: str = "2.1.2", built_in_trusted_keys: tuple[str, ...] = (), enable_license: bool = True, template_folder: str | None = None, diff --git a/packages/tesm-licensing/pyproject.toml b/packages/tesm-licensing/pyproject.toml index ed9d056..48222e1 100644 --- a/packages/tesm-licensing/pyproject.toml +++ b/packages/tesm-licensing/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm-licensing" -version = "2.1.1" +version = "2.1.2" description = "Ed25519-basiertes Lizenz- und Aktivierungsprotokoll fuer TESM und TESM-Lizenzserver" requires-python = ">=3.11" dependencies = ["cryptography>=42"]