From 83f712c17df9b1208f97b71428cd53ef2d8dc093 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Thu, 2 Dec 2021 19:05:39 +0100
Subject: [PATCH] update project

---
 agent_based/checkpoint_mho_buffers.py         | 229 ++++++++++++++++++
 checkpoint_mho_buffers.mkp                    | Bin 3003 -> 3007 bytes
 packages/checkpoint_mho_buffers               |   8 +-
 web/plugins/metrics/checkpoint_mho_buffers.py |  75 ++++++
 4 files changed, 308 insertions(+), 4 deletions(-)
 create mode 100644 agent_based/checkpoint_mho_buffers.py
 create mode 100644 web/plugins/metrics/checkpoint_mho_buffers.py

diff --git a/agent_based/checkpoint_mho_buffers.py b/agent_based/checkpoint_mho_buffers.py
new file mode 100644
index 0000000..db478d9
--- /dev/null
+++ b/agent_based/checkpoint_mho_buffers.py
@@ -0,0 +1,229 @@
+#!/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-11-30
+#
+# Monitor Check Point MHO port buffers
+#
+# 
+#
+# sample snmpwalk 
+#
+#
+# sample string_table
+#
+#
+#
+# sample section
+#
+
+import time
+from typing import List, NamedTuple, Optional, Dict
+from dataclasses import dataclass
+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,
+    equals,
+    Result,
+    State,
+    SNMPTree,
+    startswith,
+    all_of,
+    any_of,
+    Metric,
+    GetRateError,
+    get_rate,
+    get_value_store,
+    IgnoreResultsError,
+    render,
+)
+
+
+@dataclass
+class CheckPointMhoRxBuffer:
+    frames: int
+    octets: int
+    discard: int
+
+
+@dataclass
+class CheckPointMhoPortBuffer:
+    label: str
+    admin_state: str
+    link_state: str
+    buffer: Dict[str, CheckPointMhoRxBuffer]
+
+
+def parse_checkpoint_mho_buffer(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
+
+        _i = 0
+        buffer = {}
+        for frames, octet, discard in [
+            (_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),
+        ]:
+            buffer[str(_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,
+            )
+            _i += 1
+
+        section[str(index)] = CheckPointMhoPortBuffer(
+            label=label,
+            admin_state=admin_state,
+            link_state=link_state,
+            buffer=buffer,
+            )
+
+    return section
+
+
+def discovery_checkpoint_mho_buffer(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
+        if params['add_link_down'] is not True and section[item].link_state.lower() == 'down':
+            continue
+        yield Service(item=item)
+
+
+def check_checkpoint_mho_buffer(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}')
+
+    now = time.time()
+    value_store = get_value_store()
+    metric_prefix = 'checkpoint_mho_port_buffer'
+    raise_ingore_res = False
+
+    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
+        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
+        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
+        else:
+            yield Metric(value=value, name=f'{metric_prefix}_{buffer}_discards')
+
+    if raise_ingore_res:
+        raise IgnoreResultsError('Initializing counters')
+
+
+register.snmp_section(
+    name='checkpoint_mho_buffer',
+    parse_function=parse_checkpoint_mho_buffer,
+    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
+            '3.1.6',  # mhoRxBuff1Frames
+            '3.1.7',  # mhoRxBuff1Octet
+            '3.1.8',  # mhoRxBuff1Discard
+            '3.1.9',  # mhoRxBuff2Frames
+            '3.1.10',  # mhoRxBuff2Octet
+            '3.1.11',  # mhoRxBuff2Discard
+            '3.1.12',  # mhoRxBuff3Frames
+            '3.1.13',  # mhoRxBuff3Octet
+            '3.1.14',  # mhoRxBuff3Discard
+            '3.1.15',  # mhoRxBuff4Frames
+            '3.1.16',  # mhoRxBuff4Octet
+            '3.1.17',  # mhoRxBuff4Discard
+            '3.1.18',  # mhoRxBuff5Frames
+            '3.1.19',  # mhoRxBuff5Octet
+            '3.1.20',  # mhoRxBuff5Discard
+            '3.1.21',  # mhoRxBuff6Frames
+            '3.1.22',  # mhoRxBuff6Octet
+            '3.1.23',  # mhoRxBuff6Discard
+            '3.1.24',  # mhoRxBuff7Frames
+            '3.1.25',  # mhoRxBuff7Octet
+            '3.1.26',  # mhoRxBuff7Discard
+
+            '4.1.1',  # mhoStatePortIndex
+            '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(
+        startswith('.1.3.6.1.2.1.1.2.0', '.1.3.6.1.4.1.2620'),
+        all_of(
+            equals('.1.3.6.1.2.1.1.2.0', '.1.3.6.1.4.1.8072.3.2.10'),
+            equals('.1.3.6.1.4.1.2620.1.6.1.0', 'SVN Foundation'),
+        )
+    )
+)
+
+register.check_plugin(
+    name='checkpoint_mho_buffer',
+    service_name='RX buffers port %s',
+    discovery_function=discovery_checkpoint_mho_buffer,
+    discovery_ruleset_name='discovery_checkpoint_mho_buffer',
+    discovery_default_parameters={
+        'add_admin_down': False,
+        'add_link_down': False,
+    },
+    check_function=check_checkpoint_mho_buffer,
+    check_default_parameters={},
+    check_ruleset_name='checkpoint_mho_buffer',
+)
diff --git a/checkpoint_mho_buffers.mkp b/checkpoint_mho_buffers.mkp
index 11e6a4ad70817b57404a7e4f39d8a73991a8a6cd..e55967d7afff3677883e55211f90fc2ec9207547 100644
GIT binary patch
delta 2948
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

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

diff --git a/packages/checkpoint_mho_buffers b/packages/checkpoint_mho_buffers
index 1055a92..f75b7df 100644
--- a/packages/checkpoint_mho_buffers
+++ b/packages/checkpoint_mho_buffers
@@ -1,10 +1,10 @@
-{'author': 'cmkadmin',
+{'author': 'Th.L. (thl-cmk[at]outlook[dot]com)',
  'description': 'Monitors Check Point MHO port RX buffers\n'
                 '\n'
                 'Tested on Orchestrator MHO-140 with R8020.SP HFA_317\n',
- 'download_url': '',
- 'files': {'agent_based': ['checkpoint_mho_buffer.py'],
-           'web': ['plugins/metrics/checkpoint_mho_buffer.py']},
+ 'download_url': 'https://thl-cmk.hopto.org',
+ 'files': {'agent_based': ['checkpoint_mho_buffers.py'],
+           'web': ['plugins/metrics/checkpoint_mho_buffers.py']},
  'name': 'checkpoint_mho_buffers',
  'num_files': 2,
  'title': 'Check Point MHO port RX buffers',
diff --git a/web/plugins/metrics/checkpoint_mho_buffers.py b/web/plugins/metrics/checkpoint_mho_buffers.py
new file mode 100644
index 0000000..9723e49
--- /dev/null
+++ b/web/plugins/metrics/checkpoint_mho_buffers.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+
+from cmk.gui.i18n import _
+
+from cmk.gui.plugins.metrics import (
+    metric_info,
+    graph_info,
+    perfometer_info,
+)
+
+
+_i = 0
+while _i < 8:
+    metric_info[f'checkpoint_mho_port_buffer_{_i}_frames'] = {
+        'title': _(f'RX buffer {_i} frames'),
+        'unit': '1/s',
+        'color': f'1{_i // 2 + 1}/{chr(97 + _i % 2)}',
+    }
+    metric_info[f'checkpoint_mho_port_buffer_{_i}_octets'] = {
+        'title': _(f'RX buffer {_i} octets'),
+        'unit': '1/s',
+        'color': f'2{_i // 2 + 1}/{chr(97 + _i % 2)}',
+    }
+
+    metric_info[f'checkpoint_mho_port_buffer_{_i}_discards'] = {
+        'title': _(f'RX buffer {_i} discards'),
+        'unit': '1/s',
+        'color': f'3{_i // 2 + 1}/{chr(97 + _i % 2)}',
+    }
+
+    _i += 1
+
+graph_info['checkpoint_mho_port_buffer_frames'] = {
+    'title': _('Check Point MHO RX buffer frames'),
+    'metrics': [
+        ('checkpoint_mho_port_buffer_0_frames', 'line'),
+        ('checkpoint_mho_port_buffer_1_frames', 'line'),
+        ('checkpoint_mho_port_buffer_2_frames', 'line'),
+        ('checkpoint_mho_port_buffer_3_frames', 'line'),
+        ('checkpoint_mho_port_buffer_4_frames', 'line'),
+        ('checkpoint_mho_port_buffer_5_frames', 'line'),
+        ('checkpoint_mho_port_buffer_6_frames', 'line'),
+        ('checkpoint_mho_port_buffer_7_frames', 'line'),
+    ],
+}
+
+graph_info['checkpoint_mho_port_buffer_octets'] = {
+    'title': _('Check Point MHO RX buffer octets'),
+    'metrics': [
+        ('checkpoint_mho_port_buffer_0_octets', 'line'),
+        ('checkpoint_mho_port_buffer_1_octets', 'line'),
+        ('checkpoint_mho_port_buffer_2_octets', 'line'),
+        ('checkpoint_mho_port_buffer_3_octets', 'line'),
+        ('checkpoint_mho_port_buffer_4_octets', 'line'),
+        ('checkpoint_mho_port_buffer_5_octets', 'line'),
+        ('checkpoint_mho_port_buffer_6_octets', 'line'),
+        ('checkpoint_mho_port_buffer_7_octets', 'line'),
+    ],
+}
+
+graph_info['checkpoint_mho_port_buffer_discards'] = {
+    'title': _('Check Point MHO RX buffer discards'),
+    'metrics': [
+        ('checkpoint_mho_port_buffer_0_discards', 'line'),
+        ('checkpoint_mho_port_buffer_1_discards', 'line'),
+        ('checkpoint_mho_port_buffer_2_discards', 'line'),
+        ('checkpoint_mho_port_buffer_3_discards', 'line'),
+        ('checkpoint_mho_port_buffer_4_discards', 'line'),
+        ('checkpoint_mho_port_buffer_5_discards', 'line'),
+        ('checkpoint_mho_port_buffer_6_discards', 'line'),
+        ('checkpoint_mho_port_buffer_7_discards', 'line'),
+    ],
+}
-- 
GitLab