Nagios – Check BigIP F5 memory

This is the last plugin I coded for F5 BigIP. As usual, I just found this old Nagios plugin of mine, sitting in a directory, taking dust.

As usual, I’m not a programmer, so I just do quick and dirty tricks to get what I need, so here it is the plugin in all it’s bash glory.

The plugin is commented, although in Italian, but google can translate the comments.

I wrote this plugins some years ago, it works using SNMP as protocol and with the standard (at those times) OID for BigIP. If they’ve not changed, it should work with no efforts. It’s based on v3 of SNMP protocol and the auth and priv are “hardcoded”, so you may want to change them.

Have fun.

 

#!/bin/sh

# License: GPL
# 
# Author: Giorgio Zarrelli <zarrelli@linux.it>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#

SNMP_GET=$(which snmpget)
SED=$(which sed)
BC=$(which bc)
ECHO=$(which echo)

# Nagios return codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

WARNING_THRESHOLD=${WARNING_THRESHOLD:="50"}
CRITICAL_THRESHOLD=${CRITICAL_THRESHOLD:="80"}
HOST=${HOST:="change me"}
LOGIN=${LOGIN:="change me"}
PASSWORD=${PASSWORD:="change me"}

# Indico l'OID dei dati che voglio reperire

TOTAL_HOST_MEMORY=".1.3.6.1.4.1.3375.2.1.7.1.1.0"
TOTAL_TMM_MEMORY=".1.3.6.1.4.1.3375.2.1.1.2.1.44.0"
USED_HOST_MEMORY=".1.3.6.1.4.1.3375.2.1.7.1.2.0"
USED_TMM_MEMORY=".1.3.6.1.4.1.3375.2.1.1.2.1.45.0"



print_help() {
        echo ""
        echo "Questo plugin consente di monitorare la banda occupata "
        echo "su una interfaccia di rete per gli F5. -w per la percentuale di warning, -c per la critica,"
        echo " -H per l'host name o l'host address del server da controllare, -l per la login, -p per la password."
        echo ""
                exit 0
}



# Parse parameters
while [ $# -gt 0 ]; do
    case "$1" in
        -h | --help)
            print_help
            exit ${STATE_OK}
            ;;
         -H | --hostname)
            shift
            HOST=$1
            ;;
        -w | --warning)
                shift
                WARNING_THRESHOLD=$1
                ;;
        -c | --critical)
                shift
                CRITICAL_THRESHOLD=$1
                ;;
        -l | --login)
                shift
                LOGIN=$1
                ;;
        -p | --password)
                shift
                PASSWORD=$1
                ;;
        -i | --interface)
                shift
                INTERFACE=$1
                ;;
        *)  echo "Unknown argument: $1"
            print_help
            exit ${STATE_UNKNOWN}
            ;;
        esac
shift
done


if [ -n "${SNMP_GET}" ] ;

                                                then

                                                        # Se la variabile SNMP_GET contiene almeno un carattere, controllo che il suo contenuto punti
                                                        # al percorso dell'eseguibile echo

                                                        if [ -f "${SNMP_GET}" ] ;

                                                                then
                                                                        # Se il contenuto di SNMP_GET punta al file binario snmpget
                                                                        # allora non faccio nulla

                                                                        :


                                                                else
                                                                        # Se non presente il file echo, non posso stampare a video alcunche'.
                                                                        # Allora esco silenziosamente dal programma
									
									${ECHO} "La variabile SNMP_GET e' istanziata ma non punta a un file preciso"
                                                                        exit ${STATE_UNKNOWN}

                                                        # Chiudo la struttura di controllo sul puntamento a file del contenuto della variabile SNMP_GET

                                                        fi

                                                else
                                                                    # Se il contenuto di SNMP_GET risulta vuoto, non e' presente il file echo
                                                                    # e quindi non posso stampare a video dei messaggi ed esco silenziosamente

								    ${ECHO} "La variabile SNMP_GET non risulta istanziata"
								    exit ${STATE_UNKNOWN}

                                                                    # Chiudo la struttura di controllo relativa all'istanziazione della variabile SNMP_GET (contenuto non vuoto)

                                          fi

