[technique] Script de watchdog VPN

Cyril popolinux at gmail.com
Mer 14 Déc 18:57:16 CET 2011


Salut à vous !

On a des soucis à St Crotens.
Parfois le VPN tombe et ne se remet pas en route tant que l'on a pas 
killé le process OpenVPN, puis relancé.

J'ai codé un petit script de watchdog pour veiller au grain et éviter de 
me lever à 3h du mat pour relancer le bouzin.
Le voici ci-après, peut être que ça sera utile sur d'autres gateways.
Désolé si la façon de code n'est pas toujours très efficiente, moi et le 
bash ça fait trois !

-------

#!/bin/bash

DATA_FILE='/root/watchdog_ping.dat'
RESTART_THRESHOLD=2

hosts[0]='8.8.8.8'
hosts[1]='81.93.255.70'

function check_ping() {
         ping -nc 1 $1 >/dev/null
}

function count_reset() {
         echo '0' > $DATA_FILE
}

function count_reset_up() {
         if [ "$(cat /root/watchdog_ping.dat)" != "0" ]
                 then echo "$(date +"%m-%d-%Y %H:%I:%S") : Ping UP !"
         fi
         count_reset
}

function count_increment(){
         nb_try=$(cat /root/watchdog_ping.dat)
         new_nb_try=$(($nb_try + 1))
         echo $new_nb_try > $DATA_FILE

         echo "$(date +"%m-%d-%Y %H:%I:%S") : Ping down (try : 
$new_nb_try/$RESTART_THRESHOLD)"
}

function restart_vpn(){
         /root/tetaneutral.sh --setup
         count_reset

         echo "$(date +"%m-%d-%Y %H:%I:%S") : VPN Restart"
}

function check_all_hosts() {
         nb_down=0
         nb_hosts=0

         # Test de ping sur tous les hosts
         for i in ${!hosts[*]}
         do
                 if ! check_ping ${hosts[$i]}
                         then    nb_down=$((nb_down+1))
                 fi
                 nb_hosts=$((nb_hosts+1))
         done

         # Si tous les hosts test sont down on incremente le compteur
         if [ $nb_down == $nb_hosts ]
                 then count_increment
                 else count_reset_up
         fi

         # Si le nombre d'echecs depassent le seuil
         if [ "$(($(cat /root/watchdog_ping.dat)+1))" -gt 
"$RESTART_THRESHOLD" ]
                 then restart_vpn
         fi
}

check_all_hosts

-------

Fonctionnement :

- Les IP présentes dans l'array hosts seront pinguées l'une après 
l'autre et si aucune ne répond, le script détectera la coupure.
- Si le nombre d'essais définis dans la variable RESTART_THRESHOLD est 
dépassé, la fonction restart_vpn() sera appelée (à St Crotens 
"/root/tetaneutral.sh --setup" fait un "killall -9 openvpn" et relance 
le VPN).
- Le but de RESTART_THRESHOLD est de ne pas relancer le VPN pour rien 
s'il s'agit d'une mini coupure, mais la valeur peut être passée à 1 pour 
que ce soit plus agressif.
- Et... en fait c'est tout...


Installation :

- Avant tout il faut créer le fichier contenant le nombre d'essais : 
echo '0' > /root/watchdog_ping.dat
- Ensuite, il suffit d'ajouter le script dans la crontab : * * * * * 
/root/watchdog_ping.sh >> /root/watchdog_ping.log



Bien entendu je sous ouvert à toute proposition d'amélioration, il y a 
peut être des coquilles :)

A++
Cyril



Plus d'informations sur la liste de diffusion technique