Version 2.8.21: die Seite wartet nicht mehr stumm

This commit is contained in:
alientim committed 2026-09-13 14:14:38 +02:00
1 parent 3b3ce96678
commit a528e9f3b2
3 files changed
+35 -2

No files matched your search

+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "tesm" name = "tesm"
version = "2.8.20" version = "2.8.21"
description = "TESM -- Verwaltung und Ueberwachung von PoE-Endgeraeten und Aruba-Switchen" description = "TESM -- Verwaltung und Ueberwachung von PoE-Endgeraeten und Aruba-Switchen"
requires-python = ">=3.11" requires-python = ">=3.11"
dependencies = [ dependencies = [
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "tesm-core" name = "tesm-core"
version = "2.8.10" version = "2.8.11"
description = "Gemeinsames Anwendungsgeruest (Auth, RBAC, Navigation, Design-System, Migrationen) fuer TESM und TESM-Lizenzserver" description = "Gemeinsames Anwendungsgeruest (Auth, RBAC, Navigation, Design-System, Migrationen) fuer TESM und TESM-Lizenzserver"
requires-python = ">=3.11" requires-python = ">=3.11"
dependencies = [ dependencies = [
@@ -38,6 +38,15 @@ const gescheitert = new Set();
//: RealVNC Server zaehlt abgebrochene Versuche mit -- wer dreimal anklopft, //: RealVNC Server zaehlt abgebrochene Versuche mit -- wer dreimal anklopft,
//: sperrt sich aus. //: sperrt sich aus.
const HOECHSTENS = 2; const HOECHSTENS = 2;
//: So lange darf "wird aufgebaut" stehen, bevor die Seite selbst nachsieht.
//:
//: Der Server hat eigene Grenzen und meldet sich, wenn das Geraet schweigt --
//: aber nur, wenn die Leitung dorthin ueberhaupt steht. Kommt die
//: WebSocket-Verbindung gar nicht erst zustande, wartet noVNC ohne jedes
//: Ereignis, und die Seite stuende stumm bis zum Seitenwechsel. Genau so
//: gemeldet: "Verbindung wird aufgebaut ..." und sonst nichts.
const AUFBAU_GRENZE = 12000;
// Den *Grund* eines Fehlschlags kennt nur ``_fail`` -- das Ereignis // Den *Grund* eines Fehlschlags kennt nur ``_fail`` -- das Ereignis
// "disconnect" traegt ihn nicht, und der Weg ueber die Protokollausgabe // "disconnect" traegt ihn nicht, und der Weg ueber die Protokollausgabe
// funktioniert nicht: die Bibliothek bindet ``console.error`` beim Laden, also // funktioniert nicht: die Bibliothek bindet ``console.error`` beim Laden, also
@@ -87,6 +96,7 @@ function starten(wurzel) {
); );
let rfb = null; let rfb = null;
let aufbauUhr = 0;
let versuche = 0; let versuche = 0;
let stand = false; let stand = false;
let letzterZugang = {}; let letzterZugang = {};
@@ -164,6 +174,25 @@ function starten(wurzel) {
letzterCode = 0; letzterCode = 0;
letzterZugang = zugang; letzterZugang = zugang;
versuche += 1; versuche += 1;
window.clearTimeout(aufbauUhr);
aufbauUhr = window.setTimeout(() => {
// Weder verbunden noch abgebrochen noch nach Zugangsdaten gefragt --
// dann haengt es an der Leitung, nicht am VNC-Server.
melden("Es kommt keine Antwort. Wird geprüft, woran es liegt …", "warnung");
streckeTesten().then((steht) => {
melden(
steht
? "Die WebSocket-Strecke zu TESM steht, aber die Sitzung kommt nicht " +
"zustande. Antwortet der VNC-Server auf dem Gerät noch? Ein Neustart " +
"des VNC-Dienstes räumt eine Sperre ab."
: "Die WebSocket-Verbindung zu TESM kommt nicht zustande – auch eine " +
"einfache Probe scheitert. Ein Proxy zwischen Browser und TESM muss " +
"die Kopfzeilen Upgrade und Connection durchreichen (nginx: " +
"location /ws/ mit proxy_set_header Upgrade $http_upgrade).",
"fehler",
);
});
}, AUFBAU_GRENZE);
// Was abgerissen ist, wird nicht noch einmal gewaehlt. Sonst faende noVNC // Was abgerissen ist, wird nicht noch einmal gewaehlt. Sonst faende noVNC
// dasselbe Verfahren wieder zuerst -- und der zweite Anlauf waere eine // dasselbe Verfahren wieder zuerst -- und der zweite Anlauf waere eine
@@ -185,6 +214,7 @@ function starten(wurzel) {
rfb.focusOnClick = true; rfb.focusOnClick = true;
rfb.addEventListener("connect", () => { rfb.addEventListener("connect", () => {
window.clearTimeout(aufbauUhr);
stand = true; stand = true;
melden(`Verbunden mit ${wurzel.dataset.ziel}`, "ok"); melden(`Verbunden mit ${wurzel.dataset.ziel}`, "ok");
abfrage.hidden = true; abfrage.hidden = true;
@@ -194,6 +224,7 @@ function starten(wurzel) {
}); });
rfb.addEventListener("disconnect", (ereignis) => { rfb.addEventListener("disconnect", (ereignis) => {
window.clearTimeout(aufbauUhr);
leinwand.hidden = true; leinwand.hidden = true;
knopfTrennen.hidden = true; knopfTrennen.hidden = true;
knopfStrg.hidden = true; knopfStrg.hidden = true;
@@ -236,6 +267,7 @@ function starten(wurzel) {
}); });
rfb.addEventListener("credentialsrequired", (ereignis) => { rfb.addEventListener("credentialsrequired", (ereignis) => {
window.clearTimeout(aufbauUhr);
const gefragt = ereignis.detail.types || ["password"]; const gefragt = ereignis.detail.types || ["password"];
abfrage.hidden = false; abfrage.hidden = false;
feldBenutzer.closest("label").hidden = !gefragt.includes("username"); feldBenutzer.closest("label").hidden = !gefragt.includes("username");
@@ -244,6 +276,7 @@ function starten(wurzel) {
}); });
rfb.addEventListener("securityfailure", (ereignis) => { rfb.addEventListener("securityfailure", (ereignis) => {
window.clearTimeout(aufbauUhr);
melden( melden(
`Anmeldung abgelehnt: ${ereignis.detail.reason || "kein Grund genannt"}`, `Anmeldung abgelehnt: ${ereignis.detail.reason || "kein Grund genannt"}`,
"fehler", "fehler",