#!/bin/sh
# Der Selbstpruefflauf nach ADR-0004 und ADR-0011.
#
# Er entscheidet, ob ein Start als gelungen gilt. Besteht er, wird `boot-complete.target`
# erreicht, systemd loescht den Startzaehler und die Fassung ist bestaetigt. Faellt er durch,
# bleibt der Zaehler stehen — und der dritte Fehlversuch stuft die Fassung ab, sodass das
# Geraet von selbst auf die andere Wurzel zurueckkehrt.
#
# WICHTIG: Diese Pruefliste waechst mit dem Produkt. Heute prueft sie, was es gibt. Spaeter
# kommen die Punkte aus ADR-0004 dazu — Datenbank antwortet, jede Aufgabenklasse ist
# bedienbar, der Wissensspeicher ist erreichbar. Die Verdrahtung aendert sich dabei nicht.
set -u

PROTOKOLL=/bestand/xinionos/protokoll
FASSUNG_DATEI=/etc/xinionos/fassung
SCHALTER=/etc/xinionos/selbstpruefung-scheitert

fehler=0
zeilen=""

pruefe() {
    name=$1; shift
    if "$@" >/dev/null 2>&1; then
        zeilen="${zeilen}    \"${name}\": \"bestanden\",\n"
    else
        zeilen="${zeilen}    \"${name}\": \"durchgefallen\",\n"
        fehler=$((fehler + 1))
        echo "Selbstpruefung: ${name} durchgefallen" >&2
    fi
}

# --- die Pruefliste -------------------------------------------------------------------
pruefe "wurzel_erkennbar"   xinionos-wurzeln aktiv
pruefe "bestand_eingehaengt" mountpoint -q /bestand
pruefe "bestand_beschreibbar" sh -c 'touch /bestand/.schreibprobe && rm -f /bestand/.schreibprobe'
pruefe "dienst_antwortet"   sh -c 'curl -fsS --max-time 5 http://127.0.0.1:8080/zustand'

# Der Pruefschalter. Ein Ruecksprung, den man nicht ausloesen kann, ist nicht nachweisbar —
# und ohne Nachweis gilt er in diesem Produkt nicht. Deshalb gibt es einen ausdruecklichen
# Weg, absichtlich durchzufallen.
if [ -f "$SCHALTER" ]; then
    zeilen="${zeilen}    \"pruefschalter\": \"absichtlicher Fehlschlag\",\n"
    fehler=$((fehler + 1))
    echo "Selbstpruefung: absichtlicher Fehlschlag durch $SCHALTER" >&2
fi
# --------------------------------------------------------------------------------------

wurzel=$(xinionos-wurzeln aktiv 2>/dev/null || echo "unbekannt")
fassung=$(cat "$FASSUNG_DATEI" 2>/dev/null || echo "unbekannt")
zeit=$(date -Is)
[ "$fehler" -eq 0 ] && ergebnis=bestanden || ergebnis=durchgefallen

# Das Protokoll liegt im Bestandsbereich und ueberlebt damit den Ruecksprung. Das ist kein
# Zufall, sondern der Grund fuer die eigene Partition: Wer nach einem Rueckfall wissen will,
# WARUM die neue Fassung nicht hochkam, findet es nur dort.
mkdir -p "$PROTOKOLL" 2>/dev/null || true
printf '{\n  "zeit": "%s",\n  "wurzel": "%s",\n  "fassung": "%s",\n  "ergebnis": "%s",\n  "schritte": {\n%b  }\n}\n' \
    "$zeit" "$wurzel" "$fassung" "$ergebnis" "$(printf '%b' "$zeilen" | sed '$ s/,$//')" \
    > /run/xinionos-selbstpruefung.json
cat /run/xinionos-selbstpruefung.json >> "$PROTOKOLL/selbstpruefung.jsonl" 2>/dev/null || true

[ "$fehler" -eq 0 ] || exit 1
