#!/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