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

version 1.2, 2009/12/17 11:16:34 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 28  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 59  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 85  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 121  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 134  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 148  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 157  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 232  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 241  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 291  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 321  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 347  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\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\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)"
         EMAIL_SUBJECT="Attention: $(hostname -f) Not operating on standard default gateway!"          EMAIL_SUBJECT="Attention: $(hostname -f) not operating on standard default gateway!"
         echo -e "$EMAIL_BODY" | mail -s "$EMAIL_SUBJECT" "$ALERT_EMAIL"          echo -e "$EMAIL_BODY" | mail -s "$EMAIL_SUBJECT" "$ALERT_EMAIL"
         if [[ -n "$DEBUG" && "$DEBUG" != "low" ]]; then          if [[ -n "$DEBUG" && "$DEBUG" != "low" ]]; then
                 echo "Alert message sent to $ALERT_EMAIL."                  echo "Alert message sent to $ALERT_EMAIL."
         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

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


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