Tickets liefen im Rechtebaum komplett ueber licenses.view/.create/.edit mit, obwohl Tickets ein eigener, gleichberechtigter Navigationspunkt neben Kunden und Lizenzen ist -- analog zu TESM, wo Clients/Switche/ Zugangsdaten trotz enger fachlicher Verwandtschaft jeweils eigene Rechte haben. Ergaenzt die im vorigen Release (v1.2.4) behobene Lizenz-Rechte-Luecke um diese zweite, gleich gelagerte Luecke. - Neues Rechtepaar tickets.view/tickets.create/tickets.edit (PERMISSIONS/PERMISSION_LABELS), Property can_manage_tickets. - Nav-Sichtbarkeit sowie tickets_list()/ticket_new()/ticket_edit()/ ticket_delete() auf das neue Recht umgestellt. - ticket_detail(): GET-Zugriff jetzt ueber can_manage_tickets. POST jetzt PRO SUB-AKTION geprueft statt eines einzigen Gates: 'toggle_block' (Sperren/Entsperren) -> tickets.edit (neu, Ticket- Domain); 'issue_license' (erstellt eine LIZENZ) bleibt bewusst unveraendert an licenses.edit gebunden, damit sich 'Tickets verwalten' und 'Lizenzen ausstellen' unabhaengig voneinander vergeben lassen, ohne dass irgendjemand automatisch die eine Faehigkeit durch die andere verliert. - tickets.html/ticket_detail.html: can_edit-Variable entsprechend in can_edit_ticket/can_issue_license aufgeteilt. - Migration (_migrated_tickets_permission_v1, einmalig geguarded): jede Gruppe mit licenses.view/.create/.edit bekommt automatisch das gespiegelte tickets.view/.create/.edit dazu -- niemand verliert beim Update stillschweigend eine Faehigkeit, die vorher implizit ueber licenses.* mitlief. - Getestet gegen isolierte Test-DB: Backfill korrekt (Gruppe mit voller Lizenz-Berechtigung bekommt volle Ticket-Berechtigung, Gruppe mit nur .view bekommt nur tickets.view), idempotent, keine Duplikate. PERMISSIONS/PERMISSION_LABELS/NAV_ITEMS erneut vollstaendig konsistent (keine Nav-Keys mehr ohne Rechte-Entsprechung), app.py syntaktisch fehlerfrei kompiliert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
TESM-Lizenzserver
Master-Lizenzserver für TESM (TimEShepManager) — 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
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:
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)
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.