72 行
2.2 KiB
Bash
72 行
2.2 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||
|
|
. "$ROOT_DIR/scripts/lib.sh"
|
||
|
|
load_env
|
||
|
|
|
||
|
|
EVENT="${1:-UNKNOWN}"
|
||
|
|
MESSAGE="${2:-}"
|
||
|
|
TIMESTAMP="$(now)"
|
||
|
|
|
||
|
|
# Webhook URL from config (never logged)
|
||
|
|
WEBHOOK_URL="${ALERT_WEBHOOK_URL:-}"
|
||
|
|
WEBHOOK_TYPE="${ALERT_WEBHOOK_TYPE:-wecom}" # wecom | dingtalk | feishu
|
||
|
|
|
||
|
|
[ -n "$WEBHOOK_URL" ] || {
|
||
|
|
printf 'ALERT_WEBHOOK_URL not configured; alert suppressed: [%s] %s\n' "$EVENT" "$MESSAGE" >&2
|
||
|
|
exit 0
|
||
|
|
}
|
||
|
|
|
||
|
|
# Sanitize message: strip any passwords, tokens, keys
|
||
|
|
SAFE_MSG="$(printf '%s' "$MESSAGE" | sed 's/password=[^ ]*/password=***/gi; s/token=[^ ]*/token=***/gi; s/secret=[^ ]*/secret=***/gi')"
|
||
|
|
|
||
|
|
build_payload() {
|
||
|
|
local event="$1"
|
||
|
|
local msg="$2"
|
||
|
|
local ts="$3"
|
||
|
|
local version="${PRIVATE_VERSION:-unknown}"
|
||
|
|
case "$WEBHOOK_TYPE" in
|
||
|
|
dingtalk)
|
||
|
|
printf '{"msgtype":"markdown","markdown":{"title":"[%s] XuqmGroup Private","text":"**[%s]** %s\n\n版本: %s\n时间: %s"}}' \
|
||
|
|
"$event" "$event" "$msg" "$version" "$ts"
|
||
|
|
;;
|
||
|
|
feishu)
|
||
|
|
printf '{"msg_type":"text","content":{"text":"[%s] %s\n版本: %s\n时间: %s"}}' \
|
||
|
|
"$event" "$msg" "$version" "$ts"
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
# WeCom (企业微信)
|
||
|
|
printf '{"msgtype":"markdown","markdown":{"content":"**[%s]** %s\n>版本: `%s`\n>时间: %s"}}' \
|
||
|
|
"$event" "$msg" "$version" "$ts"
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
}
|
||
|
|
|
||
|
|
PAYLOAD="$(build_payload "$EVENT" "$SAFE_MSG" "$TIMESTAMP")"
|
||
|
|
|
||
|
|
if command -v curl >/dev/null 2>&1; then
|
||
|
|
HTTP_CODE="$(curl -s -o /dev/null -w '%{http_code}' \
|
||
|
|
-X POST -H 'Content-Type: application/json' \
|
||
|
|
-d "$PAYLOAD" \
|
||
|
|
--max-time 10 \
|
||
|
|
"$WEBHOOK_URL" 2>/dev/null || echo '000')"
|
||
|
|
if [ "$HTTP_CODE" = "200" ]; then
|
||
|
|
audit "alert" "SENT" "event=$EVENT"
|
||
|
|
else
|
||
|
|
audit "alert" "FAILED" "event=$EVENT http=$HTTP_CODE"
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
audit "alert" "SKIPPED" "curl not available event=$EVENT"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Consecutive failure tracking for auto-alert on healthcheck failures
|
||
|
|
FAIL_COUNT_FILE="$ROOT_DIR/.deploy-state/healthcheck-fail-count.txt"
|
||
|
|
if [ "$EVENT" = "HEALTHCHECK_FAILED" ]; then
|
||
|
|
COUNT="$(cat "$FAIL_COUNT_FILE" 2>/dev/null || echo 0)"
|
||
|
|
COUNT=$((COUNT + 1))
|
||
|
|
printf '%s\n' "$COUNT" > "$FAIL_COUNT_FILE"
|
||
|
|
else
|
||
|
|
printf '0\n' > "$FAIL_COUNT_FILE"
|
||
|
|
fi
|