#!/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="https://discord.com/api/webhooks/***REMOVED***" 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