added checks

This commit is contained in:
George Pochiscan 2015-02-06 14:28:29 +02:00
parent 38f7bd5f3c
commit dc5087f3eb
6 changed files with 369 additions and 0 deletions

61
flex_blade_bays Normal file
View File

@ -0,0 +1,61 @@
#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# SpearHead Systems
#
flex_blade_bays_module_state = {
0: 'standby',
1: 'on',
2: 'notPresent',
255: 'notApplicable',
}
def flex_blade_bays_make_item(line):
# "3.IO Module 5"
pd, name = line[0].split(".", 1)
if pd == '2':
power_domain = 1
else:
power_domain = 2
return "PD%d %s" % (power_domain, name)
def inventory_flex_blade_bays(info):
# find only modules that are present and switched on or standby
inventory = []
for line in info:
if line[1] in [ '0', '1' ]:
item = flex_blade_bays_make_item(line)
inventory.append((item, None))
return inventory
def check_flex_blade_bays(item, _no_params, info):
for line in info:
if item == flex_blade_bays_make_item(line):
state = saveint(line[1])
type = line[2].split('(')[0]
if state == 1:
return (0, "State %s (Type: %s, ID: %s)" %
(flex_blade_bays_module_state.get(state, 'Unhandled'), type, line[3]))
elif state == 2:
return (1, "Not present")
elif state == 3:
return (1, "Device is switched off")
elif state == 0:
return (1, "Device is in standby")
else:
return (2, "invalid state %d" % state)
return (3, "no data for '%s' in SNMP info" % item)
check_info["flex_blade_bays"] = {
'check_function': check_flex_blade_bays,
'inventory_function': inventory_flex_blade_bays,
'service_description': 'IBM Flex Bay %s',
'snmp_info': (
".1.3.6.1.4.1.2.3.51.2.2.10", [
"2", # powerDomain1
"3", # powerDomain2
], [ "1.1.5", "1.1.6", "1.1.2", "1.1.1" ] ), # BLADE-MIB
'snmp_scan_function': \
lambda oid: re.match('IBM Flex Chassis Management Module', oid(".1.3.6.1.2.1.1.1.0")) != None,
}

83
flex_blade_blades Normal file
View File

@ -0,0 +1,83 @@
#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# +------------------------------------------------------------------+
# | ____ _ _ __ __ _ __ |
# | / ___| |__ ___ ___| | __ | \/ | |/ / |
# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
# | | |___| | | | __/ (__| < | | | | . \ |
# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
# | |
# | Copyright Mathias Kettner 2014 mk@mathias-kettner.de |
# +------------------------------------------------------------------+
#
# This file is part of Check_MK.
# The official homepage is at http://mathias-kettner.de/check_mk.
#
# check_mk is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation in version 2. check_mk is distributed
# in the hope that it will be useful, but WITHOUT ANY WARRANTY; with-
# out even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more de-
# ails. You should have received a copy of the GNU General Public
# License along with GNU Make; see the file COPYING. If not, write
# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301 USA.
# Author: Lars Michelsen <lm@mathias-kettner.de>
# Mappings for translating SNMP states to nagios states
flex_blade_blades_exists_states = (2, 0)
flex_blade_blades_power_states = (1, 0)
flex_blade_blades_health_states = (3, 0, 1, 2)
# Name mappings
flex_blade_blades_exists_labels = ('no', 'yes')
flex_blade_blades_power_labels = ('off', 'on')
flex_blade_blades_health_labels = ('unknown', 'good', 'warning', 'bad')
def inventory_flex_blade_blades(info):
# find only blades that are powered on
return [ (line[0], '', line[1]) for line in info if line[2] == '1' ]
def check_flex_blade_blades(item, params, info):
for line in info:
if line[0] == item:
exists, power_state, health_state = map(saveint, line[1:4])
name = line[4]
state = 0
output = '%s: ' % (name)
for label, part_state, nag_state, state_label in (
('Exists', exists, flex_blade_blades_exists_states[exists], flex_blade_blades_exists_labels[exists]),
('Power', power_state, flex_blade_blades_power_states[power_state], flex_blade_blades_power_labels[power_state]),
('Health', health_state, flex_blade_blades_health_states[health_state], flex_blade_blades_health_labels[health_state])):
output += '%s: %s' % (label, state_label)
if nag_state == 1:
output += ' (!)'
elif nag_state == 2:
output += ' (!!)'
elif nag_state == 3:
output += ' (UNKNOWN)'
state = max(state, nag_state)
output += ', '
return (state, output.rstrip(', '))
return (3, "no data for '%s' in SNMP info" % item)
check_info["flex_blade_blades"] = {
'check_function': check_flex_blade_blades,
'inventory_function': inventory_flex_blade_blades,
'service_description': 'Flex Blade %s',
'snmp_info': (
".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1", [ # BLADE-MIB
2, # bladeId
3, # bladeExists
4, # bladePowerState
5, # bladeHealthState
6, # bladeName
]),
'snmp_scan_function': \
lambda oid: re.match('IBM Flex Chassis Management Module', oid(".1.3.6.1.2.1.1.1.0")) != None,
}

