Files
threadnet-operating/monitoring/cve/test_scan_loop.sh
T

90 lines
3.5 KiB
Bash
Raw Normal View History

#!/bin/sh
# Zusicherungen fuer scan-loop.sh (#0106), ohne Trivy und ohne Netz:
# sh cve/test_scan_loop.sh
#
# Gate 3 hatte diese Faelle bei test_targets.py vorgesehen. Sie stehen hier,
# weil die Logik in POSIX-Shell lebt - ein Python-Test haette sie nachgebaut
# statt geprueft, und ein nachgebauter Test prueft den Nachbau.
#
# ⚠️ Der gefaehrliche Fall ist nicht "loescht zu wenig", sondern "loescht zu
# viel": Ohne Zielliste darf NICHTS entfernt werden, sonst raeumt ein Neustart
# waehrend eines Prometheus-Ausfalls den gesamten Bestand ab. Deshalb steht zu
# jeder Zusicherung ihre Gegenprobe.
set -u
FEHLER=0
ARBEIT=$(mktemp -d)
trap 'rm -rf "$ARBEIT"' EXIT
pruefe() { # name erwartet ist
if [ "$2" = "$3" ]; then
echo " ok $1"
else
echo " FEHL $1 — erwartet '$2', bekommen '$3'"
FEHLER=$((FEHLER + 1))
fi
}
# ⚠️ Die ECHTE runde() wird geladen, nicht nachgebaut. Ein nachgebauter Test
# prueft den Nachbau: er kann gruen bleiben, waehrend die ausgelieferte Datei
# kaputt ist. Die Ladewache in scan-loop.sh verhindert, dass dabei die
# Endlosschleife anlaeuft.
ARBEIT_RESULTS="$ARBEIT/results"
ARBEIT_TARGETS="$ARBEIT/targets.txt"
RESULTS_DIR="$ARBEIT_RESULTS"
TARGETS_FILE="$ARBEIT_TARGETS"
SCAN_LOOP_NUR_LADEN=1
export RESULTS_DIR TARGETS_FILE
. "$(dirname "$0")/scan-loop.sh"
# Trivy durch eine Attrappe ersetzen - die einzige Stelle, die Netz braeuchte.
scanne() { : > "$2"; }
# Aus der ECHTEN Ausgabe lesen, statt eine eigene Form zu erwarten.
entfernt_aus() { echo "$1" | sed -n "s/.*, \([0-9]*\) verwaiste.*/\1/p" | tail -1; }
ausgesetzt_aus() { echo "$1" | grep -q "^warte:" && echo AUSGESETZT || echo GELAUFEN; }
mkdir -p "$ARBEIT_RESULTS"
echo "1) Ohne Zielliste wird NICHTS geloescht (der gefaehrliche Fall)"
: > "$ARBEIT/results/altbestand.json"
: > "$ARBEIT/results/zweiter.json"
rm -f "$ARBEIT_TARGETS"
ergebnis=$(runde)
pruefe "Runde ausgesetzt" "AUSGESETZT" "$(ausgesetzt_aus "$ergebnis")"
pruefe "Berichte unberuehrt" "2" "$(ls -1 "$ARBEIT_RESULTS" | wc -l | tr -d ' ')"
echo "2) Leere Zielliste ebenso"
: > "$ARBEIT_TARGETS"
ergebnis=$(runde)
pruefe "Runde ausgesetzt" "AUSGESETZT" "$(ausgesetzt_aus "$ergebnis")"
pruefe "Berichte unberuehrt" "2" "$(ls -1 "$ARBEIT_RESULTS" | wc -l | tr -d ' ')"
echo "3) Mit Zielliste: verwaiste Berichte verschwinden, neue entstehen"
printf '# Kopfzeile\npostgres:17-alpine\nrohana.axion1337.de/sorb/threadnet-web:v0.6.0\n' > "$ARBEIT_TARGETS"
ergebnis=$(runde)
pruefe "zwei verwaiste entfernt" "2" "$(entfernt_aus "$ergebnis")"
pruefe "genau die zwei Ziele bleiben" "2" "$(ls -1 "$ARBEIT_RESULTS" | wc -l | tr -d ' ')"
pruefe "altbestand ist fort" "" "$(ls "$ARBEIT_RESULTS" | grep altbestand || true)"
pruefe "v0.6.0 ist da" "rohana.axion1337.de_sorb_threadnet-web_v0.6.0.json" \
"$(ls "$ARBEIT_RESULTS" | grep v0.6.0)"
echo "4) Der Fall vom 2026-08-20: v0.3.0 faellt aus der Menge und verstummt"
: > "$ARBEIT/results/rohana.axion1337.de_sorb_threadnet-web_v0.3.0.json"
ergebnis=$(runde)
pruefe "v0.3.0 entfernt" "1" "$(entfernt_aus "$ergebnis")"
pruefe "v0.3.0 ist fort" "" "$(ls "$ARBEIT_RESULTS" | grep 'v0.3.0' || true)"
echo "5) Host-Scans werden nicht nach dieser Liste beurteilt"
: > "$ARBEIT/results/etwas__host__cfgmon.json"
ergebnis=$(runde)
pruefe "nichts entfernt" "0" "$(entfernt_aus "$ergebnis")"
pruefe "Host-Bericht bleibt" "etwas__host__cfgmon.json" \
"$(ls "$ARBEIT_RESULTS" | grep __host__)"
echo
if [ "$FEHLER" -eq 0 ]; then
echo "ALLE ZUSICHERUNGEN GRUEN"
else
echo "$FEHLER ZUSICHERUNG(EN) ROT"
fi
exit "$FEHLER"