{"id":1643,"date":"2015-03-31T12:27:02","date_gmt":"2015-03-31T11:27:02","guid":{"rendered":"http:\/\/www.zarrelli.org\/blog\/?p=1643"},"modified":"2015-03-31T12:33:24","modified_gmt":"2015-03-31T11:33:24","slug":"nagios-check-bigip-f5-load","status":"publish","type":"post","link":"https:\/\/www.zarrelli.org\/blog\/nagios-check-bigip-f5-load\/","title":{"rendered":"Nagios \u2013 Check BigIP F5 load"},"content":{"rendered":"<p>As for the previous F5 plugin, I just found this\u00a0old Nagios plugin of mine, sitting in a directory, taking dust.<\/p>\n<p>As usual, I\u2019m 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\u2019s bash glory.<\/p>\n<p>The plugin is commented, although in Italian, but google can translate the comments.<\/p>\n<p>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\u2019ve not changed, it should work with no efforts. It\u2019s based on v3 of SNMP protocol and the auth and priv are \u201chardcoded\u201d, so you may want to change them.<\/p>\n<p>Have fun.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:sh decode:true \">#!\/bin\/sh\r\n\r\nSNMP_GET=$(which snmpget)\r\nSED=$(which sed)\r\nBC=$(which bc)\r\nOD=$(which od)\r\nECHO=$(which echo)\r\nSLEEP=$(which sleep)\r\n\r\n# Nagios return codes\r\nSTATE_OK=0\r\nSTATE_WARNING=1\r\nSTATE_CRITICAL=2\r\nSTATE_UNKNOWN=3\r\n\r\nWARNING_THRESHOLD=${WARNING_THRESHOLD:=\"5\"}\r\nCRITICAL_THRESHOLD=${CRITICAL_THRESHOLD:=\"7\"}\r\nHOST=${HOST:=\"change me\"}\r\nLOGIN=${LOGIN:=\"change me\"}\r\nPASSWORD=${PASSWORD:=\"change me\"}\r\n\r\n# Indico l'OID di base, compreso del valore di leaf, per le interfacce di rete:\r\n\r\nLOAD_AVERAGE_1_MIN_OID=\".1.3.6.1.4.1.2021.10.1.3.1\"\r\nLOAD_AVERAGE_5_MIN_OID=\".1.3.6.1.4.1.2021.10.1.3.2\"\r\nLOAD_AVERAGE_15_MIN_OID=\".1.3.6.1.4.1.2021.10.1.3.3\"\r\n\r\nprint_help() {\r\n        echo \"\"\r\n        echo \"Questo plugin consente di monitorare il Load Average \"\r\n        echo \"per gli F5. -w per la percentuale di warning, -c per la critica,\"\r\n        echo \" -H per l'host name o l'host address del server da controllare, -l per la login, -p per la password.\"\r\n        echo \"\"\r\n                exit 0\r\n}\r\n\r\n\r\n\r\n# Parse parameters\r\nwhile [ $# -gt 0 ]; do\r\n    case \"$1\" in\r\n        -h | --help)\r\n            print_help\r\n            exit ${STATE_OK}\r\n            ;;\r\n         -H | --hostname)\r\n            shift\r\n            HOST=$1\r\n            ;;\r\n        -w | --warning)\r\n                shift\r\n                WARNING_THRESHOLD=$1\r\n                ;;\r\n        -c | --critical)\r\n                shift\r\n                CRITICAL_THRESHOLD=$1\r\n                ;;\r\n        -l | --login)\r\n                shift\r\n                LOGIN=$1\r\n                ;;\r\n        -p | --password)\r\n                shift\r\n                PASSWORD=$1\r\n                ;;\r\n        *)  echo \"Argomento sconosciuto: $1\"\r\n            print_help\r\n            exit ${STATE_UNKNOWN}\r\n            ;;\r\n        esac\r\nshift\r\ndone\r\n\r\nif [ -n \"${SNMP_GET}\" ] ;\r\n\r\nthen\r\n\r\n                                                        # Se la variabile SNMP_GET contiene almeno un carattere, controllo che il suo contenuto punti\r\n                                                        # al percorso dell'eseguibile echo\r\n\r\n                                                        if [ -f \"${SNMP_GET}\" ] ;\r\n\r\n                                                                then\r\n                                                                        # Se il contenuto di SNMP_GET punta al file binario snmpget\r\n                                                                        # allora non faccio nulla\r\n\r\n                                                                        :\r\n\r\n\r\n                                                                else\r\n                                                                        # Se non presente il file echo, non posso stampare a video alcunche'.\r\n                                                                        # Allora esco silenziosamente dal programma\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t${ECHO} \"La variabile SNMP_GET e' istanziata ma non punta a un file preciso\"\r\n                                                                        exit ${STATE_UNKNOWN}\r\n\r\n                                                        # Chiudo la struttura di controllo sul puntamento a file del contenuto della variabile SNMP_GET\r\n\r\n                                                        fi\r\n\r\nelse\r\n                                                                   # Se il contenuto di SNMP_GET risulta vuoto, non e' presente il file echo\r\n                                                                    # e quindi non posso stampare a video dei messaggi ed esco silenziosamente\r\n\r\n\t\t\t\t\t\t\t\t    ${ECHO} \"La variabile SNMP_GET non risulta istanziata\"\r\n\t\t\t\t\t\t\t\t    exit ${STATE_UNKNOWN}\r\n\r\n                                                                    # Chiudo la struttura di controllo relativa all'istanziazione della variabile SNMP_GET (contenuto non vuoto)\r\n\r\n                                          fi\r\n\r\nif [ -n \"${BC}\" ] ;\r\n\r\n                                                then\r\n\r\n                                                        # Se la variabile BC contiene almeno un carattere, controllo che il suo contenuto punti\r\n                                                        # al percorso dell'eseguibile echo\r\n\r\n                                                        if [ -f \"${BC}\" ] ;\r\n\r\n                                                                then\r\n                                                                        # Se il contenuto di BC punta al file binario snmpget\r\n                                                                        # allora non faccio nulla\r\n\r\n                                                                        :\r\n\r\n\r\n                                                                else\r\n                                                                        # Se non presente il file echo, non posso stampare a video alcunche'.\r\n                                                                        # Allora esco silenziosamente dal programma\r\n\r\n                                                                        ${ECHO} \"La variabile BC e' istanziata ma non punta a un file preciso\"\r\n                                                                        exit ${STATE_UNKNOWN}\r\n\r\n                                                        # Chiudo la struttura di controllo sul puntamento a file del contenuto della variabile BC\r\n\r\n                                                        fi\r\n\r\n                                                else\r\n                                                                    # Se il contenuto di BC risulta vuoto, non e' presente il file echo\r\n                                                                    # e quindi non posso stampare a video dei messaggi ed esco silenziosamente\r\n\r\n                                                                    ${ECHO} \"La variabile BC non risulta istanziata\"\r\n                                                                    exit ${STATE_UNKNOWN}\r\n\r\n                                                                    # Chiudo la struttura di controllo relativa all'istanziazione della variabile BC (contenuto non vuoto)\r\n\r\n                                          fi\r\nif [ -n \"$SLEEP\" ] ;\r\n\r\n                                                then\r\n\r\n                                                        # Se la variabile SLEEP contiene almeno un carattere, controllo che il suo contenuto punti\r\n                                                        # al percorso dell'eseguibile echo\r\n\r\n                                                        if [ -f \"$SLEEP\" ] ;\r\n\r\n                                                                then\r\n                                                                        # Se il contenuto di SLEEP punta al file binario snmpget\r\n                                                                        # allora non faccio nulla\r\n\r\n                                                                        :\r\n\r\n\r\n                                                                else\r\n                                                                        # Se non presente il file echo, non posso stampare a video alcunche'.\r\n                                                                        # Allora esco silenziosamente dal programma\r\n\r\n                                                                        ${ECHO} \"La variabile SLEEP e' istanziata ma non punta a un file preciso\"\r\n                                                                        exit ${STATE_UNKNOWN}\r\n\r\n                                                        # Chiudo la struttura di controllo sul puntamento a file del contenuto della variabile SLEEP\r\n\r\n                                                        fi\r\n\r\n                                                else\r\n                                                                    # Se il contenuto di SLEEP risulta vuoto, non e' presente il file echo\r\n                                                                    # e quindi non posso stampare a video dei messaggi ed esco silenziosamente\r\n\r\n                                                                    ${ECHO} \"La variabile SLEEP non risulta istanziata\"\r\n                                                                    exit ${STATE_UNKNOWN}\r\n\r\n                                                                    # Chiudo la struttura di controllo relativa all'istanziazione della variabile SLEEP (contenuto non vuoto)\r\n\r\n                                          fi\r\n\r\n\r\n\r\ncontrolla_limiti ()\r\n\r\n        {\r\n\r\n        if\r\n                        (( $(echo \"scale=2; ${WARNING_THRESHOLD} &gt;= ${CRITICAL_THRESHOLD}\" | bc ) )) ;\r\n\r\n        then\r\n                        echo \"Il valore di WARNING (${WARNING_THRESHOLD}) deve essere minore rispetto a quello di CRITICAL (${CRITICAL_THRESHOLD})\"\r\n                        exit 1\r\n\r\n        else\r\n\r\n                        :\r\n\r\n        fi\r\n\r\n\t}\r\n\r\n\r\n\r\naggiorna ()\r\n\r\n        {\r\n\r\n\r\nif\r\n\r\n! 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}`\r\n\r\nthen\r\n\r\nexit ${STATE_WARNING}\r\n\r\nfi\r\n\r\nCONVERT_LOAD_AVERAGE_POLL=$( echo $LOAD_AVERAGE_POLL | tr -d '\"' | awk 'BEGIN{ FS=\" \" } { print $1 \"\\n\" $2 \"\\n\" $3 }' )\r\n\r\nARRAY_LOAD_AVERAGE_POLL=($CONVERT_LOAD_AVERAGE_POLL)\r\n\r\nLOAD_AVERAGE_1_MIN_POLL=${ARRAY_LOAD_AVERAGE_POLL[0]}\r\nLOAD_AVERAGE_5_MIN_POLL=${ARRAY_LOAD_AVERAGE_POLL[1]}\r\nLOAD_AVERAGE_15_MIN_POLL=${ARRAY_LOAD_AVERAGE_POLL[2]}\r\n\r\n\r\nif      \r\n\r\n\t\t\t(( $(echo \"scale=6; ${LOAD_AVERAGE_1_MIN_POLL} &gt;= ${WARNING_THRESHOLD}\" | bc ) )) &amp;&amp;  (( $(echo \"scale=2; ${LOAD_AVERAGE_1_MIN_POLL} &lt; ${CRITICAL_THRESHOLD}\" | bc ) ))  ;\r\n\r\nthen\r\n\r\n                        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}\"\r\n\r\n                        exit ${STATE_WARNING}\r\n\r\n\r\nelif    \t\t(( $(echo \"scale=6; ${LOAD_AVERAGE_1_MIN_POLL} &gt;= ${CRITICAL_THRESHOLD}\" | bc ) )) ; \r\n\r\n\r\nthen\r\n\r\n                        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}\"\r\n                        exit ${STATE_CRITICAL}\r\n\r\nelif\r\n\r\n\t\t\t (( $(echo \"scale=6; ${LOAD_AVERAGE_1_MIN_POLL} &lt; ${WARNING_THRESHOLD}\" | bc ) )) ;\r\n\r\n\r\nthen\r\n                         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}\"\r\n\r\n\r\n\r\n                        exit ${STATE_OK}\r\nfi\r\n\r\n\r\n}\r\n\r\ncontrolla_limiti\r\naggiorna<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As for the previous F5 plugin, I just found this\u00a0old Nagios plugin of mine, sitting in a directory, taking dust. As usual, I\u2019m 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\u2019s bash glory. The plugin is commented, although &hellip;<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[456,454,455,494,138],"class_list":["post-1643","post","type-post","status-publish","format-standard","hentry","category-di-tutto-un-po","tag-bandwidth","tag-bigip","tag-f5","tag-nagios","tag-plugin","without-featured-image"],"_links":{"self":[{"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/posts\/1643","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/comments?post=1643"}],"version-history":[{"count":0,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/posts\/1643\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/media?parent=1643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/categories?post=1643"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zarrelli.org\/blog\/wp-json\/wp\/v2\/tags?post=1643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}