if [ -n "${BC}" ] ;

                                                then

                                                        # Se la variabile BC contiene almeno un carattere, controllo che il suo contenuto punti
                                                        # al percorso dell'eseguibile echo

                                                        if [ -f "${BC}" ] ;

                                                                then
                                                                        # Se il contenuto di BC punta al file binario snmpget
                                                                        # allora non faccio nulla

                                                                        :


                                                                else
                                                                        # Se non presente il file echo, non posso stampare a video alcunche'.
                                                                        # Allora esco silenziosamente dal programma

                                                                        ${ECHO} "La variabile BC e' istanziata ma non punta a un file preciso"
                                                                        exit ${STATE_UNKNOWN}

                                                        # Chiudo la struttura di controllo sul puntamento a file del contenuto della variabile BC

                                                        fi

                                                else
                                                                    # Se il contenuto di BC risulta vuoto, non e' presente il file echo
                                                                    # e quindi non posso stampare a video dei messaggi ed esco silenziosamente

                                                                    ${ECHO} "La variabile BC non risulta istanziata"
                                                                    exit ${STATE_UNKNOWN}

                                                                    # Chiudo la struttura di controllo relativa all'istanziazione della variabile BC (contenuto non vuoto)

                                          fi


controlla_limiti ()

        {

        if
                        (( $(echo "scale=2; ${WARNING_THRESHOLD} >= ${CRITICAL_THRESHOLD}" | bc ) )) ;

        then
                        echo "Il valore di WARNING (${WARNING_THRESHOLD}) deve essere minore rispetto a quello di CRITICAL (${CRITICAL_THRESHOLD})"
                        exit 1

        else

                        :

        fi

	}



aggiorna ()

        {


if 

! POLL=`/usr/bin/snmpget -Oqvt -t 1 -r 5 -m '' -v 3 -l authPriv -a MD5 -u ${LOGIN} -A ${PASSWORD} -x DES -X ${PASSWORD} ${HOST}:161 ${TOTAL_HOST_MEMORY} ${TOTAL_TMM_MEMORY} ${USED_HOST_MEMORY} ${USED_TMM_MEMORY}`

then

exit ${STATE_CRITICAL}

fi

CONVERT_POLL=$( echo $POLL | awk 'BEGIN{ FS=" " } { print $1 "\n" $2 "\n" $3 "\n" $4}' )

ARRAY_POLL=($CONVERT_POLL)

TOTAL_HOST_MEMORY_POLL=$((${ARRAY_POLL[0]} / 1000000))
TOTAL_TMM_MEMORY_POLL=$((${ARRAY_POLL[1]} / 1000000))
USED_HOST_MEMORY_POLL=$((${ARRAY_POLL[2]} / 1000000))
USED_TMM_MEMORY_POLL=$((${ARRAY_POLL[3]} / 1000000))


HOST_MEMORY_PERCENTUALE=$(echo "scale=2; (${USED_HOST_MEMORY_POLL} * 100) / (${TOTAL_HOST_MEMORY_POLL})" | bc)

USED_MEMORY_PERCENTUALE=$(echo "scale=2; (${USED_TMM_MEMORY_POLL} * 100) / (${TOTAL_TMM_MEMORY_POLL})" | bc)


if      

			(( $(echo "scale=6; ${HOST_MEMORY_PERCENTUALE} >= ${WARNING_THRESHOLD}" | bc ) )) &&  (( $(echo "scale=2; ${HOST_MEMORY_PERCENTUALE} < ${CRITICAL_THRESHOLD}" | bc ) ))  ;

then

                        echo "MEMORIA BIGIP WARNING - THM=${TOTAL_HOST_MEMORY_POLL} MB;UHM=${USED_HOST_MEMORY_POLL} MB;TMM=${TOTAL_TMM_MEMORY_POLL} MB;UTM=${USED_TMM_MEMORY_POLL} MB | THM=${TOTAL_HOST_MEMORY_POLL} MB;UHM=${USED_HOST_MEMORY_POLL} MB;TMM=${TOTAL_TMM_MEMORY_POLL} MB;UTM=${USED_TMM_MEMORY_POLL}MB"
                        exit ${STATE_WARNING}


elif    		(( $(echo "scale=6; ${HOST_MEMORY_PERCENTUALE} >= ${CRITICAL_THRESHOLD}" | bc ) )) ; 


then


                        echo "MEMORIA BIGIP CRITICAL - THM=${TOTAL_HOST_MEMORY_POLL} MB;UHM=${USED_HOST_MEMORY_POLL} MB;TMM=${TOTAL_TMM_MEMORY_POLL} MB;UTM=${USED_TMM_MEMORY_POLL} MB | THM=${TOTAL_HOST_MEMORY_POLL} MB;UHM=${USED_HOST_MEMORY_POLL} MB;TMM=${TOTAL_TMM_MEMORY_POLL} MB;UTM=${USED_TMM_MEMORY_POLL} MB"
                        exit ${STATE_CRITICAL}

elif

(( $(echo "scale=2; ${USED_MEMORY_PERCENTUALE} >= ${WARNING_THRESHOLD}" | bc ) )) &&  (( $(echo "scale=2; ${USED_MEMORY_PERCENTUALE} < ${CRITICAL_THRESHOLD}" | bc ) ))  ;

then


                        echo "MEMORIA BIGIP WARNING - THM=${TOTAL_HOST_MEMORY_POLL} MB;UHM=${USED_HOST_MEMORY_POLL} MB;TMM=${TOTAL_TMM_MEMORY_POLL} MB;UTM=${USED_TMM_MEMORY_POLL} MB | THM=${TOTAL_HOST_MEMORY_POLL} MB;UHM=${USED_HOST_MEMORY_POLL} MB;TMM=${TOTAL_TMM_MEMORY_POLL} MB;UTM=${USED_TMM_MEMORY_POLL} MB"
                        exit ${STATE_WARNING}


elif                    (( $(echo "scale=6; ${USED_MEMORY_PERCENTUALE} >= ${CRITICAL_THRESHOLD}" | bc ) )) ;


then
                        echo "MEMORIA BIGIP CRITICAL - THM=${TOTAL_HOST_MEMORY_POLL} MB;UHM=${USED_HOST_MEMORY_POLL} MB;TMM=${TOTAL_TMM_MEMORY_POLL} MB;UTM=${USED_TMM_MEMORY_POLL} MB | THM=${TOTAL_HOST_MEMORY_POLL} MB;UHM=${USED_HOST_MEMORY_POLL} MB;TMM=${TOTAL_TMM_MEMORY_POLL} MB;UTM=${USED_TMM_MEMORY_POLL} MB"
                        exit ${STATE_CRITICAL}


else

                        echo "MEMORIA BIGIP OK - THM=${TOTAL_HOST_MEMORY_POLL} MB;UHM=${USED_HOST_MEMORY_POLL} MB;TMM=${TOTAL_TMM_MEMORY_POLL} MB;UTM=${USED_TMM_MEMORY_POLL} MB | THM=${TOTAL_HOST_MEMORY_POLL} MB;UHM=${USED_HOST_MEMORY_POLL} MB;TMM=${TOTAL_TMM_MEMORY_POLL} MB;UTM=${USED_TMM_MEMORY_POLL} MB"

                        exit ${STATE_OK}
fi


}

