zektyc/scripts/uptime-check.sh
riricdev f27387b525 chore(secrets): retire les webhooks Discord et l'état runtime du git avant hébergement public
- scripts antiflood/ipwatch/uptime-check chargent désormais leur webhook depuis
  scripts/.webhooks (gitignoré) au lieu d'un token en dur
- suppression scripts/antiflood.sh.bak-before-cpu-removal (doublon mort)
- untrack + gitignore des fichiers d'état runtime (.ipwatch-state/offset, .synbase,
  .synstate, .uptime-state) contenant des IP opérationnelles
2026-09-06 16:38:49 +02:00

66 lines
2 KiB
Shell
Executable file

#!/usr/bin/env bash
# Zektyc — moniteur de disponibilité (uptime checker)
# Vérifie toutes les 5 secondes le code HTTP de réponse de la homepage.
# - Code 2xx/3xx -> online
# - Code 000 (échec connexion / funnel coupé), 5xx (erreur serveur) ou autre
# code d'échec -> incident technique
set -uo pipefail
URL="https://riricdev.tail5ea5cd.ts.net/"
# Webhook Discord chargé depuis un fichier local gitignoré (jamais commité).
source /home/riricdev/zektyc/scripts/.webhooks
WEBHOOK="${ANTIFLOOD_WEBHOOK:-}"
STATE_FILE="/home/riricdev/zektyc/scripts/.uptime-state"
INTERVAL=5
# Un code HTTP est "online" s'il est 2xx/3xx, ou 429 (rate limit = serveur up,
# juste throttlé). Tout le reste (000, 4xx hors 429, 5xx) = down.
http_is_online() {
local code="$1"
case "$code" in
2*|3*|429) return 0 ;; # 200-399 et 429 : online
*) return 1 ;; # 000, 4xx (hors 429), 5xx : down
esac
}
down() {
local payload
payload=$(printf '{"content":"🔴 **Zektyc** — incident technique."}' )
curl -s -m 10 -H "Content-Type: application/json" -X POST "$WEBHOOK" -d "$payload" >/dev/null 2>&1 || true
echo down >"$STATE_FILE"
}
up() {
local payload
payload=$(printf '{"content":"🟢 **Zektyc** — le site est de nouveau en ligne."}' )
curl -s -m 10 -H "Content-Type: application/json" -X POST "$WEBHOOK" -d "$payload" >/dev/null 2>&1 || true
echo up >"$STATE_FILE"
}
if [[ ! -f "$STATE_FILE" ]]; then
echo "unknown" >"$STATE_FILE"
fi
while true; do
code="$(curl -s -o /dev/null -w '%{http_code}' -m 10 "$URL" 2>/dev/null || echo 000)"
code="${code:-000}"
state="$(cat "$STATE_FILE")"
if http_is_online "$code"; then
if [[ "$state" != "up" ]]; then
up
fi
else
if [[ "$state" != "down" ]]; then
# On n'envoie qu'une fois la notification de panne (quand on était up).
if [[ "$state" == "up" ]]; then
down
else
# État initial inconnu : on se contente de mémoriser sans notifier.
echo down >"$STATE_FILE"
fi
fi
fi
sleep "$INTERVAL"
done