Trading-Plattform-Pruefung: Bestaetigung ohne Host bricht die Sicherung ab, als Fall belegt (Paket NT, Task 739)

- abendkontrolle_dockerhost_angriffe.py: Fall eine_bestaetigung_ohne_host_bricht_die_sicherung_ab
  und Mutant E739-01 (39 Faelle, 57 Mutanten, keiner ueberlebt).
- abendkontrolle.py: Docstring von ssh_lauf nennt den Vorbehalt zu Win32-OpenSSH.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_0126RDfXiECscXipzf67uypJ
This commit is contained in:
Pascal MichelandClaude Opus 5.5 committed 2026-10-12 00:09:38 +02:00
1 parent 88ec4fd40f
commit ef8059903c
2 files changed
+34 -1

No files matched your search

@@ -253,7 +253,8 @@ def ssh_lauf(befehl: str, timeout, stdout=None) -> subprocess.CompletedProcess:
Eigene Funktion, damit die Angriffsfaelle Zeitlimit und Dauer jedes Befehls sehen. Seit Paket NT Eigene Funktion, damit die Angriffsfaelle Zeitlimit und Dauer jedes Befehls sehen. Seit Paket NT
(Quorum 4, G1): abendkontrolle-lesen.sh endet mit 0 bis 4. Exit 255 meldet ssh selbst: keine (Quorum 4, G1): abendkontrolle-lesen.sh endet mit 0 bis 4. Exit 255 meldet ssh selbst: keine
Verbindung oder Anmeldung, aber auch ein Befehl, den auf dem Host ein Signal beendet. Er und ein Verbindung oder Anmeldung, laut Quelltext von OpenSSH-portable 9.5p1 auch ein Befehl, den auf dem
Host ein Signal beendet (fuer Win32-OpenSSH 9.5p2 auf diesem Rechner nicht nachgelesen). Er und ein
abgelaufenes Zeitlimit heissen: Der Docker-Host ist nicht erreichbar (HostNichtErreichbar). abgelaufenes Zeitlimit heissen: Der Docker-Host ist nicht erreichbar (HostNichtErreichbar).
""" """
try: try:
@@ -1155,6 +1155,32 @@ def ein_zeitlimit_beim_archiv_laesst_nur_diese_instanz_scheitern():
assert "Docker-Host nicht erreichbar" not in zeile, zeile assert "Docker-Host nicht erreichbar" not in zeile, zeile
@fall
def eine_bestaetigung_ohne_host_bricht_die_sicherung_ab():
# Kritische Pruefung NT, Befund 1: Auch die Bestaetigung gehoert zur Grenze "Docker-Host nicht
# erreichbar" (Entscheidung 1 in Task 729), nicht nur die Summe. Nach Summe und Archiv von alpaca
# ist der Host weg, die Bestaetigung endet mit 255. Das Archiv liegt dann ohne Summendatei auf D:,
# nichts ist bestaetigt, und die Sicherung endet mit genau einer Zeile von heute.
with tempfile.TemporaryDirectory() as ordner:
wurzel = Path(ordner)
host = host_ablage(wurzel)
modul = lade()
ergebnisse_liegen(modul, wurzel)
code, notiz, befehle, _ = sicherungslauf(wurzel, "--jetzt", "2026-10-05T23:30", modul=modul, host_weg="2")
summe = host_summe(host, "alpaca")
assert code == 1, (code, notiz)
assert befehle == [
f"sicherung-summe {TAG}-alpaca", f"sicherung {TAG}-alpaca", f"sicherung-bestaetigt {TAG}-alpaca {summe}"
], befehle
assert einzige_zeile(notiz) == (
f"- 23:30 Uhr — {KOPF}: **gescheitert** #needs-review. Docker-Host nicht erreichbar "
f"(sicherung-bestaetigt {TAG}-alpaca {summe}: Exit 255; {HOST_WEG}), Sicherung abgebrochen. "
"Der nächste Lauf versucht es erneut."
), notiz
assert namen(wurzel / "ziel" / TAG) == ["alpaca.tar"], namen(wurzel / "ziel" / TAG)
assert namen(host / "bestaetigt") == [], namen(host / "bestaetigt")
@fall @fall
def kein_kommentar_beginnt_mit_s3(): def kein_kommentar_beginnt_mit_s3():
# Paket NT (Quorum 4): Die Kommentarzeile ueber SICHERUNG_NACHHOLEN_TAGE begann mit "(S3).", einem # Paket NT (Quorum 4): Die Kommentarzeile ueber SICHERUNG_NACHHOLEN_TAGE begann mit "(S3).", einem
@@ -1295,6 +1321,12 @@ MUTANTEN = [
" except ZeroDivisionError as abbruch:", " except ZeroDivisionError as abbruch:",
["ein_zeitlimit_beim_archiv_laesst_nur_diese_instanz_scheitern", ["ein_zeitlimit_beim_archiv_laesst_nur_diese_instanz_scheitern",
"eine_abgebrochene_uebertragung_hinterlaesst_nichts"]), "eine_abgebrochene_uebertragung_hinterlaesst_nichts"]),
# Seit der kritischen Pruefung NT, Befund 1: Eine Bestaetigung ohne Host bricht die Sicherung ab.
("E739-01 Bestaetigung ohne Host nur fuer die Instanz",
' lauf = ssh_lauf(f"sicherung-bestaetigt {name} {summe}", SSH_TIMEOUT_S)',
' try:\n lauf = ssh_lauf(f"sicherung-bestaetigt {name} {summe}", SSH_TIMEOUT_S)\n'
' except HostNichtErreichbar as abbruch:\n raise RuntimeError(f"nicht bestaetigt ({abbruch})") from None',
["eine_bestaetigung_ohne_host_bricht_die_sicherung_ab"]),
("Name der Summendatei beim Host egal", ' if treffer is None or treffer.group(2) != f"{name}.tar":', ("Name der Summendatei beim Host egal", ' if treffer is None or treffer.group(2) != f"{name}.tar":',
" if treffer is None:", ["eine_summendatei_des_hosts_in_falscher_form_holt_kein_archiv"]), " if treffer is None:", ["eine_summendatei_des_hosts_in_falscher_form_holt_kein_archiv"]),
("Grossbuchstaben in der Summe", r'SUMMENZEILE = re.compile(r"([0-9a-f]{64}) (\S+)\n")', ("Grossbuchstaben in der Summe", r'SUMMENZEILE = re.compile(r"([0-9a-f]{64}) (\S+)\n")',