Diff for /badi/public_scripts/switchgate/switchgate between versions 1.1 and 1.8

version 1.1, 2009/04/24 00:12:49 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 16  CONFIG_PATH="/etc/switchgate" Line 16  CONFIG_PATH="/etc/switchgate"
 # the dhclient-exit-hook helper program  # the dhclient-exit-hook helper program
 DHCP_TMP_DIR=/tmp/switchgate  DHCP_TMP_DIR=/tmp/switchgate
   
   # eMail address to send alert messages, if not operating on the
   # standard default gateway
   ALERT_EMAIL="adi@ente.limmat.ch"
   
 # Host set to ping. A file containing IP addresses, each on a single line.  # Host set to ping. A file containing IP addresses, each on a single line.
 # Do not include any local hosts, list only hosts located behind your gateways.  # Do not include any local hosts, list only hosts located behind your gateways.
 HOSTSET_FILE="$CONFIG_PATH/hostset"  HOSTSET_FILE="$CONFIG_PATH/hostset"
Line 24  HOSTSET_FILE="$CONFIG_PATH/hostset" Line 28  HOSTSET_FILE="$CONFIG_PATH/hostset"
 GATEWAYS_FILE="$CONFIG_PATH/gateways"  GATEWAYS_FILE="$CONFIG_PATH/gateways"
   
 # path to fping  # path to fping
 PING=/usr/sbin/fping  PING=/usr/bin/fping
   
 # answer of fping to reachable hosts  # answer of fping to reachable hosts
 ALIVE_ANSWER="is alive"  ALIVE_ANSWER="is alive"
