From 96ec9cf345280486ab585ddc31c80fbd62476b83 Mon Sep 17 00:00:00 2001
From: "Th.L" <thl-cmk@outlook.com>
Date: Sun, 21 Mar 2021 22:43:49 +0100
Subject: [PATCH] update project

---
 agent_based/cisco_asyncos_cpu.py  |  82 +++++++++++++++++++++++
 agent_based/cisco_asyncos_mem.py  |  95 ++++++++++++++++++++++++++
 agent_based/cisco_asyncos_temp.py | 107 ++++++++++++++++++++++++++++++
 checks/cisco_asyncos_cpu          |  58 ----------------
 checks/cisco_asyncos_dns          |   5 +-
 checks/cisco_asyncos_fan          |   6 +-
 checks/cisco_asyncos_license      |   5 +-
 checks/cisco_asyncos_mem          |  83 -----------------------
 checks/cisco_asyncos_messageage   |   5 +-
 checks/cisco_asyncos_power        |   5 +-
 checks/cisco_asyncos_queue        |   5 +-
 checks/cisco_asyncos_raid         |   5 +-
 checks/cisco_asyncos_resources    |   5 +-
 checks/cisco_asyncos_temp         |  75 ---------------------
 checks/cisco_asyncos_update       |   5 +-
 cisco_asyncos.mkp                 | Bin 11328 -> 11862 bytes
 packages/cisco_asyncos            |  39 ++++++++---
 17 files changed, 342 insertions(+), 243 deletions(-)
 create mode 100644 agent_based/cisco_asyncos_cpu.py
 create mode 100644 agent_based/cisco_asyncos_mem.py
 create mode 100644 agent_based/cisco_asyncos_temp.py
 delete mode 100644 checks/cisco_asyncos_cpu
 delete mode 100644 checks/cisco_asyncos_mem
 delete mode 100644 checks/cisco_asyncos_temp

