diff --git a/flex_blade_bays b/flex_blade_bays new file mode 100644 index 0000000..5faa72c --- /dev/null +++ b/flex_blade_bays @@ -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, +} diff --git a/flex_blade_blades b/flex_blade_blades new file mode 100644 index 0000000..ca3a007 --- /dev/null +++ b/flex_blade_blades @@ -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 + +# 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, +} diff --git a/flex_blade_blowers b/flex_blade_blowers new file mode 100644 index 0000000..5be670a --- /dev/null +++ b/flex_blade_blowers @@ -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, +} diff --git a/flex_blade_health b/flex_blade_health new file mode 100644 index 0000000..a0f5313 --- /dev/null +++ b/flex_blade_health @@ -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, +} diff --git a/flex_blade_powerfan b/flex_blade_powerfan new file mode 100644 index 0000000..af4304e --- /dev/null +++ b/flex_blade_powerfan @@ -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, +} diff --git a/flex_blade_powermod b/flex_blade_powermod new file mode 100644 index 0000000..4373cfe --- /dev/null +++ b/flex_blade_powermod @@ -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, +}