#!/bin/sh
# Simon's nasty watchdog script.
#this could be done a lot better.. but I'm a shitty scripter

#setup the devices, so we know what we're working with
Device1=router
Device2=p333
Device3=clarissa
Device4=sabrina
Device5=games
Device6=shiva
Device7=sparc

#setup IP addresses of pingable devices..
Device1IP=192.168.0.1
Device2IP=192.168.0.2
Device3IP=192.168.0.3
Device4IP=192.168.0.4
Device5IP=192.168.0.5
Device6IP=192.168.0.6
Device7IP=192.168.0.7

#setup check files..
Device1Check=/tmp/D1Check
Device2Check=/tmp/D2Check
Device3Check=/tmp/D3Check
Device4Check=/tmp/D4Check
Device5Check=/tmp/D5Check
Device6Check=/tmp/D6Check
Device7Check=/tmp/D7Check

#setup some other variables we're going to need
Log=/var/log/watchdog
Switch=/usr/local/bin/lptout

#check all the devices..
Device1Status=`fping $Device1IP | grep alive`
Device2Status=`fping $Device2IP | grep alive`
Device3Status=`fping $Device3IP | grep alive`
Device4Status=`fping $Device4IP | grep alive`
Device5Status=`fping $Device5IP | grep alive`
Device6Status=`fping $Device6IP | grep alive`
Device7Status=`fping $Device7IP | grep alive`

#dump the time in the log, so we know when the following happened..
echo `date` >> $Log

#work out what's going on with each..

if [ "$Device1Status" ];then
	echo "$Device1 is alive" >> $Log
else
	echo "$Device1 seems to be down" >> $Log
	Device1DownCount=`cat $Device1Check`
	if [ ! "$Device1DownCount" ];then
		touch $Device1Check
		Device1DownCount=0
	fi
	Device1DownCount=`expr $Device1DownCount + 1`
	echo $Device1DownCount > $Device1Check
	if [ "$Device1DownCount" -eq 5 ];then
		echo "$Device1 meets criteria for reset" >> $Log
		Device1Reset=YES
	fi
fi

if [ "$Device2Status" ];then
	echo "$Device2 is alive" >> $Log
else
	echo "$Device2 seems to be down" >> $Log
	Device2DownCount=`cat $Device2Check`
	if [ ! "$Device2DownCount" ];then
		touch $Device2Check
		Device2DownCount=0
	fi
	Device2DownCount=`expr $Device2DownCount + 1`
	echo $Device2DownCount > $Device2Check
	if [ "$Device2DownCount" -eq 5 ];then
		echo "$Device2 meets criteria for reset" >> $Log
		Device2Reset=YES
	fi
fi

if [ "$Device3Status" ];then
	echo "$Device3 is alive" >> $Log
else
	echo "$Device3 seems to be down" >> $Log
	Device3DownCount=`cat $Device3Check`
	if [ ! "$Device3DownCount" ];then
		touch $Device3Check
		Device3DownCount=0
	fi
	Device3DownCount=`expr $Device3DownCount + 1`
	echo $Device3DownCount > $Device3Check
	if [ "$Device3DownCount" -eq 5 ];then
		echo "$Device3 meets criteria for reset" >> $Log
		Device3Reset=YES
	fi
fi

if [ "$Device4Status" ];then
	echo "$Device4 is alive" >> $Log
else
	echo "$Device4 seems to be down" >> $Log
	Device4DownCount=`cat $Device4Check`
	if [ ! "$Device4DownCount" ];then
		touch $Device4Check
		Device4DownCount=0
	fi
	Device4DownCount=`expr $Device4DownCount + 1`
	echo $Device4DownCount > $Device4Check
	if [ "$Device4DownCount" -eq 5 ];then
		echo "$Device4 meets criteria for reset" >> $Log
		Device4Reset=YES
	fi
fi

if [ "$Device5Status" ];then
	echo "$Device5 is alive" >> $Log
else
	echo "$Device5 seems to be down" >> $Log
	Device5DownCount=`cat $Device5Check`
	if [ ! "$Device5DownCount" ];then
		touch $Device5Check
		Device5DownCount=0
	fi
	Device5DownCount=`expr $Device5DownCount + 1`
	echo $Device5DownCount > $Device5Check
	if [ "$Device5DownCount" -eq 5 ];then
		echo "$Device5 meets criteria for reset" >> $Log
		Device5Reset=YES
	fi
