#!/usr/bin/env sh set -eu FAILED_UNIT="${1:-qsfera-rpi-production-check.service}" JOURNAL_LINES="${QSFERA_ALERT_JOURNAL_LINES:-80}" HOSTNAME_VALUE="$(hostname -f 2>/dev/null || hostname)" TIMESTAMP_UTC="$(date -u +%Y-%m-%dT%H:%M:%SZ)" SUMMARY="QSfera Raspberry Pi production check failed on ${HOSTNAME_VALUE}: ${FAILED_UNIT} at ${TIMESTAMP_UTC}" if command -v journalctl >/dev/null 2>&1; then JOURNAL_OUTPUT="$(journalctl -u "$FAILED_UNIT" -n "$JOURNAL_LINES" --no-pager 2>/dev/null || true)" else JOURNAL_OUTPUT="" fi { echo "$SUMMARY" if [ -n "$JOURNAL_OUTPUT" ]; then echo echo "$JOURNAL_OUTPUT" fi } | if command -v systemd-cat >/dev/null 2>&1; then systemd-cat -t qsfera-rpi-production-alert -p err else cat >&2 fi if [ -n "${QSFERA_ALERT_WEBHOOK_URL:-}" ]; then if ! command -v python3 >/dev/null 2>&1; then echo "ERROR: python3 is required to format the alert webhook payload." >&2 exit 1 fi if ! command -v curl >/dev/null 2>&1; then echo "ERROR: curl is required to send the alert webhook." >&2 exit 1 fi python3 - "$SUMMARY" "$FAILED_UNIT" "$HOSTNAME_VALUE" "$TIMESTAMP_UTC" "$JOURNAL_OUTPUT" <<'PY' | import json import sys summary, failed_unit, hostname, timestamp_utc, journal = sys.argv[1:] print(json.dumps({ "summary": summary, "failedUnit": failed_unit, "host": hostname, "timestampUtc": timestamp_utc, "journal": journal, }, ensure_ascii=False)) PY curl -fsS \ -X POST \ -H "Content-Type: application/json" \ --data-binary @- \ "$QSFERA_ALERT_WEBHOOK_URL" >/dev/null fi