From 517fc0e8050ec210a964ce57a26a2886e1ca812f Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Thu, 2 Dec 2021 21:14:10 +0100
Subject: [PATCH] update project

---
 agent_based/checkpoint_mho_buffers.py         | 101 ++++++++++--------
 checkpoint_mho_buffers.mkp                    | Bin 3007 -> 3775 bytes
 packages/checkpoint_mho_buffers               |   5 +-
 web/plugins/metrics/checkpoint_mho_buffers.py |  21 ++++
 web/plugins/wato/checkpoint_mho_buffers.py    |  89 +++++++++++++++
 5 files changed, 172 insertions(+), 44 deletions(-)
 create mode 100644 web/plugins/wato/checkpoint_mho_buffers.py

diff --git a/agent_based/checkpoint_mho_buffers.py b/agent_based/checkpoint_mho_buffers.py
index db478d9..45607f0 100644
--- a/agent_based/checkpoint_mho_buffers.py
+++ b/agent_based/checkpoint_mho_buffers.py
@@ -45,6 +45,7 @@ from cmk.base.plugins.agent_based.agent_based_api.v1 import (
     get_rate,
     get_value_store,
     IgnoreResultsError,
+    check_levels,
     render,
 )
 
@@ -61,16 +62,25 @@ class CheckPointMhoPortBuffer:
     label: str
     admin_state: str
     link_state: str
-    buffer: Dict[str, CheckPointMhoRxBuffer]
+    sum_frames: int
+    sum_octets: int
+    sum_discards: int
+    buffer: Dict[int, CheckPointMhoRxBuffer]
 
 
-def parse_checkpoint_mho_buffer(string_table: StringTable) -> Dict[str, CheckPointMhoPortBuffer]:
+def parse_checkpoint_mho_buffers(string_table: StringTable) -> Dict[str, CheckPointMhoPortBuffer]:
     section = {}
     for line in string_table:
         _0_frames, _0_octet, _0_discard, _1_frames, _1_octet, _1_discard, _2_frames, _2_octet, _2_discard, _3_frames,\
         _3_octet, _3_discard, _4_frames, _4_octet, _4_discard, _5_frames, _5_octet, _5_discard, _6_frames, _6_octet,\
         _6_discard, _7_frames, _7_octet, _7_discard, index, label, link_state, admin_state = line
 