fi

if [ "$Device6Status" ];then
	echo "$Device6 is alive" >> $Log
else
	echo "$Device6 seems to be down" >> $Log
	Device6DownCount=`cat $Device6Check`
	if [ ! "$Device6DownCount" ];then
		touch $Device6Check
		Device6DownCount=0
	fi
	Device6DownCount=`expr $Device6DownCount + 1`
	echo $Device6DownCount > $Device6Check
	if [ "$Device6DownCount" -eq 5 ];then
		echo "$Device6 meets criteria for reset" >> $Log
		Device6Reset=YES
	fi
fi

if [ "$Device7Status" ];then
	echo "$Device7 is alive" >> $Log
else
	echo "$Device7 seems to be down" >> $Log
	Device7DownCount=`cat $Device7Check`
	if [ ! "$Device7DownCount" ];then
		touch $Device7Check
		Device7DownCount=0
	fi
	Device7DownCount=`expr $Device7DownCount + 1`
	echo $Device7DownCount > $Device7Check
	if [ "$Device7DownCount" -eq 5 ];then
		echo "$Device7 meets criteria for reset" >> $Log
		Device7Reset=YES
	fi
fi


#ok, now we need to work out what we're going to do based on the reset flags..

#worst case scenario..
if [ "$Device1Reset" = "YES" -a "$Device2Reset" = "YES" -a "$Device3Reset" = "YES" -a "$Device4Reset" = "YES" -a "$Device5Reset" = "YES" -a "$Device6Reset" = "YES" -a "$Device7Reset" = "YES" ];then
	echo "Oh shit! everything is down!" >> $Log
	echo "Either we've lost our network" >> $Log
	echo "Or a hub/switch has shit itself" >> $Log
	echo "Now resetting the hub/switch power" >> $Log
	$Switch #combo of hub power data line
	#reset the fail counts..
	echo "0" > $Device1Check
	echo "0" > $Device2Check
	echo "0" > $Device3Check
	echo "0" > $Device4Check
	echo "0" > $Device5Check
	echo "0" > $Device6Check
	echo "0" > $Device7Check
	#reset the reset flag, to avoid everything being bounced later
	Device1Reset=NO
	Device2Reset=NO
	Device3Reset=NO
	Device4Reset=NO
	Device5Reset=NO
	Device6Reset=NO
	Device7Reset=NO
fi

#now we work with individual failures
if [ "$Device1Reset" = "YES" ];then
	echo "$Device1 now being reset" >> $Log
	$Switch 1
	sleep 3
	$Switch 0
	echo "cross your fingers, $Device1 is now rebooting" >> $Log
	echo "0" > $Device1Check
fi

if [ "$Device2Reset" = "YES" ];then
	echo "$Device2 now being reset" >> $Log
	$Switch 2
	sleep 3
	$Switch 0
	echo "cross your fingers, $Device2 is now rebooting" >> $Log
	echo "0" > $Device2Check
fi

if [ "$Device3Reset" = "YES" ];then
	echo "$Device3 now being reset" >> $Log
	$Switch 4
	sleep 3
	$Switch 0
	echo "cross your fingers, $Device3 is now rebooting" >> $Log
	echo "0" > $Device3Check
fi

if [ "$Device4Reset" = "YES" ];then
	echo "$Device4 now being reset" >> $Log
	$Switch 8
	sleep 3
	$Switch 0
	echo "cross your fingers, $Device4 is now rebooting" >> $Log
	echo "0" > $Device4Check
fi

if [ "$Device5Reset" = "YES" ];then
	echo "$Device5 now being reset" >> $Log
	$Switch 16
	sleep 3
	$Switch 0
	echo "cross your fingers, $Device5 is now rebooting" >> $Log
	echo "0" > $Device5Check
fi

if [ "$Device6Reset" = "YES" ];then
	echo "$Device6 now being reset" >> $Log
	$Switch 32
	sleep 3
	$Switch 0
	echo "cross your fingers, $Device6 is now rebooting" >> $Log
	echo "0" > $Device6Check
fi

if [ "$Device7Reset" = "YES" ];then
	echo "$Device7 now being reset" >> $Log
	$Switch 64
	sleep 3
	$Switch 0
	echo "cross your fingers, $Device7 is now rebooting" >> $Log
	echo "0" > $Device7Check
fi