diff --git a/agent_based/cisco_asyncos_cpu.py b/agent_based/cisco_asyncos_cpu.py
new file mode 100644
index 0000000..1ad56b1
--- /dev/null
+++ b/agent_based/cisco_asyncos_cpu.py
@@ -0,0 +1,82 @@
+#!/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  : 2021-03-21
+
+from typing import Mapping, Dict, List, Tuple, NamedTuple
+
+from .agent_based_api.v1.type_defs import (
+    DiscoveryResult,
+    CheckResult,
+    StringTable,
+)
+
+from .agent_based_api.v1 import (
+    register,
+    Service,
+    equals,
+    Result,
+    check_levels,
+    State,
+    SNMPTree,
+    contains,
+    startswith,
+    all_of,
+    any_of,
+)
+
+
+#
+# sample string_table
+# [[['41']]]
+#
+def parse_cisco_asyncos_cpu(string_table: List[StringTable]) -> int:
+    try:
+        return int(string_table[0][0][0])
+    except KeyError:
+        pass
+
+
+def discovery_cisco_asyncos_cpu(section: int) -> DiscoveryResult:
+    yield Service()
+
+
+def check_cisco_asyncos_cpu(params, section: int) -> CheckResult:
+    def render_percent(value) -> str:
+        return '%s%%' % value
+
+    yield from check_levels(
+        section,
+        label='CPU utilization in the last minute',
+        levels_upper=params.get('util', None),
+        metric_name='util',  # if params.get('output_metrics') else None,
+        render_func=render_percent,
+    )
+
+
+register.snmp_section(
+    name='cisco_asyncos_cpu',
+    parse_function=parse_cisco_asyncos_cpu,
+    fetch=[
+        SNMPTree(
+            base='.1.3.6.1.4.1.15497.1.1.1',
+            oids=[
+                '2'  # ASYNCOS-MAIL-MIB::perCentCPUUtilization
+            ]
+        ),
+    ],
+    detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
+)
+
+register.check_plugin(
+    name='cisco_asyncos_cpu',
+    service_name='CPU Utilization 1 min',
+    discovery_function=discovery_cisco_asyncos_cpu,
+    check_function=check_cisco_asyncos_cpu,
+    check_default_parameters={},
+    check_ruleset_name='cpu_utilization'
+)
diff --git a/agent_based/cisco_asyncos_mem.py b/agent_based/cisco_asyncos_mem.py
new file mode 100644
index 0000000..b4ddf23
--- /dev/null
+++ b/agent_based/cisco_asyncos_mem.py
@@ -0,0 +1,95 @@
+#!/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  : 2021-03-21
+#
+# .1.3.6.1.4.1.15497.1.1.1.1.0 = INTEGER: 0
+# .1.3.6.1.4.1.15497.1.1.1.7.0 = INTEGER: 1
+#
+# ASYNCOS-MAIL-MIB::perCentMemoryUtilization.0 = INTEGER: 0
+# ASYNCOS-MAIL-MIB::memoryAvailabilityStatus.0 = INTEGER: memoryAvailable(1)
+#
+# sample info
+# [[u'0', u'1']]
+#
+
+from typing import Mapping, Dict, List, Tuple, NamedTuple
+
+from .agent_based_api.v1.type_defs import (
+    DiscoveryResult,
+    CheckResult,
+    StringTable,
+)
+
+from .agent_based_api.v1 import (
+    register,
+    Service,
+    equals,
+    Result,
+    check_levels,
+    State,
+    SNMPTree,
+    contains,
+    startswith,
+    all_of,
+    any_of,
+)
+
+
+# factory_settings['cisco_asyncos_mem_default_levels'] = {
+#         'levels':(80.0, 90.0),
+#     }
+
+#
+# [[['48']]
+#
+def parse_cisco_asyncos_mem(string_table: List[StringTable]) -> int:
+    try:
+        return int(string_table[0][0][0])
+    except KeyError:
+        pass
+
+
+def discovery_cisco_asyncos_mem(section: int) -> DiscoveryResult:
+    yield Service()
+
+
+def check_cisco_asyncos_mem(params, section: int) -> CheckResult:
+    def render_percent(value) -> str:
+        return '%s%%' % value
+
+    yield from check_levels(
+        section,
+        label='Memory utilization',
+        levels_upper=params.get('util', None),
+        metric_name='util',  # if params.get('output_metrics') else None,
+        render_func=render_percent,
+    )
+
+
+register.snmp_section(
+    name='cisco_asyncos_mem',
+    parse_function=parse_cisco_asyncos_mem,
+    fetch=[
+        SNMPTree(
+            base='.1.3.6.1.4.1.15497.1.1.1',
+            oids=[
+                '1',  # perCentMemoryUtilization
+            ]
+        ),
+    ],
+    detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
+)
+
+register.check_plugin(
+    name='cisco_asyncos_mem',
+    service_name='Memory utilization',
+    discovery_function=discovery_cisco_asyncos_mem,
+    check_function=check_cisco_asyncos_mem,
+    check_default_parameters={},
+    check_ruleset_name='memory'
+)
diff --git a/agent_based/cisco_asyncos_temp.py b/agent_based/cisco_asyncos_temp.py
new file mode 100644
index 0000000..2b26886
--- /dev/null
+++ b/agent_based/cisco_asyncos_temp.py
@@ -0,0 +1,107 @@
+#!/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) temperature 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.9.1.1.1 = INTEGER: 1
+# .1.3.6.1.4.1.15497.1.1.1.9.1.2.1 = INTEGER: 22
+# .1.3.6.1.4.1.15497.1.1.1.9.1.3.1 = STRING: Ambient
+#
+# ASYNCOS-MAIL-MIB::temperatureIndex.1 = INTEGER: 1
+# ASYNCOS-MAIL-MIB::degreesCelsius.1 = INTEGER: 22
+# ASYNCOS-MAIL-MIB::temperatureName.1 = STRING: Ambient
+#
+
+from typing import Mapping, Dict, List, Tuple, NamedTuple
+
+from .agent_based_api.v1.type_defs import (
+    DiscoveryResult,
+    CheckResult,
+    StringTable,
+)
+
+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,
+)
+
+
+#
+# [[['22', 'FP_TEMP_SENSOR']]]
+#
+def parse_cisco_asyncos_temp(string_table: List[StringTable]) -> dict:
+    sensors = {}
+    for sensor in string_table[0]:
+        try:
+            value, item = sensor
+            item = item.replace('_', ' ')
+            sensors.update({item: int(value)})
+        except (ValueError, IndexError):
+            pass
+    return sensors
+
+
+def discovery_cisco_asyncos_temp(section: Dict) -> DiscoveryResult:
+    for key in section.keys():
+        yield Service(item=key)
+
+
+def check_cisco_asyncos_temp(item, params: TempParamType, section) -> CheckResult:
+    try:
+        yield from check_temperature(
+            section[item],
+            params=params,
+            unique_name='check_cisco_asyncos_temp.%s' % item,
+        )
+    except KeyError:
+        pass
+
+
+register.snmp_section(
+    name='cisco_asyncos_temp',
+    parse_function=parse_cisco_asyncos_temp,
+    fetch=[
+        SNMPTree(
+            base='.1.3.6.1.4.1.15497.1.1.1.9.1',  # ASYNCOS-MAIL-MIB::temperatureEntry
+            oids=[
+                '2',  # degreesCelsius
+                '3',  # temperatureName
+            ]
+        ),
+    ],
+    detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
+)
+
+register.check_plugin(
+    name='cisco_asyncos_temp',
+    service_name='Temperature %s',
+    discovery_function=discovery_cisco_asyncos_temp,
+    check_function=check_cisco_asyncos_temp,
+    check_default_parameters={},
+    check_ruleset_name='temperature'
+)
diff --git a/checks/cisco_asyncos_cpu b/checks/cisco_asyncos_cpu
deleted file mode 100644
index 1beb308..0000000
--- a/checks/cisco_asyncos_cpu
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/python
-# -*- encoding: utf-8; py-indent-offset: 4 -*-
-# +------------------------------------------------------------------+
-# |             ____ _               _        __  __ _  __           |
-# |            / ___| |__   ___  ___| | __   |  \/  | |/ /           |
-# |           | |   | '_ \ / _ \/ __| |/ /   | |\/| | ' /            |
-# |           | |___| | | |  __/ (__|   <    | |  | | . \            |
-# |            \____|_| |_|\___|\___|_|\_\___|_|  |_|_|\_\           |
-# |                                                                  |
-# | Copyright Mathias Kettner 2013             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.
-
-
-cisco_asyncos_cpu_default_levels = (80.0, 90.0)
-
-
-def inventory_cisco_asyncos_cpu(info):
-    if len(info) > 0:
-        return [(None, 'cisco_asyncos_cpu_default_levels')]
-
-
-def check_cisco_asyncos_cpu(_no_item, params, info):
-    warn, crit = params
-    util = float(info[0][0])
-    perfdata=[('util', util, warn, crit, 0, 100)]
-    infotext = '%2.1f%% utilization in the last minute' % util
-    if util >= crit:
-        return 2, infotext + ' (critical at %d%%)' % crit, perfdata
-    elif util >= warn:
-        return 1, infotext + ' (warning at %d%%)' % warn, perfdata
-    else:
-        return 0, infotext, perfdata
-
-
-check_info['cisco_asyncos_cpu'] = {
-    'check_function':          check_cisco_asyncos_cpu,
-    'inventory_function':      inventory_cisco_asyncos_cpu,
-    'service_description':     'CPU Utilization',
-    'has_perfdata':            True,
-    'group':                   'cpu_utilization',
-    'snmp_info':               ('.1.3.6.1.4.1.15497.1.1.1', ['2']),  # ASYNCOS-MAIL-MIB::perCentCPUUtilization
-    'snmp_scan_function': scan_cisco_asyncos,
-    'includes': ['cisco_asyncos.include'],
-}
diff --git a/checks/cisco_asyncos_dns b/checks/cisco_asyncos_dns
index 4d65116..a98e20d 100644
--- a/checks/cisco_asyncos_dns
+++ b/checks/cisco_asyncos_dns
@@ -66,7 +66,8 @@ check_info['cisco_asyncos_dns'] = {
             '15',  # outstandingDNSRequests
             '16',  # pendingDNSRequests
         ]),