controlla_limiti
aggiorna

 

 

Nagios – Check BigIP F5 load

As for the previous F5 plugin, I just found this old Nagios plugin of mine, sitting in a directory, taking dust.

As usual, I’m not a programmer, so I just do quick and dirty tricks to get what I need, so here it is the plugin in all it’s bash glory.

The plugin is commented, although in Italian, but google can translate the comments.

I wrote this plugins some years ago, it works using SNMP as protocol and with the standard (at those times) OID for BigIP. If they’ve not changed, it should work with no efforts. It’s based on v3 of SNMP protocol and the auth and priv are “hardcoded”, so you may want to change them.

Have fun.

 

#!/bin/sh

SNMP_GET=$(which snmpget)
SED=$(which sed)
BC=$(which bc)
OD=$(which od)
ECHO=$(which echo)
SLEEP=$(which sleep)

# Nagios return codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

WARNING_THRESHOLD=${WARNING_THRESHOLD:="5"}
CRITICAL_THRESHOLD=${CRITICAL_THRESHOLD:="7"}
HOST=${HOST:="change me"}
LOGIN=${LOGIN:="change me"}
PASSWORD=${PASSWORD:="change me"}

# Indico l'OID di base, compreso del valore di leaf, per le interfacce di rete:

LOAD_AVERAGE_1_MIN_OID=".1.3.6.1.4.1.2021.10.1.3.1"
LOAD_AVERAGE_5_MIN_OID=".1.3.6.1.4.1.2021.10.1.3.2"
LOAD_AVERAGE_15_MIN_OID=".1.3.6.1.4.1.2021.10.1.3.3"

print_help() {
        echo ""
        echo "Questo plugin consente di monitorare il Load Average "
        echo "per gli F5. -w per la percentuale di warning, -c per la critica,"
        echo " -H per l'host name o l'host address del server da controllare, -l per la login, -p per la password."
        echo ""
                exit 0
}



