57 lines
1.6 KiB
Bash
57 lines
1.6 KiB
Bash
#!/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
|