Umlaute in der Oberflaeche, Sitzungskopplung, Statusanzeigen

Echte Umlaute in allen Texten der Oberflaeche und in den Markdown-Dateien.
Die Einbindung von Dateifreigaben haengt jetzt an der Sitzung: wird sie
widerrufen oder laeuft sie ab, verschwinden die Freigaben mit ihr. Neu
einstellbar ist die automatische Abmeldung bei Leerlauf (Vorgabe 30 Minuten).
Ein Geraet, das nicht antwortet, bietet nur noch "Einschalten (PoE)" an --
Neustart ueber SSH oder RPC braucht ein erreichbares Geraet. Der Zeitgeber der
naechsten Pruefung und die Restlaufzeit der Lizenz stehen jetzt oben in der
Kopfzeile; der doppelte Knopf darunter ist weg. Millisekunden werden ab einer
Sekunde als Sekunden und ab einer Minute als m:ss dargestellt.

Ausserdem: Release-Tarball nicht mehr im Repository -- er haengt am Release.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-02 23:54:33 +02:00
co-authored by Claude Opus 5
parent 9a760274f8
commit fbbf8eb87b
68 changed files with 1235 additions and 691 deletions
+34 -34
View File
@@ -1,12 +1,12 @@
# TESM
Verwaltung von PoE-Geraeten und Aruba-Switchen: Inventar, Zustandsueberwachung,
Portsteuerung, Neustart (PoE, SSH, RPC), DHCP ueber Kea, Dateifreigaben,
Wartung ueber SSH, Protokolle, Papierkorb, verschluesselte Ein- und Ausfuhr und
Verwaltung von PoE-Geräten und Aruba-Switchen: Inventar, Zustandsüberwachung,
Portsteuerung, Neustart (PoE, SSH, RPC), DHCP über Kea, Dateifreigaben,
Wartung über SSH, Protokolle, Papierkorb, verschlüsselte Ein- und Ausfuhr und
ein SSH-Terminal im Browser.
**Dieses Repository enthaelt genau das, was zum Installieren und Betreiben von
TESM gebraucht wird** -- nichts darueber hinaus:
**Dieses Repository enthält genau das, was zum Installieren und Betreiben von
TESM gebraucht wird** -- nichts darüber hinaus:
```
apps/tesm die Anwendung
@@ -16,7 +16,7 @@ deploy/ install.sh, update.sh, release.sh, systemd, privileg
docs/ Betrieb und Sicherheit
```
Die Serverhaelfte des Lizenzprotokolls (`tesm-licensing-server`: ausstellen,
Die Serverhälfte des Lizenzprotokolls (`tesm-licensing-server`: ausstellen,
erneuern, Antworten signieren) liegt **nicht** hier. TESM verifiziert Lizenzen
und stellt Anfragen; den Code zum Ausstellen soll ein Client nicht einmal
mitbringen.
@@ -31,7 +31,7 @@ mitbringen.
| Zweig | Inhalt |
|---|---|
| `main` | dieser Neubau (Version 2.0.0) |
| `SONNET5` | der Stand davor, unveraendert aufbewahrt |
| `SONNET5` | der Stand davor, unverändert aufbewahrt |
---
@@ -43,9 +43,9 @@ sudo -u tesm tesm-admin create-admin
```
Danach `https://<host>/`. Ohne `--domain` entsteht ein selbstsigniertes
Zertifikat; der Browser warnt einmal, die Verbindung ist verschluesselt.
Zertifikat; der Browser warnt einmal, die Verbindung ist verschlüsselt.
Mit oeffentlichem Namen und Let's Encrypt stattdessen:
Mit öffentlichem Namen und Let's Encrypt stattdessen:
```bash
sudo bash deploy/install.sh --app tesm --https --domain tesm.firma.de --acme-email it@firma.de
@@ -54,16 +54,16 @@ sudo bash deploy/install.sh --app tesm --https --domain tesm.firma.de --acme-ema
Zielzustand: **Port 443 mit TLS, Port 80 leitet dorthin um** -- ausser dem
ACME-Pfad, der erreichbar bleiben muss, sonst kann Let's Encrypt nie erneuern.
Sitzt ein eigener Reverse Proxy davor, der TLS beendet, laeuft TESM ohne
Sitzt ein eigener Reverse Proxy davor, der TLS beendet, läuft TESM ohne
`--https` schlicht auf Port 80.
Eine zweite Installation zum Testen stoert die laufende nicht:
Eine zweite Installation zum Testen stört die laufende nicht:
```bash
sudo bash deploy/install.sh --app tesm --instance test --port 5100 --http-port 8080
```
Jede Instanz bekommt eigene Datenbank, eigene Schluessel, eigene nginx-Site und
Jede Instanz bekommt eigene Datenbank, eigene Schlüssel, eigene nginx-Site und
ein eigenes Sitzungscookie.
### Aktualisieren
@@ -72,9 +72,9 @@ ein eigenes Sitzungscookie.
sudo bash deploy/update.sh --app tesm
```
Das laedt ein Release, entpackt es und ruft dessen `install.sh` auf. Vor jedem
Update entsteht ein vollstaendiges Backup -- unabhaengig davon, ob sich das
Schema geaendert hat -- und danach laeuft ein Health-Check mit automatischem
Das lädt ein Release, entpackt es und ruft dessen `install.sh` auf. Vor jedem
Update entsteht ein vollständiges Backup -- unabhängig davon, ob sich das
Schema geändert hat -- und danach läuft ein Health-Check mit automatischem
Rollback.
---
@@ -83,15 +83,15 @@ Rollback.
```bash
sudo -u tesm tesm-admin status # Zustand der Installation
sudo -u tesm tesm-admin create-admin # Konto anlegen oder zuruecksetzen
sudo -u tesm tesm-admin check-now # Ueberwachungsdurchlauf sofort
sudo -u tesm tesm-admin housekeeping # Sitzungen und Protokolle aufraeumen
sudo -u tesm tesm-admin create-admin # Konto anlegen oder zurücksetzen
sudo -u tesm tesm-admin check-now # Überwachungsdurchlauf sofort
sudo -u tesm tesm-admin housekeeping # Sitzungen und Protokolle aufräumen
sudo -u tesm tesm-admin web-setup --https # nginx und TLS einrichten
```
### Umzug aus dem alten TESM
Ein Export des Vorgaengers laesst sich uebersetzen und dann ueber den normalen
Ein Export des Vorgängers lässt sich übersetzen und dann über den normalen
Import einlesen -- Clients, Switche, Zugangsdaten und die DHCP-Konfiguration:
```bash
@@ -100,11 +100,11 @@ sudo -u tesm tesm-admin convert-legacy tesm_export_20260813_195455.json --dry-ru
`--dry-run` zeigt nur den Bericht. Ohne die Option entsteht eine Datei im
neuen Format, die unter *Verwaltung -> Sicherung* eingelesen wird. Der Bericht
nennt ausdruecklich, was **nicht** uebersetzt werden kann (lokale Konten,
nennt ausdrücklich, was **nicht** übersetzt werden kann (lokale Konten,
Rechte, Verzeichnisdienst, Webserver) -- das ist von Hand nachzuziehen.
Die Passphrase gehoert an die verdeckte Eingabeaufforderung. `--passphrase`
existiert nur fuer Automatisierung: es schreibt sie in Shell-Historie und
Die Passphrase gehört an die verdeckte Eingabeaufforderung. `--passphrase`
existiert nur für Automatisierung: es schreibt sie in Shell-Historie und
Prozessliste.
---
@@ -135,20 +135,20 @@ Entwicklungsrepository, ebenso die Tests.
## Was diese Fassung anders macht
Ein Neubau. Die Fehler des Vorgaengers sind bekannt; an den Stellen, an denen
sie entstanden sind, steht jetzt ein Kommentar, der erklaert, warum es hier
anders geloest ist. Die wichtigsten:
Ein Neubau. Die Fehler des Vorgängers sind bekannt; an den Stellen, an denen
sie entstanden sind, steht jetzt ein Kommentar, der erklärt, warum es hier
anders gelöst ist. Die wichtigsten:
* **Kein root fuer die Anwendung.** Ein einziger allowlisted Helfer mit
Argumentpruefung statt eines Webprozesses als `root`.
* **CSRF-Schutz ueberhaupt.** Der Vorgaenger hatte keinen.
* **Rechte werden serverseitig geprueft**, nicht nur im Template ausgeblendet.
* **Kein root für die Anwendung.** Ein einziger allowlisted Helfer mit
Argumentprüfung statt eines Webprozesses als `root`.
* **CSRF-Schutz überhaupt.** Der Vorgänger hatte keinen.
* **Rechte werden serverseitig geprüft**, nicht nur im Template ausgeblendet.
* **Die nginx-Site wird bei jedem Lauf inhaltlich verglichen und erneuert.** Ein
falscher `alias`-Pfad ueberlebte im Vorgaenger jahrelang jedes Update.
* **Jede erzeugte Konfiguration wird vor dem Uebernehmen geprueft** -- nginx wie
Kea. Eine fehlerhafte Datei faellt beim Schreiben auf, nicht erst beim
naechsten Start des Dienstes.
falscher `alias`-Pfad überlebte im Vorgänger jahrelang jedes Update.
* **Jede erzeugte Konfiguration wird vor dem Übernehmen geprüft** -- nginx wie
Kea. Eine fehlerhafte Datei fällt beim Schreiben auf, nicht erst beim
nächsten Start des Dienstes.
* **Kein Hostname im Lizenz-Fingerabdruck.** Umbenennen brach die Bindung.
* **Zwei Installationen stoeren sich nicht** -- eigener `SITE_KEY` fuer
* **Zwei Installationen stören sich nicht** -- eigener `SITE_KEY` für
nginx-Site, netplan, logrotate, Zertifikate und Sitzungscookie.
* **Verschachtelte Datenbankverbindungen sind ein Fehler**, kein Deadlock.