# Parse parameters
while [ $# -gt 0 ]; do
    case "$1" in
        -h | --help)
            print_help
            exit ${STATE_OK}
            ;;
         -H | --hostname)
            shift
            HOST=$1
            ;;
        -w | --warning)
                shift
                WARNING_THRESHOLD=$1
                ;;
        -c | --critical)
                shift
                CRITICAL_THRESHOLD=$1
                ;;
        -l | --login)
                shift
                LOGIN=$1
                ;;
        -p | --password)
                shift
                PASSWORD=$1
                ;;
        *)  echo "Argomento sconosciuto: $1"
            print_help
            exit ${STATE_UNKNOWN}
            ;;
        esac
shift
done

if [ -n "${SNMP_GET}" ] ;

then

                                                        # Se la variabile SNMP_GET contiene almeno un carattere, controllo che il suo contenuto punti
                                                        # al percorso dell'eseguibile echo

                                                        if [ -f "${SNMP_GET}" ] ;

                                                                then
                                                                        # Se il contenuto di SNMP_GET punta al file binario snmpget
                                                                        # allora non faccio nulla

                                                                        :


                                                                else
                                                                        # Se non presente il file echo, non posso stampare a video alcunche'.
                                                                        # Allora esco silenziosamente dal programma
									
									${ECHO} "La variabile SNMP_GET e' istanziata ma non punta a un file preciso"
                                                                        exit ${STATE_UNKNOWN}

                                                        # Chiudo la struttura di controllo sul puntamento a file del contenuto della variabile SNMP_GET

                                                        fi

else
                                                                   # Se il contenuto di SNMP_GET risulta vuoto, non e' presente il file echo
                                                                    # e quindi non posso stampare a video dei messaggi ed esco silenziosamente

								    ${ECHO} "La variabile SNMP_GET non risulta istanziata"
								    exit ${STATE_UNKNOWN}

                                                                    # Chiudo la struttura di controllo relativa all'istanziazione della variabile SNMP_GET (contenuto non vuoto)

                                          fi

if [ -n "${BC}" ] ;

                                                then

                                                        # Se la variabile BC contiene almeno un carattere, controllo che il suo contenuto punti
                                                        # al percorso dell'eseguibile echo

                                                        if [ -f "${BC}" ] ;

                                                                then
                                                                        # Se il contenuto di BC punta al file binario snmpget
                                                                        # allora non faccio nulla

                                                                        :


                                                                else
                                                                        # Se non presente il file echo, non posso stampare a video alcunche'.
                                                                        # Allora esco silenziosamente dal programma

                                                                        ${ECHO} "La variabile BC e' istanziata ma non punta a un file preciso"
                                                                        exit ${STATE_UNKNOWN}

                                                        # Chiudo la struttura di controllo sul puntamento a file del contenuto della variabile BC

                                                        fi

                                                else
                                                                    # Se il contenuto di BC risulta vuoto, non e' presente il file echo
                                                                    # e quindi non posso stampare a video dei messaggi ed esco silenziosamente

                                                                    ${ECHO} "La variabile BC non risulta istanziata"
                                                                    exit ${STATE_UNKNOWN}

                                                                    # Chiudo la struttura di controllo relativa all'istanziazione della variabile BC (contenuto non vuoto)

                                          fi
if [ -n "$SLEEP" ] ;

                                                then

                                                        # Se la variabile SLEEP contiene almeno un carattere, controllo che il suo contenuto punti
                                                        # al percorso dell'eseguibile echo

                                                        if [ -f "$SLEEP" ] ;

                                                                then
                                                                        # Se il contenuto di SLEEP punta al file binario snmpget
                                                                        # allora non faccio nulla

                                                                        :


                                                                else
                                                                        # Se non presente il file echo, non posso stampare a video alcunche'.
                                                                        # Allora esco silenziosamente dal programma

                                                                        ${ECHO} "La variabile SLEEP e' istanziata ma non punta a un file preciso"
                                                                        exit ${STATE_UNKNOWN}

                                                        # Chiudo la struttura di controllo sul puntamento a file del contenuto della variabile SLEEP

                                                        fi

                                                else
                                                                    # Se il contenuto di SLEEP risulta vuoto, non e' presente il file echo
                                                                    # e quindi non posso stampare a video dei messaggi ed esco silenziosamente

                                                                    ${ECHO} "La variabile SLEEP non risulta istanziata"
                                                                    exit ${STATE_UNKNOWN}

                                                                    # Chiudo la struttura di controllo relativa all'istanziazione della variabile SLEEP (contenuto non vuoto)

                                          fi



