proxmox-server-setup/kuma-push.sh
2025-08-01 16:16:20 -05:00

55 lines
2.1 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 Bash + jq + wget (no curl)
###############################################################################
set -Eeuo pipefail
CFG="/opt/kuma-checks.json"
BASE="https://status.jordanwages.com/api/push"
WGET_OPTS=(--quiet --tries=1 --timeout=4 --output-document=/dev/null)
# 0-4 s jitter so many VMs don't hit Kuma at the exact same second
sleep $(( RANDOM % 5 ))
# --------------------------------------------------------------------------- #
push() { # $1 token $2 status $3 msg $4 ping-ms
local url="${BASE}/${1}?status=${2}&msg=${3// /%20}&ping=${4}"
wget "${WGET_OPTS[@]}" "$url" || true # Kuma will alert if pushes stop
}
check_http() { # arg: URL
local start elapsed
start=$(date +%s%3N)
if wget "${WGET_OPTS[@]}" "$1"; then
elapsed=$(( $(date +%s%3N) - start ))
echo "up $elapsed"
else
elapsed=$(( $(date +%s%3N) - start ))
echo "down $elapsed"
fi
}
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"; }
# --------------------------------------------------------------------------- #
# Iterate through 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") # target may be absent
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