#!/bin/bash # ================================================ # ๐Ÿ” SUPER WATCHDOG DI RETE (Gira su Pi-2) # ================================================ LOOGLE_NOTIFY="/home/daniely/docker/loogle-casa/scripts/loogle-notify.sh" if [[ ! -x "$LOOGLE_NOTIFY" ]]; then echo "ERRORE: loogle-notify non disponibile ($LOOGLE_NOTIFY)" >&2 exit 1 fi STATE_DIR="/tmp/watchdog_states" mkdir -p "$STATE_DIR" # Riavvio giornaliero AP WiFi: silenzio allarmi per REBOOT_GRACE_MIN minuti # dall'orario programmato. Se ancora DOWN dopo la finestra โ†’ allarme. REBOOT_GRACE_MIN=5 TARGETS=( "๐Ÿ“ Pi-1 (Master)|192.168.128.80" "๐Ÿ—„๏ธ NAS DS920+|192.168.128.100" "๐ŸŒ Internet (Google)|8.8.8.8" "๐Ÿ“ก Router Main|192.168.128.1" "๐Ÿ—„๏ธ NAS DS214|192.168.128.90" "๐Ÿ”Œ Switch Sala (.105)|192.168.128.105" "๐Ÿ”Œ Switch Taverna (.106)|192.168.128.106" "๐Ÿ”Œ Switch Lavanderia (.107)|192.168.128.107" "๐Ÿ“ถ WiFi Sala (.101)|192.168.128.101" "๐Ÿ“ถ WiFi Luca (.102)|192.168.128.102" "๐Ÿ“ถ WiFi Taverna (.103)|192.168.128.103" "๐Ÿ“ถ WiFi Dado (.104)|192.168.128.104" "๐Ÿ“ถ WiFi Esterno (.108)|192.168.128.108" "๐Ÿ“ถ WiFi Pozzo (.109)|192.168.128.109" "๐Ÿ“ท Cam Matrimoniale|192.168.135.2" "๐Ÿ“ท Cam Luca|192.168.135.3" "๐Ÿ“ท Cam Ingresso|192.168.135.4" "๐Ÿ“ท Cam Sala|192.168.135.5" "๐Ÿ“ท Cam Taverna|192.168.135.6" "๐Ÿ“ท Cam Retro|192.168.135.7" ) send_alert() { local title="$1" local body="$2" local severity="$3" "$LOOGLE_NOTIFY" --title "$title" --body "$body" --category super_watchdog \ --severity "$severity" & } # Restituisce i minuti da mezzanotte dell'inizio riavvio (o vuoto se non programmato). # 04:00 โ†’ Dado (.104), Sala (.101) # 04:30 โ†’ Luca (.102), Taverna (.103) # 14:00 โ†’ Esterno (.108), Pozzo (.109) wifi_reboot_start_min() { case "$1" in 192.168.128.101|192.168.128.104) echo 240 ;; # 04:00 192.168.128.102|192.168.128.103) echo 270 ;; # 04:30 192.168.128.108|192.168.128.109) echo 840 ;; # 14:00 *) echo "" ;; esac } # 0 se siamo nella finestra [start, start+grace) del riavvio programmato. in_wifi_reboot_window() { local start start=$(wifi_reboot_start_min "$1") [[ -n "$start" ]] || return 1 local now_min=$((10#$(date +%H) * 60 + 10#$(date +%M))) local end=$((start + REBOOT_GRACE_MIN)) [[ $now_min -ge $start && $now_min -lt $end ]] } echo "--- Inizio controllo $(date) ---" for target_line in "${TARGETS[@]}"; do NAME=$(echo "$target_line" | cut -d'|' -f1) IP=$(echo "$target_line" | cut -d'|' -f2) SAFE_IP="${IP//./_}" STATE_FILE="$STATE_DIR/${SAFE_IP}.state" if [ -f "$STATE_FILE" ]; then LAST_STATE=$(cat "$STATE_FILE") else LAST_STATE="UP" echo "UP" > "$STATE_FILE" fi ping -c 2 -W 1 "$IP" > /dev/null 2>&1 PING_RESULT=$? if [ $PING_RESULT -eq 0 ]; then if [ "$LAST_STATE" == "DOWN" ]; then send_alert \ "Dispositivo online" \ "RISOLTO: $NAME รจ tornato ONLINE! IP: $IP" \ "info" echo "UP" > "$STATE_FILE" echo "--> $NAME tornato UP. Notifica inviata." elif [ "$LAST_STATE" == "REBOOT_DOWN" ]; then # Ripristino dopo riavvio programmato: nessun allarme off/on echo "UP" > "$STATE_FILE" echo "--> $NAME tornato UP dopo riavvio programmato. Nessuna notifica." fi else if [ "$LAST_STATE" == "UP" ]; then if in_wifi_reboot_window "$IP"; then echo "REBOOT_DOWN" > "$STATE_FILE" echo "--> $NAME DOWN in finestra riavvio programmato. Silenzio." else ICON="โš ๏ธ" if [[ "$NAME" == *"๐Ÿšจ"* || "$NAME" == *"๐ŸŒ"* ]]; then ICON="๐Ÿšจ CRITICO:"; fi send_alert \ "Dispositivo offline" \ "$ICON ALLARME: $NAME รจ OFFLINE! IP: $IP non risponde." \ "warning" echo "DOWN" > "$STATE_FILE" echo "--> $NAME andato DOWN. Notifica inviata." fi elif [ "$LAST_STATE" == "REBOOT_DOWN" ]; then if in_wifi_reboot_window "$IP"; then echo "$NAME ancora DOWN in finestra riavvio. Silenzio." else # Oltre i 5 minuti dal riavvio programmato: allarme reale ICON="โš ๏ธ" send_alert \ "Dispositivo offline" \ "$ICON ALLARME: $NAME รจ OFFLINE oltre il riavvio programmato! IP: $IP non risponde." \ "warning" echo "DOWN" > "$STATE_FILE" echo "--> $NAME ancora DOWN dopo finestra riavvio. Notifica inviata." fi else echo "$NAME ancora DOWN. Nessuna notifica." fi fi done echo "--- Fine controllo ---"