From a3a896d872578ef859fc10152a81d60b2dd5b4f2 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Mon, 6 Sep 2021 18:00:26 +0200
Subject: [PATCH] update project

---
 agent_based/checkpoint_vsx.ps         | 249 ++++++++++++++++++++++++++
 checkpoint_vsx.mkp                    | Bin 3428 -> 4083 bytes
 packages/checkpoint_vsx               |  23 ++-
 web/plugins/metrics/checkpoint_vsx.py |  29 +--
 4 files changed, 283 insertions(+), 18 deletions(-)
 create mode 100644 agent_based/checkpoint_vsx.ps

diff --git a/agent_based/checkpoint_vsx.ps b/agent_based/checkpoint_vsx.ps
new file mode 100644
index 0000000..8d49537
--- /dev/null
+++ b/agent_based/checkpoint_vsx.ps
@@ -0,0 +1,249 @@
+#!/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  : 2017-17-05
+#
+# Check Point vsx Cluster status
+#
+# Monitor status of virtual systems in Check Point vsx/vsls cluster
+#
+# 2018-08-03: changed snmp scan function
+# 2018-08-13: code cleanup, add metrics
+# 2020-06-08: changed snmp-scan function
+# 2021-09-06: rewritten for CMK 2.0
+#
+# snmpwalk sample
+#
+# .1.3.6.1.4.1.2620.1.16.22.1.1.1.3.0 = Gauge32: 2
+# .1.3.6.1.4.1.2620.1.16.22.1.1.2.3.0 = Gauge32: 2
+# .1.3.6.1.4.1.2620.1.16.22.1.1.3.3.0 = STRING: "HRI"
+# .1.3.6.1.4.1.2620.1.16.22.1.1.4.3.0 = STRING: "Virtual System"
+# .1.3.6.1.4.1.2620.1.16.22.1.1.5.3.0 = STRING: "10.140.1.3"
+# .1.3.6.1.4.1.2620.1.16.22.1.1.6.3.0 = STRING: "Standard"
+# .1.3.6.1.4.1.2620.1.16.22.1.1.7.3.0 = STRING: "Active"
+# .1.3.6.1.4.1.2620.1.16.22.1.1.8.3.0 = STRING: "Trust established"
+# .1.3.6.1.4.1.2620.1.16.22.1.1.9.3.0 = STRING: "Standby"
+# .1.3.6.1.4.1.2620.1.16.22.1.1.10.3.0 = Gauge32: 0
+#
+# .1.3.6.1.4.1.2620.1.16.23.1.1.2.3.0 = Gauge32: 40
+# .1.3.6.1.4.1.2620.1.16.23.1.1.3.3.0 = Gauge32: 864
+# .1.3.6.1.4.1.2620.1.16.23.1.1.4.3.0 = Gauge32: 14900
+# .1.3.6.1.4.1.2620.1.16.23.1.1.5.3.0 = STRING: "69459"
+# .1.3.6.1.4.1.2620.1.16.23.1.1.6.3.0 = STRING: "2405"
+# .1.3.6.1.4.1.2620.1.16.23.1.1.7.3.0 = STRING: "67054"
+# .1.3.6.1.4.1.2620.1.16.23.1.1.8.3.0 = STRING: "0"
+# .1.3.6.1.4.1.2620.1.16.23.1.1.9.3.0 = STRING: "4228862"
+# .1.3.6.1.4.1.2620.1.16.23.1.1.10.3.0 = STRING: "72445"
+# .1.3.6.1.4.1.2620.1.16.23.1.1.11.3.0 = STRING: "0"
+# .1.3.6.1.4.1.2620.1.16.23.1.1.12.3.0 = STRING: "7074"
+# .1.3.6.1.4.1.2620.1.16.23.1.1.13.3.0 = INTEGER: 0
+#
+import time
+from dataclasses import dataclass
+from typing import List, Dict, Optional, Tuple
+
+from cmk.base.plugins.agent_based.agent_based_api.v1 import (
+    register,
+    Service,
+    Result,
+    State,
+    SNMPTree,
+    all_of,
+    startswith,
+    any_of,
+    equals,
+    Metric,
+    get_value_store,
+    get_rate,
+    GetRateError,
+)
+from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
+    DiscoveryResult,
+    CheckResult,
+    StringTable,
+)
+
+
+@dataclass
+class CheckpointVsx:
+    vsxStatusVSId: str
+    vsxStatusVsType: str
+    vsxStatusMainIP: str
+    vsxStatusPolicyName: str
+    vsxStatusVsPolicyType: str
+    vsxStatusSicTrustState: str
+    vsxStatusHAState: str
+    vsxStatusVSWeight: str
+    vsxCountersConnNum: int
+    vsxCountersConnPeakNum: int
+    vsxCountersConnTableLimit: int
+    vsxCountersIsDataValid: str
+    metrics_rate: List[Tuple[str, int]]
+
+
+def parse_checkpoint_vsx(string_table: StringTable) -> Optional[Dict[str, CheckpointVsx]]:
+    vsx_systems = {}
+    for entry in string_table:
+        try:
+            vsxStatusVSId, vsxStatusVsName, vsxStatusVsType, vsxStatusMainIP, vsxStatusPolicyName, vsxStatusVsPolicyType, \
+            vsxStatusSicTrustState, vsxStatusHAState, vsxStatusVSWeight, vsxCountersConnNum, vsxCountersConnPeakNum, \
+            vsxCountersConnTableLimit, vsxCountersPackets, vsxCountersDroppedTotal, vsxCountersAcceptedTotal, \
+            vsxCountersRejectedTotal, vsxCountersBytesAcceptedTotal, vsxCountersBytesDroppedTotal, \
+            vsxCountersBytesRejectedTotal, vsxCountersLoggedTotal, vsxCountersIsDataValid = entry
+        except ValueError:
+            return
+        if vsxStatusVsType.lower in ['virtual system']:  # , 'vsx gateway', 'virtual switch', 'virtual router'
+            vsx_systems[vsxStatusVsName] = CheckpointVsx(
+                vsxStatusVSId=vsxStatusVSId,
+                vsxStatusVsType=vsxStatusVsType,
+                vsxStatusMainIP=vsxStatusMainIP,
+                vsxStatusPolicyName=vsxStatusPolicyName,
+                vsxStatusVsPolicyType=vsxStatusVsPolicyType,
+                vsxStatusSicTrustState=vsxStatusSicTrustState,
+                vsxStatusHAState=vsxStatusHAState,
+                vsxStatusVSWeight=vsxStatusVSWeight,
+                vsxCountersConnNum=int(vsxCountersConnNum),
+                vsxCountersConnPeakNum=int(vsxCountersConnPeakNum),
+                vsxCountersConnTableLimit=int(vsxCountersConnTableLimit),
+                vsxCountersIsDataValid=vsxCountersIsDataValid,
+                metrics_rate=[
+                    ('vsxCountersPackets', int(vsxCountersPackets)),
+                    ('vsxCountersDroppedTotal', int(vsxCountersDroppedTotal)),
+                    ('vsxCountersAcceptedTotal', int(vsxCountersAcceptedTotal)),
+                    ('vsxCountersRejectedTotal', int(vsxCountersRejectedTotal)),
+                    ('vsxCountersBytesAcceptedTotal', int(vsxCountersBytesAcceptedTotal)),
+                    ('vsxCountersBytesDroppedTotal', int(vsxCountersBytesDroppedTotal)),
+                    ('vsxCountersBytesRejectedTotal', int(vsxCountersBytesRejectedTotal)),
+                    ('vsxCountersLoggedTotal', int(vsxCountersLoggedTotal)),
+                ],
+            )
+    return vsx_systems
+
+
+def discovery_checkpoint_vsx(section: Dict[str, CheckpointVsx]) -> DiscoveryResult:
+    for key in section.keys():
+        yield Service(
+            item=key,
+            parameters={'policyname': section[key].vsxStatusPolicyName, 'ha_state': section[key].vsxStatusHAState}
+        )
+
+
+def check_checkpoint_vsx(item, params, section: Dict[str, CheckpointVsx]) -> CheckResult:
+    try:
+        vsx = section[item]
+    except KeyError:
+        yield Result(state=State.UNKNOWN, notice='Item not found in SNMP data')
+        return
+
+    now_time = time.time()
+    value_store = get_value_store()
+    raise_ingore_res = False
+
+    for key, value in vsx.metrics_rate:
+        try:
+            value = get_rate(value_store, f'checkpoint_vsx_{key}', now_time, int(value), raise_overflow=True)
+        except GetRateError:
+            raise_ingore_res = True
+            value = 0
+        yield Metric(name=f'checkpoint_vsx_{key}', value=value, boundaries=(0, None))
+
+    # system information
+    yield Result(state=State.OK, summary=f'IP: {vsx.vsxStatusMainIP}, VS ID: {vsx.vsxStatusVSId}')
+    # Counters
+    # infotext = f'Connections: {vsx.vsxCountersConnNum:.0f}, ' \
+    #            f'Packets prosessed: {vsx.vsxCountersPackets:.0f}/s, ' \
+    #            f'Logs send: {vsx.vsxCountersLoggedTotal:0.2f}/s')
+
+    yield Result(state=State.OK, notice=f'System name: {item}')
+    yield Result(state=State.OK, notice=f'H/A status: {vsx.vsxStatusHAState}')
+    yield Result(state=State.OK, notice=f'Virtual system ID {vsx.vsxStatusVSId}')
+    yield Result(state=State.OK, notice=f'Type {vsx.vsxStatusVsType}')
+    yield Result(state=State.OK, notice=f'Weight {vsx.vsxStatusVSWeight}')
+    yield Result(state=State.OK, notice=f'Main IP {vsx.vsxStatusMainIP}')
+    yield Result(state=State.OK, notice=f'Policy name {vsx.vsxStatusPolicyName}')
+    yield Result(state=State.OK, notice=f'Policy type {vsx.vsxStatusVsPolicyType}')
+    yield Result(state=State.OK, notice=f'SIC status {vsx.vsxStatusSicTrustState}')
+
+    yield Result(state=State.OK, notice=f'Conn table limit {vsx.vsxCountersConnTableLimit}')
+    yield Result(state=State.OK, notice=f'Is data valid {vsx.vsxCountersIsDataValid}')
+
+    if vsx.vsxCountersConnTableLimit > 0:
+        yield Metric(value=vsx.vsxCountersConnNum, name='connections', boundaries=(0, vsx.vsxCountersConnTableLimit))
+    else:
+        yield Metric(value=vsx.vsxCountersConnNum, name='connections')
+    yield Metric(value=vsx.vsxCountersConnPeakNum, name='connections_peak')
+
+    if not vsx.vsxStatusHAState.lower() in ['active', 'standby']:
+        yield Result(state=State.WARN, notice=f'Status: {vsx.vsxStatusHAState}')
+    else:
+        yield Result(state=State.OK, summary=f'Status: {vsx.vsxStatusHAState}')
+    if not vsx.vsxStatusSicTrustState.lower() in ['trust established']:
+        yield Result(state=State.WARN, notice='SIC not established')
+    if not vsx.vsxStatusVsPolicyType.lower() in ['active']:
+        yield Result(state=State.CRIT, notice='No policy installed')
+    if params.get('policyname', 'unknown') != vsx.vsxStatusPolicyName:
+        yield Result(
+            state=State.WARN,
+            notice=f'Policy name changed: expected {params["policyname"]}, found {vsx.vsxStatusPolicyName}'
+        )
+    if params.get('ha_state', 'unknown') != vsx.vsxStatusHAState:
+        yield Result(
+            state=State.WARN,
+            notice=f'State changed: expected/found {params["ha_state"]}/{vsx.vsxStatusHAState}'
+        )
+
+
+register.snmp_section(
+    name='checkpoint_vsx',
+    parse_function=parse_checkpoint_vsx,
+    fetch=SNMPTree(
+        base='.1.3.6.1.4.1.2620.1.16',  # CHECKPOINT-MIB::vsxStatusVSId
+        oids=[
+            '22.1.1.3',  # vsxStatusVsName
+            '22.1.1.4',  # vsxStatusVsType
+            '22.1.1.5',  # vsxStatusMainIP
+            '22.1.1.6',  # vsxStatusPolicyName
+            '22.1.1.7',  # vsxStatusVsPolicyType
+            '22.1.1.8',  # vsxStatusSicTrustState
+            '22.1.1.9',  # vsxStatusHAState
+            '22.1.1.10',  # vsxStatusVSWeight
+            '23.1.1.2',  # vsxCountersConnNum
+            '23.1.1.3',  # vsxCountersConnPeakNum
+            '23.1.1.4',  # vsxCountersConnTableLimit
+            '23.1.1.5',  # vsxCountersPackets
+            '23.1.1.6',  # vsxCountersDroppedTotal
+            '23.1.1.7',  # vsxCountersAcceptedTotal
+            '23.1.1.8',  # vsxCountersRejectedTotal
+            '23.1.1.9',  # vsxCountersBytesAcceptedTotal
+            '23.1.1.10',  # vsxCountersBytesDroppedTotal
+            '23.1.1.11',  # vsxCountersBytesRejectedTotal
+            '23.1.1.12',  # vsxCountersLoggedTotal
+            '23.1.1.13',  # vsxCountersIsDataValid
+        ]),
+
+    detect=  # all_of(
+    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'),
+        )
+    ),
+    # startswith('.1.3.6.1.4.1.2620.1.2.1.0', 'IPSec VPN')
+    # )
+)
+
+register.check_plugin(
+    name='checkpoint_vsx',
+    service_name='VSX System %s',
+    discovery_function=discovery_checkpoint_vsx,
+    check_function=check_checkpoint_vsx,
+    check_ruleset_name='checkpoint_vsx',
+    check_default_parameters={
+        'vsType': ['virtual system', 'vsx gateway', 'virtual switch', 'virtual router']
+    },
+)
diff --git a/checkpoint_vsx.mkp b/checkpoint_vsx.mkp
index 672988dba878c54172c89c07e3c596a955fb4a3a..b37c81fcaa6dccf918ba631d8ae0553f07af8a6f 100644
GIT binary patch
literal 4083
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
RPmd!+xo~mcE4p{@{{Ue5>%;&6

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

diff --git a/packages/checkpoint_vsx b/packages/checkpoint_vsx
index 81903a1..cd48699 100644
--- a/packages/checkpoint_vsx
+++ b/packages/checkpoint_vsx
@@ -1,11 +1,20 @@
-{'author': u'Th.L. (thl-cmk[at]outlook[dot]com)',
- 'description': u"Monitor status of virtual systems in Check Point vsx/vsls cluster.\n\n - creates one check for every virtual system. \n - check goes critical if virtual system status is not 'Active' or 'Standby'\n - longoutput gives details for each virtual system.\n - monitors VSX virtual system counters (connections/packets/bytes/logs).\n",
+{'author': 'Th.L. (thl-cmk[at]outlook[dot]com)',
+ 'description': 'Monitor status of virtual systems in Check Point vsx/vsls '
+                'cluster.\n'
+                '\n'
+                ' - creates one check for every virtual system. \n'
+                ' - check goes critical if virtual system status is not '
+                "'Active' or 'Standby'\n"
+                ' - longoutput gives details for each virtual system.\n'
+                ' - monitors VSX virtual system counters '
+                '(connections/packets/bytes/logs).\n',
  'download_url': 'https://thl-cmk.hopto.org',
- 'files': {'checks': ['checkpoint_vsx'],
+ 'files': {'agent_based': ['checkpoint_vsx.ps'],
            'web': ['plugins/metrics/checkpoint_vsx.py']},
  'name': 'checkpoint_vsx',
  'num_files': 2,
- 'title': u'Check Point VSX system status and counter',
- 'version': '20200608.v.0.2',
- 'version.min_required': '1.2.8b8',
- 'version.packaged': '1.4.0p38'}
\ No newline at end of file
+ 'title': 'Check Point VSX system status and counter',
+ 'version': '20210906.v.0.3',
+ 'version.min_required': '2.0.0',
+ 'version.packaged': '2021.07.14',
+ 'version.usable_until': None}
\ No newline at end of file
diff --git a/web/plugins/metrics/checkpoint_vsx.py b/web/plugins/metrics/checkpoint_vsx.py
index 11d39c5..a4700f2 100644
--- a/web/plugins/metrics/checkpoint_vsx.py
+++ b/web/plugins/metrics/checkpoint_vsx.py
@@ -1,5 +1,5 @@
-#!/usr/bin/python
-# -*- encoding: utf-8; py-indent-offset: 4 -*-
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
 #
 # License: GNU General Public License v2
 #
@@ -10,6 +10,13 @@
 # Check Point VSX status metrics plugin
 # checkpoint_vsx
 #
+from cmk.gui.i18n import _
+
+from cmk.gui.plugins.metrics import (
+    metric_info,
+    graph_info,
+    perfometer_info,
+)
 metric_info['checkpoint_vsx_connections'] = {
     'title': _('Connections active'),
     'unit': 'count',
@@ -83,15 +90,15 @@ check_metrics['check_mk-checkpoint_vsx'] = {
     'logges_send': {'name': 'checkpoint_vsx_logges_send', },
 }
 
-graph_info.append({
+graph_info['checkpoint_vsx_connections']={
     'title': _('Check Point VSX: Connections'),
     'metrics': [
         ('checkpoint_vsx_connections_peak', 'line'),
         ('checkpoint_vsx_connections', 'area'),
     ]
-})
+}
 
-graph_info.append({
+graph_info['checkpoint_vsx_packets']={
     'title': _('Check Point VSX: Packets'),
     'metrics': [
         ('checkpoint_vsx_packets_rejected', 'line'),
@@ -99,24 +106,23 @@ graph_info.append({
         ('checkpoint_vsx_packets_accepted', 'line'),
         ('checkpoint_vsx_packets_processed', 'line'),
     ]
-})
+}
 
-graph_info.append({
+graph_info['checkpoint_vsx_bytes']={
     'title': _('Check Point VSX: Bytes'),
     'metrics': [
         ('checkpoint_vsx_bytes_rejected', 'line'),
         ('checkpoint_vsx_bytes_dropped', 'line'),
         ('checkpoint_vsx_bytes_accepted', 'line'),
     ]
-})
+}
 
-graph_info.append({
+graph_info['checkpoint_vsx_logges_send']={
     'title': _('Check Point VSX: Logs'),
     'metrics': [
         ('checkpoint_vsx_logges_send', 'line'),
     ]
-})
-
+}
 
 perfometer_info.append(('stacked', [
     {
@@ -132,3 +138,4 @@ perfometer_info.append(('stacked', [
         'exponent': 2,
     },
 ]))
+
-- 
GitLab