Backup automatico script del 2025-12-27 10:58
This commit is contained in:
94
scripts/pi2-backup/auto-git-backup.sh
Executable file
94
scripts/pi2-backup/auto-git-backup.sh
Executable file
@@ -0,0 +1,94 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# 💾 AUTO GIT BACKUP - DINAMICO
|
||||||
|
# Sincronizza automaticamente tutti gli script .sh e .py dal Pi2 e dal Pi1
|
||||||
|
# verso il repository Gitea locale, poi esegue il push.
|
||||||
|
# ==============================================================================
|
||||||
|
|
||||||
|
# --- CONFIGURAZIONE ---
|
||||||
|
REPO_DIR="/home/daniely/loogle-repo"
|
||||||
|
LOG_FILE="/var/log/git-backup.log"
|
||||||
|
DATE=$(date +"%Y-%m-%d %H:%M")
|
||||||
|
|
||||||
|
# IP del Pi1 (Master) da cui prelevare i file remoti
|
||||||
|
PI1_IP="192.168.128.80"
|
||||||
|
PI1_USER="daniely"
|
||||||
|
|
||||||
|
# Redirige tutto l'output (stdout e stderr) nel log
|
||||||
|
exec >> $LOG_FILE 2>&1
|
||||||
|
|
||||||
|
echo "=== Inizio Backup Git: $DATE ==="
|
||||||
|
|
||||||
|
# 1. PREPARAZIONE REPOSITORY
|
||||||
|
# --------------------------
|
||||||
|
if [ -d "$REPO_DIR" ]; then
|
||||||
|
cd "$REPO_DIR" || { echo "❌ Errore: Impossibile entrare in $REPO_DIR"; exit 1; }
|
||||||
|
else
|
||||||
|
echo "❌ Errore: La cartella $REPO_DIR non esiste."; exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Aggiorna il repository locale (pull) per evitare conflitti
|
||||||
|
echo "🔄 Eseguo Git Pull..."
|
||||||
|
git pull origin main
|
||||||
|
|
||||||
|
# Assicuriamoci che le cartelle di destinazione esistano
|
||||||
|
mkdir -p ./scripts/pi2-backup
|
||||||
|
mkdir -p ./services/telegram-bot
|
||||||
|
mkdir -p ./scripts/pi1-master
|
||||||
|
mkdir -p ./configs
|
||||||
|
|
||||||
|
# 2. RACCOLTA FILE DAL PI-2 (LOCALE)
|
||||||
|
# ----------------------------------
|
||||||
|
echo "📂 Raccolta dinamica file locali (Pi-2)..."
|
||||||
|
|
||||||
|
# A. Script nella Home (solo .sh) -> scripts/pi2-backup
|
||||||
|
# --include='*.sh' prende gli script, --exclude='*' ignora tutto il resto
|
||||||
|
rsync -av --include='*.sh' --exclude='*' /home/daniely/ "$REPO_DIR/scripts/pi2-backup/"
|
||||||
|
|
||||||
|
# B. Script del Bot (tutti .py e .sh) -> services/telegram-bot
|
||||||
|
rsync -av --include='*.py' --include='*.sh' --exclude='*' /home/daniely/docker/telegram-bot/ "$REPO_DIR/services/telegram-bot/"
|
||||||
|
|
||||||
|
# C. File di Configurazione specifici (Keepalived)
|
||||||
|
if [ -f "/etc/keepalived/keepalived.conf" ]; then
|
||||||
|
sudo cp /etc/keepalived/keepalived.conf ./configs/keepalived_pi2.conf
|
||||||
|
sudo chown daniely:daniely ./configs/keepalived_pi2.conf
|
||||||
|
echo "✅ Configurazione Keepalived Pi2 copiata."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. RACCOLTA FILE DAL PI-1 (REMOTO)
|
||||||
|
# ----------------------------------
|
||||||
|
echo "📡 Raccolta dinamica file remoti (Pi-1)..."
|
||||||
|
|
||||||
|
# A. Script nella Home remota (.sh e .py) -> scripts/pi1-master
|
||||||
|
# Nota: Richiede che le chiavi SSH siano configurate per non chiedere password
|
||||||
|
rsync -av -e "ssh -q" --include='*.sh' --include='*.py' --exclude='*' $PI1_USER@$PI1_IP:/home/daniely/ "$REPO_DIR/scripts/pi1-master/"
|
||||||
|
|
||||||
|
# B. Recupero file specifici fuori dalla home (Legacy da vecchio script)
|
||||||
|
# Se dhcp-alert.sh esiste ancora in /usr/local/bin, lo prendiamo
|
||||||
|
scp -q $PI1_USER@$PI1_IP:/usr/local/bin/dhcp-alert.sh ./scripts/pi1-master/ 2>/dev/null || echo "⚠️ dhcp-alert.sh non trovato su Pi1 (ignorato)"
|
||||||
|
|
||||||
|
# C. Configurazione Keepalived Remota
|
||||||
|
scp -q $PI1_USER@$PI1_IP:/etc/keepalived/keepalived.conf ./configs/keepalived_pi1.conf 2>/dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "✅ Configurazione Keepalived Pi1 scaricata."
|
||||||
|
else
|
||||||
|
echo "⚠️ Impossibile scaricare Keepalived conf da Pi1."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 4. GIT PUSH
|
||||||
|
# -----------
|
||||||
|
# Verifica se ci sono cambiamenti reali
|
||||||
|
if [[ `git status --porcelain` ]]; then
|
||||||
|
echo "📝 Rilevati cambiamenti. Eseguo Commit e Push..."
|
||||||
|
|
||||||
|
git add .
|
||||||
|
git commit -m "Backup automatico script del $DATE"
|
||||||
|
git push -u origin main
|
||||||
|
|
||||||
|
echo "✅ Push completato con successo."
|
||||||
|
else
|
||||||
|
echo "ℹ️ Nessun cambiamento rilevato. Repository già aggiornato."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Fine Backup Git ==="
|
||||||
120
scripts/pi2-backup/super_watchdog.sh
Normal file
120
scripts/pi2-backup/super_watchdog.sh
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
#!/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 ---"
|
||||||
16
sync_loogle_bot.cron.log
Normal file
16
sync_loogle_bot.cron.log
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
2025-12-27 09:00:01 [START] Sync Loogle Bot
|
||||||
|
2025-12-27 09:00:01 [RSYNC] /home/daniely/docker/telegram-bot/ -> /home/daniely/loogle-repo/services/telegram-bot/
|
||||||
|
sending incremental file list
|
||||||
|
./
|
||||||
|
nowcast_120m_alert.py
|
||||||
|
|
||||||
|
sent 11.968 bytes received 38 bytes 24.012,00 bytes/sec
|
||||||
|
total size is 160.755 speedup is 13,39
|
||||||
|
[main 91189e0] Sync Loogle Bot 2025-12-27 09:00
|
||||||
|
1 file changed, 379 insertions(+)
|
||||||
|
create mode 100644 services/telegram-bot/nowcast_120m_alert.py
|
||||||
|
remote: . Processing 1 references
|
||||||
|
remote: Processed 1 references in total
|
||||||
|
To gitea-local:daniele/loogle-scripts.git
|
||||||
|
aa5386b..91189e0 main -> main
|
||||||
|
2025-12-27 09:00:02 [OK] Push completato.
|
||||||
Reference in New Issue
Block a user