O cliente de VPN da Cisco vpnc não mantém persistência na conexão, hora ou outra a conexão é finalizada. Para aqueles que precisam manter conexão 24×7 um script como estes será muito útil.
O script watch_vpnc possui 4 opções:
- start: inicia a conexão
- stop: finaliza a conexão
- status: apenas verifica o status da conexão verificando se o arquivo PID existe E se existe o processo, pois pode ser que aconteça do daemon ser finalizado abruptamente (kill -9) e o arquivo ainda existir.
- check: verifica se a conexão está ativa, se não estiver, reconecta.
Este script foi escrito com base no vpnc para RedHat/CentOS, para Ubuntu será necessário mudar a localização do arquivo PID.
Para manter como um “daemon” é recomendado rodá-lo na crontab, pois fazer um script com “sleep” não é uma boa idéia.
#!/usr/bin/env bash
# watchdog para Cisco vpnc Client
# v1, abril/2012 - ftorres[at]ymail.com
export PATH=$PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
LOGFILE=/tmp/watch_vpn.log
Status()
{
# Verifica se existe um processo com o mesmo numero do PID
# Alguns casos podera existir o arquivo mas o daemon ter finalizado abruptamente.
if [ -e /var/run/vpnc/pid ];then
PID=$(cat /var/run/vpnc/pid)
ps -p $PID -o comm= >/dev/null 2>&1
RET=$?
if [ $RET -eq 0 ];then
echo OK
else
echo NOK
fi
else
# Se o arquivo nem existir, nok
echo NOK
fi
}
Stop()
{
pidof vpnc|xargs kill -15
rm -f /var/run/vpnc/pid
}
Log_msg()
{
echo "$(date '+%x - %X') $@"
}
Help()
{
echo "$0 stop|start|status|check"
}
Vpn()
{
if [ -f /tmp/watch.lock ];then
Log_msg "Lock existe - /tmp/watch.lock"
exit
else
> /tmp/watch.lock
RET=$(Status)
if [ "$RET" = "OK" ];then
Log_msg "VPN OK"
rm -f /tmp/watch.lock
else
Log_msg "VPN nao esta conectada"
Stop
vpnc
rm -f /tmp/watch.lock
fi
fi
}
Start()
{
Stop
Vpn
}
Check()
# Verifica o status da VPN, se nao estiver OK ele ira conectar.
{
RET=$(Status)
if [ "$RET" = "NOK" ];then
Stop
Start
else
echo $RET
Log_msg $RET >> $LOGFILE
fi
}
Main()
{
case "$1" in
start) Start;;
stop) Stop;;
status) Status;;
check) Check;;
*) Help;;
esac
exit 0
}
[ -z "$1" ] && Help || Main $1
Se você precisa rodar a cada “segundo” e não quer construir um daemon e não quer usar “sleep”, então:
# Se quiser apenas a cada minuto */1 * * * * /usr/local/bin/watch_vpnc.sh check # Se não estiver satisfeito e quiser apelar: */1 * * * * sleep 20 && /usr/local/bin/watch_vpnc.sh check */1 * * * * sleep 40 && /usr/local/bin/watch_vpnc.sh check