Proper Matrix alerter support with client API

Matrix doesn't use a simple webhook URL — needs homeserver, room ID,
and bot token separately. Uses PUT /_matrix/client/v3/rooms/.../send
with Bearer token auth. Room ID is bash-encoded (! → %21, : → %3A)
to avoid Python dependency pre-setup. Also adds ntfy and plain
webhook as options under a typed alerter menu.
This commit is contained in:
Cobra
2026-04-07 14:55:23 -04:00
parent 84f0775f76
commit 4c332eabb4
+56 -12
View File
@@ -374,12 +374,34 @@ fi
# Network alerter webhook
step "Network Alerter"
prompt_default enable_alerter "Enable alerter webhook? (y/n)" "n"
prompt_default enable_alerter "Enable online alert? (y/n)" "n"
BB_ALERTER_TYPE=""
BB_ALERTER_WEBHOOK=""
BB_ALERTER_MATRIX_HS=""
BB_ALERTER_MATRIX_ROOM=""
BB_ALERTER_MATRIX_TOKEN=""
if [[ "$enable_alerter" =~ ^[yY]$ ]]; then
prompt_default webhook_url "Webhook URL (Slack/Discord/Matrix)" ""
BB_ALERTER_WEBHOOK="$webhook_url"
else
BB_ALERTER_WEBHOOK=""
echo " [1] Matrix"
echo " [2] Slack / Discord (webhook URL)"
echo " [3] ntfy"
prompt_default alerter_type "Alerter type (1-3)" "1"
if [[ "$alerter_type" == "1" ]]; then
BB_ALERTER_TYPE="matrix"
prompt_default matrix_hs "Homeserver URL" "https://m.example.org"
prompt_default matrix_room "Room ID (e.g. !abc123:homeserver)" ""
prompt_default matrix_token "Bot access token" ""
BB_ALERTER_MATRIX_HS="$matrix_hs"
BB_ALERTER_MATRIX_ROOM="$matrix_room"
BB_ALERTER_MATRIX_TOKEN="$matrix_token"
elif [[ "$alerter_type" == "2" ]]; then
BB_ALERTER_TYPE="webhook"
prompt_default webhook_url "Webhook URL" ""
BB_ALERTER_WEBHOOK="$webhook_url"
elif [[ "$alerter_type" == "3" ]]; then
BB_ALERTER_TYPE="ntfy"
prompt_default ntfy_url "ntfy topic URL" ""
BB_ALERTER_WEBHOOK="$ntfy_url"
fi
fi
# ══════════════════════════════════════════════════════════════════════════════
@@ -405,7 +427,7 @@ if [[ "$BB_VPN" == "autossh" ]]; then
else
echo "VPN: ${BOLD}${BB_VPN}${NC}"
fi
echo "Alerter: ${BOLD}$([ -n "$BB_ALERTER_WEBHOOK" ] && echo "enabled" || echo "disabled")${NC}"
echo "Alerter: ${BOLD}$([ -n "$BB_ALERTER_TYPE" ] && echo "$BB_ALERTER_TYPE" || echo "disabled")${NC}"
echo ""
echo -n -e "${CYAN}Proceed with flashing and configuration? (y/n):${NC} "
@@ -550,9 +572,17 @@ BB_VPN="${BB_VPN}"
BB_DEVICE_ID="${DEVICE_ID}"
EOF
if [[ -n "$BB_ALERTER_TYPE" ]]; then
echo "BB_ALERTER_TYPE=\"${BB_ALERTER_TYPE}\"" >> "${MOUNT_POINT}/root/bb-config.env"
fi
if [[ -n "$BB_ALERTER_WEBHOOK" ]]; then
echo "BB_ALERTER_WEBHOOK=\"${BB_ALERTER_WEBHOOK}\"" >> "${MOUNT_POINT}/root/bb-config.env"
fi
if [[ -n "$BB_ALERTER_MATRIX_HS" ]]; then
echo "BB_ALERTER_MATRIX_HS=\"${BB_ALERTER_MATRIX_HS}\"" >> "${MOUNT_POINT}/root/bb-config.env"
echo "BB_ALERTER_MATRIX_ROOM=\"${BB_ALERTER_MATRIX_ROOM}\"" >> "${MOUNT_POINT}/root/bb-config.env"
echo "BB_ALERTER_MATRIX_TOKEN=\"${BB_ALERTER_MATRIX_TOKEN}\"" >> "${MOUNT_POINT}/root/bb-config.env"
fi
# Store Tailscale auth key if needed
if [[ "$BB_VPN" == "tailscale" && -n "$TAILSCALE_KEY" ]]; then
@@ -664,13 +694,27 @@ SVCEOF
fi
# Network alerter
if [[ -n "${BB_ALERTER_WEBHOOK:-}" ]]; then
if [[ -n "${BB_ALERTER_TYPE:-}" ]]; then
echo "[*] Sending online alert..."
BB_IP=$(curl -sf --max-time 5 https://api.ipify.org 2>/dev/null || hostname -I | awk '{print $1}')
BB_HOSTNAME=$(hostname)
curl -sf -X POST "$BB_ALERTER_WEBHOOK" \
-H 'Content-Type: application/json' \
-d "{\"text\":\"BigBrother ${BB_DEVICE_ID} online | ip: ${BB_IP} | host: ${BB_HOSTNAME}\"}" || true
_BB_IP=$(curl -sf --max-time 5 https://api.ipify.org 2>/dev/null || hostname -I | awk '{print $1}')
_BB_MSG="${BB_DEVICE_ID} online | ip: ${_BB_IP} | host: $(hostname)"
if [[ "${BB_ALERTER_TYPE}" == "matrix" ]]; then
_TXNID=$(date +%s%N)
_ROOM="${BB_ALERTER_MATRIX_ROOM//!/%21}"
_ROOM="${_ROOM//:/%3A}"
curl -sf -X PUT \
"${BB_ALERTER_MATRIX_HS}/_matrix/client/v3/rooms/${_ROOM}/send/m.room.message/${_TXNID}" \
-H "Authorization: Bearer ${BB_ALERTER_MATRIX_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"msgtype\":\"m.text\",\"body\":\"${_BB_MSG}\"}" || true
elif [[ "${BB_ALERTER_TYPE}" == "ntfy" ]]; then
curl -sf -X POST "${BB_ALERTER_WEBHOOK}" -d "${_BB_MSG}" || true
else
curl -sf -X POST "${BB_ALERTER_WEBHOOK}" \
-H 'Content-Type: application/json' \
-d "{\"text\":\"${_BB_MSG}\"}" || true
fi
fi
echo "[+] First-boot complete: $(date)"