diff --git a/.vault-tools/trading-plattform-pruefung/abendkontrolle.py b/.vault-tools/trading-plattform-pruefung/abendkontrolle.py index c8e062f..5e7bb96 100644 --- a/.vault-tools/trading-plattform-pruefung/abendkontrolle.py +++ b/.vault-tools/trading-plattform-pruefung/abendkontrolle.py @@ -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 (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). """ try: diff --git a/.vault-tools/trading-plattform-pruefung/abendkontrolle_dockerhost_angriffe.py b/.vault-tools/trading-plattform-pruefung/abendkontrolle_dockerhost_angriffe.py index bd99325..bdff33d 100644 --- a/.vault-tools/trading-plattform-pruefung/abendkontrolle_dockerhost_angriffe.py +++ b/.vault-tools/trading-plattform-pruefung/abendkontrolle_dockerhost_angriffe.py @@ -1155,6 +1155,32 @@ def ein_zeitlimit_beim_archiv_laesst_nur_diese_instanz_scheitern(): 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 def kein_kommentar_beginnt_mit_s3(): # Paket NT (Quorum 4): Die Kommentarzeile ueber SICHERUNG_NACHHOLEN_TAGE begann mit "(S3).", einem @@ -1295,6 +1321,12 @@ MUTANTEN = [ " except ZeroDivisionError as abbruch:", ["ein_zeitlimit_beim_archiv_laesst_nur_diese_instanz_scheitern", "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":', " 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")',