From f5855abafe9b4c3a32503dac14d95d0285a7cbf0 Mon Sep 17 00:00:00 2001
From: "Th.L" <thl-cmk@outlook.com>
Date: Wed, 24 Mar 2021 23:40:09 +0100
Subject: [PATCH] update project

---
 agent_based/cisco_asyncos_bandwidth.py  |   3 +-
 agent_based/cisco_asyncos_conn.py       |  83 +++++++++++++++++++
 agent_based/cisco_asyncos_dns.py        |  89 ++++++++++++++++++++
 agent_based/cisco_asyncos_messageage.py |  85 +++++++++++++++++++
 agent_based/cisco_asyncos_queue.py      | 104 ++++++++++++++++++++++++
 cisco_asyncos.mkp                       | Bin 44 -> 11776 bytes
 packages/cisco_asyncos                  |  15 ++--
 7 files changed, 371 insertions(+), 8 deletions(-)
 create mode 100644 agent_based/cisco_asyncos_conn.py
 create mode 100644 agent_based/cisco_asyncos_dns.py
 create mode 100644 agent_based/cisco_asyncos_messageage.py
 create mode 100644 agent_based/cisco_asyncos_queue.py

diff --git a/agent_based/cisco_asyncos_bandwidth.py b/agent_based/cisco_asyncos_bandwidth.py
index 99483a0..0b6374c 100644
--- a/agent_based/cisco_asyncos_bandwidth.py
+++ b/agent_based/cisco_asyncos_bandwidth.py
@@ -26,6 +26,7 @@ from cmk.base.plugins.agent_based.agent_based_api.v1 import (
     SNMPTree,
     contains,
     State,
+    render,
 )
 
 
@@ -55,7 +56,7 @@ def check_cisco_asyncos_bandwidth(params, section: CiscoAsyncosBandwidth) -> Che
         levels_upper=params.get('upper', None),
         levels_lower=params.get('lower', None),
         metric_name='bandwith_now',
