Die Geraeteschicht — Abbild, zwei Wurzeln, Selbstprueflauf, Ruecksprung — verlaesst die Ablage der ersten Appliance und wird ein eigenes Erzeugnis mit eigenem Takt und eigenem Nachweis. Drei Gruende, nach Gewicht: Der Cyber Resilience Act verpflichtet fuer das gesamte Produkt einschliesslich der Betriebssystemschicht — vier gewachsene Basissysteme waeren vier Stuecklisten und vier Schwachstellenprozesse, eine gemeinsame Basis ist ein Dossier. Der Ruecksprung wird nur einmal richtig gebaut, weil er nur geprueft wird wenn ihn jemand braucht. Und eine abgegrenzte Aufgabe laesst sich ausschreiben, was unmittelbar auf das groesste benannte Risiko des Hauses einzahlt. Der Einwand der Vertraeglichkeitsmatrix wird durch den Nutzlast-Vertrag entkraeftet statt weggeredet: Die Nutzlast liegt in der Wurzel und wird mit ihr getauscht. Eine Fassung, ein Rueckweg, keine Matrix. Das OS kennt kein Produkt — Regel 1. Alle Namen sind entkoppelt, die Statusseite ist auf die Standardbibliothek umgestellt, weil jede Abhaengigkeit im Grund-OS eine Verpflichtung ueber die Produktlebensdauer ist. Nichts davon ist gelaufen. Der Inhalt gilt als Bauplan. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
62 lines
2.8 KiB
Bash
Executable file
62 lines
2.8 KiB
Bash
Executable file
#!/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
|