version 1.5, 2010/01/09 04:25:42
|
version 1.8, 2017/03/28 21:44:24
|
Line 1
|
Line 1
|
#!/bin/bash |
#!/bin/bash |
|
|
# switchhgate 0.0.3 |
# switchhgate 0.0.5 |
# (c) 2005 under GPL by Adrian Zaugg |
# (c) 2005-2010 under GPL by Adrian Zaugg |
|
|
# switchgate pings a set of hosts to determine the state of the internet connectivity. If |
# switchgate pings a set of hosts to determine the state of the internet connectivity. If |
# the connection is down, it can change the default gateway to an alternative gateway. |
# the connection is down, it can change the default gateway to an alternative gateway. |
Line 36 ALIVE_ANSWER="is alive"
|
Line 36 ALIVE_ANSWER="is alive"
|
# set to an empty string to avoid debug output |
# set to an empty string to avoid debug output |
# to "low" for a few output and to anything else |
# to "low" for a few output and to anything else |
# for verbose output |
# for verbose output |
DEBUG=low |
DEBUG= |
|
|
|
|
# -------- Do not edit below this line -------- |
# -------- Do not edit below this line -------- |
Line 47 PINGARGS="-A -p25 -t100"
|
Line 47 PINGARGS="-A -p25 -t100"
|
## Function declarations |
## Function declarations |
# |
# |
|
|
# parse commandline switches |
|
function parse_commandline { |
|
|
|
# check rest |
|
while [ "$#" -gt 0 ]; do |
|
|
|
case "$1" in |
|
|
|
-d|--debug) |
|
# debug switch (another hidden feature) |
|
shift |
|
if [ "$1" != "low" ]; then |
|
DEBUG="choke" |
|
echo "Debug mode on." |
|
else |
|
#echo "Info mode on." |
|
DEBUG="low" |
|
shift |
|
fi |
|
;; |
|
|
|
-C) |
|
# Parse writeable dir request (hidden feature) |
|
echo "$DHCP_TMP_DIR" |
|
exit 0 |
|
;; |
|
|
|
-q|--query) |
|
# Parse query for current gw (yet another hidden feature) |
|
shift |
|
parse_commandline "$@" |
|
getcurrentgw |
|
echo "$CURRENTGW" |
|
exit 0 |
|
;; |
|
|
|
-s|--set) |
|
# Set gateway to number n (yet another hidden feature) |
|
shift |
|
set_to_gw="$1" |
|
shift |
|
parse_commandline "$@" |
|
set_gw |
|
exit 0 |
|
;; |
|
|
|
*) |
|
echo "Invalid argument \"$1\"." |
|
exit 1 |
|
;; |
|
|
|
esac |
|
done |
|
} |
|
|
|
# Read gateways from file |
# Read gateways from file |
function readgwlist { |
function readgwlist { |
if [ -f "$GATEWAYS_FILE" ]; then |
if [ -f "$GATEWAYS_FILE" ]; then |
Line 114 function readgwlist {
|
Line 59 function readgwlist {
|
fi |
fi |
|
|
allgates=`grep -ve "^[ ]*[\#]\+.*$" "$GATEWAYS_FILE" | xargs` |
allgates=`grep -ve "^[ ]*[\#]\+.*$" "$GATEWAYS_FILE" | xargs` |
|
alldhcpgates="" |
for gate in $allgates; do |
for gate in $allgates; do |
if [[ $(echo "$gate" | grep -c -e "^[:space:]*dhcp\..*$") -eq 1 && \ |
if [[ $(echo "$gate" | grep -c -e "^[[:space:]]*dhcp\..*$") -eq 1 && \ |
-f "$CONFIG_PATH/$gate" ]]; then |
-f "$DHCP_TMP_DIR/$gate" ]]; then |
# Read dhcp supplied gate for a specific interface |
# Read dhcp supplied gate for a specific interface |
alldhcpgates=`grep -e "^[^\#].*$" "$CONFIG_PATH/$gate" | xargs` |
alldhcpgates="$alldhcpgates `grep -e "^[^\#].*$" "$DHCP_TMP_DIR/$gate" | xargs`" |
elif [[ $(echo "$gate" | grep -c -e "^[:space:]*dhcp[:space:]*$") -eq 1 ]]; then |
elif [[ $(echo "$gate" | grep -c -e "^[[:space:]]*dhcp[[:space:]]*$") -eq 1 ]]; then |
# Read all dhcp files |
# Read all dhcp files |
alldhcpgates="" |
for dhcpfile in $(echo -n $(ls -1 $DHCP_TMP_DIR/dhcp* 2>/dev/null)); do |
for dhcpfile in $(echo -n $(ls -1 $DHCP_TMP_DIR/dhcp* 2>/dev/null)); do |
|
alldhcpgates="$alldhcpgates `grep -e "^[^\#].*$" "$dhcpfile" | xargs`" |
alldhcpgates="$alldhcpgates `grep -e "^[^\#].*$" "$dhcpfile" | xargs`" |
done |
done |
else |
else |
Line 196 function checkgw {
|
Line 141 function checkgw {
|
fi |
fi |
} |
} |
|
|
# Get the current default gateway (or set it, if there was none set) |
|
function getcurrentgw { |
function getcurrentgw { |
iproute_default_gw_txt="$(ip route show scope global)" |
iproute_default_gw_txt="$(ip route show scope global)" |
if [ `echo $iproute_default_gw_txt | grep -c default` -gt 1 ]; then |
if [ `echo $iproute_default_gw_txt | grep -c default` -gt 1 ]; then |
Line 209 function getcurrentgw {
|
Line 153 function getcurrentgw {
|
# no default gateway currently set, set to the highest index, to land on GW0 |
# no default gateway currently set, set to the highest index, to land on GW0 |
CURRENTGW_ID=0 |
CURRENTGW_ID=0 |
CURRENTGW=${GW[$CURRENTGW_ID]} |
CURRENTGW=${GW[$CURRENTGW_ID]} |
|
CURRENTGW_DEV="unknown" |
echo "No default gateway currently set. Setting it now to $CURRENTGW." |
echo "No default gateway currently set. Setting it now to $CURRENTGW." |
ip route add default via $CURRENTGW |
ip route add default via $CURRENTGW |
if [ $? -eq 2 ]; then |
|
echo "Not able to switch default gateway. Is your interface up?" |
|
exit 1 |
|
fi |
|
else |
else |
CURRENTGW=`echo $iproute_default_gw_txt | sed "s/^default via \(\([0-9]\+\.\?\)\{4\}\).*\$/\1/"` |
CURRENTGW=`echo $iproute_default_gw_txt | sed "s/^default via \(\([0-9]\+\.\?\)\{4\}\).*\$/\1/"` |
|
CURRENTGW_DEV=`echo $iproute_default_gw_txt | sed "s/^default via .* dev \(eth[0-9]\+\).*\$/\1/"` |
fi |
fi |
CURRENTGW_DEV=`echo $iproute_default_gw_txt | sed "s/^default via .* dev \(eth[0-9]\+\).*\$/\1/"` |
|
|
|
# get index of current gateway |
# get index of current gateway |
index=-1 |
index=-1 |
Line 260 function getnextgw {
|
Line 201 function getnextgw {
|
function getnewgw { |
function getnewgw { |
getnextgw |
getnextgw |
# Check wheter all gateways are already tested and failed |
# Check wheter all gateways are already tested and failed |
if [[ "$NEWGW_ID" -eq "$CURRENTGW_ID" && -z $set_to_gw ]]; then |
if [ "$NEWGW_ID" -eq "$CURRENTGW_ID" ]; then |
if [ -n "$DEBUG" ]; then |
if [ -n "$DEBUG" ]; then |
echo "All gateways tried." |
echo "All gateways tried." |
fi |
fi |
Line 286 function getnewgw {
|
Line 227 function getnewgw {
|
fi |
fi |
} |
} |
|
|
# Switch the gateway to a desired gateway |
|
function set_gw { |
|
|
|
# get name of gateway |
|
if [[ ! "$set_to_gw" =~ ^[0-9]{1,}$ ]]; then |
|
echo "Only positive numbers allowed. Invalid value \"$set_to_gw\"." |
|
exit 1 |
|
fi |
|
|
|
NEWGW=${GW[$set_to_gw]} |
|
if [ -z "$NEWGW" ]; then |
|
echo "The gateway number $set_to_gw is not in the list of available gateways." |
|
echo "Valid gateways are:" |
|
for ((gw=0; gw<${#GW[*]}; gw++)); do |
|
echo -e "\t$gw (${GW[$gw]})" |
|
done |
|
exit 1 |
|
fi |
|
if [ -n "$DEBUG" -a "$DEBUG" != "low" ]; then |
|
echo "Default gateway desired: $NEWGW ($set_to_gw)" |
|
fi |
|
|
|
getcurrentgw |
|
NEWGW_ID=$[ $set_to_gw - 1 ] |
|
switchgw |
|
} |
|
|
|
function switchgw { |
function switchgw { |
getnewgw |
getnewgw |
if [ -n "$NEWGW" ]; then |
if [ -n "$NEWGW" ]; then |
Line 360 function switchgw {
|
Line 274 function switchgw {
|
## MAIN |
## MAIN |
# |
# |
|
|
|
# Parse writeable dir request (hidden feature) |
|
if [ "$1" = "-C" ]; then |
|
echo "$DHCP_TMP_DIR" |
|
exit 0 |
|
fi |
|
|
|
# Parse debug switch (another hidden feature) |
|
if [ "$1" = "-d" ]; then |
|
if [ "$2" != "low" ]; then |
|
echo "Debug mode on." |
|
DEBUG="choke" |
|
else |
|
#echo "Info mode on." |
|
DEBUG="low" |
|
fi |
|
fi |
|
|
# Check fping existence |
# Check fping existence |
if [ ! -x "$PING" ]; then |
if [ ! -x "$PING" ]; then |
Line 370 fi
|
Line 300 fi
|
# Get all gateways, we can forward traffic |
# Get all gateways, we can forward traffic |
readgwlist |
readgwlist |
|
|
# parse commandline switches |
# Parse query for current gw (yet another hidden feature) |
parse_commandline "$@" |
if [ "$1" = "-q" ]; then |
|
DEBUG= |
|
getcurrentgw |
|
echo "$CURRENTGW" |
|
exit 0 |
|
fi |
|
|
# get current gw |
# get current gw |
getcurrentgw |
getcurrentgw |
Line 418 fi
|
Line 353 fi
|
|
|
# send an eMail if the connection is down or limited |
# send an eMail if the connection is down or limited |
if [ -z "$UP" ]; then |
if [ -z "$UP" ]; then |
EMAIL_BODY="Switchgate on $(hostname -f) reports: No connection!\n\nTime:\t\t$(date)\nGateway:\t$CURRENTGW ($CURRENTGW_ID)" |
if [ -z "$NEWGW" ]; then |
EMAIL_SUBJECT="Attention: $(hostname -f) has no connection!" |
EMAIL_BODY="Switchgate on $(hostname -f) reports: No connection!\n\nTime:\t\t$(date)\nGateway:\t$CURRENTGW ($CURRENTGW_ID)" |
echo -e "$EMAIL_BODY" | mail -s "$EMAIL_SUBJECT" "$ALERT_EMAIL" |
EMAIL_SUBJECT="Attention: $(hostname -f) has no connection!" |
if [[ -n "$DEBUG" && "$DEBUG" != "low" ]]; then |
echo -e "$EMAIL_BODY" | mail -s "$EMAIL_SUBJECT" "$ALERT_EMAIL" |
echo "Alert message sent to $ALERT_EMAIL." |
if [[ -n "$DEBUG" && "$DEBUG" != "low" ]]; then |
|
echo "Alert message sent to $ALERT_EMAIL." |
|
fi |
fi |
fi |
elif [ "$CURRENTGW_ID" != 0 ]; then |
elif [ "$CURRENTGW_ID" != 0 ]; then |
EMAIL_BODY="Switchgate on $(hostname -f) reports: Not operating on standard default gateway!\n\nTime:\t\t$(date)\nGateway:\t$CURRENTGW ($CURRENTGW_ID)" |
EMAIL_BODY="Switchgate on $(hostname -f) reports: Not operating on standard default gateway!\n\nTime:\t\t$(date)\nGateway:\t$CURRENTGW ($CURRENTGW_ID)" |
Line 433 elif [ "$CURRENTGW_ID" != 0 ]; then
|
Line 370 elif [ "$CURRENTGW_ID" != 0 ]; then
|
fi |
fi |
fi |
fi |
|
|
if [ "$DEBUG" = "low" ]; then |
if [ "$DEBUG" = "low" -o "$DEBUG" = "choke" ]; then |
echo |
if [ -n "$UP" ]; then |
echo "Default Gateway: $CURRENTGW ($CURRENTGW_ID)" |
echo |
echo |
echo "Current Default Gateway: $CURRENTGW ($CURRENTGW_ID)" |
|
echo |
|
else |
|
echo |
|
echo "No connection." |
|
echo |
|
fi |
fi |
fi |
exit 0 |
exit 0 |