Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash --
- # Joaquín Moreno 2011
- # FailOver 1.0
- #Funcionamiento
- #Comprueba si tiene acceso a google.es, sino, intenta con 8.8.8.8, si falla entonces:
- # Repite la operación en cada ejecución del script hasta tantas veces como el valor
- # de la variable INTENTOS. Si sigue fallando y se consumen todos los INTENTOS entonces:
- # Se cambia la ruta a la secundaria. Mientras se encuentre en este estado:
- # Cada RESTAURAR veces de la ejecución del script comprobara si el sistema se ha
- # restablecido. Para ello restaurará la ruta principal, comprobará conexión, si falla
- # entonces vuelve a pone la de backup.
- #Requisitos:
- #Poner la ruta de la principal únicamente
- #Anyadir en el contrab una ejecución cada 5 minutos */5 * * * * script
- ### Variables ###
- #
- CONFIG="/usr/local/failover/config"
- #Interfaz primaria
- PRINCIPAL="eth0"
- #Interfaz de backup
- SECUNDARIA="eth1"
- #Numero de intentos antes de cambiar a BackUp
- INTENTOS=3
- #Es donde escribimos los intentos realizados
- TIMEOUT="/usr/local/failover/timeout"
- #Numero de intentos antes de restaurar
- RESTAURAR=6
- #Es donde escribimos los intentos realizados
- FICREST="/usr/local/failover/restaurar"
- #Vale 0 si estamos en principal o 1 si estamos en backup
- BACKUP="/usr/local/failover/backup"
- #Log del agente
- LOG="/usr/local/failover.log"
- #Dominios a los que consultamos
- DOMAIN1="www.google.com"
- DOMAIN2="8.8.8.8"
- ### Funciones ###
- #Comprobamos si existe las dependencis del agente
- checkDep()
- {
- [ -f $TIMEOUT ] ||
- {
- echo "Intento" > $TIMEOUT
- }
- [ -f $FICREST ] ||
- {
- echo "Esperar" > $FICREST
- }
- [ -f $BACKUP ] ||
- {
- echo "0" > $BACKUP
- }
- }
- #Configura las puertas de enlace
- checkConfig()
- {
- [ -f $CONFIG ] ||
- {
- GW=""
- getGW $PRINCIPAL
- echo "$GW" > $CONFIG
- getGW $SECUNDARIA
- [ "$GW" != "" ] &&
- {
- echo "$GW" >> $CONFIG
- /sbin/route del default gw $GW
- }
- }
- }
- #Obtención del gateway
- getGW()
- {
- #GW=`/sbin/ip route | grep default | grep $1 | awk {'print $2'}`
- GW=`/sbin/route -n | grep $1 | grep 0.0.0.0 | grep ^'0.0.0.0' | awk {'print $2'}`
- }
- #Cambio a la linea de backup
- setBackup()
- {
- #Obtenemos las puertas de enlace
- GW=`tail -1 $CONFIG`
- #Cambiamos la ruta
- /sbin/ip route flush cache
- /sbin/route del default
- /sbin/route add default gw $GW
- }
- #Cambio a la linea principal
- setPrincipal()
- {
- #Configuramos la principal
- GW=""
- GW=`head -1 $CONFIG`
- #Cambiamos la ruta
- /sbin/ip route flush cache
- /sbin/route del default
- /sbin/route add default gw $GW
- #Comprobar conectividad contra google
- if /bin/ping -c3 $DOMAIN1 >/dev/null 2>&1;
- then
- echo "[OK] $DATE -> RESTAURADO" >> $LOG
- echo "0" > $BACKUP
- else
- #Comprobamos contra la IP
- if /bin/ping -c3 $DOMAIN2 >/dev/null 2>&1;
- then
- echo "[OK] $DATE -> RESTAURADO $DOMAIN2, ¿DNS ERROR?" >> $LOG
- echo "0" > $BACKUP
- else
- setBackup
- echo "[INFO] $DATE -> NO RESTAURADO" >> $LOG
- fi
- fi
- }
- #Generación de evento
- setEvento()
- {
- DESC="La linea principal ha caido, se pasa a backup"
- #Enviar un correo mediante mail o usar el gestor de tickets que tengamos
- }
- ### Principal ###
- #Hora
- DATE=`date +%Y-%m-%d_%H:%M`
- #Dependencias
- checkDep
- #Configuracion de las puertas de enlace
- checkConfig
- #SI ESTAMOS EN LINEA BACKUP
- FOUND=`cat $BACKUP`
- [ "$FOUND" == "1" ] &&
- {
- FOUND=`cat $FICREST | wc -l`
- if [ "$FOUND" == "$RESTAURAR" ] ;
- then
- setPrincipal
- echo "Esperar" > $FICREST
- else
- echo "Esperar" >> $FICREST
- fi
- exit 0
- }
- #SI ESTAMOS EN LINEA PRINCIPAL
- #Comprobar conectividad contra google
- if /bin/ping -c3 $DOMAIN1 >/dev/null 2>&1;
- then
- echo "[OK] $DATE -> $DOMAIN1"
- echo "Intento" > $TIMEOUT
- else
- #Comprobamos contra la IP
- if /bin/ping -c3 $DOMAIN2 >/dev/null 2>&1;
- then
- echo "[OK] $DATE -> $DOMAIN2, ¿DNS ERROR?" >> $LOG
- echo "Intento" > $TIMEOUT
- else
- #Si hay $INTENTOS(lineas) en el timeout, cambiamos la ruta a la de backup
- FOUND=`cat $TIMEOUT | wc -l`
- if [ "$FOUND" == "$INTENTOS" ];
- then
- #Cambiamos de línea
- echo "[ERROR] $DATE -> BACKUP ACTIVADO" >> $LOG
- setBackup
- #Generamos evento
- setEvento
- #Se restaura el estado
- echo "Intento" > $TIMEOUT
- #Notificamos que estamos en línea de backup
- echo "1" > $BACKUP
- else
- echo "[ERROR] $DATE -> Fallo numero $FOUND" >> $LOG
- echo "Intento" >> $TIMEOUT
- fi
- fi
- fi
- exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement