Dreizehn rote Pruefungen, eine Ursache: openssl steht nicht im PATH

DER BEFUND

Im naechtlichen Lauf standen dreizehn Pruefungen mit derselben Zeile
rot:

    [uncaughtException] Error: spawnSync openssl ENOENT

Kein Programmfehler. Die Pruefungen brauchen einen https-Vorbau (der
Sitzungskeks des Hauses ist `secure` und kommt ueber http nicht an),
und dafuer erzeugen sie ein Wegwerf-Zertifikat mit openssl.

GEMESSEN, NICHT VERMUTET

  openssl liegt hier:   C:\Program Files\Git\mingw64\bin\openssl.exe
                        C:\Program Files\Git\usr\bin\openssl.exe
  im System-PATH steht: C:\Program Files\Git\cmd   (nur git.exe)
  im Benutzer-PATH:     nichts mit Git

Wer aus Git Bash startet, erbt die mingw-Pfade und merkt nie etwas.
Die Aufgabenplanung startet `node.exe` DIREKT, ohne Shell -- und
bekommt sie nicht. Bei mir gruen, nachts rot, und der Grund steht
nicht im Code.

Das Schlimmste daran ist nicht der Ausfall: Dreizehn dauerhaft rote
Zeilen in einer Notiz, die Filipe morgens liest, gewoehnen einem das
Hinsehen ab -- und decken dabei die echten Befunde zu.

DIE REPARATUR

`server/helfer-openssl.mjs` sucht openssl erst im PATH (ohne `where`
oder `which` -- beides sind selbst Programme und koennen genauso
fehlen), danach an den Orten, an denen es auf einem Windows-Rechner
mit Git wirklich liegt.

Dazu `zertifikatBauen(schluessel, zertifikat, host)`. Die acht
Aufrufformen im Haus waren identisch bis auf die Variablennamen
(schl/zert, schluesselDatei/zertDatei, zKey/zCrt, sk/zt, key/crt) --
eine Stelle traegt alle neunundzwanzig. Zwei Tage zuvor war eine
davon um ein `-addext` aermer als die anderen; gemerkt hat es
niemand, weil der Browser den fehlenden Alternativnamen erst bei
einer Weiterleitung anmahnt. Eine Stelle kann nicht von sich selbst
abweichen.

KEIN EINTRAG IN DEN SYSTEM-PATH. `mingw64\bin` enthaelt rund hundert
Programme mit Unix-Namen (`find`, `sort`, `link`), die gleichnamige
Windows-Befehle verdecken. Das fuer eine Pruefung zu aendern haette
an ganz anderen Stellen Fehler verursacht, die niemand hierher
zurueckverfolgt.

GEGENPROBE IN BEIDE RICHTUNGEN, mit dem PATH des Nachtlaufs:

  vorher (direkter Aufruf):  ABSTURZ: spawnSync openssl ENOENT
  nachher (ueber den Helfer): Zertifikat gebaut, 1236 Bytes

Und eine echte Pruefung unter denselben Bedingungen:

  PATH ohne mingw64 -> pruef-chat-neu-stelle
  63 Pruefungen, 0 Fehler, 0 Abstuerze

Genau diese Datei stand im Nachtlauf mit ENOENT rot.

EINE WACHE DAGEGEN

pruef-struktur prueft ab jetzt, dass niemand openssl wieder direkt
ruft -- der naechste merkt es dort und nicht erst in einem
Nachtlauf, den niemand liest. Drei Gegenproben.

Beim ersten Anlauf schlug sie auf ihre EIGENEN Probetexte an: Sie
liest alle Serverdateien, und dazu gehoert sie selbst. Die Texte
werden jetzt zusammengesetzt. Derselbe Selbsttreffer ist mir heute
schon zweimal passiert.

DER DRITTE AUSGANG BLEIBT, WO ER HINGEHOERT

`helfer-kachel-echtfarbe.mjs` faengt den Fehler weiterhin ab und
meldet `moeglich: false` mit Grund, statt abzubrechen. Eine
Sicherung abzuschaffen, weil ihr Anlass gerade behoben ist, ist der
Anfang des naechsten stillen Fehlschlags.

NEBENBEI: pruef-community-sicht

Sie war rot mit "ZU VIEL: reaktion.html" -- mein eigener Rueckstand
vom 28.09. Die Reaction steht als Kachel im Community-Bereich; die
Liste war nicht nachgezogen. Jetzt 10 / 0.

Die Liste bleibt bewusst von Hand gepflegt: Sie ist eine ABSICHT,
keine Ableitung. Aus rechte.js gelesen verglichen sich zwei Kopien
derselben Quelle -- immer gruen, nie ein Beweis.

