pep8 fixes

This commit is contained in:
Pall Sigurdsson 2014-02-21 10:52:39 +00:00
parent b96e973e60
commit b0b55dcd3e
1 changed files with 508 additions and 461 deletions

View File

@ -20,18 +20,16 @@
# This script will check the status of a remote IBM Bladecenter via SNMP. # This script will check the status of a remote IBM Bladecenter via SNMP.
# No real need to change anything below here # No real need to change anything below here
version="1.1.2" version = "1.1.2"
ok=0 ok = 0
warning=1 warning = 1
critical=2 critical = 2
unknown=3 unknown = 3
not_present = -1 not_present = -1
exit_status = -1 exit_status = -1
state = {} state = {}
state[not_present] = "Not Present" state[not_present] = "Not Present"
state[ok] = "OK" state[ok] = "OK"
@ -40,59 +38,57 @@ state[critical] = "Critical"
state[unknown] = "Unknown" state[unknown] = "Unknown"
longserviceoutput="\n" longserviceoutput = "\n"
perfdata="" perfdata = ""
summary="" summary = ""
sudo=False sudo = False
from sys import exit from sys import exit
from sys import argv from sys import argv
from os import getenv,putenv,environ from os import getenv, putenv, environ
import subprocess import subprocess
# Parse some Arguments # Parse some Arguments
from optparse import OptionParser from optparse import OptionParser
parser = OptionParser() parser = OptionParser()
parser.add_option("-m","--mode", dest="mode", parser.add_option("-m", "--mode", dest="mode",
help="Which check mode is in use (powermodules,system-health,temperature,chassis-status,bladehealth,blowers,switchmodules)") help="Which check mode is in use (powermodules,system-health,temperature,chassis-status,bladehealth,blowers,switchmodules)")
parser.add_option("-H","--host", dest="host", parser.add_option("-H", "--host", dest="host",
help="Hostname or IP address of the host to check") help="Hostname or IP address of the host to check")
parser.add_option("-w","--warning", dest="warning_threshold", parser.add_option("-w", "--warning", dest="warning_threshold",
help="Warning threshold", type="int", default=None) help="Warning threshold", type="int", default=None)
parser.add_option("-c","--critical", type="int", dest="critical_threshold", parser.add_option("-c", "--critical", type="int", dest="critical_threshold",
help="Critical threshold", default=None) help="Critical threshold", default=None)
parser.add_option("-e","--exclude", dest="exclude", parser.add_option("-e", "--exclude", dest="exclude",
help="Exclude specific object", default=None) help="Exclude specific object", default=None)
parser.add_option("-v","--snmp_version", dest="snmp_version", parser.add_option("-v", "--snmp_version", dest="snmp_version",
help="SNMP Version to use (1, 2c or 3)", default="1") help="SNMP Version to use (1, 2c or 3)", default="1")
parser.add_option("-u","--snmp_username", dest="snmp_username", parser.add_option("-u", "--snmp_username", dest="snmp_username",
help="SNMP username (only with SNMP v3)", default=None) help="SNMP username (only with SNMP v3)", default=None)
parser.add_option("-C","--snmp_community", dest="snmp_community", parser.add_option("-C", "--snmp_community", dest="snmp_community",
help="SNMP Community (only with SNMP v1|v2c)", default=None) help="SNMP Community (only with SNMP v1|v2c)", default=None)
parser.add_option("-p","--snmp_password", dest="snmp_password", parser.add_option("-p", "--snmp_password", dest="snmp_password",
help="SNMP password (only with SNMP v3)", default=None) help="SNMP password (only with SNMP v3)", default=None)
parser.add_option("-l","--snmp_security_level", dest="snmp_seclevel", parser.add_option("-l", "--snmp_security_level", dest="snmp_seclevel",
help="SNMP security level (only with SNMP v3) (noAuthNoPriv|authNoPriv|authPriv)", default=None) help="SNMP security level (only with SNMP v3) (noAuthNoPriv|authNoPriv|authPriv)", default=None)
parser.add_option("-t","--snmp_timeout", dest="snmp_timeout", parser.add_option("-t", "--snmp_timeout", dest="snmp_timeout",
help="Timeout in seconds for SNMP", default=10) help="Timeout in seconds for SNMP", default=10)
parser.add_option("-d","--debug", dest="debug", parser.add_option("-d", "--debug", dest="debug",
help="Enable debugging (for troubleshooting", action="store_true", default=False) help="Enable debugging (for troubleshooting", action="store_true", default=False)
(opts,args) = parser.parse_args() (opts, args) = parser.parse_args()
if opts.host == None: if opts.host is None:
parser.error("Hostname (-H) is required.") parser.error("Hostname (-H) is required.")
if opts.mode == None: if opts.mode is None:
parser.error("Mode (--mode) is required.") parser.error("Mode (--mode) is required.")
snmp_options = "" snmp_options = ""
def set_snmp_options(): def set_snmp_options():
global snmp_options global snmp_options
if opts.snmp_version is not None: if opts.snmp_version is not None:
@ -101,39 +97,47 @@ def set_snmp_options():
if opts.snmp_username is None: if opts.snmp_username is None:
parser.error("--snmp_username required with --snmp_version=3") parser.error("--snmp_username required with --snmp_version=3")
if opts.snmp_seclevel is None: if opts.snmp_seclevel is None:
parser.error("--snmp_security_level required with --snmp_version=3") parser.error(
"--snmp_security_level required with --snmp_version=3")
if opts.snmp_password is None: if opts.snmp_password is None:
parser.error("--snmp_password required with --snmp_version=3") parser.error("--snmp_password required with --snmp_version=3")
snmp_options = snmp_options + " -u %s -l %s -A %s " % (opts.snmp_username, opts.snmp_seclevel,opts.snmp_password) snmp_options = snmp_options + " -u %s -l %s -A %s " % (
opts.snmp_username, opts.snmp_seclevel, opts.snmp_password)
else: else:
if opts.snmp_community is None: if opts.snmp_community is None:
parser.error("--snmp_community is required with --snmp_version=1|2c") parser.error(
"--snmp_community is required with --snmp_version=1|2c")
snmp_options = snmp_options + " -c %s " % opts.snmp_community snmp_options = snmp_options + " -c %s " % opts.snmp_community
snmp_options += " -t %s " % (opts.snmp_timeout) snmp_options += " -t %s " % (opts.snmp_timeout)
def error(errortext): def error(errortext):
print "* Error: %s" % errortext print "* Error: %s" % errortext
exit(unknown) exit(unknown)
def debug( debugtext ):
def debug(debugtext):
if opts.debug: if opts.debug:
print debugtext print debugtext
def nagios_status( newStatus ):
def nagios_status(newStatus):
global exit_status global exit_status
exit_status = max(exit_status, newStatus) exit_status = max(exit_status, newStatus)
return exit_status return exit_status
'''runCommand: Runs command from the shell prompt. Exit Nagios style if unsuccessful'''
def runCommand(command): def runCommand(command):
debug( "Executing: %s" % command ) '''runCommand: Runs command from the shell prompt. Exit Nagios style if unsuccessful'''
proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE,) debug("Executing: %s" % command)
proc = subprocess.Popen(
command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,)
stdout, stderr = proc.communicate('through stdin to stdout') stdout, stderr = proc.communicate('through stdin to stdout')
if proc.returncode > 0: if proc.returncode > 0:
print "Error %s: %s\n command was: '%s'" % (proc.returncode,stderr.strip(),command) print "Error %s: %s\n command was: '%s'" % (proc.returncode, stderr.strip(), command)
debug("results: %s" % (stdout.strip() ) ) debug("results: %s" % (stdout.strip()))
if proc.returncode == 127: # File not found, lets print path if proc.returncode == 127: # File not found, lets print path
path=getenv("PATH") path = getenv("PATH")
print "Check if your path is correct %s" % (path) print "Check if your path is correct %s" % (path)
if stderr.find('Password:') == 0 and command.find('sudo') == 0: if stderr.find('Password:') == 0 and command.find('sudo') == 0:
print "Check if user is in the sudoers file" print "Check if user is in the sudoers file"
@ -143,70 +147,82 @@ def runCommand(command):
else: else:
return stdout return stdout
def end(): def end():
global summary global summary
global longserviceoutput global longserviceoutput
global perfdata global perfdata
global exit_status global exit_status
print "%s - %s | %s" % (state[exit_status], summary,perfdata) print "%s - %s | %s" % (state[exit_status], summary, perfdata)
print longserviceoutput print longserviceoutput
if exit_status < 0: exit_status = unknown if exit_status < 0:
exit_status = unknown
exit(exit_status) exit(exit_status)
def add_perfdata(text): def add_perfdata(text):
global perfdata global perfdata
text = text.strip() text = text.strip()
perfdata = perfdata + " %s " % (text) perfdata = perfdata + " %s " % (text)
def add_long(text): def add_long(text):
global longserviceoutput global longserviceoutput
longserviceoutput = longserviceoutput + text + '\n' longserviceoutput = longserviceoutput + text + '\n'
def add_summary(text): def add_summary(text):
global summary global summary
summary = summary + text summary = summary + text
def set_path(path): def set_path(path):
current_path = getenv('PATH') current_path = getenv('PATH')
if current_path.find('C:\\') > -1: # We are on this platform if current_path.find('C:\\') > -1: # We are on this platform
if path == '': if path == '':
pass pass
else: path = ';' + path else:
path = ';' + path
else: # Unix/Linux, etc else: # Unix/Linux, etc
if path == '': path = ":/usr/sbin" if path == '':
else: path = ':' + path path = ":/usr/sbin"
current_path = "%s%s" % (current_path,path) else:
path = ':' + path
current_path = "%s%s" % (current_path, path)
environ['PATH'] = current_path environ['PATH'] = current_path
def snmpget(oid): def snmpget(oid):
snmpgetcommand = "snmpget %s %s %s" % (snmp_options,opts.host,oid) snmpgetcommand = "snmpget %s %s %s" % (snmp_options, opts.host, oid)
output = runCommand(snmpgetcommand) output = runCommand(snmpgetcommand)
oid,result = output.strip().split(' = ', 1) oid, result = output.strip().split(' = ', 1)
resultType,resultValue = result.split(': ',1) resultType, resultValue = result.split(': ', 1)
if resultType == 'STRING': # strip quotes of the string if resultType == 'STRING': # strip quotes of the string
resultValue = resultValue[1:-1] resultValue = resultValue[1:-1]
return resultValue return resultValue
# snmpwalk -v3 -u v3get mgmt-rek-proxy-p02 -A proxy2011 -l authNoPriv 1.3.6.1.4.1.15497 # snmpwalk -v3 -u v3get mgmt-rek-proxy-p02 -A proxy2011 -l authNoPriv
# 1.3.6.1.4.1.15497
def snmpwalk(base_oid): def snmpwalk(base_oid):
snmpwalkcommand = "snmpwalk %s %s %s" % (snmp_options, opts.host, base_oid) snmpwalkcommand = "snmpwalk %s %s %s" % (snmp_options, opts.host, base_oid)
output = runCommand(snmpwalkcommand + " " + base_oid) output = runCommand(snmpwalkcommand + " " + base_oid)
return output return output
def getTable(base_oid): def getTable(base_oid):
myTable = {} myTable = {}
output = snmpwalk(base_oid) output = snmpwalk(base_oid)
for line in output.split('\n'): for line in output.split('\n'):
tmp = line.strip().split(' = ', 1) tmp = line.strip().split(' = ', 1)
if len(tmp) == 2: if len(tmp) == 2:
oid,result = tmp oid, result = tmp
else: else:
continue continue
tmp = result.split(': ',1) tmp = result.split(': ', 1)
if len(tmp) > 1: if len(tmp) > 1:
resultType,resultValue = tmp[0],tmp[1] resultType, resultValue = tmp[0], tmp[1]
else: else:
resultType = None resultType = None
resultValue = tmp[0] resultValue = tmp[0]
@ -215,10 +231,12 @@ def getTable(base_oid):
index = oid.strip().split('.') index = oid.strip().split('.')
column = int(index.pop()) column = int(index.pop())
row = int(index.pop()) row = int(index.pop())
if not myTable.has_key(column): myTable[column] = {} if not myTable.has_key(column):
myTable[column] = {}
myTable[column][row] = resultValue myTable[column][row] = resultValue
return myTable return myTable
def check_powermodules(): def check_powermodules():
powermodules = getTable('1.3.6.1.4.1.2.3.51.2.2.4') powermodules = getTable('1.3.6.1.4.1.2.3.51.2.2.4')
index = 1 index = 1
@ -232,22 +250,27 @@ def check_powermodules():
myStatus = i[status] myStatus = i[status]
myDetails = i[details] myDetails = i[details]
myExists = i[exists] myExists = i[exists]
if myIndex == opts.exclude: continue if myIndex == opts.exclude:
continue
if myExists == "0": if myExists == "0":
num_no = num_no + 1 num_no = num_no + 1
else: else:
if myStatus != "1": if myStatus != "1":
nagios_status(warning) nagios_status(warning)
add_summary( 'Powermodule "%s" status "%s". %s. ' % (myIndex,myStatus,myDetails) ) add_summary('Powermodule "%s" status "%s". %s. ' %
(myIndex, myStatus, myDetails))
else: else:
num_ok = num_ok + 1 num_ok = num_ok + 1
add_long('Powersupply "%s" status "%s". %s. ' % (myIndex,myStatus,myDetails) ) add_long('Powersupply "%s" status "%s". %s. ' %
add_summary( "%s out of %s powermodules are healthy" % (num_ok, len(powermodules) ) ) (myIndex, myStatus, myDetails))
add_perfdata( "'Number of powermodules'=%s" % (len(powermodules) - num_no ) ) add_summary("%s out of %s powermodules are healthy" %
(num_ok, len(powermodules)))
add_perfdata("'Number of powermodules'=%s" %
(len(powermodules) - num_no))
nagios_status(ok) nagios_status(ok)
def check_switchmodules(): def check_switchmodules():
switchmodules = getTable("1.3.6.1.4.1.2.3.51.2.22.3.1.1") switchmodules = getTable("1.3.6.1.4.1.2.3.51.2.22.3.1.1")
# The following oid is undocumented, but contains some useful extra info # The following oid is undocumented, but contains some useful extra info
@ -265,18 +288,21 @@ def check_switchmodules():
'this module is installed' 'this module is installed'
if healthstate == "1": if healthstate == "1":
nagios_status(ok) nagios_status(ok)
add_long("Module%s health good.\n post=%s" % (myIndex,resultvalue)) add_long("Module%s health good.\n post=%s" %
(myIndex, resultvalue))
else: else:
nagios_status(warning) nagios_status(warning)
add_long("Module%s health bad(%s).\n post=%s" % (myIndex, healthstate,resultvalue) ) add_long("Module%s health bad(%s).\n post=%s" %
(myIndex, healthstate, resultvalue))
add_summary("Problem with Module %s. " % (myIndex)) add_summary("Problem with Module %s. " % (myIndex))
if len(extrainfo) > int(myIndex): if len(extrainfo) > int(myIndex):
try: try:
myExtraInfo = extrainfo[int(myIndex)-1] myExtraInfo = extrainfo[int(myIndex) - 1]
module_type = myExtraInfo[22] module_type = myExtraInfo[22]
module_ip = myExtraInfo[6] module_ip = myExtraInfo[6]
add_long( " type=%s ip=%s" % (module_type,module_ip) ) add_long(" type=%s ip=%s" % (module_type, module_ip))
except: pass except:
pass
if exit_status == ok: if exit_status == ok:
add_summary("All switchmodules healthy") add_summary("All switchmodules healthy")
@ -291,14 +317,14 @@ def check_blowers():
blower2speed = snmpget("1.3.6.1.4.1.2.3.51.2.2.3.2.0") blower2speed = snmpget("1.3.6.1.4.1.2.3.51.2.2.3.2.0")
blower2state = snmpget("1.3.6.1.4.1.2.3.51.2.2.3.11.0") blower2state = snmpget("1.3.6.1.4.1.2.3.51.2.2.3.11.0")
add_long( "Blower 1 state=%s speed=%s" % (blower1state,blower1speed) ) add_long("Blower 1 state=%s speed=%s" % (blower1state, blower1speed))
add_long( "Blower 2 state=%s speed=%s" % (blower2state,blower2speed) ) add_long("Blower 2 state=%s speed=%s" % (blower2state, blower2speed))
add_perfdata("blower1=%s" %(blower1speed.split(None,1)[0] )) add_perfdata("blower1=%s" % (blower1speed.split(None, 1)[0]))
add_perfdata("blower2=%s" %(blower2speed.split(None,1)[0] )) add_perfdata("blower2=%s" % (blower2speed.split(None, 1)[0]))
# Check blower 1 # Check blower 1
if blower1state == "1": if blower1state == "1":
nagios_status(ok) nagios_status(ok)
add_summary("Blower1 OK. " ) add_summary("Blower1 OK. ")
else: else:
add_summary("Blower1 NOT OK. ") add_summary("Blower1 NOT OK. ")
nagios_status(warning) nagios_status(warning)
@ -306,7 +332,7 @@ def check_blowers():
# Check blower 2 # Check blower 2
if blower2state == "1": if blower2state == "1":
nagios_status(ok) nagios_status(ok)
add_summary("Blower2 OK. " ) add_summary("Blower2 OK. ")
else: else:
add_summary("Blower2 NOT OK. ") add_summary("Blower2 NOT OK. ")
nagios_status(warning) nagios_status(warning)
@ -319,33 +345,33 @@ def check_chassis_status():
chassis = getTable('1.3.6.1.4.1.2.3.51.2.2.5.2') chassis = getTable('1.3.6.1.4.1.2.3.51.2.2.5.2')
oids = chassis.values()[0] oids = chassis.values()[0]
chassis_oid = { chassis_oid = {
1 :"bistSdram", 1: "bistSdram",
10 :"bistBootRomFlashImage", 10: "bistBootRomFlashImage",
11 :"bistEthernetPort1", 11: "bistEthernetPort1",
113 :"bistSwitchModulesCommunicating", 113: "bistSwitchModulesCommunicating",
12 :"bistEthernetPort2", 12: "bistEthernetPort2",
13 :"bistInternalPCIBus", 13: "bistInternalPCIBus",
14 :"bistExternalI2CDevices", 14: "bistExternalI2CDevices",
15 :"bistUSBController", 15: "bistUSBController",
16 :"bistVideoCompressorBoard", 16: "bistVideoCompressorBoard",
17 :"bistPrimaryBus", 17: "bistPrimaryBus",
18 :"bistInternalEthernetSwitch", 18: "bistInternalEthernetSwitch",
2 :"bistRs485Port1", 2: "bistRs485Port1",
3 :"bistRs485Port2", 3: "bistRs485Port2",
33 :"bistBladesInstalled", 33: "bistBladesInstalled",
4 :"bistNvram", 4: "bistNvram",
49 :"bistBladesCommunicating", 49: "bistBladesCommunicating",
6 :"bistRtc", 6: "bistRtc",
65 :"bistBlowersInstalled", 65: "bistBlowersInstalled",
7 :"bistLocalI2CBus", 7: "bistLocalI2CBus",
73 :"bistBlowersFunctional", 73: "bistBlowersFunctional",
74 :"bistMediaTrayInstalled", 74: "bistMediaTrayInstalled",
75 :"bistMediaTrayCommunicating", 75: "bistMediaTrayCommunicating",
8 :"bistPrimaryMainAppFlashImage", 8: "bistPrimaryMainAppFlashImage",
81 :"bistPowerModulesInstalled", 81: "bistPowerModulesInstalled",
89 :"bistPowerModulesFunctional", 89: "bistPowerModulesFunctional",
9 :"bistSecondaryMainAppFlashImage", 9: "bistSecondaryMainAppFlashImage",
97 :"bistSwitchModulesInstalled", 97: "bistSwitchModulesInstalled",
} }
# Check if all blades are working # Check if all blades are working
@ -363,59 +389,60 @@ def check_chassis_status():
# Check Blade Communications # Check Blade Communications
if not oids.has_key(bistBladesInstalled) or not oids.has_key(bistBladesCommunicating): if not oids.has_key(bistBladesInstalled) or not oids.has_key(bistBladesCommunicating):
add_summary( "Blades N/A. ") add_summary("Blades N/A. ")
elif oids[bistBladesInstalled] == oids[bistBladesCommunicating]: elif oids[bistBladesInstalled] == oids[bistBladesCommunicating]:
nagios_status(ok) nagios_status(ok)
add_summary( "Blades OK. " ) add_summary("Blades OK. ")
else: else:
nagios_status(warning) nagios_status(warning)
add_summary( "Blades NOT OK. " ) add_summary("Blades NOT OK. ")
# Check PowerModule Status # Check PowerModule Status
if not oids.has_key(bistPowerModulesFunctional) or not oids.has_key(bistPowerModulesInstalled): if not oids.has_key(bistPowerModulesFunctional) or not oids.has_key(bistPowerModulesInstalled):
add_summary( "Powermodules N/A. ") add_summary("Powermodules N/A. ")
elif oids[bistPowerModulesFunctional] == oids[bistPowerModulesInstalled]: elif oids[bistPowerModulesFunctional] == oids[bistPowerModulesInstalled]:
nagios_status(ok) nagios_status(ok)
add_summary( "PowerModules OK. " ) add_summary("PowerModules OK. ")
else: else:
nagios_status(warning) nagios_status(warning)
add_summary( "PowerModules NOT OK. " ) add_summary("PowerModules NOT OK. ")
# Check SwitcModule Communications # Check SwitcModule Communications
if not oids.has_key(bistSwitchModulesCommunicating) or not oids.has_key(bistSwitchModulesInstalled): if not oids.has_key(bistSwitchModulesCommunicating) or not oids.has_key(bistSwitchModulesInstalled):
add_summary( "SwitchModules N/A. ") add_summary("SwitchModules N/A. ")
if oids[bistSwitchModulesCommunicating] == oids[bistSwitchModulesInstalled]: if oids[bistSwitchModulesCommunicating] == oids[bistSwitchModulesInstalled]:
nagios_status(ok) nagios_status(ok)
add_summary("Switchmodules OK. ") add_summary("Switchmodules OK. ")
else: else:
nagios_status(warning) nagios_status(warning)
add_summary( "Switchmodules NOT OK. ") add_summary("Switchmodules NOT OK. ")
# Check blower status # Check blower status
if not oids.has_key(bistBlowersInstalled) or not oids.has_key(bistBlowersFunctional): if not oids.has_key(bistBlowersInstalled) or not oids.has_key(bistBlowersFunctional):
add_summary( "Blowers N/A. ") add_summary("Blowers N/A. ")
elif oids[bistBlowersInstalled] == oids[bistBlowersFunctional]: elif oids[bistBlowersInstalled] == oids[bistBlowersFunctional]:
nagios_status(ok) nagios_status(ok)
add_summary( "Blowers OK. " ) add_summary("Blowers OK. ")
else: else:
nagios_status(warning) nagios_status(warning)
add_summary( "Blowers NOT OK. " ) add_summary("Blowers NOT OK. ")
# Check Media Tray Status # Check Media Tray Status
if not oids.has_key(bistMediaTrayCommunicating) or not oids.has_key(bistMediaTrayInstalled): if not oids.has_key(bistMediaTrayCommunicating) or not oids.has_key(bistMediaTrayInstalled):
nagios_status(ok) nagios_status(ok)
add_summary( "Media Trays N/A. ") add_summary("Media Trays N/A. ")
elif oids[bistMediaTrayCommunicating] == oids[bistMediaTrayInstalled]: elif oids[bistMediaTrayCommunicating] == oids[bistMediaTrayInstalled]:
add_summary( "Media Trays OK. " ) add_summary("Media Trays OK. ")
else: else:
nagios_status(warning) nagios_status(warning)
add_summary( "Media Trays NOT OK. " ) add_summary("Media Trays NOT OK. ")
# status_oids, oids that where 0 == ok # status_oids, oids that where 0 == ok
status_oids = ( 2,3,5,7,8,9,10,11,14,18,19,20,21,22,23,24,25,26,27,28,29,30, ) status_oids = (2, 3, 5, 7, 8, 9, 10, 11, 14, 18,
19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, )
add_long("Other Sensors: ") add_long("Other Sensors: ")
sensor_status = ok sensor_status = ok
for oid in status_oids: for oid in status_oids:
if not chassis_oid.has_key(oid): continue if not chassis_oid.has_key(oid):
continue
oidValue = oids[oid] oidValue = oids[oid]
oidName = chassis_oid[oid] oidName = chassis_oid[oid]
if oidValue == "0": if oidValue == "0":
@ -424,28 +451,32 @@ def check_chassis_status():
friendly_status = "%s (not ok)" % oidValue friendly_status = "%s (not ok)" % oidValue
nagios_status(warning) nagios_status(warning)
sensor_status = warning sensor_status = warning
add_summary( "%s is %s" % oidName, friendly_status) add_summary("%s is %s" % oidName, friendly_status)
add_long( " %s status: %s" % (oidName,friendly_status) ) add_long(" %s status: %s" % (oidName, friendly_status))
if sensor_status == ok: if sensor_status == ok:
add_summary( "Other Sensors: OK. ") add_summary("Other Sensors: OK. ")
def check_bladehealth(): def check_bladehealth():
blades = getTable('1.3.6.1.4.1.2.3.51.2.22.1.5.2.1') blades = getTable('1.3.6.1.4.1.2.3.51.2.22.1.5.2.1')
bladestate = getTable('1.3.6.1.4.1.2.3.51.2.22.1.5.1.1').values() bladestate = getTable('1.3.6.1.4.1.2.3.51.2.22.1.5.1.1').values()
index,bladeid,severity,description = (1,2,3,4) index, bladeid, severity, description = (1, 2, 3, 4)
good_blades = 0 good_blades = 0
total_blades = 0 total_blades = 0
for i,row in enumerate(blades.values()): for i, row in enumerate(blades.values()):
myIndex = row[index] myIndex = row[index]
myBladeid = row[bladeid] myBladeid = row[bladeid]
mySeverity = row[severity] mySeverity = row[severity]
myDescription = row[description] myDescription = row[description]
try: myName = bladestate[i][6] try:
except: myName = "" myName = bladestate[i][6]
if mySeverity == "(No severity)": continue except:
add_long( "blade%s (%s): %s %s" % (myBladeid,myName,mySeverity, myDescription) ) myName = ""
if mySeverity == "(No severity)":
continue
add_long("blade%s (%s): %s %s" %
(myBladeid, myName, mySeverity, myDescription))
if opts.exclude: if opts.exclude:
if myDescription.find(opts.exclude) > -1: if myDescription.find(opts.exclude) > -1:
continue continue
@ -455,25 +486,32 @@ def check_bladehealth():
good_blades += 1 good_blades += 1
else: else:
nagios_status(warning) nagios_status(warning)
add_summary( "blade%s (%s): %s %s. " % (myBladeid,myName,mySeverity, myDescription) ) add_summary("blade%s (%s): %s %s. " %
(myBladeid, myName, mySeverity, myDescription))
if good_blades == total_blades: if good_blades == total_blades:
add_summary( "%s out of %s blades in Good health. " % (good_blades, total_blades)) add_summary("%s out of %s blades in Good health. " %
(good_blades, total_blades))
nagios_status(ok) nagios_status(ok)
else: else:
nagios_status(warning) nagios_status(warning)
def check_systemhealth(): def check_systemhealth():
systemhealthstat = snmpget('1.3.6.1.4.1.2.3.51.2.2.7.1.0') systemhealthstat = snmpget('1.3.6.1.4.1.2.3.51.2.2.7.1.0')
summary = getTable('1.3.6.1.4.1.2.3.51.2.2.7.2.1') summary = getTable('1.3.6.1.4.1.2.3.51.2.2.7.2.1')
index,severity,description,date = (1,2,3,4) index, severity, description, date = (1, 2, 3, 4)
# Sometimes chassis delivers warning when absolutely nothing is going on. Lets work around that # Sometimes chassis delivers warning when absolutely nothing is going on.
workaround = {1: '1', 2: 'Good', 3: 'No critical or warning events', 4: 'No timestamp'} # Lets work around that
workaround = {1: '1', 2: 'Good', 3:
'No critical or warning events', 4: 'No timestamp'}
# Check overall health # Check overall health
if systemhealthstat == '255': if systemhealthstat == '255':
nagios_status(ok) nagios_status(ok)
add_summary("Bladecenter health: OK. ") add_summary("Bladecenter health: OK. ")
elif systemhealthstat == "2": elif systemhealthstat == "2":
if summary.values() == workaround: if summary.values() == workaround:
add_summary("Non-Critical Error: %s " % workaround[0][description] ) add_summary("Non-Critical Error: %s " %
workaround[0][description])
nagios_status(ok) nagios_status(ok)
return return
nagios_status(warning) nagios_status(warning)
@ -486,7 +524,9 @@ def check_systemhealth():
add_summary("Critical. ") add_summary("Critical. ")
else: else:
nagios_status(unknown) nagios_status(unknown)
add_summary("Bladecenter health unkown (oid 1.3.6.1.4.1.2.3.51.2.2.7.1.0 returns %s). " % systemhealthstat) add_summary(
"Bladecenter health unkown (oid 1.3.6.1.4.1.2.3.51.2.2.7.1.0 returns %s). " %
systemhealthstat)
for row in summary.values(): for row in summary.values():
if row[severity] == 'Good': if row[severity] == 'Good':
nagios_status(ok) nagios_status(ok)
@ -496,30 +536,37 @@ def check_systemhealth():
nagios_status(warning) nagios_status(warning)
else: else:
nagios_status(critical) nagios_status(critical)
add_summary( "%s. " % (row[description]) ) add_summary("%s. " % (row[description]))
add_long( "* %s. " % (row[description]) ) add_long("* %s. " % (row[description]))
def check_temperature(): def check_temperature():
# set some sensible defaults # set some sensible defaults
if opts.warning_threshold is None: opts.warning_threshold = 28 if opts.warning_threshold is None:
if opts.critical_threshold is None: opts.critical_threshold = 35 opts.warning_threshold = 28
if opts.critical_threshold is None:
opts.critical_threshold = 35
str_temp = snmpget('1.3.6.1.4.1.2.3.51.2.2.1.5.1.0') str_temp = snmpget('1.3.6.1.4.1.2.3.51.2.2.1.5.1.0')
float_temp,measurement = str_temp.split(None, 1) float_temp, measurement = str_temp.split(None, 1)
float_temp = float( float_temp ) float_temp = float(float_temp)
if opts.critical_threshold is not None and float_temp > opts.critical_threshold: if opts.critical_threshold is not None and float_temp > opts.critical_threshold:
nagios_status(critical) nagios_status(critical)
add_summary( "ambient temperature (%s) is over critical thresholds (%s). " % (str_temp, opts.critical_threshold) ) add_summary(
"ambient temperature (%s) is over critical thresholds (%s). " %
(str_temp, opts.critical_threshold))
elif opts.warning_threshold is not None and float_temp > opts.warning_threshold: elif opts.warning_threshold is not None and float_temp > opts.warning_threshold:
nagios_status(warning) nagios_status(warning)
add_summary( "ambient temperature (%s) is over warning thresholds (%s). " % (str_temp, opts.warning_threshold) ) add_summary(
"ambient temperature (%s) is over warning thresholds (%s). " %
(str_temp, opts.warning_threshold))
else: else:
add_summary( "Ambient temperature = %s. " % (str_temp) ) add_summary("Ambient temperature = %s. " % (str_temp))
add_perfdata( "'ambient_temp'=%s;%s;%s " % (float_temp,opts.warning_threshold,opts.critical_threshold) ) add_perfdata("'ambient_temp'=%s;%s;%s " %
(float_temp, opts.warning_threshold, opts.critical_threshold))
#add_long( "Ambient Temperature = %s" % (str_temp) ) #add_long( "Ambient Temperature = %s" % (str_temp) )
nagios_status(ok) nagios_status(ok)
if __name__ == '__main__': if __name__ == '__main__':
try: try:
set_snmp_options() set_snmp_options()