proxmox-server-setup/kuma-push.sh
2025-08-01 02:49:26 -05:00

50 lines
2 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
###############################################################################
# Uptime Kuma push script using JSON inventory + jq
###############################################################################
set -Eeuo pipefail
CFG="/opt/kuma-checks.json"
BASE="https://status.jordanwages.com/api/push"
CURL_OPTS=(--silent --show-error --max-time 4)
# 0-4 s start-up jitter so many VMs dont hit Kuma simultaneously
sleep $(( RANDOM % 5 ))
# --------------------------------------------------------------------------- #
push() { # $1 token $2 status $3 msg $4 ping-ms
curl "${CURL_OPTS[@]}" \
"${BASE}/${1}?status=${2}&msg=${3// /%20}&ping=${4}" \
|| true # dont abort script if push itself fails
}
check_http() { # arg: URL
local t0=$(date +%s%3N)
local code
code=$(curl "${CURL_OPTS[@]}" -o /dev/null -w '%{http_code}' "$1" || echo 000)
echo "$([[ $code =~ ^2|3 ]] && echo up || echo down) $(( $(date +%s%3N) - t0 ))"
}
check_service() { systemctl is-active --quiet "$1" && echo "up 0" || echo "down 0"; }
check_docker() { docker inspect -f '{{.State.Running}}' "$1" &>/dev/null && echo "up 0" || echo "down 0"; }
check_mount() { mountpoint -q "$1" 2>/dev/null && echo "up 0" || echo "down 0"; }
check_native() { echo "up 0"; }
# --------------------------------------------------------------------------- #
# Loop over checks defined in the JSON inventory
jq -c '.[]' "$CFG" | while IFS= read -r item; do
name=$(jq -r '.name' <<<"$item")
type=$(jq -r '.type' <<<"$item")
id=$(jq -r '.push' <<<"$item")
tgt=$(jq -r '.target // empty' <<<"$item") # may be absent for "native"
case "$type" in
http) read -r stat ping < <(check_http "$tgt") ;;
service) read -r stat ping < <(check_service "$tgt") ;;
docker) read -r stat ping < <(check_docker "$tgt") ;;
mount) read -r stat ping < <(check_mount "$tgt") ;;
native) read -r stat ping < <(check_native) ;;
*) stat=down; ping=0 ;;
esac
push "$id" "$stat" "$name" "$ping"
done