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

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

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


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