GEPRUEFT
  pruef-struktur         ALLES IN ORDNUNG (mit der neuen Wache)
  pruef-community-sicht  10 / 0
  pruef-chat-neu-stelle  63 / 0  (mit dem PATH des Nachtlaufs)
  pruef-notizen, -teamlage-karten, -werdegang: EXIT 0, keine Abstuerze
  mess-quer              EXIT 0
  29 Dateien: node --check auf allen, kein direkter Aufruf mehr
This commit is contained in:
2026-09-29 16:14:13 +02:00
parent b846693de5
commit 077925ab25
32 changed files with 257 additions and 95 deletions
+63
View File
@@ -902,5 +902,68 @@ ok(routeGibtEs("/workspace/api/aufgaben"),
ok(!existsSync(join(WS, "gibtesnicht.html")),
"erfundene Seite wird als fehlend erkannt");
/* =====================================================================
RUFT JEMAND `openssl` WIEDER DIREKT AUF?
WAS HIER SCHIEFGING (29.09.2026 gemessen): Im naechtlichen Lauf
standen DREIZEHN Pruefungen mit derselben Zeile rot --
[uncaughtException] Error: spawnSync openssl ENOENT
Kein Programmfehler. Die Pruefungen brauchen einen https-Vorbau
(der Sitzungskeks ist `secure`), und dafuer erzeugen sie ein
Wegwerf-Zertifikat. Auf diesem Rechner liegt openssl in
`Git\\mingw64\\bin`; im System-PATH steht aber nur `Git\\cmd`. Wer
aus Git Bash startet, erbt die mingw-Pfade und merkt nie etwas --
die Aufgabenplanung startet `node.exe` direkt und bekommt sie
nicht.
Bei mir gruen, nachts rot, und der Grund steht nicht im Code. Die
dreizehn roten Zeilen haben dabei monatelang die echten Befunde
zugedeckt.
`helfer-openssl.mjs` sucht das Programm jetzt auch ausserhalb des
PATH. Diese Wache sorgt dafuer, dass der direkte Aufruf nicht
zurueckkommt -- der naechste, der ihn schreibt, merkt es hier und
nicht erst in einem Nachtlauf, den niemand liest. */
console.log(`\n=== Ruft noch jemand openssl direkt auf? ===`);
{
const direkt = [];
let ueberHelfer = 0;
for (const datei of readdirSync(SERVER).filter((n) => /\.(mjs|js)$/.test(n))) {
if (datei === "helfer-openssl.mjs") continue;
const text = readFileSync(join(SERVER, datei), "utf8");
for (const m of text.matchAll(/exec(?:File)?Sync\(\s*["'`]openssl/g)) {
direkt.push(`${datei}:${text.slice(0, m.index).split("\n").length}`);
}
if (/zertifikatBauen\(/.test(text)) ueberHelfer++;
}
ok(ueberHelfer > 20,
`${ueberHelfer} Dateien bauen ihr Zertifikat ueber den Helfer`);
ok(direkt.length === 0,
direkt.length
? `DIREKT: ${direkt.slice(0, 6).join(" | ")} -- bitte zertifikatBauen() aus `
+ "helfer-openssl.mjs nehmen, sonst faellt es im Nachtlauf um"
: "keine Datei ruft openssl mehr am PATH vorbei");
/* GEGENPROBE IN BEIDE RICHTUNGEN. Eine Wache, die nur „nichts
gefunden" sagen kann, hat nichts bewiesen.
DIE PROBETEXTE WERDEN ZUSAMMENGESETZT und stehen nicht am Stueck
da. Beim ersten Anlauf schlug diese Wache auf ihre EIGENEN
Gegenproben an: Sie liest den Quelltext aller Serverdateien,
und dazu gehoert diese hier. Dasselbe ist mir heute schon
zweimal passiert -- eine Pruefung, die ihre eigene Begruendung
als Fund meldet, ist der haeufigste Selbsttreffer im Haus. */
const findet = (t) => [...t.matchAll(/exec(?:File)?Sync\(\s*["'`]openssl/g)].length;
const O = "openssl";
ok(findet(`execFileSync("${O}", ["version"]);`) === 1,
"Gegenprobe: ein direkter Aufruf wird erkannt");
ok(findet(`execSync(\`${O} version\`);`) === 1,
"auch mit Schraegstrich-Anfuehrung");
ok(findet("zertifikatBauen(k, z, CREW);") === 0,
"und der Weg ueber den Helfer gilt nicht als Fund");
}
console.log(`\n${fehler === 0 ? "ALLES IN ORDNUNG" : `${fehler} FEHLER`}`);
process.exit(fehler ? 1 : 0);