# TESM-Lizenzserver Master-Lizenzserver für [TESM (TimEShepManager)](https://gitea.int.eertmoed.net/alientim/tesm) — verwaltet Kunden und deren Lizenzen, statt Netzwerkgeräte. Ursprünglich als Teil des TESM-Hauptrepos gebaut (gleiche Codebasis: Login/Benutzer/Gruppen, LDAP/AD, NGINX- und Systemeinstellungen, Live-Log/Verlauf/Auditlog, Im-/Export-Grundgerüst, das komplette Rechtesystem) und in dieses eigene Repo ausgelagert. **Das Projekt ist ausschließlich für Linux ausgelegt** (Zielsystem: eine Linux-VM, identisches Deployment-Muster wie TESM selbst). ## Kernfunktionen - **Kunden-/Lizenzübersicht** als Dashboard (Typ, Module, Ablaufdatum, Aktivierungsstatus, letzter Heartbeat) - **Lizenz-Ausstellung**: Trial/Standard/Custom/Enterprise, frei wählbare Gültigkeitsdauer, bei Custom einzeln wählbare Module - **Ed25519-signierte Lizenzdateien** (siehe `srv/tesm-license/licensing.py`) — dieselbe Datei existiert byte-identisch im TESM-Repo, da Client (TESM) und Master (dieses Repo) exakt dasselbe Signier-/ Verifikationsprotokoll sprechen müssen - **Online-Aktivierung/-Deaktivierung/-Heartbeat** über eine schlanke JSON-API (`/api/activate`, `/api/deactivate`, `/api/heartbeat`, unauthentifiziert per Design — die Signatur der Anfrage selbst ist der Berechtigungsnachweis) - **Offline-Fallback**: dieselbe Aktivierungs-/Deaktivierungs-/Heartbeat- Logik auch als manuell kopierbarer Code für Kunden ohne Netzwerkzugriff auf den Lizenzserver - **E-Mail-Versand** ausgestellter Lizenzen per Microsoft Graph (Client-Credentials-Flow, keine zusätzliche Abhängigkeit) inkl. Einrichtungsanleitung und Verbindungstest in der GUI - Eigene Bootstrap-Lizenz des Masters selbst (`create_master_license.py`, rein lokal, kein externer Super-Master nötig) ## Installation ```bash sudo ./install.sh ``` Richtet System-Pakete, die Flask-App (systemd: `tesm-license.service`) sowie nginx als Reverse-Proxy unter `/srv/tesm-license` ein. Erkennt selbstständig, ob dort bereits eine Installation existiert, und aktualisiert sie entsprechend (In-Place bei unverändertem Datenbank-Schema, sonst mit automatischem Backup + Health-Check + Rückroll bei Fehlschlag — siehe Kommentarkopf in `install.sh`). Nach der Erstinstallation: ```bash sudo /srv/tesm-license/venv/bin/python3 /srv/tesm-license/create_admin.py sudo /srv/tesm-license/venv/bin/python3 /srv/tesm-license/create_master_license.py ``` ## Update (von einem bereits installierten System aus) ```bash sudo ./update.sh # oder für eine bestimmte Version statt "latest": TESM_RELEASE_TAG=v1.0.0 sudo -E ./update.sh ``` Lädt das aktuelle Gitea-Release herunter und übergibt an `install.sh`. ## Zusammenspiel mit TESM Eine TESM-Instanz aktiviert sich gegen genau einen Lizenzserver (`master_endpoint`, in der Lizenzdatei hinterlegt). Ein Protokoll, zwei Transportwege: online automatisch per HTTPS/JSON, offline als manuell auszutauschender Code — beide Seiten nutzen dieselben Funktionen aus `licensing.py`. Details zum kryptografischen Format und Ablauf siehe die Docstrings in `srv/tesm-license/licensing.py` bzw. dem identischen Modul im [TESM-Repo](https://gitea.int.eertmoed.net/alientim/tesm).