Skip to content

Instantly share code, notes, and snippets.

@andreivmaksimov
Created June 2, 2017 10:40
Show Gist options
  • Save andreivmaksimov/cae904ce2cac1fcb3720fb6678902a83 to your computer and use it in GitHub Desktop.
Save andreivmaksimov/cae904ce2cac1fcb3720fb6678902a83 to your computer and use it in GitHub Desktop.
SOHO Linux Router 2 ISP failover script
#!/bin/bash
# Set defaults if not provided by environment
CHECK_DELAY=${CHECK_DELAY:-5}
CHECK_IP=${CHECK_IP:-8.8.8.8}
PRIMARY_IF=${PRIMARY_IF:-eth2}
PRIMARY_GW=${PRIMARY_GW:-192.168.1.1}
BACKUP_IF=${BACKUP_IF:-eth1}
BACKUP_GW=${BACKUP_GW:-192.168.3.1}
# Compare arg with current default gateway interface for route to healthcheck IP
gateway_if() {
[[ "$1" = "$(ip r g ${CHECK_IP} | sed -rn 's/^.*dev ([^ ]*).*$/\1/p')" ]]
}
CURRENT_GW_IF=$(ip r | grep default | cut -d' ' -f5)
echo Current GW = ${CURRENT_GW_IF}
# Cycle healthcheck continuously with specified delay
while sleep "$CHECK_DELAY"
do
CURRENT_GW_IF=`ip r | grep default | cut -d' ' -f5`
#echo "Setting ${CHECK_IP} traffic through ${PRIMARY_GW}"
route add ${CHECK_IP} gw ${PRIMARY_GW}
# If healthcheck succeeds from primary interface
if ping -I "$PRIMARY_IF" -c1 "$CHECK_IP" &>/dev/null
then
echo "Primary interface ${PRIMARY_IF} is working"
# Are we using the backup?
#echo Current GW IF = ${CURRENT_GW_IF}
#echo Backup IF = ${BACKUP_IF}
if [ "${CURRENT_GW_IF}" == "${BACKUP_IF}" ]; then # Switch to primary
echo "Switching from backup interface ${BACKUP_IF} to primary ${PRIMARY_IF}"
ip r d default via "${BACKUP_GW}" dev "${BACKUP_IF}"
ip r a default via "${PRIMARY_GW}" dev "${PRIMARY_IF}"
fi
else
# Are we using the primary?
echo "Primary interface ${PRIMARY_IF} is not working"
if [ "${CURRENT_GW_IF}" == "${PRIMARY_IF}" ]; then # Switch to backup
echo "Switching from primary ${PRIMARY_IF} interface to backup ${BACKUP_IF}"
ip r d default via "${PRIMARY_GW}" dev "${PRIMARY_IF}"
ip r a default via "${BACKUP_GW}" dev "${BACKUP_IF}"
fi
fi
#echo "Deleting ${CHECK_IP} traffic through ${PRIMARY_GW}"
route del 8.8.8.8
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment