#!/bin/bash # ================================================ # πŸ” SUPER WATCHDOG DI RETE (Gira su Pi-2) # ================================================ # --- CONFIGURAZIONE TELEGRAM --- # Legge il token dal file sicuro invece che averlo in chiaro TOKEN_FILE="/etc/telegram_dpc_bot_token" if [ -f "$TOKEN_FILE" ]; then # Legge il file e rimuove spazi o 'a capo' accidentali BOT_TOKEN=$(cat "$TOKEN_FILE" | tr -d '\n' | tr -d '\r') else echo "ERRORE CRITICO: Token file non trovato in $TOKEN_FILE" exit 1 fi CHAT_ID="64463169" # πŸ‘†πŸ‘† FINE MODIFICHE πŸ‘†πŸ‘† # Cartella dove salvare lo stato di ogni dispositivo STATE_DIR="/tmp/watchdog_states" mkdir -p "$STATE_DIR" # --- LISTA DEI BERSAGLI --- # Formato: "Nome Amichevole|Indirizzo IP" # Usa icone diverse per capire subito la gravitΓ . TARGETS=( # CRITICI 🚨 "πŸ“ 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" # INFRASTRUTTURA πŸ”Œ "πŸ—„οΈ NAS DS214|192.168.128.90" "πŸ”Œ Switch Sala (.105)|192.168.128.105" "πŸ”Œ Switch Main (.106)|192.168.128.106" "πŸ”Œ Switch Lavanderia (.107)|192.168.128.107" "πŸ”Œ Switch Taverna (.108)|192.168.128.108" # WIFI πŸ“Ά "πŸ“Ά 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" # CAMERE πŸ“· (Sottorete .135) "πŸ“· 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" ) # Funzione per inviare messaggi Telegram send_telegram() { MSG="$1" # Usa un timeout breve per curl per non bloccare lo script se Telegram non va curl -s --max-time 5 -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" -d chat_id="$CHAT_ID" -d text="$MSG" -d parse_mode="Markdown" > /dev/null 2>&1 } # ================================================ # CICLO DI CONTROLLO PRINCIPALE # ================================================ echo "--- Inizio controllo $(date) ---" # Loop attraverso ogni dispositivo nella lista for target_line in "${TARGETS[@]}"; do # Estrai Nome e IP separati dal simbolo "|" NAME=$(echo "$target_line" | cut -d'|' -f1) IP=$(echo "$target_line" | cut -d'|' -f2) # Crea un nome file sicuro per lo stato usando l'IP (es. 192_168_1_1.state) SAFE_IP="${IP//./_}" STATE_FILE="$STATE_DIR/${SAFE_IP}.state" # Leggi lo stato precedente (default UP se non esiste) if [ -f "$STATE_FILE" ]; then LAST_STATE=$(cat "$STATE_FILE") else LAST_STATE="UP" echo "UP" > "$STATE_FILE" # Inizializza fi # --- IL PING --- # Tenta 2 ping, con timeout di 1 secondo l'uno. # È un controllo rapido. Se fallisce 2 volte di fila, Γ¨ giΓΉ. ping -c 2 -W 1 "$IP" > /dev/null 2>&1 PING_RESULT=$? # 0 = Successo, altro = Fallimento if [ $PING_RESULT -eq 0 ]; then # === ORA È ONLINE === if [ "$LAST_STATE" == "DOWN" ]; then # Era giΓΉ, ora Γ¨ su: NOTIFICA DI RISOLUZIONE send_telegram "βœ… **RISOLTO: $NAME Γ¨ tornato ONLINE!**%0AIP: \`$IP\`" echo "UP" > "$STATE_FILE" echo "--> $NAME tornato UP. Notifica inviata." fi else # === ORA È OFFLINE === if [ "$LAST_STATE" == "UP" ]; then # Era su, ora Γ¨ giΓΉ: NOTIFICA DI ALLARME # Scegli l'icona in base al tipo di dispositivo per l'allarme ICON="⚠️" if [[ "$NAME" == *"🚨"* || "$NAME" == *"🌍"* ]]; then ICON="🚨 CRITICO:"; fi send_telegram "$ICON **ALLARME: $NAME Γ¨ OFFLINE!**%0AIP: \`$IP\` non risponde." echo "DOWN" > "$STATE_FILE" echo "--> $NAME andato DOWN. Notifica inviata." else echo "$NAME ancora DOWN. Nessuna notifica." fi fi done echo "--- Fine controllo ---"