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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user