-        # render_func=
+        render_func=render.networkbandwidth
     )
 
     yield Result(state=State.OK,
diff --git a/agent_based/cisco_asyncos_conn.py b/agent_based/cisco_asyncos_conn.py
new file mode 100644
index 0000000..c5da832
--- /dev/null
+++ b/agent_based/cisco_asyncos_conn.py
@@ -0,0 +1,83 @@
+#!/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 CiscoAsyncosConn(NamedTuple):
+    cacheClientIdleConns: int
+    cacheClientTotalConns: int
+    cacheClientMaxConns: int
+
+
+# [[['0', '5', '66277']]]
+def parse_cisco_asyncos_conn(string_table: List[StringTable]) -> CiscoAsyncosConn:
+    return CiscoAsyncosConn(
+        cacheClientIdleConns=int(string_table[0][0][0]),
+        cacheClientTotalConns=int(string_table[0][0][1]),
+        cacheClientMaxConns=int(string_table[0][0][2]),
+    )
+
+
+def discovery_cisco_asyncos_conn(section: CiscoAsyncosConn) -> DiscoveryResult:
+    yield Service()
+
+
+def check_cisco_asyncos_conn(params, section: CiscoAsyncosConn) -> CheckResult:
+    yield Result(state=State.OK,
+                 summary='%s Active Connections - %s Idle Connections - Maximum Connections was %s' % (
+                     section.cacheClientTotalConns, section.cacheClientIdleConns, section.cacheClientMaxConns))
+
+    yield Metric(name='cacheClientIdleConns', value=section.cacheClientIdleConns)
+    yield Metric(name='cacheClientTotalConns', value=section.cacheClientTotalConns)
+    yield Metric(name='cacheClientMaxConns', value=section.cacheClientMaxConns)
+
+
+register.snmp_section(
+    name='cisco_asyncos_conn',
+    parse_function=parse_cisco_asyncos_conn,
+    fetch=[
+        SNMPTree(
+            base='.1.3.6.1.4.1.15497.1.2.3.2',  # ASYNCOSWEBSECURITYAPPLIANCE-MIB::proxyClientSidePerf
+            oids=[
+                '7',  # cacheClientIdleConns
+                '8',  # cacheClientTotalConns
+                '9',  # cacheClientMaxConns
+            ]
+        ),
+    ],
+    detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
+)
+
+register.check_plugin(
+    name='cisco_asyncos_conn',
+    service_name='Connection Stats',
+    discovery_function=discovery_cisco_asyncos_conn,
+    check_function=check_cisco_asyncos_conn,
+    check_default_parameters={},
+)
diff --git a/agent_based/cisco_asyncos_dns.py b/agent_based/cisco_asyncos_dns.py
new file mode 100644
index 0000000..664d265
--- /dev/null
+++ b/agent_based/cisco_asyncos_dns.py
@@ -0,0 +1,89 @@
+#!/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-03-08
+#
+# monitors status Cisco IronPort Appliances (ESA) DNS requests
+# Tested with: C380, C370
+#
+# 2021-03-24: rewrite for CMK 2.0
+#
+# .1.3.6.1.4.1.15497.1.1.1.15.0 = Gauge32: 0
+# .1.3.6.1.4.1.15497.1.1.1.16.0 = Gauge32: 0
+#
+# ASYNCOS-MAIL-MIB::outstandingDNSRequests.0 = Gauge32: 0
+# ASYNCOS-MAIL-MIB::pendingDNSRequests.0 = Gauge32: 0
+#
+#
+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 CiscoAsyncosDns(NamedTuple):
+    outstandingDNSRequests: int
+    pendingDNSRequests: int
+
+
+# [[['0', '0']]]
+def parse_cisco_asyncos_dns(string_table: List[StringTable]) -> CiscoAsyncosDns:
+    return CiscoAsyncosDns(
+        outstandingDNSRequests=int(string_table[0][0][0]),
+        pendingDNSRequests=int(string_table[0][0][1]),
+    )
+
+
+def discovery_cisco_asyncos_dns(section: CiscoAsyncosDns) -> DiscoveryResult:
+    yield Service()
+
+
+def check_cisco_asyncos_dns(params, section: CiscoAsyncosDns) -> CheckResult:
+    yield Result(state=State.OK,
+                 summary='%s outstanding, %s pending' % (
+                     section.outstandingDNSRequests, section.pendingDNSRequests))
+
+    yield Metric(name='outstandingDNSRequests', value=section.outstandingDNSRequests)
+    yield Metric(name='pendingDNSRequests', value=section.pendingDNSRequests)
+
+
+register.snmp_section(
+    name='cisco_asyncos_dns',
+    parse_function=parse_cisco_asyncos_dns,
+    fetch=[
+        SNMPTree(
+            base='.1.3.6.1.4.1.15497.1.1.1',  # ASYNCOS-MAIL-MIB
+            oids=[
+                '15',  # outstandingDNSRequests
+                '16',  # pendingDNSRequests
+            ]
+        ),
+    ],
+    detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
+)
+
+register.check_plugin(
+    name='cisco_asyncos_dns',
+    service_name='DNS requests',
+    discovery_function=discovery_cisco_asyncos_dns,
+    check_function=check_cisco_asyncos_dns,
+    check_default_parameters={},
+)
diff --git a/agent_based/cisco_asyncos_messageage.py b/agent_based/cisco_asyncos_messageage.py
new file mode 100644
index 0000000..6aa7d9f
--- /dev/null
+++ b/agent_based/cisco_asyncos_messageage.py
@@ -0,0 +1,85 @@
+#!/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-03-08
+#
+# monitors status Cisco IronPort Appliances (ESA) oldest message age
+# Tested with: C380, C370
+#
+# 2021-03-24: rewrite for CMK 2.0
+#
+# .1.3.6.1.4.1.15497.1.1.1.14.0 = Gauge32: 258454
+#
+# ASYNCOS-MAIL-MIB::oldestMessageAge.0 = Gauge32: 259706
+#
+
+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,
+    render,
+)
+
+
+class CiscoAsyncosMessageage(NamedTuple):
+    messageage: int
+
+# [[['259297']]]
+def parse_cisco_asyncos_messageage(string_table: List[StringTable]) -> CiscoAsyncosMessageage:
+    return CiscoAsyncosMessageage(
+        messageage=int(string_table[0][0][0]),
+    )
+
+
+def discovery_cisco_asyncos_messageage(section: CiscoAsyncosMessageage) -> DiscoveryResult:
+    yield Service()
+
+
+def check_cisco_asyncos_messageage(params, section: CiscoAsyncosMessageage) -> CheckResult:
+    yield from check_levels(
+        value=section.messageage,
+        label='Oldest messages age',
+        metric_name='message_age',
+        levels_upper=params.get('upper', None),
+        render_func=render.timespan,
+    )
+
+
+register.snmp_section(
+    name='cisco_asyncos_messageage',
+    parse_function=parse_cisco_asyncos_messageage,
+    fetch=[
+        SNMPTree(
+            base='.1.3.6.1.4.1.15497.1.1.1',  # ASYNCOS-MAIL-MIB
+            oids=[
+                '14',  # oldestMessageAge
+            ]
+        ),
+    ],
+    detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
+)
+
+register.check_plugin(
+    name='cisco_asyncos_messageage',
+    service_name='Message age',
+    discovery_function=discovery_cisco_asyncos_messageage,
+    check_function=check_cisco_asyncos_messageage,
+    check_default_parameters={},
+)
diff --git a/agent_based/cisco_asyncos_queue.py b/agent_based/cisco_asyncos_queue.py
new file mode 100644
index 0000000..32a67a2
--- /dev/null
+++ b/agent_based/cisco_asyncos_queue.py
@@ -0,0 +1,104 @@
+#!/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
+#
+#  added wato, fixed inventory function, changed snmp scan function, changed item to 'work queue'
+#
+# 2021-03-24: rewrite for CMK 2.0
+#
+
+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 CiscoAsyncosQueue(NamedTuple):
+    state: State
+    status_readable: str
+    workQueueMessages: int
+
+
+def get_status_readable(st: str) -> str:
+    states = {
+        '1': 'enough',
+        '2': 'near full',
+        '3': 'full',
+    }
+    return states.get(st, st)
+
+
+def get_cmk_state(st: str) -> State:
+    states = {
+        '1': State.OK,
+        '2': State.CRIT,
+        '3': State.WARN
+    }
+    return states.get(st, State.CRIT)
+
+
+# [[['1', '1']]]
+def parse_cisco_asyncos_messageage(string_table: List[StringTable]) -> CiscoAsyncosQueue:
+    return CiscoAsyncosQueue(
+        state=get_cmk_state(string_table[0][0][0]),
+        status_readable=get_status_readable(string_table[0][0][0]),
+        workQueueMessages=int(string_table[0][0][1])
+    )
+
+
+def discovery_cisco_asyncos_queue(section: CiscoAsyncosQueue) -> DiscoveryResult:
+    yield Service()
+
+
+def check_cisco_asyncos_queue(params, section: CiscoAsyncosQueue) -> CheckResult:
+    yield from check_levels(
+        value=section.workQueueMessages,
+        label='Messages in work queue',
+        levels_upper=params.get('upper', None),
+        metric_name='work_queue_size',
+    )
+    yield Result(state=section.state, notice='Queue space: %s' % section.status_readable)
+
+
+register.snmp_section(
+    name='cisco_asyncos_queue',
+    parse_function=parse_cisco_asyncos_messageage,
+    fetch=[
+        SNMPTree(
+            base='.1.3.6.1.4.1.15497.1.1.1',  # ASYNCOS-MAIL-MIB
+            oids=[
+                '5',  # queueAvailabilityStatus
+                '11'  # workQueueMessages
+            ]
+        ),
+    ],
+    detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
+)
+
+register.check_plugin(
+    name='cisco_asyncos_queue',
+    service_name='Queue',
+    discovery_function=discovery_cisco_asyncos_queue,
+    check_function=check_cisco_asyncos_queue,
+    check_default_parameters={'levels': (50, 100)},
+    check_ruleset_name='cisco_asyncos_queue',
+)
diff --git a/cisco_asyncos.mkp b/cisco_asyncos.mkp
index 9c7a7def77a4f84f6aafb891b353508e92bbe896..fd0451b63583e3e9070d1bd8e962143458c37cc2 100644
GIT binary patch
literal 11776
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
CA$(u}

