Archive for vpn cisco

Persistencia com Cisco VPNc Client

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