Files
claude-regelwerk/.vault-tools/trading-plattform-pruefung/start_probe_w.py
T
Pascal MichelandClaude Opus 5 d7ffc9a5b5 Automatischer Push: 6 Datei(en) geändert
- .vault-tools/plan-kopie/LIESMICH.md
- .vault-tools/plan-kopie/rot_nachweis.py
- .vault-tools/trading-plattform-pruefung/LIESMICH.md
- .vault-tools/trading-plattform-pruefung/browser_r.py
- .vault-tools/trading-plattform-pruefung/start_probe_w.py
- .vault-tools/trading-plattform-pruefung/start_probe_zugang.py

Erzeugt vom PostToolUse-Hook .vault-tools/auto-push/auto_push.py.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-23 04:00:01 +02:00

83 lines
3.5 KiB
Python

"""Probe-Backend fuer den Browserlauf zu Paket W: die echte App mit Broker-Attrappe, Wegwerf-Register und Wegwerf-Zugang.
Koordinator-Pruefcode, nicht fuers Repo. Wie .vault-tools/trading-plattform-pruefung/start_probe_zugang.py,
dazu die Konfiguration fuer Sicherheitsschluessel: RP-ID localhost, Origin http://localhost:<port>.
Gestartet wird aus einer KOPIE des Baums (dort gibt es keine Geheimnisdatei) -- kein Broker-Aufruf, kein
Ereignis im echten Register, keine echte Zugangsdatei, kein Melder.
Aufruf (WSL, aus der Kopie): python start_probe_w.py <port> <ausgabeordner>
"""
import dataclasses
import json
import os
import sys
from pathlib import Path
sys.path.insert(0, str(Path.cwd()))
import uvicorn # noqa: E402
from trading.broker.attrappe import BrokerAttrappe # noqa: E402
from trading.dashboard.app import erzeuge_app # noqa: E402
from trading.dashboard.config import lade_dashboard_config # noqa: E402
from trading.dashboard.zugang import Benutzer # noqa: E402
from trading.dashboard.zugang import schreibe_benutzer # noqa: E402
from trading.dashboard.zugang import setze_passwort # noqa: E402
from trading.killswitch.killswitch import lade_killswitch_config # noqa: E402
from trading.registry.registry import Registry # noqa: E402
BENUTZER = "probe"
PASSWORT = "nur-fuer-die-probe-2026"
GEHEIMNIS = "JBSWY3DPEHPK3PXP"
port = int(sys.argv[1])
ordner = Path(sys.argv[2])
# Optional: ein Marktkatalog, der nur gelesen wird (fuer die Lastmessung der Kerzenabrufe).
katalog = sys.argv[3] if len(sys.argv) > 3 else None
ordner.mkdir(parents=True, exist_ok=True)
# Seit Paket E2 (2026-09-22) findet die Plattform die Geheimnisdatei auch ueber TRADING_GEHEIMNISSE
# bzw. CREDENTIALS_DIRECTORY -- nach dem Umzug steht die erste in jeder Login-Shell. Die Probe nimmt
# beide aus ihrer Umgebung, bevor die App gebaut wird: Sonst baute erzeuge_app den echten
# Stille-Waechter und Hausmelder, obwohl im Baum keine config/secrets.toml liegt (Befund der
# Abschlusspruefung E2).
for name in ("TRADING_GEHEIMNISSE", "CREDENTIALS_DIRECTORY"):
os.environ.pop(name, None)
assert not Path("config/secrets.toml").exists(), "Die Probe startet nur aus einem Baum ohne Geheimnisdatei"
zugang_datei = ordner / "zugang.toml"
schreibe_benutzer(
zugang_datei,
{BENUTZER: Benutzer(name=BENUTZER, passwort=setze_passwort(PASSWORT), totp_geheimnis=GEHEIMNIS)},
)
(ordner / "zugang.json").write_text(
json.dumps({"benutzer": BENUTZER, "passwort": PASSWORT, "geheimnis": GEHEIMNIS}), encoding="utf-8"
)
(ordner / "paper").mkdir(exist_ok=True)
config = dataclasses.replace(
lade_dashboard_config("config/dashboard.toml"),
port=port,
broker_wahl="attrappe",
sendeintervall_s=2.0,
erlaubte_hosts=(f"127.0.0.1:{port}", f"localhost:{port}"),
anmeldung_pflicht=True,
mfa_pflicht=True,
zugang_datei=str(zugang_datei),
zugang_protokoll=str(ordner / "anmeldungen.jsonl"),
paper_status_datei=str(ordner / "status.json"),
paper_protokoll_ordner=str(ordner / "paper"),
schluessel_rp_id="localhost",
**({} if katalog is None else {"markt_katalog": katalog}),
schluessel_origins=(f"http://localhost:{port}",),
)
app = erzeuge_app(
broker=BrokerAttrappe(),
registry=Registry(db_pfad=ordner / "registry.db", artefakt_wurzel=ordner / "artifacts"),
config=config,
killswitch_config=lade_killswitch_config("config/killswitch.toml"),
dist=Path("dashboard/dist"),
)
print(f"Probe-Backend W auf 127.0.0.1:{port}, Ablage {ordner}", flush=True)
uvicorn.run(app, host="127.0.0.1", port=port, log_level="warning", server_header=False, proxy_headers=False)