Line 55  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 81  function readgwlist { Line 85  function readgwlist {
                         unset alldhcpgates                          unset alldhcpgates
                 done                  done
         fi          fi
           
         if [ "$number_of_gws" -eq 0 ]; then          if [ "$number_of_gws" -eq 0 ]; then
                 echo "No gateways configured. Please edit $GATEWAYS_FILE."                  echo "No gateways configured. Please edit $GATEWAYS_FILE."
                 exit 1                  exit 1
Line 117  function checkconnection { Line 121  function checkconnection {
    if [ -n "$DEBUG" ]; then     if [ -n "$DEBUG" ]; then
       if [ -n "$UP" ]; then        if [ -n "$UP" ]; then
          echo "The connection is up."           echo "The connection is up."
       else         else
          echo "The connection is down."           echo "The connection is down."
       fi        fi
    fi     fi
Line 130  function checkgw { Line 134  function checkgw {
          echo "$NEWGW is reachable."           echo "$NEWGW is reachable."
       fi        fi
     else      else
       if [ -n "$DEBUG" ]; then         if [ -n "$DEBUG" ]; then
           echo "$NEWGW is not reachable."            echo "$NEWGW is not reachable."
       fi        fi
       NEWGW=""        NEWGW=""
Line 144  function getcurrentgw { Line 148  function getcurrentgw {
       exit 1        exit 1
    else     else
       iproute_default_gw_txt="$(echo "$iproute_default_gw_txt" | grep "default via")"        iproute_default_gw_txt="$(echo "$iproute_default_gw_txt" | grep "default via")"
    fi       fi
    if [ -z "$iproute_default_gw_txt" ]; then     if [ -z "$iproute_default_gw_txt" ]; then
       # 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
Line 153  function getcurrentgw { Line 157  function getcurrentgw {
       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
    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/"`         CURRENTGW_DEV=`echo $iproute_default_gw_txt | sed "s/^default via .* dev \(eth[0-9]\+\).*\$/\1/"`
    fi     fi
   
    # get index of current gateway     # get index of current gateway
Line 228  function switchgw { Line 232  function switchgw {
    if [ -n "$NEWGW" ]; then     if [ -n "$NEWGW" ]; then
       if [ "$DEBUG" = "low" ]; then        if [ "$DEBUG" = "low" ]; then
          echo -n "Switching default gateway now to $NEWGW ($NEWGW_ID)..."           echo -n "Switching default gateway now to $NEWGW ($NEWGW_ID)..."
       fi         fi
         
       iproute_msg="$(ip route change default via $NEWGW 2>&1 )"        iproute_msg="$(ip route change default via $NEWGW 2>&1 )"
       iproute_exit=$?        iproute_exit=$?
   
Line 237  function switchgw { Line 241  function switchgw {
       sleep 1        sleep 1
       GARBAGE=`$PING -q -c 5 -t100 -p50 -A -f $HOSTSET_FILE 2> /dev/null`        GARBAGE=`$PING -q -c 5 -t100 -p50 -A -f $HOSTSET_FILE 2> /dev/null`
       sleep 1        sleep 1
         
       if [ "$DEBUG" = "low" ]; then        if [ "$DEBUG" = "low" ]; then
          echo "done."           echo "done."
       fi        fi
Line 287  if [ "$1" = "-d" ]; then Line 291  if [ "$1" = "-d" ]; then
         fi           fi 
 fi  fi
   
   # Check fping existence
   if [ ! -x "$PING" ]; then
           echo -e "Error: Ping program not executable or not found at $PING.\nPlease configure the full path in $0."
           exit 1
   fi
   
 # Get all gateways, we can forward traffic  # Get all gateways, we can forward traffic
 readgwlist  readgwlist
   
Line 317  if [ -z "$UP" ]; then Line 327  if [ -z "$UP" ]; then
    checkgw     checkgw
    if [ -z "$NEWGW" ]; then     if [ -z "$NEWGW" ]; then
       echo "Gateway $CURRENTGW is down."        echo "Gateway $CURRENTGW is down."
    else      else
       echo "No connection through gateway $CURRENTGW."         echo "No connection through gateway $CURRENTGW." 
    fi     fi
     
    NEWGW_ID=$CURRENTGW_ID     NEWGW_ID=$CURRENTGW_ID
    switchgw     switchgw
      
 else  else
    # If the current gateway is not the standard default gateway, try if the connection      # If the current gateway is not the standard default gateway, try if the connection 
    # through the standard default gateway is back     # through the standard default gateway is back
Line 341  else Line 351  else
    fi     fi
 fi  fi
   
 if [ "$DEBUG" = "low" ]; then  # send an eMail if the connection is down or limited
    echo  if [ -z "$UP" ]; then
    echo "Default Gateway: $CURRENTGW ($CURRENTGW_ID)"          if [ -z "$NEWGW" ]; then
    echo                  EMAIL_BODY="Switchgate on $(hostname -f) reports: No connection!\n\nTime:\t\t$(date)\nGateway:\t$CURRENTGW ($CURRENTGW_ID)"
                   EMAIL_SUBJECT="Attention: $(hostname -f) has no connection!"
                   echo -e "$EMAIL_BODY" | mail -s "$EMAIL_SUBJECT" "$ALERT_EMAIL"
                   if [[ -n "$DEBUG" && "$DEBUG" != "low" ]]; then
                           echo "Alert message sent to $ALERT_EMAIL."
                   fi
           fi
   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_SUBJECT="Attention: $(hostname -f) not operating on standard default gateway!"
           echo -e "$EMAIL_BODY" | mail -s "$EMAIL_SUBJECT" "$ALERT_EMAIL"
           if [[ -n "$DEBUG" && "$DEBUG" != "low" ]]; then
                   echo "Alert message sent to $ALERT_EMAIL."
           fi
   fi
   
   if [ "$DEBUG" = "low" -o "$DEBUG" = "choke" ]; then
           if [ -n "$UP" ]; then
              echo
              echo "Current Default Gateway: $CURRENTGW ($CURRENTGW_ID)"
              echo
           else
              echo
              echo "No connection."
              echo
           fi
 fi  fi
 exit 0  exit 0

Removed from v.1.1  
changed lines
  Added in v.1.8


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>