#!/bin/sh
# check-report -- E9 (s6-policy-common 1.2.6): macht die Antwort eines
# Bereitschafts-Checks sichtbar.
#
# Aufruf in data/check:   exec /usr/lib/s6-policy-common/bin/check-report <befehl> [arg...]
#
# Gemessen am 23.09.2026 (Container kat): ein von s6-notifyoncheck gestarteter
# Check erbt die Deskriptoren des run-Skripts -- stdout geht in die
# Logger-Pipeline der Unit, stderr in den Catch-all (/run/uncaught-logs). Dass
# ein scheiternder Check "nicht sagt warum", liegt deshalb an den Checks selbst:
# curl -s, grep -q, 2>/dev/null schweigen, und was doch auf stderr landet, steht
# nicht im Log der Unit.
#
# check-report fuehrt den Befehl aus, sammelt stdout und stderr, und schreibt
# nach stdout (also ins Unit-Log):
#   * "check: nicht bereit (rc N): <erste Zeile>"  -- nur wenn sich die Meldung
#     gegenueber dem letzten Versuch geaendert hat; bei -w 2000 -n 150 wuerden
#     sonst bis zu 150 gleiche Zeilen je Start anfallen,
#   * "check: bereit"                             -- beim ersten Erfolg nach
#     einem Fehlschlag (oder beim allerersten Versuch).
# Der Rueckgabewert des Befehls wird unveraendert weitergegeben; nur er
# entscheidet ueber die Bereitschaft.
#
# Zustand: /run/check-report/<Unit>, die Unit ist der Name des Servicedirs (der
# Check laeuft mit dem Servicedir als Arbeitsverzeichnis).
set -u
[ $# -ge 1 ] || { echo "check-report: usage: check-report prog [args...]" >&2; exit 100; }
unit=$(basename "$(pwd)")
sdir=/run/check-report
mkdir -p "$sdir" 2>/dev/null
last="$sdir/$unit"

out=$("$@" 2>&1); rc=$?
if [ "$rc" -eq 0 ]; then
  msg="bereit"
else
  first=$(printf '%s\n' "$out" | sed -n '/./{p;q}')
  msg="nicht bereit (rc $rc): ${first:-keine Ausgabe}"
fi
prev=$(cat "$last" 2>/dev/null || true)
if [ "$msg" != "$prev" ]; then
  echo "check: $msg"
  printf '%s\n' "$msg" > "$last" 2>/dev/null
fi
exit "$rc"
