Pruefwerkzeuge Trading Plattform: Abendkontrolle vom Docker-Host (Paket DH), abgedichtete Angriffstreiber; plankritik.js auf LF

- abendkontrolle.py: --quelle und --quelle-ibkr (Vorgabe wsl wie bisher, dockerhost liest das Ergebnis des Hosts ueber SSH), fahre_dockerhost
- abendkontrolle_wsl.py: --ibkr-python fuer ibkr_pruefen.py im Container
- abendkontrolle_einrichten.ps1: -Quelle und -QuelleIbkr, 23:15 sobald ein Teil vom Host kommt
- neue Angriffstreiber abendkontrolle_dockerhost_angriffe.py und abendkontrolle_ibkr_python_angriffe.py
- Abdichtung gegen echte WSL- und SSH-Wege in den Treibern, auch in abendkontrolle_angriffe.py und rueckweg_aapl_angriffe.py (nach dem ntfy-Vorfall eines Mutanten am 2026-09-26)
- LIESMICH: Abschnitt Paket DH
- .claude/workflows/plankritik.js: LF statt CRLF (das CR war die Ursache von "script contains control characters"), meta gekuerzt, Einzelheiten im Kommentar

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Pascal MichelandClaude Opus 5.5 committed 2026-09-26 14:53:53 +02:00
1 parent c115a13190
commit 59087fb235
9 files changed
+588 -16

No files matched your search

@@ -8,6 +8,7 @@ Aufruf in WSL (Venv) und unter Windows: python abendkontrolle_angriffe.py
Exit 0, wenn jeder Fall so ausgeht wie erwartet; sonst 1 mit der Liste der Abweichungen.
"""
import atexit
import json
import os
import shutil
@@ -291,11 +292,66 @@ def wsl_faelle() -> None:
# --- Windows-Teil --------------------------------------------------------------------------------
def abdichten(ak) -> list:
"""Sperrt die echten Wege von abendkontrolle.py fuer die Windows-Faelle (Plankritik DH, 2026-09-26).
Die Faelle laufen mit --ohne-wsl; bricht ein Mutant diesen Schalter, liefe sonst der echte
WSL-Teil gegen den echten Projektordner, und seit Paket DH ssh zum Docker-Host. wsl.exe und
ssh.exe zeigen ins Leere, fahre_wsl und fahre_dockerhost schreiben jeden Aufruf mit und
lehnen ab; jeder Aufruf ist eine Abweichung.
"""
gerufen = []
abdichten.erwartet = False
def verboten(name):
def weg(*argumente, **benannte):
gerufen.append(name)
zeile = f"FEHL echter Weg {name} gerufen: {argumente}"
abweichungen.append(zeile)
if not abdichten.erwartet:
print(zeile)
raise RuntimeError(f"echter Weg {name} in den Angriffsfaellen")
weg.sperre = True
return weg
leer = Path(tempfile.mkdtemp(prefix="abendkontrolle-angriffe-kein-weg-"))
atexit.register(shutil.rmtree, leer, True) # der leere Ordner bleibt nicht im Temp liegen
ak.WSL = str(leer / "wsl.exe")
ak.SSH = str(leer / "ssh.exe")
ak.WSL_SKRIPT = "/nicht-vorhanden/abendkontrolle_wsl.py"
ak.fahre_wsl = verboten("fahre_wsl")
ak.fahre_dockerhost = verboten("fahre_dockerhost")
return gerufen
def windows_faelle() -> None:
sys.path.insert(0, str(HIER))
import abendkontrolle as ak
from datetime import datetime
gerufen = abdichten(ak)
# Die Abdichtung greift: Ohne --ohne-wsl nimmt main den WSL-Weg, und der muss als Abweichung
# ankommen, nicht als Lauf. Die erwartete Abweichung wird danach wieder entfernt.
vorher = len(abweichungen)
abdichten.erwartet = True
with tempfile.TemporaryDirectory() as tmp:
(Path(tmp) / "Inbox").mkdir()
ak.main(["--vault", tmp, "--tag", TAG, "--teil", "alpaca", "--jetzt", "2026-09-23T22:45:00"])
abdichten.erwartet = False
# Beleg fuer die uebrigen Zeilen von abdichten: beide Programme und das Skript ins Leere,
# fahre_dockerhost gesperrt.
gesperrt = (not Path(ak.WSL).exists() and not Path(ak.SSH).exists()
and ak.WSL_SKRIPT.startswith("/nicht-vorhanden/")
and getattr(ak.fahre_dockerhost, "sperre", False))
ok = gesperrt and gerufen == ["fahre_wsl"] and len(abweichungen) == vorher + 1
del abweichungen[vorher:]
del gerufen[:]
zeile = f"{'OK ' if ok else 'FEHL'} W Abdichtung: der echte WSL-Weg kommt als Abweichung an"
print(zeile)
if not ok:
abweichungen.append(zeile)
gut = {"tag": TAG, "befunde": [], "hinweise": ["auto_fortsetzen: fortgesetzt"], "exit": 0,
"fakten": {"handelstag": True, "ende": {"grund": "boersenschluss", "exit": "0", "orders": "79", "position": "0"},
"laeufe": [{"takte_aktiv": 375}], "broker_offen": 0, "bericht": True,
@@ -637,6 +693,8 @@ def ibkr_windows_faelle() -> None:
import abendkontrolle as ak
from datetime import datetime
abdichten(ak)
gut = {"tag": TAG, "teil": "ibkr", "befunde": [], "hinweise": [], "exit": 0,
"fakten": {"handelstag": True,
"ende": {"grund": "boersenschluss", "exit": "0", "orders": "40", "position": "0"},