+        if len(string_table) < 100:
+            index = f'{int(index):02}'
+        else:
+            index = f'{int(index):03}'
+
+        sum_frames = sum_octets = sum_discards = 0
         _i = 0
         buffer = {}
         for frames, octet, discard in [
@@ -83,24 +93,30 @@ def parse_checkpoint_mho_buffer(string_table: StringTable) -> Dict[str, CheckPoi
             (_6_frames, _6_octet, _6_discard),
             (_7_frames, _7_octet, _7_discard),
         ]:
-            buffer[str(_i)] = CheckPointMhoRxBuffer(
+            buffer[_i] = CheckPointMhoRxBuffer(
                 frames=int(frames) if frames.isdigit() else 0,
                 octets=int(octet) if octet.isdigit() else 0,
                 discard=int(discard) if discard.isdigit() else 0,
             )
+            sum_frames += buffer[_i].frames
+            sum_octets += buffer[_i].octets
+            sum_discards += buffer[_i].discard
             _i += 1
 
-        section[str(index)] = CheckPointMhoPortBuffer(
+        section[index] = CheckPointMhoPortBuffer(
             label=label,
             admin_state=admin_state,
             link_state=link_state,
+            sum_frames=sum_frames,
+            sum_octets=sum_octets,
+            sum_discards=sum_discards,
             buffer=buffer,
-            )
+        )
 
     return section
 
 
-def discovery_checkpoint_mho_buffer(params, section: Dict[str, CheckPointMhoPortBuffer]) -> DiscoveryResult:
+def discovery_checkpoint_mho_buffers(params, section: Dict[str, CheckPointMhoPortBuffer]) -> DiscoveryResult:
     for item in section.keys():
         if params['add_admin_down'] is not True and section[item].admin_state.lower() in ['down', 'na']:
             continue
@@ -109,56 +125,71 @@ def discovery_checkpoint_mho_buffer(params, section: Dict[str, CheckPointMhoPort
         yield Service(item=item)
 
 
-def check_checkpoint_mho_buffer(item, params, section: Dict[str, CheckPointMhoPortBuffer]) -> CheckResult:
+def check_checkpoint_mho_buffers(item, params, section: Dict[str, CheckPointMhoPortBuffer]) -> CheckResult:
     try:
         port = section[item]
     except KeyError:
         yield Result(state=State.UNKNOWN, notice='Item not found in SNMP data.')
         return
 
-    yield Result(state=State.OK, summary=f'Label: {port.label}')
-    yield Result(state=State.OK, summary=f'Admin state: {port.admin_state}')
-    yield Result(state=State.OK, summary=f'Link state: {port.link_state}')
+    yield Result(state=State.OK, notice=f'Label: {port.label}')
+    yield Result(state=State.OK, notice=f'Admin state: {port.admin_state}')
+    yield Result(state=State.OK, notice=f'Link state: {port.link_state}')
 
     now = time.time()
     value_store = get_value_store()
     metric_prefix = 'checkpoint_mho_port_buffer'
-    raise_ingore_res = False
+    raise_ignore_res = False
+
+    for metric, value, label in [
+        ('sum_octets', port.sum_octets, 'Octets'),
+        ('sum_frames', port.sum_frames, 'Frames'),
+        ('sum_discards', port.sum_discards, 'Discards'),
+    ]:
+        try:
+            value = get_rate(value_store, metric, now, value, raise_overflow=True, )
+        except GetRateError:
+            raise_ignore_res = True
+        else:
+            yield from check_levels(
+                value=value,
+                label=label,
+                metric_name=f'{metric_prefix}_{metric}',
+                render_func=lambda x: f'{x:.2f}/s',
+            )
 
     for buffer in port.buffer.keys():
         try:
             value = get_rate(value_store, f'{buffer}_frames', now, port.buffer[buffer].frames, raise_overflow=True, )
         except GetRateError:
-            raise_ingore_res = True
+            raise_ignore_res = True
         else:
             yield Metric(value=value, name=f'{metric_prefix}_{buffer}_frames')
 
         try:
             value = get_rate(value_store, f'{buffer}_octets', now, port.buffer[buffer].octets, raise_overflow=True, )
         except GetRateError:
-            raise_ingore_res = True
+            raise_ignore_res = True
         else:
             yield Metric(value=value, name=f'{metric_prefix}_{buffer}_octets')
 
         try:
             value = get_rate(value_store, f'{buffer}_discards', now, port.buffer[buffer].discard, raise_overflow=True, )
         except GetRateError:
-            raise_ingore_res = True
+            raise_ignore_res = True
         else:
             yield Metric(value=value, name=f'{metric_prefix}_{buffer}_discards')
 
-    if raise_ingore_res:
+    if raise_ignore_res:
         raise IgnoreResultsError('Initializing counters')
 
 
 register.snmp_section(
-    name='checkpoint_mho_buffer',
-    parse_function=parse_checkpoint_mho_buffer,
+    name='checkpoint_mho_buffers',
+    parse_function=parse_checkpoint_mho_buffers,
     fetch=SNMPTree(
         base='.1.3.6.1.4.1.2620.1.55.1',  # CHECKPOINT-MIB::mhoPortsStatus
         oids=[
-            # '3.1.1',  # mhoRxBuffPortIndex
-            # '3.1.2',  # mhoRxBuffPortLabel
             '3.1.3',  # mhoRxBuff0Frames
             '3.1.4',  # mhoRxBuff0Octet
             '3.1.5',  # mhoRxBuff0Discard
@@ -188,21 +219,6 @@ register.snmp_section(
             '4.1.2',  # mhoStatePortLabel
             '4.1.3',  # mhoStateLinkState
             '4.1.4',  # mhoStateAdminState
-            # '4.1.5',  # mhoStateSpeed
-
-            # '5.1.1',  # mhoSummaryPortIndex
-            # '5.1.2',  # mhoSummaryPortLabel
-            # '5.1.3',  # mhoSummaryLinkState
-            # '5.1.4',  # mhoSummaryAdminState
-            # '5.1.5',  # mhoSummarySpeed
-            # '5.1.6',  # mhoSummaryRxFcsErr
-            # '5.1.7',  # mhoSummaryRxErr
-            # '5.1.8',  # mhoSummaryRxFrames
-            # '5.1.9',  # mhoSummaryRxBytes
-            # '5.1.10',  # mhoSummaryTxErr
-            # '5.1.11',  # mhoSummaryTxFrames
-            # '5.1.12',  # mhoSummaryTxBytes
-
         ]
     ),
     detect=any_of(
@@ -215,15 +231,16 @@ register.snmp_section(
 )
 
 register.check_plugin(
-    name='checkpoint_mho_buffer',
+    name='checkpoint_mho_buffers',
     service_name='RX buffers port %s',
-    discovery_function=discovery_checkpoint_mho_buffer,
-    discovery_ruleset_name='discovery_checkpoint_mho_buffer',
+    discovery_function=discovery_checkpoint_mho_buffers,
+    discovery_ruleset_name='discovery_checkpoint_mho_buffers',
     discovery_default_parameters={
-        'add_admin_down': False,
-        'add_link_down': False,
+        'add_admin_down': True,
+        'add_link_down': True,
+    },
+    check_function=check_checkpoint_mho_buffers,
+    check_default_parameters={
     },
-    check_function=check_checkpoint_mho_buffer,
-    check_default_parameters={},
-    check_ruleset_name='checkpoint_mho_buffer',
+    check_ruleset_name='checkpoint_mho_buffers',
 )
diff --git a/checkpoint_mho_buffers.mkp b/checkpoint_mho_buffers.mkp
index e55967d7afff3677883e55211f90fc2ec9207547..8ed18242dbb00d354baea41e8187c146a775a903 100644
GIT binary patch
delta 3765
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

delta 2991
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

diff --git a/packages/checkpoint_mho_buffers b/packages/checkpoint_mho_buffers
index f75b7df..4ade262 100644
--- a/packages/checkpoint_mho_buffers
+++ b/packages/checkpoint_mho_buffers
@@ -4,9 +4,10 @@
                 'Tested on Orchestrator MHO-140 with R8020.SP HFA_317\n',
  'download_url': 'https://thl-cmk.hopto.org',
  'files': {'agent_based': ['checkpoint_mho_buffers.py'],
-           'web': ['plugins/metrics/checkpoint_mho_buffers.py']},
+           'web': ['plugins/metrics/checkpoint_mho_buffers.py',
+                   'plugins/wato/checkpoint_mho_buffers.py']},
  'name': 'checkpoint_mho_buffers',
- 'num_files': 2,
+ 'num_files': 3,
  'title': 'Check Point MHO port RX buffers',
  'version': '20211130.v0.0.1',
  'version.min_required': '2.0.0',
diff --git a/web/plugins/metrics/checkpoint_mho_buffers.py b/web/plugins/metrics/checkpoint_mho_buffers.py
index 9723e49..3c19faa 100644
--- a/web/plugins/metrics/checkpoint_mho_buffers.py
+++ b/web/plugins/metrics/checkpoint_mho_buffers.py
@@ -32,9 +32,28 @@ while _i < 8:
 
     _i += 1
 
+metric_info['checkpoint_mho_port_buffer_sum_frames'] = {
+    'title': _('RX buffer frames summary'),
+    'unit': '1/s',
+    'color': '15/a',
+}
+metric_info['checkpoint_mho_port_buffer_sum_octets'] = {
+    'title': _('RX buffer octets summary'),
+    'unit': '1/s',
+    'color': '25/a',
+}
+
+metric_info['checkpoint_mho_port_buffer_sum_discards'] = {
+    'title': _('RX buffer discards summary'),
+    'unit': '1/s',
+    'color': f'35/a',
+}
+
+
 graph_info['checkpoint_mho_port_buffer_frames'] = {
     'title': _('Check Point MHO RX buffer frames'),
     'metrics': [
+        ('checkpoint_mho_port_buffer_sum_frames', 'line'),
         ('checkpoint_mho_port_buffer_0_frames', 'line'),
         ('checkpoint_mho_port_buffer_1_frames', 'line'),
         ('checkpoint_mho_port_buffer_2_frames', 'line'),
@@ -49,6 +68,7 @@ graph_info['checkpoint_mho_port_buffer_frames'] = {
 graph_info['checkpoint_mho_port_buffer_octets'] = {
     'title': _('Check Point MHO RX buffer octets'),
     'metrics': [
+        ('checkpoint_mho_port_buffer_sum_octets', 'line'),
         ('checkpoint_mho_port_buffer_0_octets', 'line'),
         ('checkpoint_mho_port_buffer_1_octets', 'line'),
         ('checkpoint_mho_port_buffer_2_octets', 'line'),
@@ -63,6 +83,7 @@ graph_info['checkpoint_mho_port_buffer_octets'] = {
 graph_info['checkpoint_mho_port_buffer_discards'] = {
     'title': _('Check Point MHO RX buffer discards'),
     'metrics': [
+        ('checkpoint_mho_port_buffer_sum_discards', 'line'),
         ('checkpoint_mho_port_buffer_0_discards', 'line'),
         ('checkpoint_mho_port_buffer_1_discards', 'line'),
         ('checkpoint_mho_port_buffer_2_discards', 'line'),
diff --git a/web/plugins/wato/checkpoint_mho_buffers.py b/web/plugins/wato/checkpoint_mho_buffers.py
new file mode 100644
index 0000000..7fddc2a
--- /dev/null
+++ b/web/plugins/wato/checkpoint_mho_buffers.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  : 2021-12-02
+#
+from cmk.gui.i18n import _
+from cmk.gui.valuespec import (
+    Dictionary,
+    TextAscii,
+    MonitoringState,
+    FixedValue,
+)
+
+from cmk.gui.plugins.wato import (
+    CheckParameterRulespecWithItem,
+    rulespec_registry,
+    RulespecGroupCheckParametersNetworking,
+    RulespecGroupCheckParametersDiscovery,
+    HostRulespec,
+)
+
+
+# def _parameter_valuespec_checkpoint_mho_buffers():
+#     return Dictionary(
+#             elements=[
+#                 ('state_admin_down',
+#                  MonitoringState(
+#                      title=_('State if port is Admin down'),
+#                      help=_('Monitoring state if port is Admin down'),
+#                      default_value=1,
+#                  )),
+#                 ('state_link_down',
+#                  MonitoringState(
+#                      title=_('State if port Link state is down'),
+#                      help=_('Monitoring state if port link state is down'),
+#                      default_value=2,
+#                  )),
+#                 ('state_speed_changed',
+#                  MonitoringState(
+#                      title=_('State if port speed has changed'),
+#                      help=_('Monitoring state if port speed has changed from discovery'),
+#                      default_value=1,
+#                  )),
+#             ],
+#         )
+#
+#
+# rulespec_registry.register(
+#     CheckParameterRulespecWithItem(
+#         check_group_name='checkpoint_mho_buffers',
+#         group=RulespecGroupCheckParametersNetworking,
+#         match_type='dict',
+#         parameter_valuespec=_parameter_valuespec_checkpoint_mho_buffers,
+#         title=lambda: _('Check Point MHO buffers'),
+#         item_spec=lambda: TextAscii(title=_('Port index'), ),
+#     ))
+
+
+def _valuespec_discovery_checkpoint_mho_buffers():
+    return Dictionary(
+            title=_('Check Point MHO buffers'),
+            elements=[
+                ('add_admin_down',
+                 FixedValue(
+                     False,
+                     title=_('Do not add Admin down ports'),
+                     totext=_('If enabled the plugin will not add ports in Admin down state'),
+                 )),
+                ('add_link_down',
+                 FixedValue(
+                     False,
+                     title=_('Do not add Link down ports'),
+                     totext=_('If enabled the plugin will not add ports in Link down state'),
+                 )),
+            ],
+        )
+
+
+rulespec_registry.register(
+    HostRulespec(
+        group=RulespecGroupCheckParametersDiscovery,
+        match_type='dict',
+        name='discovery_checkpoint_mho_buffers',
+        valuespec=_valuespec_discovery_checkpoint_mho_buffers,
+    ))
-- 
GitLab