89
flex_blade_blowers Normal file
View File

@ -0,0 +1,89 @@
#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# SpearHead Systems
# The BLADE-MIB is somewhat goofy redarding the blower
# information. The blowers are listed sequentially
# below the same subtrees:
# BLADE-MIB::blower1speed.0 = STRING: "50% of maximum"
# BLADE-MIB::blower2speed.0 = STRING: "50% of maximum"
# BLADE-MIB::blower1State.0 = INTEGER: good(1)
# BLADE-MIB::blower2State.0 = INTEGER: good(1)
# BLADE-MIB::blowers.20.0 = STRING: "1712"
# BLADE-MIB::blowers.21.0 = STRING: "1696"
# BLADE-MIB::blowers.30.0 = INTEGER: 0
# BLADE-MIB::blowers.31.0 = INTEGER: 0
#
# The same with -On:
# .1.3.6.1.4.1.2.3.51.2.2.3.1.0 = STRING: "49% of maximum"
# .1.3.6.1.4.1.2.3.51.2.2.3.2.0 = STRING: "No Blower"
# .1.3.6.1.4.1.2.3.51.2.2.3.10.0 = INTEGER: good(1)
# .1.3.6.1.4.1.2.3.51.2.2.3.11.0 = INTEGER: unknown(0)
# .1.3.6.1.4.1.2.3.51.2.2.3.20.0 = STRING: "1696"
# .1.3.6.1.4.1.2.3.51.2.2.3.21.0 = STRING: "No Blower"
# .1.3.6.1.4.1.2.3.51.2.2.3.30.0 = INTEGER: 0
# .1.3.6.1.4.1.2.3.51.2.2.3.31.0 = INTEGER: 2
#
# How can we safely determine the number of blowers without
# assuming that each blower has four entries?
# We assume that all blowers are in state OK (used for
# inventory only)
def number_of_flex_blowers(info):
n = 0
while len(info) > n and len(info[n][0]) > 1: # state lines
n += 1
return n
def inventory_flex_blade_blowers(info):
inventory = []
n = number_of_flex_blowers(info)
for i in range(0, n):
if info[i + n][0] != "0": # skip unknown blowers
inventory.append( ("%d/%d" % (i+1,n), None, None) )
return inventory
def check_flex_blade_blowers(item, _no_params, info):
blower, num_flex_blowers = map(int, item.split("/"))
text = info[blower-1][0]
perfdata = []
output = ''
state = info[blower-1 + num_blowers][0]
try:
rpm = int(info[blower-1 + 2*num_blowers][0])
perfdata += [("rpm", rpm)]
output += 'Flex Speed at %d RMP' % rpm
except:
pass
try:
perc = int(text.split("%")[0])
perfdata += [("perc", perc, None, None, 0, 100)]
if output == '':
output += 'Flex Speed is at %d%% of max' % perc
else:
output += ' (%d%% of max)' % perc
except:
pass
if state == "1":
return (0, output, perfdata)
else:
return (2, output, perfdata)
check_info["flex_blade_blowers"] = {
'check_function': check_flex_blade_blowers,
'inventory_function': inventory_flex_blade_blowers,
'service_description': 'IBM Flex Blower %s',
'has_perfdata': True,
'snmp_info': ('.1.3.6.1.4.1.2.3.51.2.2', [3]),
'snmp_scan_function': \
lambda oid: re.match('IBM Flex Chassis Management Module', oid(".1.3.6.1.2.1.1.1.0")) != None,
}

42
flex_blade_health Normal file
View File