controlla_limiti ()

        {

        if
                        (( $(echo "scale=2; ${WARNING_THRESHOLD} >= ${CRITICAL_THRESHOLD}" | bc ) )) ;

        then
                        echo "Il valore di WARNING (${WARNING_THRESHOLD}) deve essere minore rispetto a quello di CRITICAL (${CRITICAL_THRESHOLD})"
                        exit 1

        else

                        :

        fi

	}



aggiorna ()

        {


if

! LOAD_AVERAGE_POLL=`/usr/bin/snmpget -Oqvt -t 1 -r 5 -m '' -v 3 -l authPriv -a MD5 -u ${LOGIN} -A ${PASSWORD} -x DES -X ${PASSWORD} ${HOST}:161 ${LOAD_AVERAGE_1_MIN_OID} ${LOAD_AVERAGE_5_MIN_OID} ${LOAD_AVERAGE_15_MIN_OID}`

then

exit ${STATE_WARNING}

fi

CONVERT_LOAD_AVERAGE_POLL=$( echo $LOAD_AVERAGE_POLL | tr -d '"' | awk 'BEGIN{ FS=" " } { print $1 "\n" $2 "\n" $3 }' )

ARRAY_LOAD_AVERAGE_POLL=($CONVERT_LOAD_AVERAGE_POLL)

LOAD_AVERAGE_1_MIN_POLL=${ARRAY_LOAD_AVERAGE_POLL[0]}
LOAD_AVERAGE_5_MIN_POLL=${ARRAY_LOAD_AVERAGE_POLL[1]}
LOAD_AVERAGE_15_MIN_POLL=${ARRAY_LOAD_AVERAGE_POLL[2]}


if      

			(( $(echo "scale=6; ${LOAD_AVERAGE_1_MIN_POLL} >= ${WARNING_THRESHOLD}" | bc ) )) &&  (( $(echo "scale=2; ${LOAD_AVERAGE_1_MIN_POLL} < ${CRITICAL_THRESHOLD}" | bc ) ))  ;

then

                        echo "WARNING - load average: ${LOAD_AVERAGE_1_MIN_POLL}, ${LOAD_AVERAGE_5_MIN_POLL}, ${LOAD_AVERAGE_15_MIN_POLL}| load1=${LOAD_AVERAGE_1_MIN_POLL}, load5=${LOAD_AVERAGE_5_MIN_POLL}, load15=${LOAD_AVERAGE_15_MIN_POLL};${WARNING_THRESHOLD}"

                        exit ${STATE_WARNING}


elif    		(( $(echo "scale=6; ${LOAD_AVERAGE_1_MIN_POLL} >= ${CRITICAL_THRESHOLD}" | bc ) )) ; 


then

                        echo "CRITICAL - load average: ${LOAD_AVERAGE_1_MIN_POLL}, ${LOAD_AVERAGE_5_MIN_POLL}, ${LOAD_AVERAGE_15_MIN_POLL}| load1=${LOAD_AVERAGE_1_MIN_POLL}, load5=${LOAD_AVERAGE_5_MIN_POLL}, load15=${LOAD_AVERAGE_15_MIN_POLL},${CRITICAL_THRESHOLD}"
                        exit ${STATE_CRITICAL}

elif

			 (( $(echo "scale=6; ${LOAD_AVERAGE_1_MIN_POLL} < ${WARNING_THRESHOLD}" | bc ) )) ;


then
                         echo "OK - load average: ${LOAD_AVERAGE_1_MIN_POLL}, ${LOAD_AVERAGE_5_MIN_POLL}, ${LOAD_AVERAGE_15_MIN_POLL}| load1=${LOAD_AVERAGE_1_MIN_POLL}, load5=${LOAD_AVERAGE_5_MIN_POLL}, load15=${LOAD_AVERAGE_15_MIN_POLL};${WARNING_THRESHOLD};${CRITICAL_THRESHOLD}"



                        exit ${STATE_OK}
fi


}

controlla_limiti
aggiorna

 

Nagios – Check BigIP F5 bandwidth

I just found an old Nagios plugin of mine, it was sitting in a directory, taking dust.

As usual, I’m not a programmer, so I just do quick and dirty tricks to get what I need, so here it is the plugin in all it’s bash glory.

The plugin is commented, although in Italian, but google can translate the comments.