-    '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'],
     'default_levels_variable': 'cisco_asyncos_dns_default_levels',
 }
diff --git a/checks/cisco_asyncos_fan b/checks/cisco_asyncos_fan
index 7109cc5..6c32919 100644
--- a/checks/cisco_asyncos_fan
+++ b/checks/cisco_asyncos_fan
@@ -90,7 +90,9 @@ check_info['cisco_asyncos_fan'] = {
             '2',  # fanRPMs
             '3',  # fanName
         ]),
-    'snmp_scan_function': scan_cisco_asyncos,
-    'includes': ['cisco_asyncos.include', 'fan.include'],
     '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 789ddd0..f950eb9 100644
--- a/checks/cisco_asyncos_license
+++ b/checks/cisco_asyncos_license
@@ -190,8 +190,9 @@ check_info['cisco_asyncos_license'] = {
                                  '3',  # keyIsPerpetual
                                  '4',  # keySecondsUntilExpire
                                  ]),
-    'snmp_scan_function': scan_cisco_asyncos,
-    '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'],
 }
 
diff --git a/checks/cisco_asyncos_mem b/checks/cisco_asyncos_mem
deleted file mode 100644
index 7efdd67..0000000
--- a/checks/cisco_asyncos_mem
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/usr/bin/python
-# -*- encoding: utf-8; py-indent-offset: 4 -*-
-#
-# original check by Andreas Doehler, rewritten by thl-cmk[at]outlook.com
-# date: 09.03.2020
-#
-# added oid for memoryAvailabilityStatus, added mitrics (Graph, Perf-O-Meter)
-#
-#
-# 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.
-#
-# .1.3.6.1.4.1.15497.1.1.1.1.0 = INTEGER: 0
-# .1.3.6.1.4.1.15497.1.1.1.7.0 = INTEGER: 1
-#
-# ASYNCOS-MAIL-MIB::perCentMemoryUtilization.0 = INTEGER: 0
-# ASYNCOS-MAIL-MIB::memoryAvailabilityStatus.0 = INTEGER: memoryAvailable(1)
-#
-# sample info
-# [[u'0', u'1']]
-#
-
-
-factory_settings['cisco_asyncos_mem_default_levels'] = {
-        'levels':(80.0, 90.0),
-    }
-
-
-def inventory_cisco_asyncos_mem(info):
-    if len(info) > 0:
-        return [(None, None)]
-
-
-def check_cisco_asyncos_mem(_no_item, params, info):
-    if 'levels' in params:
-        warn, crit = params['levels']
-    else:
-        warn, crit = params
-
-    perc_used, memoryStatus = info[0]
-    perc_used = float(perc_used)
-
-    perfdata=[('mem_used', perc_used, warn, crit, 0, 100)]
-    infotext = '%2.1f%% Memory usage' % perc_used
-    if perc_used >= crit:
-        yield 2, infotext + ' (critical at %d%%)' % crit, perfdata
-    elif perc_used >= warn:
-        yield 1, infotext + ' (warning at %d%%)' % warn, perfdata
-    else:
-        yield 0, infotext, perfdata
-
-    if memoryStatus.isdigit():
-        memoryStatus = int(memoryStatus)
-        if memoryStatus == 1:
-            yield 0, 'Memory: available'
-        elif memoryStatus == 2:
-            yield 2, 'Memory: shortage'
-        elif memoryStatus == 3:
-            yield 1, 'Memory: full'
-
-
-check_info['cisco_asyncos_mem'] = {
-    'check_function':          check_cisco_asyncos_mem,
-    'inventory_function':      inventory_cisco_asyncos_mem,
-    'service_description':     'Memory Usage',
-    'has_perfdata':            True,
-    'group':                   'memory',
-    'snmp_info':               ('.1.3.6.1.4.1.15497.1.1.1', [  # ASYNCOS-MAIL-MIB
-        '1',  # perCentMemoryUtilization
-        '7',  # memoryAvailabilityStatus
-    ]),
-    'snmp_scan_function': scan_cisco_asyncos,
-    'includes': ['cisco_asyncos.include'],
-    'default_levels_variable': 'cisco_asyncos_mem_default_levels',
-}
\ No newline at end of file
diff --git a/checks/cisco_asyncos_messageage b/checks/cisco_asyncos_messageage
index c2b3fc5..b1e3ee5 100644
--- a/checks/cisco_asyncos_messageage
+++ b/checks/cisco_asyncos_messageage
@@ -71,7 +71,8 @@ check_info['cisco_asyncos_messageage'] = {
         [
             '14',  # oldestMessageAge
         ]),
