From d3a8058b45afebdbdd2b8bb2e125cb31625d38e0 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Thu, 2 Dec 2021 18:41:43 +0100
Subject: [PATCH] update project

---
 agent_based/checkpoint_mho_buffer.py         | 229 +++++++++++++++++++
 checkpoint_mho_buffers.mkp                   | Bin 0 -> 3003 bytes
 packages/checkpoint_mho_buffers              |  14 ++
 web/plugins/metrics/checkpoint_mho_buffer.py |  75 ++++++
 4 files changed, 318 insertions(+)
 create mode 100644 agent_based/checkpoint_mho_buffer.py
 create mode 100644 checkpoint_mho_buffers.mkp
 create mode 100644 packages/checkpoint_mho_buffers
 create mode 100644 web/plugins/metrics/checkpoint_mho_buffer.py

diff --git a/agent_based/checkpoint_mho_buffer.py b/agent_based/checkpoint_mho_buffer.py
new file mode 100644
index 0000000..7fb2adc
--- /dev/null
+++ b/agent_based/checkpoint_mho_buffer.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 buffer 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
new file mode 100644
index 0000000000000000000000000000000000000000..11e6a4ad70817b57404a7e4f39d8a73991a8a6cd
GIT binary patch
literal 3003
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

literal 0
HcmV?d00001

diff --git a/packages/checkpoint_mho_buffers b/packages/checkpoint_mho_buffers
new file mode 100644
index 0000000..1055a92
--- /dev/null
+++ b/packages/checkpoint_mho_buffers
@@ -0,0 +1,14 @@
+{'author': 'cmkadmin',
+ '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']},
+ 'name': 'checkpoint_mho_buffers',
+ 'num_files': 2,
+ 'title': 'Check Point MHO port RX buffers',
+ 'version': '20211130.v0.0.1',
+ 'version.min_required': '2.0.0',
+ 'version.packaged': '2021.09.20',
+ 'version.usable_until': None}
\ No newline at end of file
diff --git a/web/plugins/metrics/checkpoint_mho_buffer.py b/web/plugins/metrics/checkpoint_mho_buffer.py
new file mode 100644
index 0000000..9723e49
--- /dev/null
+++ b/web/plugins/metrics/checkpoint_mho_buffer.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