#!/bin/bash IF="tun0" # Interface used for ping ping1_target="8.8.8.8" # IP no. 1 used for ping ping2_target="82.165.229.31" # IP no. 2 used for ping ping_interval="5" # waiting time in-between two pings switchback_interval="3600" # waiting time for interface to recover before probing again start_grace="10" # waiting time to allow for tunnel restart logfile="/dev/null" # logfile for debug gwsel_lockfile="/tmp/gwsel_lockfile" # lockfile to allow for low bandwidth settings openvpn_stop-cmd () { # command used disabling tunnel #service openvpn stop # ubuntu /etc/init.d/openvpn stop # debian #killall openvpn # hardcore } openvpn_start-cmd () { # command used enabling tunnel #service openvpn start # ubuntu /etc/init.d/openvpn start # debian #openvpn /etc/openvpn/*.conf & # hardcore } ping1 () { echo "$(date): ping -q -c 3 -i ${ping_interval} ${ping1_target} -I $IF" &>> $logfile ping -q -c 3 -i ${ping_interval} ${ping1_target} -I $IF &>> $logfile ping1_ExitCode=$? echo "$(date): Exit Status: ${ping1_ExitCode}" &>> $logfile } ping2 () { echo "$(date): ping -q -c 3 -i ${ping_interval} ${ping2_target} -I $IF" &>> $logfile ping -q -c 3 -i ${ping_interval} ${ping2_target} -I $IF &>> $logfile ping2_ExitCode=$? echo "$(date): Exit Status: ${ping2_ExitCode}" &>> $logfile } while true do # wait for interface build-up, if interface not present if [ ! -h "/sys/class/net/$IF" ]; then echo "$(date): Interface $IF not detected. Waiting ${start_grace} seconds." &>> $logfile sleep ${start_grace} fi # perform ping ping1 ping2 # check if ping successful if ([[ ${ping1_ExitCode} -eq 0 ]] || [[ ${ping2_ExitCode} -eq 0 ]]); then sleep ${ping_interval} else logger -t "$0" ${ping1_target} and ${ping2_target} not reached via interface $IF. echo "$(date): ${ping1_target} and ${ping2_target} not reached via interface $IF." &>> $logfile if [ -h "/sys/class/net/$IF" ]; then logger -t "$0" Stopping interface $IF. echo "$(date): Stopping interface $IF." &>> $logfile openvpn_stop-cmd &>> $logfile touch ${gwsel_lockfile} &>> $logfile fi sleep ${switchback_interval} if [ ! -h "/sys/class/net/$IF" ]; then logger -t "$0" Restoring interface $IF to probe for recovery. echo "$(date): Restoring interface $IF to probe for recovery." &>> $logfile openvpn_start-cmd &>> $logfile rm -f ${gwsel_lockfile} &>> $logfile fi fi done