- .vault-tools/trading-plattform-pruefung/LIESMICH.md - .vault-tools/trading-plattform-pruefung/abbau_alpaca_lesen.py - .vault-tools/trading-plattform-pruefung/abbau_glattstellen.sh - .vault-tools/trading-plattform-pruefung/abbau_ibkr_lesen.sh - .vault-tools/trading-plattform-pruefung/abbau_restbestand.py - .vault-tools/trading-plattform-pruefung/abbau_restbestand_angriffe.py - .vault-tools/trading-plattform-pruefung/abbau_restbestand_einrichten.ps1 - AI/Regelwerk/windows-shell.md Erzeugt vom PostToolUse-Hook .vault-tools/auto-push/auto_push.py. Co-Authored-By: Claude Opus 5 <[email protected]>
98 lines
3.6 KiB
Bash
98 lines
3.6 KiB
Bash
#!/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 <alpaca|ibkr> <instanzordner> [--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 <alpaca|ibkr> <instanzordner> [--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"
|