delta 12
TcmZpO(P5SE=HPIi$f^zi6Y>Jc

diff --git a/packages/cisco_asyncos b/packages/cisco_asyncos
index d5850fb..513ab34 100644
--- a/packages/cisco_asyncos
+++ b/packages/cisco_asyncos
@@ -21,7 +21,8 @@
                 '- 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, '
-                'cisco_asyncos_bandwidth, cisco_asyncos_cache\n',
+                'cisco_asyncos_bandwidth, cisco_asyncos_cache, '
+                'cisco_asyncos_conn\n',
  'download_url': 'https://thl-cmk.hopto.org',
  'files': {'agent_based': ['cisco_asyncos_cpu.py',
                            'cisco_asyncos_mem.py',
@@ -30,13 +31,13 @@
                            'cisco_asyncos_power.py',
                            'cisco_asyncos_raid.py',
                            'cisco_asyncos_bandwidth.py',
-                           'cisco_asyncos_cache.py'],
-           'checks': ['cisco_asyncos_conn',
-                      'cisco_asyncos_license',
-                      'cisco_asyncos_queue',
+                           'cisco_asyncos_cache.py',
+                           'cisco_asyncos_conn.py',
+                           'cisco_asyncos_dns.py',
+                           'cisco_asyncos_messageage.py',
+                           'cisco_asyncos_queue.py'],
+           'checks': ['cisco_asyncos_license',
                       'cisco_asyncos_update',
-                      'cisco_asyncos_dns',
-                      'cisco_asyncos_messageage',
                       'cisco_asyncos_resources'],
            'web': ['plugins/wato/cisco_asyncos_license.py',
                    'plugins/wato/cisco_asyncos_queue.py',
-- 
GitLab