• v2.0.9 b9342d384c

    alientim released this 2026-09-03 16:18:55 +02:00 | 0 commits to main since this release

    Eine Datei genügt

    upgrade.sh und update.sh holen sich das Release jetzt selbst. Auf einem
    System, auf dem noch nichts von dieser Fassung liegt -- und das ist bei einem
    Upgrade von 1.2.8 der Regelfall:

    curl -fsSLO https://gitea.int.eertmoed.net/alientim/tesm-license/raw/branch/main/deploy/upgrade.sh
    sudo bash upgrade.sh --app tesm-license
    

    Bisher verlangte upgrade.sh ein entpacktes Release daneben und brach sonst ab
    -- die falsche Voraussetzung für genau den Fall, für den es gedacht ist. Liegt
    das Skript doch in einem entpackten Release, wird dieses benutzt statt
    eines Downloads: wer ein Paket ausgepackt hat, will nicht, dass ungefragt ein
    anderes geladen wird. Mit --tag v2.0.9 lässt sich eine Version festlegen.

    Der Bootstrap steht wortgleich in beiden Skripten; zwei eigenständige Dateien
    können sich keine dritte teilen. Drei Tests halten das zusammen: die Blöcke
    müssen gleich sein, upgrade.sh darf kein Release daneben verlangen, und mit
    leerem PATH muss der Block das fehlende Werkzeug benennen.

    update.sh ruft install.sh nicht mehr per exec auf -- dadurch lief die
    Aufräumfalle nie, und jedes Update liess ein entpacktes Release unter /tmp
    liegen.

    Geprüft, nicht behauptet

    Die einzelne upgrade.sh hat eine echte 1.2.8 in dasselbe Verzeichnis auf
    diese Fassung gebracht: Release geladen, Clients, Zugangsdaten und die
    DHCP-Konfiguration übernommen, Dienst läuft. Die Sicherung enthält die alte
    Installation samt sqlite.db und fernet.key (Verzeichnis 0700, Passphrase
    0600), /tmp bleibt leer.

    Kleinigkeit

    opus ist aus allen Beispielen verschwunden. Das war der Name einer
    Testinstanz; seit die Installationen wie ihre Anwendung heissen, ist er in
    einer Hilfe nur ein Rätsel. In der Betriebsdoku stand dabei zweimal /opt
    statt /srv.

    Installation

    sudo bash /srv/tesm-license/deploy/update.sh tesm-license
    
    Downloads
  • v2.0.8 f062314a0a

    alientim released this 2026-09-03 14:53:39 +02:00 | 1 commits to main since this release

    Upgrade von 1.2.8 (Branch SONNET5)

    upgrade.sh findet die alte Fassung jetzt auch dann, wenn sie nicht mehr unter
    ihrem Hauptnamen liegt. Nach einem rename.sh steht unter /srv/tesm-license die
    laufende Installation und die Fassung 1.x unter /srv/tesm-license-sonnet5 --
    die Vorgabe zeigte danach auf die neue Installation und brach ab (sauber, aber
    unbrauchbar). Gesucht wird nun an beiden Orten; erkannt wird eine 1.x an der
    sqlite.db im Wurzelverzeichnis, denn diese Fassung legt ihre Datenbank unter
    data/app.db ab.

    Der Weg selbst ist gegen echte Altdaten geprüft: aus einer 1.2.8 kamen Clients,
    Zugangsdaten und die DHCP-Konfiguration in eine Probeinstallation, aus einem
    1.2.7-Lizenzserver Kunden, Tickets und neu signierte Lizenzen samt
    übernommenem Signaturschlüssel und Anbieterblock.

    sudo bash deploy/upgrade.sh --app tesm-license
    

    Installation

    sudo bash /srv/tesm-license/deploy/update.sh tesm-license
    
    Downloads
  • v2.0.7 3295583591

    alientim released this 2026-09-03 14:44:35 +02:00 | 2 commits to main since this release

    Anmeldeseite

    • Die Wortmarke steht jetzt auf beiden Anmeldeseiten -- bisher hing sie an
      der Funktionszeile, und die hatte der Lizenzserver nicht. Die Zeile darunter
      ist optional: bei TESM ÜBERWACHEN · BOOTEN · ANBINDEN, beim Lizenzserver
      LIZENZIEREN.
    • Der Kartenkopf ist weg: eine Kachel mit zwei Buchstaben, die Überschrift
      "Anmelden" und der Anwendungsname darunter sagten dasselbe wie die Marke
      darüber und der Knopf darunter.
    • Marke und Karte stehen übereinander im Fluss statt gestapelt -- auf einem
      flachen Fenster schnitt die Karte mitten durch den Schriftzug.
    • Die Marke ist kürzer, symmetrisch um die Mitte aufgebaut und hat volle
      Deckkraft (sie ist kein Wasserzeichen hinter der Karte mehr).
    • Der Farbverlauf im Hintergrund hat wieder Geometrie und Stärke der
      Fassung 1.x.
    • "Bitte melden Sie sich an." ist weg -- auf einer Seite aus Anmeldefeld,
      Passwortfeld und einem Knopf "Anmelden" sagte das nichts. Wessen Sitzung
      gerade ablief, erfährt jetzt stattdessen, warum er wieder hier ist.

    Drei Dinge, die lautlos nichts taten

    • Die Versionsnummer in der Fusszeile war falsch. __version__ stand fest
      verdrahtet in drei Dateien: angezeigt wurde vier Releases lang 2.0.2. Die
      Nummer kommt jetzt aus den Metadaten des installierten Pakets, Quelle ist
      pyproject.toml.
    • gap: var(--sp-7) -- die Skala kennt kein --sp-7. Eine undefinierte
      CSS-Variable verwirft die ganze Deklaration ohne Meldung.
    • Ein Test dagegen fand sofort --surface-0: dreimal benutzt, nie
      definiert. Die Schrift auf der Kachel "kritisch" blieb dunkelgrau auf Rot,
      die Dateivorschau hatte keinen Grund, und das Feld "Recht nicht vorhanden" in
      der Rechtematrix war durchsichtig -- also so hell wie die Karte, obwohl es
      dunkler sein sollte.

    Installation

    sudo bash /srv/tesm-license/deploy/update.sh tesm-license
    
    Downloads
  • v2.0.6 47aeaba9c8

    alientim released this 2026-09-03 14:12:44 +02:00 | 3 commits to main since this release

    Installation umbenennen

    Neu: deploy/rename.sh. Aus einer Instanz wird die Hauptinstallation (oder
    umgekehrt):

    sudo bash deploy/rename.sh --app tesm-license --from tesm-license-opus --to tesm-license
    

    Der Name steckt an mehr Stellen als im Verzeichnisnamen, und drei davon sind
    leicht zu übersehen: der SITE_KEY in der Umgebungsdatei (daraus entsteht der
    Name des Sitzungscookies), die Zertifikats- und ACME-Pfade in der Datenbank,
    und der server_name der nginx-Site -- install.sh schreibt die Site aus
    seiner Vorlage neu, sobald sich die alias-Pfade ändern, und ohne den Namen
    aus der Datenbank stehen danach zwei Sites mit server_name _ auf Port 80.

    Das venv wird verworfen und neu gebaut: seine Konsolenskripte tragen den
    absoluten Pfad im Shebang, und danach zeigt venv/bin/gunicorn auf einen
    Interpreter, den es nicht mehr gibt.

    Belegt der Zielname noch eine Installation der Fassung 1.x, wandert alles,
    was ihn belegt, in ein Archiv /srv/<ziel>-sonnet5 -- Verzeichnis, Protokolle,
    ACME-Pfad, logrotate-Datei, systemd-Units und nginx-Site. Gelöscht wird nichts.

    Ports und HTTPS bleiben wie sie waren, ein vorhandenes Zertifikat zieht mit.
    Alle angemeldeten Benutzer werden abgemeldet: das Sitzungscookie heisst
    danach anders.

    Installation

    sudo bash /srv/tesm-license/deploy/update.sh tesm-license
    
    Downloads
  • v2.0.5 d31173fa5e

    alientim released this 2026-09-03 12:48:36 +02:00 | 5 commits to main since this release

    Anmeldebanner (MOTD)

    Der Zustand der Installation steht wieder im SSH-Login-Banner:

    TESM · Lizenzserver
    
    2 Kunden · 2 Lizenzen ausgestellt
    

    Eine Tagline hat der Lizenzserver bewusst nicht: die Funktionsliste von TESM
    wäre dort falsch, und eine erfundene wäre schlimmer als keine.

    Das Banner der Fassung 1.x hing am alten Quellverzeichnis und importierte
    dafür die ganze Anwendung samt venv. Nach einem Umstieg zeigte es damit die
    Zahlen einer Datenbank, die niemand mehr füllt -- eingefroren, aber
    unverdächtig.

    Diese Fassung benutzt nur die Standardbibliothek: kein venv, kein Import
    der Anwendung, die Datenbank wird nur lesend geöffnet. Ein Lauf dauert
    Millisekunden statt eines Flask-Starts, und der Aufruf ist mit timeout 3
    abgesichert -- ein Banner darf eine Anmeldung nie blockieren.

    install.sh legt es an; ein Banner der Vorgängerfassung wird entfernt, aber
    nur, wenn es genau auf dessen motd_banner.py zeigt. Von Hand prüfen:

    sudo /usr/local/lib/tesm/tesm-motd --app tesm-license --root /srv/<name>
    

    Damit es nicht zwei Wahrheiten über "online" gibt, steht die Zählung der
    Statusübersicht jetzt an einer Stelle; das Banner trägt sie wortgleich, und ein
    Test vergleicht beide.

    Installation

    sudo bash /opt/tesm-license/deploy/update.sh tesm-license latest --instance <name>
    
    Downloads
  • v2.0.4 168d10bf87

    alientim released this 2026-09-03 12:21:39 +02:00 | 6 commits to main since this release

    Automatische Abmeldung -- jetzt wirklich

    In 2.0.3 war die Ursache nur halb behoben. Zwei Gruende, beide fuer sich
    ausreichend:

    • Eine zweite Schreibstelle. Die Sitzung wird nicht nur beim Lesen einer
      Anfrage verlängert, sondern auch beim Speichern -- und das geschieht, sobald
      eine Anfrage die Sitzung anfasst. Ein neu erzeugtes CSRF-Token genügt dafür.
      Die Prüfung an der ersten Stelle lief damit ins Leere. Sitzungsdaten werden
      weiter gespeichert, nur die Fristen bleiben stehen. Dieselbe Stelle benutzte
      ausserdem die fest eingebaute Zeit statt der einstellbaren; bei der Vorgabe
      von 30 Minuten fiel das nicht auf.
    • Ein Tab, der noch das alte Skript fährt. Die Kennzeichnung automatischer
      Anfragen kam bisher nur vom Browser -- wer seit gestern Abend angemeldet ist,
      hat die Seite seit gestern Abend nicht neu geladen und schickt sie deshalb
      nicht. Genau dieser Tab ist der Fall, um den es geht. Der Server weiss es
      jetzt ohne Zutun des Browsers: die Endpunkte, die eine Kachel oder ein
      Protokoll nachlädt, sind als Aktualisierungsausschnitt gekennzeichnet und
      gelten damit immer als automatisch.

    Dass es auf dem Lizenzserver zuverlässig funktionierte, war der entscheidende
    Hinweis: dort pollt keine Kachel.

    Ein Neuladen des Tabs ist damit nicht mehr nötig -- die Abmeldung greift
    auch bei einem Tab, der seit Stunden offen steht.

    Sichtbares Ende einer abgelaufenen Sitzung

    Die Statusübersicht antwortet auch öffentlich. Nach dem Ablauf kam deshalb eine
    200 mit den öffentlichen Kacheln zurück, und der offene Tab zeigte weiter eine
    Oberfläche, als sei alles in Ordnung. Ein zusätzlicher Kopf sagt es unabhängig
    vom Statuscode; der Browser lädt daraufhin neu und zeigt die Anmeldemaske.

    Installation

    sudo bash /opt/tesm-license/deploy/update.sh tesm-license latest --instance <name>
    
    Downloads
  • v2.0.3 2dea198bcc

    alientim released this 2026-09-03 11:43:05 +02:00 | 7 commits to main since this release

    Upgrade von der Fassung 1.x

    Neu: deploy/upgrade.sh.

    sudo bash deploy/upgrade.sh --app tesm-license
    

    Sichern -> abschalten -> installieren -> Lizenzbestand übernehmen. Der Lauf
    gegen echte Altdaten hat zwei Fehler gezeigt, die jede Übernahme unmöglich
    machten:

    • Der alte Signaturschlüssel ist URL-sicher kodiert (- und _). Das neue
      Protokoll prüft Base64 streng -- richtig so, aber beim Lesen einer alten
      Datei brach die Übernahme mit einem Traceback über "kein gültiges Base64" ab.
      Umkodiert wird jetzt an der Grenze zum Altformat; der kanonische Decoder
      bleibt streng.
    • Der Anbieterblock wurde aus den Einstellungen der neuen Installation
      gebaut, und ohne Endpunkt brach die Übernahme ab -- bei einem Upgrade steht
      dort nie etwas. Endpunkt und Anbieterdaten kommen jetzt aus der alten
      Installation, aber nur dort, wo neu nichts steht.

    Der alte Signaturschlüssel wird übernommen: sonst müsste jeder Kunde einen
    Ausstellerwechsel bestätigen (--new-key erzwingt das Gegenteil). Jede Lizenz
    wird neu signiert, und der Bericht nennt namentlich, wer eine neue Lizenzdatei
    braucht -- die Bindung an eine Maschine gilt nur für die alte Datei.

    Automatische Abmeldung -- sie hat nie ausgelöst

    Ein offener Tab fragt seine Kacheln alle 15 Sekunden neu ab, und jede
    Abfrage verlängerte das Leerlauffenster
    . Nachweisbar an einer Sitzung, deren
    last_seen_at eine Minute alt war, obwohl seit zehn Stunden niemand am Rechner
    sass. Der Browser kennzeichnet automatische Anfragen jetzt, der Server
    verlängert daraufhin nichts, und last_seen_at bleibt, was der Name sagt: der
    letzte Zeitpunkt, an dem ein Mensch da war.

    Fällt die Sitzung während des Pollens, antwortet der Server mit 401 statt mit
    einer Umleitung: der Tab lädt neu und zeigt die Anmeldemaske, statt stumm mit
    beliebig alten Zahlen stehenzubleiben.

    Ein bereits offener Tab muss einmal neu geladen werden -- bis dahin läuft
    dort noch das alte Skript.

    Audit

    Der Name einer Konsolen-Mitschrift ist jetzt ein Verweis auf die Datei. Es ist
    derselbe Weg wie zuvor, nur einen Klick weit. Verlinkt wird nur, wenn die Datei
    noch existiert und der Betrachter Protokolldateien lesen darf.

    Installation

    tar xzf tesm-license-v2.0.3.tar.gz && cd tesm-license
    sudo bash deploy/install.sh --app tesm-license --https --domain lizenz.firma.de
    

    Bestehende Installation:

    sudo bash /opt/tesm-license/deploy/update.sh tesm-license latest --instance <name>
    
    Downloads
  • v2.0.2 50da075c15

    alientim released this 2026-09-03 00:17:02 +02:00 | 8 commits to main since this release

    Oberfläche

    • Echte Umlaute in allen Texten -- Seiten und Dokumentation.
    • "Änderungen" heisst jetzt Audit; die Ampel dort ist eindeutig: Info grün,
      Hinweis orange, Warnung rot. Ein erfolgreicher Heartbeat an den Master wird
      nicht mehr protokolliert, ein fehlgeschlagener schon.
    • Der Knopf im Dateifeld ist im dunklen Thema wieder lesbar.
    • In der Rechtematrix ist dunkler jetzt nicht vorhanden -- und nicht mehr
      anhakbar.
    • Fusszeile mit Version und Rechteinhaber an einer Stelle, statt in zwei
      Vorlagen getrennt.

    Sitzung

    • Neu einstellbar: automatische Abmeldung bei Leerlauf, Vorgabe 30 Minuten
      (Systemeinstellungen). Aktivität setzt den Zähler zurück; die Zeit greift
      ohne Neustart des Dienstes.

    Sonstiges

    Der Release-Tarball liegt nicht mehr im Repository -- er hängt nur noch am
    Release, wo er hingehört.

    Aktualisierung

    update.sh funktioniert jetzt tatsächlich: die Bezugsquelle war auf einen
    Platzhalter voreingestellt, das Repository heisst jetzt wie die Anwendung, und
    alles nach dem Tag geht unverändert an install.sh weiter -- nur so lässt sich
    eine benannte Instanz aktualisieren:

    sudo bash /opt/tesm-license-opus/deploy/update.sh tesm-license latest --instance opus
    

    Ohne --instance entstünde daneben eine zweite Installation. Ausserdem bleiben
    die Ports einer bestehenden Installation erhalten: eine benannte Instanz
    fiel bisher auf 8080/8443 zurück, auch wenn sie auf Port 80 lief -- ein Reverse
    Proxy davor hätte danach ins Leere gezeigt.

    Zwei Prüfungen darin hatten nie zugegriffen: die Suche nach install.sh im
    entpackten Paket lief eine Ebene zu flach und meldete den Fehler als
    unbrauchbaren Download, und die CRLF-Prüfung rief file auf -- ein Paket, das
    auf einem schlanken Server fehlt, worauf die Prüfung stillschweigend zustimmte.

    Installation

    tar xzf tesm-license-v2.0.2.tar.gz && cd tesm-license
    sudo bash deploy/install.sh --app tesm-license --https --domain lizenz.firma.de
    sudo -u tesm-license tesm-license-admin init-key      # sofort sichern
    sudo -u tesm-license tesm-license-admin bootstrap
    sudo -u tesm-license tesm-license-admin create-admin
    

    Bestehende Installation:

    sudo bash /opt/tesm-license/deploy/update.sh tesm-license
    
    Downloads
  • v2.0.1 4bc8637a74

    alientim released this 2026-09-02 21:21:09 +02:00 | 16 commits to main since this release

    Behebt: Dateifreigaben wurden nie eingebunden ("mount error(1): Operation not permitted"). Ursache war der eigene Mount-Namensraum des Dienstes; der Mount laeuft jetzt ueber nsenter im Namensraum des Wirts und wird von dort in den Dienst weitergegeben. Die Haertung bleibt vollstaendig erhalten.

    SHA-256: 9d6ad33f9317ad3281ddc962360dc2cd36b7900267c4f4d9fda643dd4cc7a5d6

    Downloads
  • v2.0.0 6ac2ed0a62

    alientim released this 2026-09-02 18:37:40 +02:00 | 17 commits to main since this release

    Vollstaendiger Neubau. Der vorherige Stand liegt im Zweig SONNET5.

    Dieses Archiv enthaelt nur, was zum Installieren und Betreiben des Lizenzservers noetig ist -- inklusive der Serverhaelfte des Lizenzprotokolls, ohne Tests und ohne die Anwendung TESM.

    sudo bash deploy/install.sh --app tesm-license --https --domain lizenz.firma.de
    sudo -u tesm-license tesm-license-admin init-key
    sudo -u tesm-license tesm-license-admin bootstrap
    sudo -u tesm-license tesm-license-admin create-admin
    

    Den Signaturschluessel aus init-key sofort sichern.

    SHA-256: 9c19720ce943c7a7595b3afd95edd64cef236384900ab52d50b0cf7583a9d30b

    Downloads