6 changed files with 369 additions and 0 deletions
@ -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, |
||||
} |
@ -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, |
||||
} |
@ -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, |
||||
} |
@ -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, |
||||
} |
@ -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, |
||||
} |
@ -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, |
||||
} |
Loading…
Reference in new issue