From 7bc78a44ddedacda2bbbf853d4e83d0de70db809 Mon Sep 17 00:00:00 2001
From: "Th.L" <thl-cmk@outlook.com>
Date: Wed, 24 Mar 2021 21:51:05 +0100
Subject: [PATCH] update project

---
 agent_based/cisco_asyncos_bandwidth.py |  87 +++++++++++++++++++++++
 agent_based/cisco_asyncos_cache.py     |  92 +++++++++++++++++++++++++
 checks/cisco_asyncos_bandwidth         |  64 -----------------
 checks/cisco_asyncos_cache             |  69 -------------------
 cisco_asyncos.mkp                      | Bin 11910 -> 12111 bytes
 packages/cisco_asyncos                 |  11 +--
 web/plugins/metrics/cisco_asyncos.py   |  32 ++++-----
 7 files changed, 201 insertions(+), 154 deletions(-)
 create mode 100644 agent_based/cisco_asyncos_bandwidth.py
 create mode 100644 agent_based/cisco_asyncos_cache.py
 delete mode 100644 checks/cisco_asyncos_bandwidth
 delete mode 100644 checks/cisco_asyncos_cache

diff --git a/agent_based/cisco_asyncos_bandwidth.py b/agent_based/cisco_asyncos_bandwidth.py
new file mode 100644
index 0000000..99483a0
--- /dev/null
+++ b/agent_based/cisco_asyncos_bandwidth.py
@@ -0,0 +1,87 @@
+#!/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-24
+#
+# only use full for Cisco WSA appliances
+#
+
+from typing import Mapping, List, NamedTuple
+
+from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
+    DiscoveryResult,
+    CheckResult,
+    StringTable,
+)
+
+from cmk.base.plugins.agent_based.agent_based_api.v1 import (
+    register,
+    Service,
+    check_levels,
+    Result,
+    SNMPTree,
+    contains,
+    State,
+)
+
+
+class CiscoAsyncosBandwidth(NamedTuple):
+    bandwidth_now: int
+    bandwidth_hour: int
+    bandwidth_day: int
+
+
+# [[['0', '0', '247']]]
+def parse_cisco_asyncos_bandwidth(string_table: List[StringTable]) -> CiscoAsyncosBandwidth:
+    return CiscoAsyncosBandwidth(
+        bandwidth_now=int(string_table[0][0][0]),
+        bandwidth_hour=int(string_table[0][0][1]),
+        bandwidth_day = int(string_table[0][0][2]),
+    )
+
+
+def discovery_cisco_asyncos_bandwidth(section: CiscoAsyncosBandwidth) -> DiscoveryResult:
+    yield Service()
+
+
+def check_cisco_asyncos_bandwidth(params, section: CiscoAsyncosBandwidth) -> CheckResult:
+    yield from check_levels(
+        section.bandwidth_now,
+        label='Current bandwidth',
+        levels_upper=params.get('upper', None),
+        levels_lower=params.get('lower', None),
+        metric_name='bandwith_now',
+        # render_func=
+    )
+
+    yield Result(state=State.OK,
+                 summary='last hour: %s, last day: %s' % (section.bandwidth_hour, section.bandwidth_day))
+
+
+register.snmp_section(
+    name='cisco_asyncos_bandwidth',
+    parse_function=parse_cisco_asyncos_bandwidth,
+    fetch=[
+        SNMPTree(
+            base='.1.3.6.1.4.1.15497.1.2.3.7.4',  # ASYNCOSWEBSECURITYAPPLIANCE-MIB::proxyRecentBandWTotPerf
+            oids=[
+                '1',  # cacheBwidthTotalNow
+                '3',  # cacheBwidthTotal1hrMean
+                '5',  # cacheBwidthTotal1dayMean
+            ]
+        ),
+    ],
+    detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
+)
+
+register.check_plugin(
+    name='cisco_asyncos_bandwidth',
+    service_name='Bandwidth',
+    discovery_function=discovery_cisco_asyncos_bandwidth,
+    check_function=check_cisco_asyncos_bandwidth,
+    check_default_parameters={},
+)
diff --git a/agent_based/cisco_asyncos_cache.py b/agent_based/cisco_asyncos_cache.py
new file mode 100644
index 0000000..dda48c6
--- /dev/null
+++ b/agent_based/cisco_asyncos_cache.py
@@ -0,0 +1,92 @@
+#!/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-24
+#
+# only use full for Cisco WSA appliances
+#
+
+from typing import Mapping, List, NamedTuple
+
+from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
+    DiscoveryResult,
+    CheckResult,
+    StringTable,
+)
+
+from cmk.base.plugins.agent_based.agent_based_api.v1 import (
+    register,
+    Service,
+    check_levels,
+    Result,
+    Metric,
+    SNMPTree,
+    contains,
+    State,
+)
+
+
+class CiscoAsyncosCache(NamedTuple):
+    cache_hits_now: int
+    cache_misses_now: int
+    cache_hit_resptime_now: int
+    cache_miss_resptime_now: int
+    cache_total_resptime: int
+
+
+# [[['0', '0', '0', '0', '0']]]
+def parse_cisco_asyncos_cache(string_table: List[StringTable]) -> CiscoAsyncosCache:
+    return CiscoAsyncosCache(
+        cache_hits_now=int(string_table[0][0][0]),
+        cache_misses_now=int(string_table[0][0][1]),
+        cache_hit_resptime_now=int(string_table[0][0][2]),
+        cache_miss_resptime_now=int(string_table[0][0][3]),
+        cache_total_resptime=int(string_table[0][0][4]),
+    )
+
+
+def discovery_cisco_asyncos_cache(section: CiscoAsyncosCache) -> DiscoveryResult:
+    yield Service()
+
+
+def check_cisco_asyncos_cache(params, section: CiscoAsyncosCache) -> CheckResult:
+    yield Result(state=State.OK,
+                 summary='Cache Stats current %s Hits (%sms response time), %s Misses (%sms response time) and %sms total response time' % (
+                 section.cache_hits_now, section.cache_hit_resptime_now, section.cache_misses_now,
+                 section.cache_miss_resptime_now, section.cache_total_resptime))
+
+    yield Metric(name='cache_hits_now', value=section.cache_hits_now)
+    yield Metric(name='cache_misses_now', value=section.cache_misses_now)
+    yield Metric(name='cache_hit_resptime_now', value=section.cache_hit_resptime_now)
+    yield Metric(name='cache_miss_resptime_now', value=section.cache_miss_resptime_now)
+    yield Metric(name='cache_total_resptime', value=section.cache_total_resptime)
+
+register.snmp_section(
+    name='cisco_asyncos_cache',
+    parse_function=parse_cisco_asyncos_cache,
+    fetch=[
+        SNMPTree(
+            base='.1.3.6.1.4.1.15497.1.2.3.7',  # ASYNCOSWEBSECURITYAPPLIANCE-MIB::proxyRecentPerf
+            oids=[
+                '5.1',  # cacheHitsNow
+                '6.1',  # cacheMissesNow
+                '7.1',  # cacheHitRespTimeNow
+                '8.1',  # cacheMissRespTimeNow
+                '9.1',  # cacheTotalRespTimeNow
+            ]
+        ),
+    ],
+    detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
+)
+
+register.check_plugin(
+    name='cisco_asyncos_cache',
+    service_name='Cache Stats',
+    discovery_function=discovery_cisco_asyncos_cache,
+    check_function=check_cisco_asyncos_cache,
+    check_default_parameters={},
+)
diff --git a/checks/cisco_asyncos_bandwidth b/checks/cisco_asyncos_bandwidth
deleted file mode 100644
index 5829e7b..0000000
--- a/checks/cisco_asyncos_bandwidth
+++ /dev/null
@@ -1,64 +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.
-#
-# only use full for Cisco WSA appliances
-#
-
-cisco_asyncos_bandwidth_default_levels = {}
-
-
-def inventory_cisco_asyncos_bandwidth(info):
-    if len(info) > 0:
-        return [(None, 'cisco_asyncos_bandwidth_default_levels')]
-
-
-def check_cisco_asyncos_bandwidth(item, params, info):
-    state = 0
-    perfdata = []
-    warn, crit = None, None
-    now, onehour, oneday = info[0]
-    perfdata.append( ('now', now, warn, crit, 0, 1000000) )
-    perfdata.append( ('onehour', onehour, warn, crit, 0, 1000000) )
-    perfdata.append( ('oneday', oneday, warn, crit, 0, 1000000) )
-    
-    infotext = 'Bandbreitennutzung aktuell %skBits - 1h Durchschnitt %skBits - 1d Durchschnitt %skBits' % (now, onehour, oneday)
-    return state, infotext, perfdata
-
-
-check_info['cisco_asyncos_bandwidth'] = {
-    'check_function':          check_cisco_asyncos_bandwidth,
-    'inventory_function':      inventory_cisco_asyncos_bandwidth,
-    'service_description':     'Bandwidth total',
-    'has_perfdata':            True,
-    'snmp_info':               ('.1.3.6.1.4.1.15497.1.2.3.7.4', [  # ASYNCOSWEBSECURITYAPPLIANCE-MIB::proxyRecentBandWTotPerf
-                                '1',  # cacheBwidthTotalNow
-                                '3',  # cacheBwidthTotal1hrMean
-                                '5',  # cacheBwidthTotal1dayMean
-                                ]),
-    '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
deleted file mode 100644
index a52a3b9..0000000
--- a/checks/cisco_asyncos_cache
+++ /dev/null
@@ -1,69 +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.
-#
-# only use full for Cisco WSA appliances
-#
-
-
-cisco_asyncos_cache_default_levels = {}
-
-
-def inventory_cisco_asyncos_cache(info):
-    if len(info) > 0:
-        return [(None, 'cisco_asyncos_cache_default_levels')]
-
-
-def check_cisco_asyncos_cache(item, params, info):
-    state = 0
-    perfdata = []
-    warn, crit = None, None
-    hits, misses, hitresp, missresp, totalresp = info[0]
-    perfdata.append( ('hits', int(hits) ) )
-    perfdata.append( ('misses', int(misses) ) )
-    perfdata.append( ('hitresp', int(hitresp) ) )
-    perfdata.append( ('missresp', int(missresp) ) )
-    perfdata.append( ('totalresp', int(totalresp) ) )
-    
-    infotext = 'Cache Stats aktuell %s Hits (%sms Antwortzeit), %s Misses (%sms Antwortzeit) und %sms gesamt Antwortzeit' % (hits, hitresp, misses, missresp, totalresp)
-    return state, infotext, perfdata
-
-
-check_info['cisco_asyncos_cache'] = {
-    'check_function':          check_cisco_asyncos_cache,
-    'inventory_function':      inventory_cisco_asyncos_cache,
-    'service_description':     'Cache Stats',
-    'has_perfdata':            True,
-    'snmp_info':               ('.1.3.6.1.4.1.15497.1.2.3.7', [  # ASYNCOSWEBSECURITYAPPLIANCE-MIB::proxyRecentPerf
-                                '5.1',  # cacheHitsNow
-                                '6.1',  # cacheMissesNow
-                                '7.1',  # cacheHitRespTimeNow
-                                '8.1',  # cacheMissRespTimeNow
-                                '9.1',  # cacheTotalRespTimeNow
-                                ]),
-    '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 ba5d874055af624ee806e377b40b58afb5b5c37b..be691ccdddc54f9082d6cd64f3b2730339bad591 100644
GIT binary patch
literal 12111
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
F{s*T3?}Y#W

literal 11910
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

diff --git a/packages/cisco_asyncos b/packages/cisco_asyncos
index c319a77..d5850fb 100644
--- a/packages/cisco_asyncos
+++ b/packages/cisco_asyncos
@@ -20,17 +20,18 @@
                 '\n'
                 '- 2021-03-21: rewrite cisco_asyncos_cpu, cisco_asyncos_mem, '
                 'cisco_asyncos_temp for CMK 2.0\n'
-                '- 2021-03-24: rewrite cisco_asyncos_raid\n',
+                '- 2021-03-24: rewrite cisco_asyncos_raid, '
+                'cisco_asyncos_bandwidth, cisco_asyncos_cache\n',
  'download_url': 'https://thl-cmk.hopto.org',
  'files': {'agent_based': ['cisco_asyncos_cpu.py',
                            'cisco_asyncos_mem.py',
                            'cisco_asyncos_temp.py',
                            'cisco_asyncos_fan.py',
                            'cisco_asyncos_power.py',
-                           'cisco_asyncos_raid.py'],
-           'checks': ['cisco_asyncos_bandwidth',
-                      'cisco_asyncos_cache',
-                      'cisco_asyncos_conn',
+                           'cisco_asyncos_raid.py',
+                           'cisco_asyncos_bandwidth.py',
+                           'cisco_asyncos_cache.py'],
+           'checks': ['cisco_asyncos_conn',
                       'cisco_asyncos_license',
                       'cisco_asyncos_queue',
                       'cisco_asyncos_update',
diff --git a/web/plugins/metrics/cisco_asyncos.py b/web/plugins/metrics/cisco_asyncos.py
index ee23130..6159bc9 100644
--- a/web/plugins/metrics/cisco_asyncos.py
+++ b/web/plugins/metrics/cisco_asyncos.py
@@ -63,22 +63,22 @@ metric_info['cisco_asyncos_mem_mem_used'] = {
 #
 ######################################################################################################################
 
-check_metrics['check_mk-cisco_asyncos_dns'] = {
-    'outstandingdnsrequests': {'name': 'cisco_asyncos_dns_outstandingdnsrequests', },
-    'pendingdnsrequests': {'name': 'cisco_asyncos_dns_pendingdnsrequests', },
-}
-
-check_metrics['check_mk-cisco_asyncos_messageage'] = {
-    'oldestmessageage': {'name': 'cisco_asyncos_messageage_oldestmessageage', },
-}
-
-check_metrics['check_mk-cisco_asyncos_queue'] = {
-    'queue': {'name': 'cisco_asyncos_queue_work_queue', },
-}
-
-check_metrics['check_mk-cisco_asyncos_mem'] = {
-    'mem_used': {'name': 'cisco_asyncos_mem_mem_used', },
-}
+# check_metrics['check_mk-cisco_asyncos_dns'] = {
+#     'outstandingdnsrequests': {'name': 'cisco_asyncos_dns_outstandingdnsrequests', },
+#     'pendingdnsrequests': {'name': 'cisco_asyncos_dns_pendingdnsrequests', },
+# }
+#
+# check_metrics['check_mk-cisco_asyncos_messageage'] = {
+#     'oldestmessageage': {'name': 'cisco_asyncos_messageage_oldestmessageage', },
+# }
+#
+# check_metrics['check_mk-cisco_asyncos_queue'] = {
+#     'queue': {'name': 'cisco_asyncos_queue_work_queue', },
+# }
+#
+# check_metrics['check_mk-cisco_asyncos_mem'] = {
+#     'mem_used': {'name': 'cisco_asyncos_mem_mem_used', },
+# }
 
 
 ######################################################################################################################
-- 
GitLab