Check and switch gateways

I have written a quick&dirty bash script to check which gateway is still working and switch to it. It also switches back to the primary gateway as soon as it is available again. The script can be called on a regular basis via cron.

#!/bin/bash
## Create logfile and send all output to logfile
logfile=/var/log/gateway-check.log
#exec &> >(tee -a "$logfile")
## Define variable for a date/time stamp
datetimestamp=$(date)
## Define variable for destination MACs
## Define variable for the source IP to use for the ping source
GW_NAME=(Internet Alternative SomethingElse)
GW_MAC=(00:11:22:33:44:55 00:11:22:33:44:66 00:11:22:33:44:77)
GW_IP=(192.168.1.1 192.168.2.1 192.168.3.1)
SRC_IP=(192.168.1.45 192.168.2.45 192.168.3.45)
## Define variable for ping target
PING_TARGET=8.8.8.8
## Define email fields
MAIL_TO=me@example.com
#########
## Logic is:
## check if target is reachable
##   NO  -> search a GW and switch to it
##   YES -> check if GW is the default GW (the first one in the array)
##     YES -> exit
##     NO  -> check if default GW can reach internet.
##       YES -> switch to default GW
##       NO  -> keep the current GW
#########
## check if target is reachable
pingTarget=$(nping --icmp --icmp-type echo $PING_TARGET | grep Lost | awk '{print $12}')
gateway=$(route -n | grep ^0.0.0.0 | awk '{print $2}')
if [ $pingTarget -le 5 ];
then
## target reachable
## Check if current route is via first GW and works
if [ "$gateway" = "${GW_IP[0]}" ];
then
## we ware using default GW, all is fine
echo "***** "$datetimestamp" - GW OK. Packet loss: "$pingTarget"/5" >> "$logfile"
exit 0
else
gwReachesNet=$(nping --icmp --icmp-type echo --source-ip ${SRC_IP[0]} --dest-mac ${GW_MAC[0]} --delay 500ms $PING_TARGET | grep Lost | awk '{print $12}')
if [ $gwReachesNet -le 2 ];
then
## default GW reaches net, lets switch to it
echo "=========="$datetimestamp"=========="
echo "Default gateway is reachable again."
wall "Default gateway is reachable again. Your connection will be lost in 30 seconds"
sleep 30s
ip route replace default via ${GW_IP[0]} dev eth0
echo "----------"$datetimestamp"----------"
exit 0
fi
fi
else
## target unreachable
echo "=========="$datetimestamp"=========="
echo "The current gateway is "$gateway" and does not work"
## do the nping for all GWs
for i in {0..2}
do
result[i]=$(nping --icmp --icmp-type echo --source-ip ${SRC_IP[i]} --dest-mac ${GW_MAC[i]} --delay 500ms $PING_TARGET | grep Lost | awk '{print $12}')
echo ${GW_NAME[i]}": "${result[i]}
done
#########
## set GW to the highes working GW
#########
for i in {0..2}
do
if [ ${result[i]} -le 2 ];
then
## change GW to new route
ip route replace default via ${GW_IP[i]} dev eth0
## update dynDNS entry here
echo "Gateway switched from "$gateway" to "${GW_IP[i]}" ("${GW_NAME[i]}")."
break
fi
done
echo "----------"$datetimestamp"----------"
fi