@ -0,0 +1,42 @@
#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# SpearHead Systems
#
# Example excerpt from SNMP data:
# .1.3.6.1.4.1.2.3.51.2.2.7.1.0 255
# .1.3.6.1.4.1.2.3.51.2.2.7.2.1.1.1 1
# .1.3.6.1.4.1.2.3.51.2.2.7.2.1.2.1 "Good"
# .1.3.6.1.4.1.2.3.51.2.2.7.2.1.3.1 "No critical or warning events"
# .1.3.6.1.4.1.2.3.51.2.2.7.2.1.4.1 "No timestamp"
def inventory_flex_blade_health(info):
if len(info) == 1:
return [(None, None, None)]
def check_flex_blade_health(_no_item, _no_params, info):
state = info[0][0]
descr = ": " + ", ".join([ line[1] for line in info if len(line) > 1 ])
if state == "255":
return (0, "State is good")
elif state == "2":
return (2, "State is degraded (non critical)" + descr)
elif state == "4":
return (1, "State is degraded (system level)" + descr)
elif state == "0":
return (2, "State is critical!" + descr)
else:
return (3, "Undefined state code %s%s" % (state, descr))
check_info["flex_blade_health"] = {
'check_function': check_flex_blade_health,
'inventory_function': inventory_flex_blade_health,
'service_description': 'IBM Flex Summary health state',
'snmp_info': ('.1.3.6.1.4.1.2.3.51.2.2.7', ['1.0', '2.1.3.1']),
'snmp_scan_function': \
lambda oid: re.match('IBM Flex Chassis Management Module', oid(".1.3.6.1.2.1.1.1.0")) != None,
}

63
flex_blade_powerfan Normal file
View File

@ -0,0 +1,63 @@
#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# +------------------------------------------------------------------+
# | ____ _ _ __ __ _ __ |
# | / ___| |__ ___ ___| | __ | \/ | |/ / |
# | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / |
# | | |___| | | | __/ (__| < | | | | . \ |
# | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ |
# | |
# | Copyright Mathias Kettner 2014 mk@mathias-kettner.de |
# +------------------------------------------------------------------+
#
# This file is part of Check_MK.
# The official homepage is at http://mathias-kettner.de/check_mk.
#
# check_mk is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation in version 2. check_mk is distributed
# in the hope that it will be useful, but WITHOUT ANY WARRANTY; with-
# out even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more de-
# ails. You should have received a copy of the GNU General Public
# License along with GNU Make; see the file COPYING. If not, write
# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301 USA.
def inventory_flex_blade_powerfan(info):
return [ (line[0], '(50, 60)') for line in info if line[0] != '' and line[1] == '1' ]
def check_flex_blade_powerfan(item, params, info):
warn_perc, crit_perc = params
for index, present, status, fancount, speedperc, rpm, ctrlstate in info:
if index != item: continue
perfdata=[ ('perc', speedperc, warn_perc, crit_perc, "0", "100" ),
('rpm', rpm ) ]
speedperc_int = saveint(speedperc)
if present != "1":
return (2, "Fan not present", perfdata)
elif status != "1":
return (2, "Status not OK", perfdata)
elif ctrlstate != "0":
return (2, "Controller state not OK", perfdata)
elif speedperc <= crit_perc:
return (2, "Speed at %d%% of max (crit at %d%%)" % (speedperc_int, crit_perc), perfdata)
elif speedperc <= warn_perc:
return (1, "Speed at %d%% of max (warning at %d%%)" % (speedperc_int, warn_perc), perfdata)
else:
return (0, "Speed at %s RPM (%d%% of max)" % (rpm, speedperc_int), perfdata)
return (3, "Device %s not found in SNMP data" % item)
check_info["flex_blade_powerfan"] = {
'check_function': check_flex_blade_powerfan,
'inventory_function': inventory_flex_blade_powerfan,
'service_description': 'IBM Flex Power Module Cooling Device %s',
'has_perfdata': True,
'snmp_info': ('.1.3.6.1.4.1.2.3.51.2.2.6.1.1', [1, 2, 3, 4, 5, 6, 7]),
'snmp_scan_function': \
lambda oid: re.match('IBM Flex Chassis Management Module', oid(".1.3.6.1.2.1.1.1.0")) != None,
}

31
flex_blade_powermod Normal file
View File

@ -0,0 +1,31 @@
#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# SpearHead Systems
#
def inventory_flex_blade_powermod(info):
return [ (line[0], '', '""') for line in info if line[1] == '1' ]
def check_flex_blade_powermod(index, _no_param, info):
for line in info:
if line[0] == index:
present, status, text = line[1:]
if present != "1":
return (2, "Not present")
elif status != "1":
return (2, "%s" % text)
else:
return (0, "%s" % text)
return (3, "Module %s not found in SNMP info" % index)
check_info["flex_blade_powermod"] = {
'check_function': check_flex_blade_powermod,
'inventory_function': inventory_flex_blade_powermod,
'service_description': 'IBM Flex Power Module %s',
'snmp_info': ('.1.3.6.1.4.1.2.3.51.2.2.4.1.1', [1, 2, 3, 4]),
'snmp_scan_function': \
lambda oid: re.match('IBM Flex Chassis Management Module', oid(".1.3.6.1.2.1.1.1.0")) != None,
}