Baut auf licensing.py (Phase 0) auf und schaltet TESM erstmals auf ein
lizenziertes Modulmodell um. Standard-Funktionen (Dashboard, Clients,
Switche, Zugangsdaten, Benutzer, Gruppen, Auditlog, Live-Log, Verlauf,
Import) bleiben immer frei nutzbar.
- license_active()/module_licensed()-Gate-Funktionen + In-Memory-
Lizenzcache (_load_license, _write_license_file, _delete_license_file),
Jinja-Globals fuer Templates.
- Vollstaendige Module (DHCP inkl. Kea-Log, Fileshare, Wartung) werden ohne
passendes Modul in der Lizenz komplett aus der Navigation ausgeblendet
(_nav_key_visible) UND serverseitig auf Routenebene abgewiesen
(_require_module) -- ein direkter URL-Aufruf hilft nicht.
- 'Sichtbar, aber ohne Lizenz inaktiv': LDAP- und NGINX-Einstellungen,
Papierkorb-Bearbeiten, Export sowie das Pruefintervall-Feld (aus dem
gemeinsamen Systemeinstellungen-Gate herausgeloest, Hostname/Zeitzone/
Netzwerk/Logs bleiben frei) zeigen ohne Lizenz einen Hinweis statt der
Aktion.
- Export bleibt als bewusste Ausnahme auch im lizenzlosen Zustand nutzbar,
wenn dieser durch eine selbst ausgeloeste Deaktivierung (Systemwechsel)
entstanden ist (license_export_grace).
- Automatischer PoE-Neustart bei Ausfall wird in poe.sh (nicht in Python)
gegatet -- einmal pro Schleifendurchlauf gelesen, an check_device()
durchgereicht; der manuelle Neustart-Button (devices.restart) bleibt
komplett unangetastet.
- Topbar-Lizenzanzeige (Prioritaet: fehlt > abgelaufen > laeuft in <=30
Tagen ab > Heartbeat seit >=14 Tagen ausgeblieben (rein informativ) >
alles ok), eigene CSS-Blink-Varianten fuer Rot/Orange (die vorhandene
pulse-dot-Animation war fest auf Gruen verdrahtet).
- Neue Settings-Unterseite 'Lizenz': Status, Lizenzdatei-Upload, Online-
Aktivierung/-Deaktivierung mit automatischem Fallback auf einen manuell
auszutauschenden Code (ein Protokoll, zwei Transportwege, siehe
licensing.py), Anbieter-Kontaktkarte.
- 6-stuendiger Heartbeat-Hintergrundthread (_license_heartbeat_loop, exakt
nach dem Vorbild von _audit_archive_loop).
Isoliert auf dem Testsystem (192.168.82.51) verifiziert: alle fuenf
Topbar-/Sichtbarkeitszustaende (keine/gueltige/bald ablaufende/abgelaufene/
heartbeat-stale Lizenz) per Playwright durchgespielt, kompletter Online-
Fallback-auf-Offline-Code-Austausch fuer Aktivierung UND Deaktivierung
gegen einen simulierten Master erfolgreich durchlaufen (inkl. Export-
Grace-Ausnahme nach Deaktivierung).
Bewusst NICHT nach main gemergt/getaggt/ausgerollt: ohne den in Phase 2
noch zu bauenden Master-Lizenzserver kann POETEST noch keine echte Lizenz
beziehen -- ein Rollout jetzt wuerde dort DHCP/Fileshare/Wartung/LDAP/
NGINX/Papierkorb/Export/automatischen Neustart sofort abschalten. Bleibt
auf dev, bis Phase 2 (Master) + Phase 3 (POETEST-Enterprise-Lizenz) so
weit sind, dass beides zusammen ausgerollt werden kann.
Teil des Lizenz-/Modulsystems, siehe Plan toasty-twirling-hickey.md
(Phase 1 von 3).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>