#!/bin/sh
#
# gwbackup - Automatic backup of default gateway.
# v2.3 (watching state of both connections)
# lunix@haluz.net


WATCH_IP="1.1.1.1"		#check reachability of this address (could be identical with PRI_GW)
PERIOD="10"			#interval between checks in seconds
COUNT="5"			#number of packets (all of them needs to be lost to activate backup)

PING=`which ping`
LOGGER=`which logger`
LOG_OPT=""			#default null, -s for debugging
PRISTATE=0			#default state of primary connection UP (0 ping vraci kdyz je UP)
SECSTATE=0			#default state of secondary connection UP
GWSTATE=0			#default gw state (0=primary, 1=secondary)

$LOGGER $LOG_OPT -t "gwbackup" "Version 0.3 STARTED - watching $WATCH_IP"

while [ 1 ]; do

	$PING -c $COUNT -I eth0.17 -q $WATCH_IP > /dev/null
	PRISTATENEW=$?
	$PING -c $COUNT -I eth0.20 -q $WATCH_IP > /dev/null
	SECSTATENEW=$?
	
	#zmena v nejakem stavu
	if [[ $PRISTATENEW != $PRISTATE ]] || [[ $SECSTATENEW != $SECSTATE ]]  ; then
	    $LOGGER $LOG_OPT -t "gwbackup" "STATE CHANGE (ACTION OR INFO should follow)! DEBUG (old/new): pri $PRISTATE/$PRISTATENEW, sec $SECSTATE/$SECSTATENEW"
	    
	    #bezi primar - je to easy
	    if [[ $PRISTATENEW ==  0 ]] ; then
		#AKCE: nabeh primar ted?
		if [[ $PRISTATE == 1 ]] ; then
		    $LOGGER $LOG_OPT -t "gwbackup" "INFO: primary modem down->UP"
		    $LOGGER $LOG_OPT -t "gwbackup" "ACTION: ip ro table 17 default"
		    /etc/routing/setup_tables.sh
		    GWSTATE=0
		fi

		#INFO: bezi sekundar a nabeh ted?
		if [[ $SECSTATE ==  1 ]] && [[ $SECSTATENEW == 0 ]] ; then
		    $LOGGER $LOG_OPT -t "gwbackup" "INFO: secondary modem down->UP"
		fi

		#INFO: nebezi sekundar a upad ted?
		if [[ $SECSTATE ==  0 ]] && [[ $SECSTATENEW == 1 ]] ; then
		    $LOGGER $LOG_OPT -t "gwbackup" "INFO: secondary modem up->DOWN"
		fi

	    else
	    #primar nebezi, co ted?
	    
		#INFO: nebezi sekundar a upad ted - zahlasit, ze je down
		if [[ $SECSTATE ==  0 ]] && [[ $SECSTATENEW == 1 ]] ; then
		    $LOGGER $LOG_OPT -t "gwbackup" "INFO: secondary modem up->DOWN"
		fi
	    
		#upad primar ted?
		if  [[ $PRISTATE == 0 ]] ; then
		    $LOGGER $LOG_OPT -t "gwbackup" "INFO: primary modem up->DOWN"
		    #bezi sekundar?
		    if [[ $SECSTATENEW == 0 ]] ; then
			#nabeh ted?
			if [[ $SECSTATE ==  1 ]] ; then 
			    $LOGGER $LOG_OPT -t "gwbackup" "INFO: secondary modem down->UP"
			fi
			$LOGGER $LOG_OPT -t "gwbackup" "ACTION: ip ro table 20 default (primary modem down, secondary modem running)"
			/etc/routing/setup_tables_backup.sh
			GWSTATE=1
		    else
			$LOGGER $LOG_OPT -t "gwbackup" "INFO: nothing to do, both modems down, we are doomed!!!11111111"
		    fi
		
		else 
		#primar upad uz driv
		    #AKCE: bezi sekundar a nabeh ted?
	    	    if [[ $SECSTATE ==  1 ]] && [[ $SECSTATENEW == 0 ]] ; then
	    		$LOGGER $LOG_OPT -t "gwbackup" "INFO: secondary modem down->UP"
	    		#neni nahodou uz gateway prepla? (opakovane vypadky sekundaru pri spadlem primaru)
	    		if [[ $GWSTATE !=  1 ]] ; then 
			    $LOGGER $LOG_OPT -t "gwbackup" "ACTION: ip ro table 20 default (primary modem down, secondary modem running - 2)"
			    /etc/routing/setup_tables_backup.sh
			    GWSTATE=1
			fi
		    fi
		fi
	    fi
	    
	    #ulozit zmeny ve stavu
	    PRISTATE=$PRISTATENEW
	    SECSTATE=$SECSTATENEW
	fi

	sleep $PERIOD

done
