bcrypt==5.0.0
blinker==1.9.0
cffi==2.0.0
click==8.3.0
cryptography==46.0.1
Flask==3.1.2
Flask-Bcrypt==1.0.1
Flask-Login==0.6.3
gunicorn==23.0.0
itsdangerous==2.2.0
Jinja2==3.1.6
ldap3==2.9.1
MarkupSafe==3.0.2
pycparser==2.23
PyYAML==6.0.2
Werkzeug==3.1.3

# Gegenueber TESM entfernt: Flask-Sock/simple-websocket (Browser-SSH-
# Terminal fuer Switche gibt es hier nicht mehr), paramiko/PyNaCl/pyasn1
# (nur fuer SSH zu Switchen/Geraeten gebraucht -- der Lizenzserver macht
# kein Geraete-Management). cffi/pycparser bleiben: cryptography selbst
# haengt (ausserhalb PyPy) von cffi ab, das wiederum pycparser braucht --
# nicht optional, auch ohne paramiko.
#
# PyYAML wird für das netplan-Backend der Host-Netzwerkeinstellungen
# gebraucht (Systemeinstellungen → Netzwerkeinstellungen) — schreibt/liest
# die eigene Override-Datei unter /etc/netplan/.
#
# ldap3 (reines Python, keine System-Bibliothek wie libldap nötig) für die
# optionale Active-Directory/LDAP-Anmeldung (Systemeinstellungen → LDAP) —
# Search+Bind gegen einen AD-Domain-Controller oder generischen LDAP-Server.
#
# gunicorn: produktiver WSGI-Server für tesm-license.service (siehe dort)
# statt Flasks eigenem app.run()-Entwicklungsserver ("WARNING: This is a
# development server..."). Ein Worker-Prozess mit mehreren Threads
# (--worker-class gthread) reicht hier aus, da der Lizenzserver — anders
# als TESM — keine langlebigen WebSocket-Verbindungen mehr offen hält.