-    'snmp_scan_function': scan_cisco_asyncos,
-    'includes': ['cisco_asyncos.include'],
     'default_levels_variable': 'cisco_asyncos_messageage_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_power b/checks/cisco_asyncos_power
index b89ad00..fe9aa17 100644
--- a/checks/cisco_asyncos_power
+++ b/checks/cisco_asyncos_power
@@ -97,6 +97,7 @@ check_info['cisco_asyncos_power'] = {
             '3',  # powerSupplyRedundancy
             '4',  # powerSupplyName
         ]),
-    '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'],
 }
\ No newline at end of file
diff --git a/checks/cisco_asyncos_queue b/checks/cisco_asyncos_queue
index 582e574..4330b2e 100644
--- a/checks/cisco_asyncos_queue
+++ b/checks/cisco_asyncos_queue
@@ -78,8 +78,9 @@ check_info['cisco_asyncos_queue'] = {
                                 '11'  # workQueueMessages
                                 ]
                                 ),
-    '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,
     'default_levels_variable': 'cisco_asyncos_queue_default_levels',
+    # 'snmp_scan_function': scan_cisco_asyncos,
+    # 'includes': ['cisco_asyncos.include'],
 }
 
diff --git a/checks/cisco_asyncos_raid b/checks/cisco_asyncos_raid
index 12bd831..ef9e921 100644
--- a/checks/cisco_asyncos_raid
+++ b/checks/cisco_asyncos_raid
@@ -93,6 +93,7 @@ check_info['cisco_asyncos_raid'] = {
             '3',  # raidID
             '4',  # raidLastError
         ]),
