# ------------------------------------------
# ########  Script Modifications  ##########
# ------------------------------------------
# Who    When      What
# ---    ----      ----
# EDT		Add support for multiple bonding
#
# LGill  ??	Add support for second bond module ie bond1
#
#
#!/bin/bash
USAGE="`basename $0`"
NOTFOUND=`/bin/echo -e "There are no bonded interfaces detected."`
LINUXONLY=`/bin/echo -e "This script was written for Linux RedHat.  If you are using another UNIX distribution you may need to edit the code.\n"`

STATE_OK=0
STATE_OK_STR="OK"
STATE_WARNING=1
STATE_WARNING_STR="WARNING"
STATE_CRITICAL=2
STATE_CRITICAL_STR="CRITICAL"
STATE_UNKNOWN=3
STATE_UNKNOWN_STR="UNKNOWN"

NAGIOS_STATUS=$STATE_OK
NAGIOS_STATUS_STR=$STATE_OK_STR
NAGIOS_STATUS_SHORT=""
MESSAGE=""


#
# temporary files
BONDTMP=/tmp/bond.tmp
ETHLIST=/tmp/ethlist.tmp
ETHS=/tmp/eths.tmp
ETHDOWN=/tmp/ethdown.tmp
#
# commands
CAT=/bin/cat
GREP=/bin/grep
EGREP=/bin/egrep
AWK=/usr/bin/gawk
FIND=/usr/bin/find
SED=/bin/sed
WC=/usr/bin/wc
TAIL=/usr/bin/tail
ECHO=/bin/echo
LS=/bin/ls
TR=/usr/bin/tr
#
# emtpy temp files
$CAT /dev/null > $BONDTMP
$CAT /dev/null > $ETHLIST
$CAT /dev/null > $ETHS
$CAT /dev/null > $ETHDOWN
#
# Print usage
if [[ $# -ne 0 ]]
then
        echo -e "\n\nWrong Syntax: `basename $0` $*\n\n"
        echo -e "Usage: $USAGE\n\n"
        exit 0
fi



function NAGIOS_Add()
{
        MESSAGE="$MESSAGE$*"
}

function NAGIOS_Send()
{
        echo -e "$NAGIOS_STATUS_STR $NAGIOS_STATUS_SHORT\n$MESSAGE"
}


function NAGIOS_SetStatus()
{
	if [ "$2" != "" ]
	then
		NAGIOS_STATUS_SHORT="$NAGIOS_STATUS_SHORT$2"
	fi


        if [ $1 -gt $NAGIOS_STATUS ]
        then
                NAGIOS_STATUS=$1


		if [ "$NAGIOS_STATUS" = "$STATE_WARNING" ]
		then
			NAGIOS_STATUS_STR=$STATE_WARNING_STR
		else
			if [ "$NAGIOS_STATUS" = "$STATE_CRITICAL"  ]
			then
				NAGIOS_STATUS_STR=$STATE_WARNING_STR
			else
				if  [  "$NAGIOS_STATUS" = "$STATE_OK"  ]
				then
					NAGIOS_STATUS_STR=$STATE_WARNING_OK

				fi
			fi


		fi

        fi
}


#
# count bond interfaces
COUNTBONDS=`$FIND /proc/net -name bonding -exec $LS {} \;| $WC -l`
if [[ "$COUNTBONDS" -lt 1 ]]
        then
                $ECHO -e "\n\n$NOTFOUND\n\n$LINUXONLY\n\n\n"
                exit 3
fi
# verify bond count are actual bond modules
BONDLIST=`$FIND /proc/net -name bonding -exec $LS {} \;`

#BOND0TRUE=`$GREP bond0 $BONDTMP`
#BOND1TRUE=`$GREP bond1 $BONDTMP`


#if [[ "$COUNTBONDS" -eq 1 ]]
#   then
        for listBond in $BONDLIST
	do
		if [ -f $ETHDOWN ]
		then
			/bin/rm $ETHDOWN
		fi

		if [ -f $ETHS ]
		then
			/bin/rm $ETHS
		fi

            BONDMODE=`$CAT /proc/net/bonding/$listBond |$GREP "Bonding Mode"|$AWK {'print $3$4$5'}`
            $CAT /proc/net/bonding/$listBond |$GREP eth|$AWK {'print $3'}|$EGREP -v "Slave|Master|Interface|Active" > $ETHLIST

	    $CAT $ETHLIST| while read list
	    do
              	$CAT /proc/net/bonding/$listBond |$GREP -A 1 "$list"|$AWK {'print $3'}|$SED 's/Slave/Bond/'|$TR "\n" " " >> $ETHS
		$CAT $ETHS |$GREP down >> $ETHDOWN
	    done

	    TESTSTATE=`grep down $ETHDOWN|wc -l`
                  if [[ "$TESTSTATE" -gt 0 ]]
                     then
                        NAGIOS_Add "$listBond Bonding Mode: $BONDMODE. "
                        TMP=`$CAT $ETHDOWN|$TAIL -1`
			NAGIOS_Add "$TMP\n"

                        NAGIOS_SetStatus $STATE_CRITICAL "$listBond failed"
                     else
                        NAGIOS_Add "$listBond Bonding Mode: $BONDMODE. "
                        TMP=`$CAT $ETHS`
			NAGIOS_Add "$TMP\n"

                        NAGIOS_SetStatus $STATE_OK "$listBond ok "
                  fi

	done

#fi

NAGIOS_Send
exit $NAGIOS_STATUS

