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