-    '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'],
 }
\ No newline at end of file
diff --git a/checks/cisco_asyncos_resources b/checks/cisco_asyncos_resources
index 2915a74..761a5bb 100644
--- a/checks/cisco_asyncos_resources
+++ b/checks/cisco_asyncos_resources
@@ -57,6 +57,7 @@ check_info['cisco_asyncos_resources'] = {
         [
             '6',  # resourceConservationReason
         ]),
-    '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_temp b/checks/cisco_asyncos_temp
deleted file mode 100644
index ac21c20..0000000
--- a/checks/cisco_asyncos_temp
+++ /dev/null
@@ -1,75 +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) temperature sensors
-# Tested with: C380, M380, C370, M670, S370
-#
-#
-# based on original Check_MK temp checks (fireeye)
-#
-# 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]:~/local/share/check_mk/checks$ snmpwalk  -v2c -c C370-MAIL localhost -ObentU -m ASYNCOS-MAIL-MIB temperatureTable
-# .1.3.6.1.4.1.15497.1.1.1.9.1.1.1 = INTEGER: 1
-# .1.3.6.1.4.1.15497.1.1.1.9.1.2.1 = INTEGER: 22
-# .1.3.6.1.4.1.15497.1.1.1.9.1.3.1 = STRING: Ambient
-#
-# OMD[cmk16x]:~/local/share/check_mk/checks$ snmpwalk  -v2c -c C370-MAIL localhost -m ASYNCOS-MAIL-MIB temperatureTable
-# ASYNCOS-MAIL-MIB::temperatureIndex.1 = INTEGER: 1
-# ASYNCOS-MAIL-MIB::degreesCelsius.1 = INTEGER: 22
-# ASYNCOS-MAIL-MIB::temperatureName.1 = STRING: Ambient
-#
-
-factory_settings['cisco_asyncos_temp_default_levels'] = {'levels_lower': (0.0, -10.0),
-                                                    'levels': (60, 80),
-                                                    'output_unit': 'c',
-                                                    'device_levels_handling': 'usr',
-                                                    }
-
-def inventory_cisco_asyncos_temp(info):
-    if info:
-        for line in info:
-            celsius, name = line
-            item = name
-            yield item, {}
-
-
-def check_cisco_asyncos_temp(item, params, info):
-    if info:
-        for line in info:
-            reading_str, name = line
-            if item == name:
-                yield check_temperature(float(reading_str),
-                                        params,
-                                        'cisco_asyncos_temp_%s' % name,
-                                        )
-
-
-check_info['cisco_asyncos_temp'] = {
-    'inventory_function': inventory_cisco_asyncos_temp,
-    'check_function': check_cisco_asyncos_temp,
-    'service_description': 'Temperature %s',
-    'has_perfdata': True,
-    'snmp_info': (
-        '.1.3.6.1.4.1.15497.1.1.1.9.1',  # ASYNCOS-MAIL-MIB::temperatureEntry
-        [
-            '2',  # degreesCelsius
-            '3',  # temperatureName
-        ]),
-    'snmp_scan_function': scan_cisco_asyncos,
-    'group': 'temperature',
-    'default_levels_variable': 'cisco_asyncos_temp_default_levels',
-    'includes': ['temperature.include', 'cisco_asyncos.include'],
-}
diff --git a/checks/cisco_asyncos_update b/checks/cisco_asyncos_update
index 5c597db..333795a 100644
--- a/checks/cisco_asyncos_update
+++ b/checks/cisco_asyncos_update
@@ -251,8 +251,9 @@ check_info['cisco_asyncos_update'] = {
                                 '3',  # updates --> The number of successful attempts that have occurred when updating a service
                                 '4',  # updateFailures --> "The number of failed attempts that have occurred when updating a service
                                 ]),
