diff --git a/apps/tesm/pyproject.toml b/apps/tesm/pyproject.toml index fff5db0..af9325b 100644 --- a/apps/tesm/pyproject.toml +++ b/apps/tesm/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm" -version = "2.8.18" +version = "2.8.19" description = "TESM -- Verwaltung und Ueberwachung von PoE-Endgeraeten und Aruba-Switchen" requires-python = ">=3.11" dependencies = [ diff --git a/apps/tesm/src/tesm/blueprints/devices.py b/apps/tesm/src/tesm/blueprints/devices.py index cf02dfb..f85e71f 100644 --- a/apps/tesm/src/tesm/blueprints/devices.py +++ b/apps/tesm/src/tesm/blueprints/devices.py @@ -411,12 +411,14 @@ def vnc_connection(device_id: int): ziel = vnc.ziel(device) if not ziel: abort(404) - with transaction(): - _audit( - conn, - "device.vnc_opened", - str(device["name"]), - f"Verbindungsdatei für {ziel}:{port}", + # Kein Eintrag in der Aenderungskette: eine Verbindungsdatei ist derselbe + # Vorgang wie die Sitzung im Browser, nur fuer einen Viewer auf dem + # Arbeitsplatz -- und sie aendert nichts. Wer zusieht, steht im laufenden + # Protokoll; das Aenderungsprotokoll bleibt die Liste der Eingriffe. + live = core().registry.get("live_log") + if live is not None: + live.info( + "vnc", f"{current_user.username} lädt die Verbindungsdatei für {device['name']}" ) return Response( vnc.verbindungsdatei( diff --git a/apps/tesm/src/tesm/blueprints/screen.py b/apps/tesm/src/tesm/blueprints/screen.py index 9cc2446..60c438f 100644 --- a/apps/tesm/src/tesm/blueprints/screen.py +++ b/apps/tesm/src/tesm/blueprints/screen.py @@ -231,19 +231,25 @@ def _strecke(ws, device_id: int) -> None: # type: ignore[no-untyped-def] except OSError as exc: ws.close(1011, f"{host}:{port} antwortet nicht ({exc}).") return + # Das Zeitlimit galt dem *Aufbau* -- danach muss es weg. + # + # ``create_connection`` setzt es an den Socket, und dort gilt es fuer jede + # weitere Leseoperation. Ein Bildschirm, auf dem sich gerade nichts tut, + # schickt sekundenlang nichts; nach sechs Sekunden Stille brach das Lesen + # mit einer Zeitueberschreitung ab, und die Sitzung war weg. Genau so + # beobachtet: Bild steht, nach fuenf bis zehn Sekunden Schluss. + gegenstelle.settimeout(None) + # Ins **laufende** Protokoll, nicht in die Aenderungskette: eine + # Bildschirmsitzung aendert nichts an der Anlage. Das Aenderungsprotokoll + # soll beantworten, wer was umgestellt hat -- wer wann zugesehen hat, + # gehoert nicht in dieselbe Liste und macht sie in einem Betrieb mit + # ein paar Dutzend Geraeten unlesbar. Sichtbar ist die Sitzung trotzdem, + # solange sie laeuft. begonnen = time.monotonic() - with extension.database.transaction(conn): - audit.log( - conn, - actor=current_user.username, - actor_id=current_user.id, - action="device.screen_opened", - target=str(device["name"]), - detail=f"Bildschirmsitzung zu {host}:{port}", - ip=client_ip(), - severity="warning", - ) + live = extension.registry.get("live_log") + if live is not None: + live.info("vnc", f"{current_user.username} öffnet den Bildschirm von {device['name']}") laeuft = threading.Event() laeuft.set() @@ -289,14 +295,8 @@ def _strecke(ws, device_id: int) -> None: # type: ignore[no-untyped-def] pass gegenstelle.close() dauer = int(time.monotonic() - begonnen) - with extension.database.session() as frisch, extension.database.transaction(frisch): - audit.log( - frisch, - actor=current_user.username, - actor_id=current_user.id, - action="device.screen_closed", - target=str(device["name"]), - detail=f"Dauer {dauer}s", - ip=client_ip(), - severity="info", + if live is not None: + live.info( + "vnc", + f"Bildschirmsitzung {device['name']} beendet ({dauer}s)", )