From 995e4fd2d3b3d4fd5f0e8f5066a8581d25973203 Mon Sep 17 00:00:00 2001 From: "Th.L" <thl-cmk@outlook.com> Date: Sun, 21 Mar 2021 23:41:46 +0100 Subject: [PATCH] update project --- agent_based/cisco_asyncos_cpu.py | 6 -- agent_based/cisco_asyncos_fan.py | 122 ++++++++++++++++++++++++ agent_based/cisco_asyncos_mem.py | 6 -- agent_based/cisco_asyncos_power.py | 147 +++++++++++++++++++++++++++++ agent_based/cisco_asyncos_temp.py | 7 -- checks/cisco_asyncos.include | 35 ------- checks/cisco_asyncos_bandwidth | 5 +- checks/cisco_asyncos_cache | 5 +- checks/cisco_asyncos_conn | 5 +- checks/cisco_asyncos_dns | 2 +- checks/cisco_asyncos_fan | 98 ------------------- checks/cisco_asyncos_license | 4 +- checks/cisco_asyncos_power | 103 -------------------- checks/cisco_asyncos_queue | 2 +- checks/cisco_asyncos_raid | 12 --- cisco_asyncos.mkp | Bin 11862 -> 11776 bytes packages/cisco_asyncos | 9 +- 17 files changed, 286 insertions(+), 282 deletions(-) create mode 100644 agent_based/cisco_asyncos_fan.py create mode 100644 agent_based/cisco_asyncos_power.py delete mode 100644 checks/cisco_asyncos.include delete mode 100644 checks/cisco_asyncos_fan delete mode 100644 checks/cisco_asyncos_power diff --git a/agent_based/cisco_asyncos_cpu.py b/agent_based/cisco_asyncos_cpu.py index 1ad56b1..5822be0 100644 --- a/agent_based/cisco_asyncos_cpu.py +++ b/agent_based/cisco_asyncos_cpu.py @@ -18,15 +18,9 @@ from .agent_based_api.v1.type_defs import ( from .agent_based_api.v1 import ( register, Service, - equals, - Result, check_levels, - State, SNMPTree, contains, - startswith, - all_of, - any_of, ) diff --git a/agent_based/cisco_asyncos_fan.py b/agent_based/cisco_asyncos_fan.py new file mode 100644 index 0000000..13363dc --- /dev/null +++ b/agent_based/cisco_asyncos_fan.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# License: GNU General Public License v2 +# +# Author: thl-cmk[at]outlook[dot]com +# URL : https://thl-cmk.hopto.org +# Date : 2020-02-10 + +# +# monitors status Cisco IronPort Appliances (ESA/SMA/WSA) fan sensors +# Tested with: C380, M380, C370, M670, S370 +# +# 2021-03-21: rewrite for CMK 2.0 +# +# sample snmpwalk +# .1.3.6.1.4.1.15497.1.1.1.10.1.1.1 = INTEGER: 1 +# .1.3.6.1.4.1.15497.1.1.1.10.1.1.2 = INTEGER: 2 +# .1.3.6.1.4.1.15497.1.1.1.10.1.1.3 = INTEGER: 3 +# .1.3.6.1.4.1.15497.1.1.1.10.1.1.4 = INTEGER: 4 +# .1.3.6.1.4.1.15497.1.1.1.10.1.2.1 = Gauge32: 3600 +# .1.3.6.1.4.1.15497.1.1.1.10.1.2.2 = Gauge32: 3600 +# .1.3.6.1.4.1.15497.1.1.1.10.1.2.3 = Gauge32: 3600 +# .1.3.6.1.4.1.15497.1.1.1.10.1.2.4 = Gauge32: 3480 +# .1.3.6.1.4.1.15497.1.1.1.10.1.3.1 = STRING: FAN 1 +# .1.3.6.1.4.1.15497.1.1.1.10.1.3.2 = STRING: FAN 2 +# .1.3.6.1.4.1.15497.1.1.1.10.1.3.3 = STRING: FAN 3 +# .1.3.6.1.4.1.15497.1.1.1.10.1.3.4 = STRING: FAN 4 +# +# ASYNCOS-MAIL-MIB::fanIndex.1 = INTEGER: 1 +# ASYNCOS-MAIL-MIB::fanIndex.2 = INTEGER: 2 +# ASYNCOS-MAIL-MIB::fanIndex.3 = INTEGER: 3 +# ASYNCOS-MAIL-MIB::fanIndex.4 = INTEGER: 4 +# ASYNCOS-MAIL-MIB::fanRPMs.1 = Gauge32: 3600 +# ASYNCOS-MAIL-MIB::fanRPMs.2 = Gauge32: 3600 +# ASYNCOS-MAIL-MIB::fanRPMs.3 = Gauge32: 3600 +# ASYNCOS-MAIL-MIB::fanRPMs.4 = Gauge32: 3480 +# ASYNCOS-MAIL-MIB::fanName.1 = STRING: FAN 1 +# ASYNCOS-MAIL-MIB::fanName.2 = STRING: FAN 2 +# ASYNCOS-MAIL-MIB::fanName.3 = STRING: FAN 3 +# ASYNCOS-MAIL-MIB::fanName.4 = STRING: FAN 4 +# + +from typing import Dict, List + +from .agent_based_api.v1.type_defs import ( + DiscoveryResult, + CheckResult, + StringTable, +) + +from .agent_based_api.v1 import ( + register, + Service, + check_levels, + State, + SNMPTree, + contains, +) + +# +# [[['6400', 'FAN 1'], ['6300', 'FAN 2'], ['6400', 'FAN 3'], ['6400', 'FAN 4'], ['6400', 'FAN 5'], ['6800', 'FAN 6']]] +# + +def parse_cisco_asyncos_fan(string_table: List[StringTable]) -> dict: + sensors = {} + for sensor in string_table[0]: + try: + value, item = sensor + if item.startswith('FAN '): + item = item.replace('FAN ', '') + sensors.update({item: int(value)}) + except (ValueError, IndexError): + pass + return sensors + + +def discovery_cisco_asyncos_fan(section: Dict) -> DiscoveryResult: + for key in section.keys(): + yield Service(item=key) + + +def check_cisco_asyncos_fan(item, params, section) -> CheckResult: + try: + value = section[item] + + yield from check_levels( + value, + label='Speed', + levels_lower=params.get('lower', None), + levels_upper=params.get('upper', None), + metric_name='fan' if params.get('output_metrics') else None, + render_func=lambda v: '%s RPM' % str(v), + ) + + except KeyError: + pass + + +register.snmp_section( + name='cisco_asyncos_fan', + parse_function=parse_cisco_asyncos_fan, + fetch=[ + SNMPTree( + base='.1.3.6.1.4.1.15497.1.1.1.10.1', # ASYNCOS-MAIL-MIB::fanEntry + oids=[ + '2', # fanRPMs + '3', # fanName + ] + ), + ], + detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'), +) + +register.check_plugin( + name='cisco_asyncos_fan', + service_name='Fan %s', + discovery_function=discovery_cisco_asyncos_fan, + check_function=check_cisco_asyncos_fan, + check_default_parameters={}, + check_ruleset_name='hw_fans' +) diff --git a/agent_based/cisco_asyncos_mem.py b/agent_based/cisco_asyncos_mem.py index b4ddf23..55f19f0 100644 --- a/agent_based/cisco_asyncos_mem.py +++ b/agent_based/cisco_asyncos_mem.py @@ -28,15 +28,9 @@ from .agent_based_api.v1.type_defs import ( from .agent_based_api.v1 import ( register, Service, - equals, - Result, check_levels, - State, SNMPTree, contains, - startswith, - all_of, - any_of, ) diff --git a/agent_based/cisco_asyncos_power.py b/agent_based/cisco_asyncos_power.py new file mode 100644 index 0000000..d63ef49 --- /dev/null +++ b/agent_based/cisco_asyncos_power.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# License: GNU General Public License v2 +# +# Author: thl-cmk[at]outlook[dot]com +# URL : https://thl-cmk.hopto.org +# Date : 2020-02-10 +# +# monitors status power supplies of Cisco IronPort Appliances (ESA/SMA/WSA) +# Tested with: C380, M380, C370, M670, S370 +# +# 2021-03-21: rewrite for CMK 2.0 +# +# sample snmpwalk +# .1.3.6.1.4.1.15497.1.1.1.8.1.1.1 = INTEGER: 1 +# .1.3.6.1.4.1.15497.1.1.1.8.1.1.2 = INTEGER: 2 +# .1.3.6.1.4.1.15497.1.1.1.8.1.2.1 = INTEGER: 2 +# .1.3.6.1.4.1.15497.1.1.1.8.1.2.2 = INTEGER: 2 +# .1.3.6.1.4.1.15497.1.1.1.8.1.3.1 = INTEGER: 1 +# .1.3.6.1.4.1.15497.1.1.1.8.1.3.2 = INTEGER: 1 +# .1.3.6.1.4.1.15497.1.1.1.8.1.4.1 = STRING: PS 1 +# .1.3.6.1.4.1.15497.1.1.1.8.1.4.2 = STRING: PS 2 +# +# ASYNCOS-MAIL-MIB::powerSupplyIndex.1 = INTEGER: 1 +# ASYNCOS-MAIL-MIB::powerSupplyIndex.2 = INTEGER: 2 +# ASYNCOS-MAIL-MIB::powerSupplyStatus.1 = INTEGER: powerSupplyHealthy(2) +# ASYNCOS-MAIL-MIB::powerSupplyStatus.2 = INTEGER: powerSupplyHealthy(2) +# ASYNCOS-MAIL-MIB::powerSupplyRedundancy.1 = INTEGER: powerSupplyRedundancyOK(1) +# ASYNCOS-MAIL-MIB::powerSupplyRedundancy.2 = INTEGER: powerSupplyRedundancyOK(1) +# ASYNCOS-MAIL-MIB::powerSupplyName.1 = STRING: PS 1 +# ASYNCOS-MAIL-MIB::powerSupplyName.2 = STRING: PS 2 +# + +from typing import Dict, List, NamedTuple + +from .agent_based_api.v1.type_defs import ( + DiscoveryResult, + CheckResult, + StringTable, +) + +from .agent_based_api.v1 import ( + register, + Service, + Result, + State, + SNMPTree, + contains, +) + + +class CiscoAsyncosPowersupply(NamedTuple): + redundancy: State + state: State + redundancy_readable: str + state_readable: str + + +# +# [[['2', '1', 'PS 1'], ['2', '1', 'PS 2']]] +# +def parse_cisco_asyncos_power(string_table: List[StringTable]) -> dict: + def get_ps_state(st: str): + state = { + '1': (State.WARN, 'not installed'), + '2': (State.OK, 'healthy'), + '3': (State.CRIT, 'no AC'), + '4': (State.CRIT, 'faulty'), + } + return state.get(st) + + def get_ps_redundancy(st: str): + redundancy = { + '1': (State.OK, 'OK'), + '2': (State.CRIT, 'redundancy lost'), + } + return redundancy.get(st) + + sensors = {} + + for sensor in string_table[0]: + try: + state, redundancy, item = sensor + if item.startswith('PS '): + item = item.replace('PS ', '') + + state, state_readable = get_ps_state(state) + redundancy, redundancy_readable = get_ps_redundancy(redundancy) + + sensors.update({item: CiscoAsyncosPowersupply( + state=state, + state_readable=state_readable, + redundancy=redundancy, + redundancy_readable=redundancy_readable, + )}) + except (ValueError, IndexError): + pass + return sensors + + +# +# { +# '1': CiscoAsyncosPowersupply(redundancy=<State.OK: 0>, state=<State.OK: 0>, redundancy_readable='OK', state_readable='healthy'), +# '2': CiscoAsyncosPowersupply(redundancy=<State.OK: 0>, state=<State.OK: 0>, redundancy_readable='OK', state_readable='healthy') +# } +# + +def discovery_cisco_asyncos_power(section: Dict) -> DiscoveryResult: + for key in section.keys(): + yield Service(item=key) + + +def check_cisco_asyncos_power(item, section) -> CheckResult: + try: + sensor = section[item] + + yield Result(state=sensor.state, summary='Status: %s' % sensor.state_readable) + yield Result(state=sensor.redundancy, summary='Redundancy: %s' % sensor.redundancy_readable) + + except KeyError: + pass + + +register.snmp_section( + name='cisco_asyncos_power', + parse_function=parse_cisco_asyncos_power, + fetch=[ + SNMPTree( + base='.1.3.6.1.4.1.15497.1.1.1.8.1', # ASYNCOS-MAIL-MIB::powerSupplyEntry + oids=[ + '2', # powerSupplyStatus + '3', # powerSupplyRedundancy + '4', # powerSupplyName + ] + ), + ], + detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'), +) + +register.check_plugin( + name='cisco_asyncos_power', + service_name='Power Supply %s', + discovery_function=discovery_cisco_asyncos_power, + check_function=check_cisco_asyncos_power, + # check_default_parameters={}, +) diff --git a/agent_based/cisco_asyncos_temp.py b/agent_based/cisco_asyncos_temp.py index 2b26886..a8b4769 100644 --- a/agent_based/cisco_asyncos_temp.py +++ b/agent_based/cisco_asyncos_temp.py @@ -33,21 +33,14 @@ from .agent_based_api.v1.type_defs import ( from .agent_based_api.v1 import ( register, Service, - equals, - Result, check_levels, - State, SNMPTree, contains, - startswith, - all_of, - any_of, ) from .utils.temperature import ( check_temperature, TempParamType, - to_celsius, ) diff --git a/checks/cisco_asyncos.include b/checks/cisco_asyncos.include deleted file mode 100644 index dedc668..0000000 --- a/checks/cisco_asyncos.include +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/python -# -*- encoding: utf-8; py-indent-offset: 4 -*- -# -# Author: Th.L. -# Date: 10-02-2020 -# -# include for Cisco IronPort appliances -# -# 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. -# -# - -# -# find Cisco IronPort appliance by sysdescription -# -# OMD[cmk16x]:~/local/share/check_mk/checks$ snmpwalk -v2c -c public localhost sysDesc -# SNMPv2-MIB::sysDescr.0 = STRING: Cisco IronPort Model C380, AsyncOS Version: 12.5.1-037, Build Date: 2019-12-06, Serial #: E4AA5DAD515E-FCH1938V2J7 - -# OMD[cmk16x]:~/local/share/check_mk/checks$ snmpwalk -v2c -c public localhost sysDesc -# SNMPv2-MIB::sysDescr.0 = STRING: Cisco Model S370, AsyncOS Version: 9.0.1-162, Build Date: 2016-02-18, Serial #: 848F69E9A847-7QP2TW1 - -def scan_cisco_asyncos(oid): - if oid('.1.3.6.1.2.1.1.1.0').find('AsyncOS') != -1: - return True -# -# diff --git a/checks/cisco_asyncos_bandwidth b/checks/cisco_asyncos_bandwidth index a1ac94e..5829e7b 100644 --- a/checks/cisco_asyncos_bandwidth +++ b/checks/cisco_asyncos_bandwidth @@ -58,6 +58,7 @@ check_info['cisco_asyncos_bandwidth'] = { '3', # cacheBwidthTotal1hrMean '5', # cacheBwidthTotal1dayMean ]), - 'snmp_scan_function': scan_cisco_asyncos, - 'includes': ['cisco_asyncos.include'], + 'snmp_scan_function': lambda oid: oid('.1.3.6.1.2.1.1.1.0').find('AsyncOS') != -1, + # 'snmp_scan_function': scan_cisco_asyncos, + # 'includes': ['cisco_asyncos.include'], } diff --git a/checks/cisco_asyncos_cache b/checks/cisco_asyncos_cache index c376fe4..a52a3b9 100644 --- a/checks/cisco_asyncos_cache +++ b/checks/cisco_asyncos_cache @@ -63,6 +63,7 @@ check_info['cisco_asyncos_cache'] = { '8.1', # cacheMissRespTimeNow '9.1', # cacheTotalRespTimeNow ]), - 'snmp_scan_function': scan_cisco_asyncos, - 'includes': ['cisco_asyncos.include'], + 'snmp_scan_function': lambda oid: oid('.1.3.6.1.2.1.1.1.0').find('AsyncOS') != -1, + # 'snmp_scan_function': scan_cisco_asyncos, + # 'includes': ['cisco_asyncos.include'], } diff --git a/checks/cisco_asyncos_conn b/checks/cisco_asyncos_conn index 5404980..a66954b 100644 --- a/checks/cisco_asyncos_conn +++ b/checks/cisco_asyncos_conn @@ -58,6 +58,7 @@ check_info['cisco_asyncos_conn'] = { '8', # cacheClientTotalConns '9', # cacheClientMaxConns ]), - 'snmp_scan_function': scan_cisco_asyncos, - 'includes': ['cisco_asyncos.include'], + 'snmp_scan_function': lambda oid: oid('.1.3.6.1.2.1.1.1.0').find('AsyncOS') != -1, + # 'snmp_scan_function': scan_cisco_asyncos, + # 'includes': ['cisco_asyncos.include'], } diff --git a/checks/cisco_asyncos_dns b/checks/cisco_asyncos_dns index a98e20d..579959d 100644 --- a/checks/cisco_asyncos_dns +++ b/checks/cisco_asyncos_dns @@ -66,8 +66,8 @@ check_info['cisco_asyncos_dns'] = { '15', # outstandingDNSRequests '16', # pendingDNSRequests ]), + 'default_levels_variable': 'cisco_asyncos_dns_default_levels', 'snmp_scan_function': lambda oid: oid('.1.3.6.1.2.1.1.1.0').find('AsyncOS') != -1, # 'snmp_scan_function': scan_cisco_asyncos, # 'includes': ['cisco_asyncos.include'], - 'default_levels_variable': 'cisco_asyncos_dns_default_levels', } diff --git a/checks/cisco_asyncos_fan b/checks/cisco_asyncos_fan deleted file mode 100644 index 6c32919..0000000 --- a/checks/cisco_asyncos_fan +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/python -# -*- encoding: utf-8; py-indent-offset: 4 -*- -# -# Author: Th.L. -# Date: 10-02-2020 -# -# monitors status Cisco IronPort Appliances (ESA/SMA/WSA) fan sensors -# Tested with: C380, M380, C370, M670, S370 -# -# based on original Check_MK fan checks -# -# 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- -# tails. 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. -# -# OMD[cmk16x]:~$ snmpwalk -v2c -c C370-MAIL localhost -m ASYNCOS-MAIL-MIB -ObentU fanTable -# .1.3.6.1.4.1.15497.1.1.1.10.1.1.1 = INTEGER: 1 -# .1.3.6.1.4.1.15497.1.1.1.10.1.1.2 = INTEGER: 2 -# .1.3.6.1.4.1.15497.1.1.1.10.1.1.3 = INTEGER: 3 -# .1.3.6.1.4.1.15497.1.1.1.10.1.1.4 = INTEGER: 4 -# .1.3.6.1.4.1.15497.1.1.1.10.1.2.1 = Gauge32: 3600 -# .1.3.6.1.4.1.15497.1.1.1.10.1.2.2 = Gauge32: 3600 -# .1.3.6.1.4.1.15497.1.1.1.10.1.2.3 = Gauge32: 3600 -# .1.3.6.1.4.1.15497.1.1.1.10.1.2.4 = Gauge32: 3480 -# .1.3.6.1.4.1.15497.1.1.1.10.1.3.1 = STRING: FAN 1 -# .1.3.6.1.4.1.15497.1.1.1.10.1.3.2 = STRING: FAN 2 -# .1.3.6.1.4.1.15497.1.1.1.10.1.3.3 = STRING: FAN 3 -# .1.3.6.1.4.1.15497.1.1.1.10.1.3.4 = STRING: FAN 4 -# -# OMD[cmk16x]:~$ snmpwalk -v2c -c C370-MAIL localhost -m ASYNCOS-MAIL-MIB fanTable -# ASYNCOS-MAIL-MIB::fanIndex.1 = INTEGER: 1 -# ASYNCOS-MAIL-MIB::fanIndex.2 = INTEGER: 2 -# ASYNCOS-MAIL-MIB::fanIndex.3 = INTEGER: 3 -# ASYNCOS-MAIL-MIB::fanIndex.4 = INTEGER: 4 -# ASYNCOS-MAIL-MIB::fanRPMs.1 = Gauge32: 3600 -# ASYNCOS-MAIL-MIB::fanRPMs.2 = Gauge32: 3600 -# ASYNCOS-MAIL-MIB::fanRPMs.3 = Gauge32: 3600 -# ASYNCOS-MAIL-MIB::fanRPMs.4 = Gauge32: 3480 -# ASYNCOS-MAIL-MIB::fanName.1 = STRING: FAN 1 -# ASYNCOS-MAIL-MIB::fanName.2 = STRING: FAN 2 -# ASYNCOS-MAIL-MIB::fanName.3 = STRING: FAN 3 -# ASYNCOS-MAIL-MIB::fanName.4 = STRING: FAN 4 -# - - -factory_settings['cisco_asyncos_fan_default_levels'] = { - 'lower': (2000, 1000), - 'upper': (8000, 8400), - 'output_metrics': True, -} - - -def inventory_cisco_asyncos_fan(info): - if info: - for line in info: - fanRPM, fanName = line - if fanName.lower().startswith('fan '): - fanName = fanName[4:] - item = fanName - yield item, {} - - -def check_cisco_asyncos_fan(item, params, info): - if info: - for line in info: - fanRPM, fanName = line - if fanName.lower().startswith('fan '): - fanName = fanName[4:] - if fanName == item: - rpm = int(fanRPM) - yield check_fan(rpm, params) - - -check_info['cisco_asyncos_fan'] = { - 'inventory_function': inventory_cisco_asyncos_fan, - 'check_function': check_cisco_asyncos_fan, - 'group': 'hw_fans', - 'service_description': 'FAN %s', - 'has_perfdata': True, - 'snmp_info': ( - '.1.3.6.1.4.1.15497.1.1.1.10.1', # ASYNCOS-MAIL-MIB::fanEntry - [ - '2', # fanRPMs - '3', # fanName - ]), - 'default_levels_variable': 'cisco_asyncos_fan_default_levels', - 'snmp_scan_function': lambda oid: oid('.1.3.6.1.2.1.1.1.0').find('AsyncOS') != -1, - # 'snmp_scan_function': scan_cisco_asyncos, - # 'includes': ['cisco_asyncos.include', 'fan.include'], - # 'includes': ['fan.include'], -} diff --git a/checks/cisco_asyncos_license b/checks/cisco_asyncos_license index f950eb9..d46dacd 100644 --- a/checks/cisco_asyncos_license +++ b/checks/cisco_asyncos_license @@ -190,9 +190,9 @@ check_info['cisco_asyncos_license'] = { '3', # keyIsPerpetual '4', # keySecondsUntilExpire ]), + 'default_levels_variable': 'cisco_asyncos_license_default_levels', 'snmp_scan_function': lambda oid: oid('.1.3.6.1.2.1.1.1.0').find('AsyncOS') != -1, # 'snmp_scan_function': scan_cisco_asyncos, - # 'default_levels_variable': 'cisco_asyncos_license_default_levels', - 'includes': ['cisco_asyncos.include'], + # 'includes': ['cisco_asyncos.include'], } diff --git a/checks/cisco_asyncos_power b/checks/cisco_asyncos_power deleted file mode 100644 index fe9aa17..0000000 --- a/checks/cisco_asyncos_power +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/python -# -*- encoding: utf-8; py-indent-offset: 4 -*- -# -# Author: Th.L. -# Date: 10-02-2020 -# -# monitors status power supplies of Cisco IronPort Appliances (ESA/SMA/WSA) -# Tested with: C380, M380, C370, M670, S370 -# -# -# based on original Check_MK power supply checks (fireeye/dell) -# -# 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. -# -# OMD[cmk16x]:~$ snmpwalk -ObentU -v2c -c public localhost -m ASYNCOS-MAIL-MIB powerSupplyTable -# .1.3.6.1.4.1.15497.1.1.1.8.1.1.1 = INTEGER: 1 -# .1.3.6.1.4.1.15497.1.1.1.8.1.1.2 = INTEGER: 2 -# .1.3.6.1.4.1.15497.1.1.1.8.1.2.1 = INTEGER: 2 -# .1.3.6.1.4.1.15497.1.1.1.8.1.2.2 = INTEGER: 2 -# .1.3.6.1.4.1.15497.1.1.1.8.1.3.1 = INTEGER: 1 -# .1.3.6.1.4.1.15497.1.1.1.8.1.3.2 = INTEGER: 1 -# .1.3.6.1.4.1.15497.1.1.1.8.1.4.1 = STRING: PS 1 -# .1.3.6.1.4.1.15497.1.1.1.8.1.4.2 = STRING: PS 2 -# -# OMD[cmk16x]:~$ snmpwalk -v2c -c public localhost -m ASYNCOS-MAIL-MIB powerSupplyTable -# ASYNCOS-MAIL-MIB::powerSupplyIndex.1 = INTEGER: 1 -# ASYNCOS-MAIL-MIB::powerSupplyIndex.2 = INTEGER: 2 -# ASYNCOS-MAIL-MIB::powerSupplyStatus.1 = INTEGER: powerSupplyHealthy(2) -# ASYNCOS-MAIL-MIB::powerSupplyStatus.2 = INTEGER: powerSupplyHealthy(2) -# ASYNCOS-MAIL-MIB::powerSupplyRedundancy.1 = INTEGER: powerSupplyRedundancyOK(1) -# ASYNCOS-MAIL-MIB::powerSupplyRedundancy.2 = INTEGER: powerSupplyRedundancyOK(1) -# ASYNCOS-MAIL-MIB::powerSupplyName.1 = STRING: PS 1 -# ASYNCOS-MAIL-MIB::powerSupplyName.2 = STRING: PS 2 -# - - -def inventory_cisco_asyncos_power(info, has_item, has_params=False): - if info: - params = None - if has_params: - params = {} - for line in info: - if has_item: - status, redundancy, name = line - item = name - yield item, params - - -def check_cisco_asyncos_power_states(states): - # Now we only known the OK states and health states - # but we can expand if we know more - map_states = { - 'status': { - '1': (1, 'not installed'), - '2': (0, 'healthy'), - '3': (2, 'no AC'), - '4': (2, 'faulty'), - }, - 'redundancy': { - '1': (0, 'OK'), - '2': (2, 'redundancy lost'), - } - } - states_evaluated = {} - for what, text in states: - states_evaluated.setdefault(text, map_states[text.lower()].get(what.lower(), (2, 'not %s' % what.lower()))) - - return states_evaluated - - -def check_cisco_asyncos_power(item, _no_params, info): - for line in info: - status, redundancy, name = line - if item == name: - for text, (state, state_readable) in \ - check_cisco_asyncos_power_states([(status, 'Status'), (redundancy, 'redundancy')]).items(): - yield state, '%s: %s' % (text, state_readable) - - -check_info['cisco_asyncos_power'] = { - 'inventory_function': lambda info: inventory_cisco_asyncos_power(info, True), - 'check_function': check_cisco_asyncos_power, - 'service_description': 'Power Supply %s', - 'snmp_info': ( - '.1.3.6.1.4.1.15497.1.1.1.8.1', # ASYNCOS-MAIL-MIB::powerSupplyEntry - [ - '2', # powerSupplyStatus - '3', # powerSupplyRedundancy - '4', # powerSupplyName - ]), - 'snmp_scan_function': lambda oid: oid('.1.3.6.1.2.1.1.1.0').find('AsyncOS') != -1, - # 'snmp_scan_function': scan_cisco_asyncos, - # 'includes': ['cisco_asyncos.include'], -} \ No newline at end of file diff --git a/checks/cisco_asyncos_queue b/checks/cisco_asyncos_queue index 4330b2e..e4105d0 100644 --- a/checks/cisco_asyncos_queue +++ b/checks/cisco_asyncos_queue @@ -78,8 +78,8 @@ check_info['cisco_asyncos_queue'] = { '11' # workQueueMessages ] ), - 'snmp_scan_function': lambda oid: oid('.1.3.6.1.2.1.1.1.0').find('AsyncOS') != -1, 'default_levels_variable': 'cisco_asyncos_queue_default_levels', + 'snmp_scan_function': lambda oid: oid('.1.3.6.1.2.1.1.1.0').find('AsyncOS') != -1, # 'snmp_scan_function': scan_cisco_asyncos, # 'includes': ['cisco_asyncos.include'], } diff --git a/checks/cisco_asyncos_raid b/checks/cisco_asyncos_raid index ef9e921..1aed36d 100644 --- a/checks/cisco_asyncos_raid +++ b/checks/cisco_asyncos_raid @@ -8,18 +8,6 @@ # Tested with: C380, M380, C370, M670, S370 # # -# based on original Check_MK power supply checks (fireeye/dell) -# -# 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. # # OMD[cmk16x]:~$ snmpwalk -v2c -c C370-MAIL localhost -m ASYNCOS-MAIL-MIB -ObentU raidTable # .1.3.6.1.4.1.15497.1.1.1.18.1.1.1 = INTEGER: 1 diff --git a/cisco_asyncos.mkp b/cisco_asyncos.mkp index 0587cbb03450684d01757b1a334ebf94537a97dd..7ffc3e968140298a7b31323b262f25092a18aae7 100644 GIT binary patch literal 11776 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 Q9st1#@Gd8VwSj~E557=#?f?J) literal 11862 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 EKR@7nmjD0& diff --git a/packages/cisco_asyncos b/packages/cisco_asyncos index ceae4b3..7d32dda 100644 --- a/packages/cisco_asyncos +++ b/packages/cisco_asyncos @@ -23,17 +23,16 @@ 'download_url': 'https://thl-cmk.hopto.org', 'files': {'agent_based': ['cisco_asyncos_cpu.py', 'cisco_asyncos_mem.py', - 'cisco_asyncos_temp.py'], + 'cisco_asyncos_temp.py', + 'cisco_asyncos_fan.py', + 'cisco_asyncos_power.py'], 'checks': ['cisco_asyncos_bandwidth', 'cisco_asyncos_cache', 'cisco_asyncos_conn', - 'cisco_asyncos_fan', 'cisco_asyncos_license', - 'cisco_asyncos_power', 'cisco_asyncos_queue', 'cisco_asyncos_raid', 'cisco_asyncos_update', - 'cisco_asyncos.include', 'cisco_asyncos_dns', 'cisco_asyncos_messageage', 'cisco_asyncos_resources'], @@ -42,7 +41,7 @@ 'plugins/wato/cisco_asyncos_update.py', 'plugins/metrics/cisco_asyncos.py']}, 'name': 'cisco_asyncos', - 'num_files': 20, + 'num_files': 19, 'title': 'Cisco AsyncOS (IronPort) checks', 'version': '20200514_v0.1.4', 'version.min_required': '2.0.0', -- GitLab