-    'snmp_scan_function': scan_cisco_asyncos,
     'default_levels_variable': 'cisco_asyncos_update_default_levels',
-    '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/cisco_asyncos.mkp b/cisco_asyncos.mkp
index 75863cc0dbe251e94846b745d23683252e7f5917..0587cbb03450684d01757b1a334ebf94537a97dd 100644
GIT binary patch
literal 11862
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
EKR@7nmjD0&

literal 11328
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
Y;s0r+{~rYiiy&B}m&azXPH?dQ1D(-gVE_OC

diff --git a/packages/cisco_asyncos b/packages/cisco_asyncos
index c62480e..ceae4b3 100644
--- a/packages/cisco_asyncos
+++ b/packages/cisco_asyncos
@@ -1,17 +1,37 @@
-{'author': u'Th.L. (thl-cmk[at]outlook[dot]com)',
- 'description': u'Cisco AsyncOS (IronPort) checks\n\n- fixed inventory function\n- changed scan function, to look for "AsyncOS"\n- cisco_asyncos_queue: added wato\n\n- cisco_asyncos_fan, cisco_asyncos_power, cisco_asyncos_raid, cisco_asyncos_license, cisco_asyncos_update and cisco_asyncos_temp rewriten by Th.L. all other checks by A.Doehler\n\n- cisco_asyncos_fan uses fan.include\n- cisco_asyncos_temp  uses temperature.include\n\n- 2020-03-08: added cisco_asyncos_dns, cisco_asyncos_resources, cisco_asyncos_messageage\n- 2020-05-14: added wato option to cisco_asyncos_update to ignore features\n',
+{'author': 'Th.L. (thl-cmk[at]outlook[dot]com)',
+ 'description': 'Cisco AsyncOS (IronPort) checks\n'
+                '\n'
+                '- fixed inventory function\n'
+                '- changed scan function, to look for "AsyncOS"\n'
+                '- cisco_asyncos_queue: added wato\n'
+                '\n'
+                '- cisco_asyncos_fan, cisco_asyncos_power, cisco_asyncos_raid, '
+                'cisco_asyncos_license, cisco_asyncos_update and '
+                'cisco_asyncos_temp rewriten by Th.L. all other checks by '
+                'A.Doehler\n'
+                '\n'
+                '- cisco_asyncos_fan uses fan.include\n'
+                '- cisco_asyncos_temp  uses temperature.include\n'
+                '\n'
+                '- 2020-03-08: added cisco_asyncos_dns, '
+                'cisco_asyncos_resources, cisco_asyncos_messageage\n'
+                '- 2020-05-14: added wato option to cisco_asyncos_update to '
+                'ignore features\n'
+                '\n'
+                '- 2021-03-21: rewrite cisco_asyncos_cpu, cisco_asyncos_mem, '
+                'cisco_asyncos_temp for CMK 2.0\n',
  'download_url': 'https://thl-cmk.hopto.org',
- 'files': {'checks': ['cisco_asyncos_bandwidth',
+ 'files': {'agent_based': ['cisco_asyncos_cpu.py',
+                           'cisco_asyncos_mem.py',
+                           'cisco_asyncos_temp.py'],
+           'checks': ['cisco_asyncos_bandwidth',
                       'cisco_asyncos_cache',
                       'cisco_asyncos_conn',
-                      'cisco_asyncos_cpu',
                       'cisco_asyncos_fan',
                       'cisco_asyncos_license',
-                      'cisco_asyncos_mem',
                       'cisco_asyncos_power',
                       'cisco_asyncos_queue',
                       'cisco_asyncos_raid',
-                      'cisco_asyncos_temp',
                       'cisco_asyncos_update',
                       'cisco_asyncos.include',
                       'cisco_asyncos_dns',
@@ -23,7 +43,8 @@
                    'plugins/metrics/cisco_asyncos.py']},
  'name': 'cisco_asyncos',
  'num_files': 20,
- 'title': u'Cisco AsyncOS (IronPort) checks',
+ 'title': 'Cisco AsyncOS (IronPort) checks',
  'version': '20200514_v0.1.4',
- 'version.min_required': '1.6.0p6',
- 'version.packaged': '1.6.0p8'}
\ No newline at end of file
+ 'version.min_required': '2.0.0',
+ 'version.packaged': '2.0.0p1',
+ 'version.usable_until': None}
\ No newline at end of file
-- 
GitLab