I wrote this plugins some years ago, it works using SNMP as protocol and with the standard (at those times) OID for BigIP. If they’ve not changed, it should work with no efforts. It’s based on v3 of SNMP protocol and the auth and priv are “hardcoded”, so you may want to change them.

Have fun.

#!/bin/sh

#
# License: GPL
# 
# Author: Giorgio Zarrelli <zarrelli@linux.it>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#


SNMP_GET=$(which snmpget)
SED=$(which sed)
BC=$(which bc)
OD=$(which od)
ECHO=$(which echo)
SLEEP=$(which sleep)
SLEEP_TIME=15

# Nagios return codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

WARNING_THRESHOLD=${WARNING_THRESHOLD:="33"}
CRITICAL_THRESHOLD=${CRITICAL_THRESHOLD:="50"}
HOST=${HOST:="change me"}
LOGIN=${LOGIN:="change me"}
PASSWORD=${PASSWORD:="change me"}
INTERFACE=${INTERFACE:="1.1"}

# Indico l'OID di base, compreso del valore di leaf, per le interfacce di rete:

BASE_IN_OID=".1.3.6.1.4.1.3375.2.1.2.4.4.3.1.3.3"
BASE_OUT_OID=".1.3.6.1.4.1.3375.2.1.2.4.4.3.1.5.3"
BASE_SPEED_OID=".1.3.6.1.4.1.3375.2.1.2.4.1.2.1.4.3"
SYS_UPTIME_OID=".1.3.6.1.4.1.3375.2.1.6.6.0"

print_help() {
echo ""
echo "Questo plugin consente di monitorare la banda occupata "
echo "su una interfaccia di rete per gli F5. -w per la percentuale di warning, -c per la critica,"
echo " -H per l'host name o l'host address del server da controllare, -l per la login, -p per la password."
echo ""
exit 0
}



# Parse parameters
while [ $# -gt 0 ]; do
case "$1" in
-h | --help)
print_help
exit ${STATE_OK}
;;
-H | --hostname)
shift
HOST=$1
;;
-w | --warning)
shift
WARNING_THRESHOLD=$1
;;
-c | --critical)
shift
CRITICAL_THRESHOLD=$1
;;
-l | --login)
shift
LOGIN=$1
;;
-p | --password)
shift
PASSWORD=$1
;;
-i | --interface)
shift
INTERFACE=$1
;;
*) echo "Unknown argument: $1"
print_help
exit ${STATE_UNKNOWN}
;;
esac
shift
done


INTERFACE_OID=$( ${ECHO} ${INTERFACE} | ${OD} -An -N3 -td1 | ${SED} 's/ /./g')

FULL_IN_OID=${BASE_IN_OID}${INTERFACE_OID}
FULL_OUT_OID=${BASE_OUT_OID}${INTERFACE_OID}

if

! NOM_SPEED=`${SNMP_GET} -v 3 -t 1 -r 5 -m '' -v 3 -l authPriv -a MD5 -u ${LOGIN} -A ${PASSWORD} -x DES -X ${PASSWORD} ${HOST}:161 ${BASE_SPEED_OID}${INTERFACE_OID} | cut -d " " -f 4`

then

exit ${STATE_CRITICAL}

fi


SPEED=$(echo "scale=0; (${NOM_SPEED} * 1000000 / 8)" | bc)


if [ -n "${SNMP_GET}" ] ;

then

# Se la variabile SNMP_GET contiene almeno un carattere, controllo che il suo contenuto punti
# al percorso dell'eseguibile echo

if [ -f "${SNMP_GET}" ] ;

then
# Se il contenuto di SNMP_GET punta al file binario snmpget
# allora non faccio nulla

:


else
# Se non presente il file echo, non posso stampare a video alcunche'.
# Allora esco silenziosamente dal programma

${ECHO} "La variabile SNMP_GET e' istanziata ma non punta a un file preciso"
exit ${STATE_UNKNOWN}

# Chiudo la struttura di controllo sul puntamento a file del contenuto della variabile SNMP_GET

fi

else
# Se il contenuto di SNMP_GET risulta vuoto, non e' presente il file echo
# e quindi non posso stampare a video dei messaggi ed esco silenziosamente

${ECHO} "La variabile SNMP_GET non risulta istanziata"
exit ${STATE_UNKNOWN}

# Chiudo la struttura di controllo relativa all'istanziazione della variabile SNMP_GET (contenuto non vuoto)

fi

if [ -n "${BC}" ] ;

then

# Se la variabile BC contiene almeno un carattere, controllo che il suo contenuto punti
# al percorso dell'eseguibile echo

