fsc_sc2_temp, fsc_sc2_voltage:
avoid crashes when values values are
missing in the SNMP walk
Message-ID: <5b50926e.nrOgfUCsVdxy7h4+%tb(a)mathias-kettner.de>
User-Agent: Heirloom mailx 12.5 6/20/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Module: check_mk
Branch: master
Commit: 3cc72e34fb97410a14dbf81b7cc0324d8b21307e
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=3cc72e34fb9741…
Author: Tom Baerwinkel <tb(a)mathias-kettner.de>
Date: Wed Jul 18 12:10:57 2018 +0200
6123 FIX fsc_sc2_fans, fsc_sc2_power_consumption, fsc_sc2_psu, fsc_sc2_temp,
fsc_sc2_voltage: avoid crashes when values values are missing in the SNMP walk
Change-Id: I0ad1f5c0ea6a14442c5b6223bc6b783e372f4663
---
.werks/6123 | 10 ++++++++++
checks/fsc_sc2_fans | 30 ++++++++++++++++-------------
checks/fsc_sc2_power_consumption | 6 +++++-
checks/fsc_sc2_psu | 41 ++++++++++++++++++++--------------------
checks/fsc_sc2_temp | 37 +++++++++++++++++++++---------------
checks/fsc_sc2_voltage | 22 +++++++++++++--------
6 files changed, 89 insertions(+), 57 deletions(-)
diff --git a/.werks/6123 b/.werks/6123
new file mode 100644
index 0000000..9940d78
--- /dev/null
+++ b/.werks/6123
@@ -0,0 +1,10 @@
+Title: fsc_sc2_fans, fsc_sc2_power_consumption, fsc_sc2_psu, fsc_sc2_temp,
fsc_sc2_voltage: avoid crashes when values values are missing in the SNMP walk
+Level: 1
+Component: checks
+Compatible: compat
+Edition: cre
+Version: 1.6.0i1
+Date: 1531982632
+Class: fix
+
+
diff --git a/checks/fsc_sc2_fans b/checks/fsc_sc2_fans
index d357943..48286b3 100644
--- a/checks/fsc_sc2_fans
+++ b/checks/fsc_sc2_fans
@@ -56,25 +56,29 @@ def inventory_fsc_sc2_fans(info):
def check_fsc_sc2_fans(item, params, info):
- def get_status_map(status):
- return {
- '1' : (3, 'Status is unknown'),
- '2' : (0, 'Status is disabled'),
- '3' : (0, 'Status is ok'),
- '4' : (2, 'Status is failed'),
- '5' : (1, 'Status is prefailure-predicted'),
- '6' : (1, 'Status is redundant-fan-failed'),
- '7' : (3, 'Status is not-manageable'),
- '8' : (0, 'Status is not-present'),
- }.get(status, (3, 'Status is unknown'))
+ status_map = {
+ '1': (3, 'Status is unknown'),
+ '2': (0, 'Status is disabled'),
+ '3': (0, 'Status is ok'),
+ '4': (2, 'Status is failed'),
+ '5': (1, 'Status is prefailure-predicted'),
+ '6': (1, 'Status is redundant-fan-failed'),
+ '7': (3, 'Status is not-manageable'),
+ '8': (0, 'Status is not-present'),
+ }
if type(params) == tuple:
params = { 'lower' : params }
for designation, status, rpm in info:
if designation == item:
- yield check_fan(int(rpm), params)
- yield get_status_map(status)
+ # in this case booth values are important
+ if rpm:
+ yield check_fan(int(rpm), params)
+ else:
+ yield 3, "Device did not deliver rpm values"
+
+ yield status_map.get(status, (3, 'Status is unknown'))
check_info["fsc_sc2_fans"] = {
diff --git a/checks/fsc_sc2_power_consumption b/checks/fsc_sc2_power_consumption
index 74318b8..3774075 100644
--- a/checks/fsc_sc2_power_consumption
+++ b/checks/fsc_sc2_power_consumption
@@ -45,7 +45,11 @@
def parse_fsc_sc2_power_consumption(info):
parsed = {}
for designation, value in info:
- parsed.setdefault(designation, {"power": int(value)})
+ # sometimes the device does not return a value
+ if not value:
+ parsed.setdefault(designation, {"device_state": (3,'Error on
device while reading value')})
+ else:
+ parsed.setdefault(designation, {"power": int(value)})
return parsed
diff --git a/checks/fsc_sc2_psu b/checks/fsc_sc2_psu
index 3cfcd0f..2dc13dd 100644
--- a/checks/fsc_sc2_psu
+++ b/checks/fsc_sc2_psu
@@ -39,29 +39,30 @@ def inventory_fsc_sc2_psu(info):
def check_fsc_sc2_psu(item, _no_params, info):
- def get_psu_status(status):
- return {
- '1' : (3, 'Status is unknown'),
- '2' : (0, 'Status is not-present'),
- '3' : (0, 'Status is ok'),
- '4' : (2, 'Status is failed'),
- '5' : (2, 'Status is ac-fail'),
- '6' : (2, 'Status is dc-fail'),
- '7' : (2, 'Status is critical-temperature'),
- '8' : (0, 'Status is not-manageable'),
- '9' : (1, 'Status is fan-failure-predicted'),
- '10': (2, 'Status is fan-failure'),
- '11': (1, 'Status is power-safe-mode'),
- '12': (1, 'Status is non-redundant-dc-fail'),
- '13': (1, 'Status is non-redundant-ac-fail')
- }.get(status, (3, 'Status is unknown'))
+ psu_status = {
+ '1' : (3, 'Status is unknown'),
+ '2' : (0, 'Status is not-present'),
+ '3' : (0, 'Status is ok'),
+ '4' : (2, 'Status is failed'),
+ '5' : (2, 'Status is ac-fail'),
+ '6' : (2, 'Status is dc-fail'),
+ '7' : (2, 'Status is critical-temperature'),
+ '8' : (0, 'Status is not-manageable'),
+ '9' : (1, 'Status is fan-failure-predicted'),
+ '10': (2, 'Status is fan-failure'),
+ '11': (1, 'Status is power-safe-mode'),
+ '12': (1, 'Status is non-redundant-dc-fail'),
+ '13': (1, 'Status is non-redundant-ac-fail')
+ }
for designation, status, load, nominal in info:
if designation == item:
- state, infotext = get_psu_status(status)
- infotext += ', nominal load: {0} W, actual load: {1}
W'.format(nominal, load)
- perfdata = [ ('power', int(load)) ]
- return state, infotext, perfdata
+ yield psu_status.get(status, (3, 'Status is unknown'))
+
+ if nominal and load:
+ yield 0, 'Nominal load: {0} W, Actual load: {1}
W'.format(nominal, load), [('power', int(load))]
+ else:
+ yield 1, 'Did not receive load data'
check_info["fsc_sc2_psu"] = {
diff --git a/checks/fsc_sc2_temp b/checks/fsc_sc2_temp
index 245139c..1d15492 100644
--- a/checks/fsc_sc2_temp
+++ b/checks/fsc_sc2_temp
@@ -77,25 +77,32 @@ def inventory_fsc_sc2_temp(info):
def check_fsc_sc2_temp(item, params, info):
- def get_temp_status(status):
- return {
- '1' : (3, 'unknown'),
- '2' : (0, 'not-available'),
- '3' : (0, 'ok'),
- '4' : (2, 'sensor-failed'),
- '5' : (2, 'failed'),
- '6' : (1, 'temperature-warning-toohot'),
- '7' : (2, 'temperature-critical-toohot'),
- '8' : (0, 'temperature-normal'),
- '9' : (1, 'temperature-warning')
- }.get(status, (3, 'unknown'))
+ temp_status = {
+ '1' : (3, 'unknown'),
+ '2' : (0, 'not-available'),
+ '3' : (0, 'ok'),
+ '4' : (2, 'sensor-failed'),
+ '5' : (2, 'failed'),
+ '6' : (1, 'temperature-warning-toohot'),
+ '7' : (2, 'temperature-critical-toohot'),
+ '8' : (0, 'temperature-normal'),
+ '9' : (1, 'temperature-warning')
+ }
for designation, status, temp, dev_warn, dev_crit in info:
if designation == item:
+ if not temp:
+ return 3, 'Did not receive temperature data'
+
+ dev_status, dev_status_name = temp_status.get(status, (3,
'unknown'))
+
+ if not dev_warn or not dev_crit:
+ return 3, 'Did not receive device levels'
+
dev_levels = int(dev_warn), int(dev_crit)
- dev_status, dev_status_name = get_temp_status(status)
- return check_temperature(int(temp), params,
'temp_{}'.format(item.replace(' ', '_')), \
- 'c', dev_levels, None, dev_status, dev_status_name)
+
+ return check_temperature(int(temp), params,
'temp_{}'.format(item.replace(' ', '_')),
+ 'c', dev_levels, None, dev_status,
dev_status_name)
check_info['fsc_sc2_temp'] = {
diff --git a/checks/fsc_sc2_voltage b/checks/fsc_sc2_voltage
index 002f4c9..3bd6e2e 100644
--- a/checks/fsc_sc2_voltage
+++ b/checks/fsc_sc2_voltage
@@ -74,14 +74,20 @@
def parse_fsc_sc2_voltage(info):
parsed = {}
for designation, value, min_value, max_value in info:
- value, min_value, max_value = [float(v)/1000
- for v in [value, min_value, max_value]]
- dev_state = value
- if value < min_value:
- dev_state = (value, (2, 'too low, deceeds %.2f V' % min_value))
- elif value >= max_value:
- dev_state = (value, (2, 'too high, exceeds %.2f V' % max_value))
- parsed.setdefault(designation, {"voltage": dev_state})
+ try:
+ value = float(value)/1000.0
+ min_value = float(min_value)/1000.0
+ max_value = float(max_value)/1000.0
+ except ValueError:
+ dev_state = 3, 'Could not get all values'
+ parsed.setdefault(designation, {"device_state": dev_state})
+ else:
+ dev_state = value
+ if value < min_value:
+ dev_state = value, (2, 'too low, deceeds %.2f V' % min_value)
+ elif value >= max_value:
+ dev_state = value, (2, 'too high, exceeds %.2f V' % max_value)
+ parsed.setdefault(designation, {"voltage": dev_state})
return parsed