#!/usr/bin/env bash # Abbau Restbestand: stellt eine Paper-Instanz ueber scripts/killswitch.py glattstellen glatt. # Ersteller: Pascal Michel Erstellt: 2026-10-07 # Doku: LIESMICH.md in diesem Ordner, Abschnitt "Paket AB" # # Das Bestaetigungswort verlaesst WSL nie: Dieses Skript liest es aus config/killswitch.toml der # Instanz und reicht es nur an killswitch.py weiter. Jede Zeile von killswitch.py geht danach durch # einen Filter: das Wort wird [wort], dann ohne_kontonummer() aus abendkontrolle_wsl.py # (Kontonummern als [konto], dann maskiere()), dann jede Dezimalzahl als [x]. # Den Broker waehlt das Skript ausdruecklich: alpaca -> --broker alpaca, ibkr -> --broker ibkr # (gemessen: ibkr ist im IBKR-Ordner mit Marke ibkr erlaubt, alpaca im Projektordner ohne Marke). # --broker attrappe ersetzt die Wahl, nur fuer die Probe in einer Wegwerfkopie und die Angriffsfaelle. # Den Instanzordner nennt immer der Aufrufer (abbau_restbestand.py); hier steht kein echter Pfad. # Genau ein Aufruf von killswitch.py je Start, keine Schleife. # # Aufruf: bash abbau_glattstellen.sh [--broker attrappe] # Exit: der von killswitch.py (0 erfolgreich, 1 nicht erfolgreich, 3 abgelehnt, 4 Voraussetzung), # 2 Bedienfehler, 4 Wort nicht lesbar oder Instanzordner nicht erreichbar. set -u GRUND="Abbau Restbestand nach Netzschalter-Abriss 2026-10-07; Auftrag Pascal 2026-10-07, ausgefuehrt von der Aufgabe Abbau Restbestand" HIER="$(dirname "$(readlink -f "$0")")" export TRADING_GEHEIMNISSE=/home/claude/.config/trading-plattform/secrets.toml export PYTHONIOENCODING=utf-8 if [ "$#" -lt 2 ]; then echo "Bedienfehler: Aufruf abbau_glattstellen.sh [--broker attrappe]" >&2 exit 2 fi instanz="$1" ordner="$2" shift 2 case "$instanz" in alpaca) py=/home/claude/venvs/trading/bin/python broker=(--broker alpaca) ;; ibkr) py=/home/claude/venvs/trading-ibkr/bin/python broker=(--broker ibkr) ;; *) echo "Bedienfehler: Instanz muss alpaca oder ibkr sein" >&2 exit 2 ;; esac while [ "$#" -gt 0 ]; do case "$1" in --broker) if [ "$#" -lt 2 ] || [ "$2" != "attrappe" ]; then echo "Bedienfehler: --broker nimmt nur attrappe" >&2 exit 2 fi broker=(--broker attrappe) shift 2 ;; *) echo "Bedienfehler: unbekannte Angabe" >&2 exit 2 ;; esac done if ! cd "$ordner"; then echo "Voraussetzung fehlt: Instanzordner nicht erreichbar" >&2 exit 4 fi # Das Wort, nur in dieser Shell; tomllib aus dem Python der Instanz. wort="$("$py" -I -c 'import tomllib with open("config/killswitch.toml", "rb") as datei: print(tomllib.load(datei)["killswitch"]["bestaetigungswort"])' 2>/dev/null)" if [ -z "$wort" ]; then echo "Voraussetzung fehlt: Bestaetigungswort in config/killswitch.toml nicht lesbar" >&2 exit 4 fi # Genau ein Aufruf; stdout und stderr zusammen, gefiltert erst hinter dem Lauf. ausgabe="$("$py" scripts/killswitch.py "${broker[@]}" glattstellen --grund "$GRUND" --bestaetigung "$wort" 2>&1)" code=$? # Filter je Zeile: Wort, Kontonummern und maskiere(), Dezimalzahlen. Das Wort geht nur ueber die Umgebung. if ! printf '%s\n' "$ausgabe" | ABBAU_WORT="$wort" "$py" -I -c 'import os import re import sys sys.path.insert(0, sys.argv[1]) from abendkontrolle_wsl import ohne_kontonummer wort = os.environ.pop("ABBAU_WORT", "") for zeile in sys.stdin.read().splitlines(): if wort: zeile = zeile.replace(wort, "[wort]") zeile = ohne_kontonummer(zeile) print(re.sub(r"-?\d+[.,]\d+", "[x]", zeile)[:300])' "$HIER"; then echo "Ausgabe von killswitch.py nicht gefiltert und deshalb zurueckgehalten" fi unset wort ausgabe exit "$code"