if [ -f "${BC}" ] ;

then
# Se il contenuto di BC punta al file binario snmpget
# allora non faccio nulla

:


else
# Se non presente il file echo, non posso stampare a video alcunche'.
# Allora esco silenziosamente dal programma

${ECHO} "La variabile BC e' istanziata ma non punta a un file preciso"
exit ${STATE_UNKNOWN}

# Chiudo la struttura di controllo sul puntamento a file del contenuto della variabile BC

fi

else
# Se il contenuto di BC risulta vuoto, non e' presente il file echo
# e quindi non posso stampare a video dei messaggi ed esco silenziosamente

${ECHO} "La variabile BC non risulta istanziata"
exit ${STATE_UNKNOWN}

# Chiudo la struttura di controllo relativa all'istanziazione della variabile BC (contenuto non vuoto)

fi
if [ -n "$SLEEP" ] ;

then

# Se la variabile SLEEP contiene almeno un carattere, controllo che il suo contenuto punti
# al percorso dell'eseguibile echo

if [ -f "$SLEEP" ] ;

then
# Se il contenuto di SLEEP punta al file binario snmpget
# allora non faccio nulla

:


else
# Se non presente il file echo, non posso stampare a video alcunche'.
# Allora esco silenziosamente dal programma

${ECHO} "La variabile SLEEP e' istanziata ma non punta a un file preciso"
exit ${STATE_UNKNOWN}

# Chiudo la struttura di controllo sul puntamento a file del contenuto della variabile SLEEP

fi

else
# Se il contenuto di SLEEP risulta vuoto, non e' presente il file echo
# e quindi non posso stampare a video dei messaggi ed esco silenziosamente

${ECHO} "La variabile SLEEP non risulta istanziata"
exit ${STATE_UNKNOWN}

# Chiudo la struttura di controllo relativa all'istanziazione della variabile SLEEP (contenuto non vuoto)

fi



controlla_limiti ()

{

if
(( $(echo "scale=2; ${WARNING_THRESHOLD} >= ${CRITICAL_THRESHOLD}" | bc ) )) ;

then
echo "Il valore di WARNING (${WARNING_THRESHOLD}) deve essere minore rispetto a quello di CRITICAL (${CRITICAL_THRESHOLD})"
exit 1

else

:

fi

}



aggiorna ()

