143 lines
4.8 KiB
Bash
Executable File
143 lines
4.8 KiB
Bash
Executable File
#!/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 ---"
|