{


FIRST_POLL=`/usr/bin/snmpget -Oqvt -t 1 -r 5 -m '' -v 3 -l authPriv -a MD5 -u ${LOGIN} -A ${PASSWORD} -x DES -X ${PASSWORD} ${HOST}:161 ${FULL_IN_OID} ${FULL_OUT_OID} ${SYS_UPTIME_OID}`


${SLEEP} ${SLEEP_TIME}

SECOND_POLL=`/usr/bin/snmpget -Oqvt -t 1 -r 5 -m '' -v 3 -l authPriv -a MD5 -u ${LOGIN} -A ${PASSWORD} -x DES -X ${PASSWORD} ${HOST}:161 ${FULL_IN_OID} ${FULL_OUT_OID} ${SYS_UPTIME_OID}`

CONVERT_FIRST_POLL=$( echo $FIRST_POLL | awk 'BEGIN{ FS=" " } { print $1 "\n" $2 "\n" $3 }' )

ARRAY_FIRST_POLL=($CONVERT_FIRST_POLL)

IN_FIRST_POLL=${ARRAY_FIRST_POLL[0]}
OUT_FIRST_POLL=${ARRAY_FIRST_POLL[1]}
TIME_FIRST_POLL=${ARRAY_FIRST_POLL[2]}


CONVERT_SECOND_POLL=$( echo $SECOND_POLL | awk 'BEGIN{ FS=" " } { print $1 "\n" $2 "\n" $3 }' )

ARRAY_SECOND_POLL=($CONVERT_SECOND_POLL)

IN_SECOND_POLL=${ARRAY_SECOND_POLL[0]}
OUT_SECOND_POLL=${ARRAY_SECOND_POLL[1]}
TIME_SECOND_POLL=${ARRAY_SECOND_POLL[2]}


ENTRATA=$(echo "scale=6; (${IN_SECOND_POLL}) - (${IN_FIRST_POLL})" | bc)

USCITA=$(echo "scale=6; (${OUT_SECOND_POLL}) - (${OUT_FIRST_POLL})" | bc)

DELTA="$[(${TIME_SECOND_POLL} - ${TIME_FIRST_POLL}) /100]"

BANDA_PERCENTUALE_IN_ENTRATA=$(echo "scale=6; (${ENTRATA}) / (${DELTA} * ${SPEED})" | bc)

BANDA_AL_SECONDO_IN_KBYTE_IN_ENTRATA=$(echo "scale=6; (${ENTRATA} / ${DELTA}) /1024" | bc)


BANDA_PERCENTUALE_IN_USCITA=$(echo "scale=6; (${USCITA}) / (${DELTA} * ${SPEED})" | bc)

BANDA_AL_SECONDO_IN_KBYTE_IN_USCITA=$(echo "scale=6; (${USCITA} / ${DELTA}) /1024" | bc)

if

(( $(echo "scale=6; ${BANDA_PERCENTUALE_IN_ENTRATA} >= ${WARNING_THRESHOLD}" | bc ) )) && (( $(echo "scale=2; ${BANDA_PERCENTUALE_IN_ENTRATA} < ${CRITICAL_THRESHOLD}" | bc ) )) ;

then

echo "BANDWIDTH WARNING - IN=${BANDA_AL_SECONDO_IN_KBYTE_IN_ENTRATA} KB/s;OUT=${BANDA_AL_SECONDO_IN_KBYTE_IN_USCITA} KB/s | IN=${BANDA_AL_SECONDO_IN_KBYTE_IN_ENTRATA} KB/s;OUT=${BANDA_AL_SECONDO_IN_KBYTE_IN_USCITA} KB/s;${WARNING_THRESHOLD}"
exit ${STATE_WARNING}


elif (( $(echo "scale=6; ${BANDA_PERCENTUALE_IN_ENTRATA} >= ${CRITICAL_THRESHOLD}" | bc ) )) ;


then

echo "BANDWIDTH CRITICAL - IN=${BANDA_AL_SECONDO_IN_KBYTE_IN_ENTRATA} KB/s;OUT=${BANDA_AL_SECONDO_IN_KBYTE_IN_USCITA} KB/s | IN=${BANDA_AL_SECONDO_IN_KBYTE_IN_ENTRATA} KB/s;OUT=${BANDA_AL_SECONDO_IN_KBYTE_IN_USCITA} KB/s;${CRITICAL_THRESHOLD}"
exit ${STATE_CRITICAL}

elif

(( $(echo "scale=2; ${BANDA_PERCENTUALE_IN_USCITA} >= ${WARNING_THRESHOLD}" | bc ) )) && (( $(echo "scale=2; ${BANDA_PERCENTUALE_IN_USCITA} < ${CRITICAL_THRESHOLD}" | bc ) )) ;

then

echo "BANDWIDTH WARNING - IN=${BANDA_AL_SECONDO_IN_KBYTE_IN_ENTRATA} KB/s;OUT=${BANDA_AL_SECONDO_IN_KBYTE_IN_USCITA} KB/s | IN=${BANDA_AL_SECONDO_IN_KBYTE_IN_ENTRATA} KB/s;OUT=${BANDA_AL_SECONDO_IN_KBYTE_IN_USCITA}KB/s;${WARNING_THRESHOLD}"
exit ${STATE_WARNING}


elif (( $(echo "scale=6; ${BANDA_PERCENTUALE_IN_USCITA} >= ${CRITICAL_THRESHOLD}" | bc ) )) ;


then

echo "BANDWIDTH CRITICAL - IN=${BANDA_AL_SECONDO_IN_KBYTE_IN_ENTRATA} KB/s;OUT=${BANDA_AL_SECONDO_IN_KBYTE_IN_USCITA} KB/s | IN=${BANDA_AL_SECONDO_IN_KBYTE_IN_ENTRATA} KB/s;OUT=${BANDA_AL_SECONDO_IN_KBYTE_IN_USCITA} KB/s;${CRITICAL_THRESHOLD}"
exit ${STATE_CRITICAL}


else
echo "BANDWIDTH OK - IN=${BANDA_AL_SECONDO_IN_KBYTE_IN_ENTRATA} KB/s;OUT=${BANDA_AL_SECONDO_IN_KBYTE_IN_USCITA} KB/s | IN=${BANDA_AL_SECONDO_IN_KBYTE_IN_ENTRATA} KB/s;OUT=${BANDA_AL_SECONDO_IN_KBYTE_IN_USCITA} KB/s;${WARNING_THRESHOLD};${CRITICAL_THRESHOLD}"



exit ${STATE_OK}
fi


}

controlla_limiti
aggiorna