From 57e7227470aef691f744777eb62b7443df587ac6 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Mon, 26 Jun 2023 19:23:49 +0200
Subject: [PATCH] update project

---
 agent_based/checkpoint_vsx_system.py          |  51 ++------
 checkman/checkpoint_vsx_system                |  51 +++-----
 checkpoint_vsx_system-0.5.1-20230626.mkp      | Bin 0 -> 7797 bytes
 checkpoint_vsx_system.mkp                     | Bin 0 -> 7797 bytes
 gui/metrics/checkpoint_vsx_system.py          | 118 +++++++++++++++---
 .../check_parameters/checkpoint_vsx_system.py |   7 +-
 packages/checkpoint_vsx_system                |  42 +++++--
 7 files changed, 163 insertions(+), 106 deletions(-)
 create mode 100644 checkpoint_vsx_system-0.5.1-20230626.mkp
 create mode 100644 checkpoint_vsx_system.mkp

diff --git a/agent_based/checkpoint_vsx_system.py b/agent_based/checkpoint_vsx_system.py
index 8dfb77a..e9b0086 100644
--- a/agent_based/checkpoint_vsx_system.py
+++ b/agent_based/checkpoint_vsx_system.py
@@ -26,7 +26,8 @@
 # 2023-06-17: added support for predicted levels for connection active
 #             changed bytes/packets metrics to check_levels/check_levels_predictive
 # 2023-06-18: cleanup variable names to better meet python standards
-#
+# 2023-06-23: fixed _render_per_second to output non scientific format
+#             changed _render_per_second to match output in metrics
 
 #
 # snmpwalk sample
@@ -55,50 +56,16 @@
 # .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
 #
-# sample section
-# section = {
-#     'VSXGateway': CheckpointVsx(
-#         vsxStatusVSId='0', vsxStatusVsType='VSX Gateway', vsxStatusMainIP='10.10.2.3',
-#         vsxStatusPolicyName='Policy1', vsxStatusVsPolicyType='Active',
-#         vsxStatusSicTrustState='Trust established', vsxStatusHAState='Active',
-#         vsxStatusVSWeight='0', vsxCountersConnNum=31, vsxCountersConnPeakNum=140,
-#         vsxCountersConnTableLimit=14900,
-#         metrics_rate=[
-#             ('packets_processed', 315101), ('packets_dropped', 23),
-#             ('packets_accepted', 315078), ('packets_rejected', 0),
-#             ('bytes_accepted', 196127045), ('bytes_dropped', 1380),
-#             ('bytes_rejected', 0), ('loggs_send', 534)]
-#     ),
-#     'VSSwitch': CheckpointVsx(
-#         vsxStatusVSId='2', vsxStatusVsType='Virtual Switch', vsxStatusMainIP='N/A',
-#         vsxStatusPolicyName='InitialPolicy', vsxStatusVsPolicyType='Initial Policy',
-#         vsxStatusSicTrustState='Trust established', vsxStatusHAState='N/A',
-#         vsxStatusVSWeight='0', vsxCountersConnNum=0, vsxCountersConnPeakNum=0,
-#         vsxCountersConnTableLimit=900,
-#         metrics_rate=[
-#             ('packets_processed', 0), ('packets_dropped', 0),
-#             ('packets_accepted', 0), ('packets_rejected', 0),
-#             ('bytes_accepted', 0), ('bytes_dropped', 0),
-#             ('bytes_rejected', 0), ('loggs_send', 3)]),
-#     'VirtualSystem': CheckpointVsx(
-#         vsxStatusVSId='3', vsxStatusVsType='Virtual System',
-#         vsxStatusMainIP='10.10.30.33', vsxStatusPolicyName='Standard',
-#         vsxStatusVsPolicyType='Active', vsxStatusSicTrustState='Trust established',
-#         vsxStatusHAState='Standby', vsxStatusVSWeight='0', vsxCountersConnNum=58,
-#         vsxCountersConnPeakNum=575, vsxCountersConnTableLimit=999900,
-#         metrics_rate=[
-#             ('packets_processed', 9632), ('packets_dropped', 119),
-#             ('packets_accepted', 9513), ('packets_rejected', 0),
-#             ('bytes_accepted', 1494138), ('bytes_dropped', 3524),
-#             ('bytes_rejected', 0), ('loggs_send', 98)]),
-# }
-#
+
 
 import ipaddress
 import time
 from dataclasses import dataclass
 from typing import List, Dict, Optional, Any
 
+# import same render function as used for the metrics (undocumented for check API, and metrics as well)
+from cmk.utils.render import fmt_number_with_precision
+
 from cmk.base.plugins.agent_based.agent_based_api.v1 import (
     register,
     Service,
@@ -149,8 +116,10 @@ class CheckpointVsx:
     metrics_rate: List[VsxMetric]
 
 
+# render the /s in the same way as in the metrics
 def _render_per_second(value: float) -> str:
-    return f'{value:.2}/s'
+    return fmt_number_with_precision(value, drop_zeroes=True, unit="/s")
+    # return f'{value:.2f}/s'
 
 
 def parse_checkpoint_vsx_system(string_table: StringTable) -> Optional[Dict[str, CheckpointVsx]]:
@@ -334,7 +303,7 @@ def check_checkpoint_vsx_system(item, params, section: Dict[str, CheckpointVsx])
                 )
             except GetRateError:
                 continue
-            # yield Metric(name=f'checkpoint_vsx_{key}', value=value, boundaries=(0, None))
+
             yield from check_levels_predictive(
                 value=value,
                 metric_name=f'checkpoint_vsx_{metric.name}',
diff --git a/checkman/checkpoint_vsx_system b/checkman/checkpoint_vsx_system
index 7cf5bf2..da16eb1 100644
--- a/checkman/checkpoint_vsx_system
+++ b/checkman/checkpoint_vsx_system
@@ -1,43 +1,32 @@
-title: Check Point VSX gateway state monitoring
+title: Check Point VSX device
 agents: snmp
+catalog: hw/network/checkpoint
+license: GPLv2
+distribution: https://thl-cmk.hopto.org/gitlab/checkmk/check-point/gateway/checkpoint_vsx_system
 author: thl-cmk[at]outlook[dot]com
-catalog: see modules/catalog.py for possible values
-license: GPL
-distribution: check_mk
 description:
- This plugin monitors the state of Check Point VSX gateways.
- With default settings the VSX system gets {critical} if the H/A state is other than activ/standby,
- the SIC trust is not established or the policy type is not active. The monitoring state becomes
- {warning} if the policy name or the H/A state is differnet from discovery time. All this states are
- configurable via WATO.
+ This plugin monitors the state of Check Point VSX devices.
+
+ With default settings the VSX system gets {critical} if the H/A state is other than active/standby,
+ the SIC trust is not established or the policy type is not active.
+
+ The monitoring state becomes {warning} if the policy name or the H/A state is different from discovery time.
+
+ All this states are configurable via WATO.
 
 item:
- The system name.
+ The system name of the Virtual device.
+
+discovery:
+ One service is created for each Virtual device.
 
 perfdata:
- This plugin adds the following perfdata:
-  connections (count)
-  connections peak (count)
-  packets processed/s
-  packets dropped/s
-  packets accepted/s
-  packets rejected/s
-  bytes accepted/s
-  bytes dropped/s
-  bytes rejected/s
-  loggs send/s
+  One graph for connections active/peak/limit.
+  One graph for packets/s processed/dropped/accepted/rejected/.
+  One graph for bytes/s accepted/dropped/rejected,
+  One graph for loggs send/s
 
 inventory:
  By default the inventory will discover {Virtual Systems}. Via WATO you can change this to discover also
  the {VSX Gateway} itself, {Virtual Switches} and {Virtual Routers}.
 
-parameters:
-Here you can define all the monitoring states.
-        excample (default) parameters:
-        {
-         'state_sic_not_established': 2,   # SIC trust is not established
-         'state_ha_not_act_stb': 2,  #  H/A state is other than activ/standby
-         'state_policy_not_installed': 2,  # policy type is not active
-         'state_policy_changed': 1,  # policy name changed
-         'state_ha_changed': 1,  # H/A state changed
-        }
diff --git a/checkpoint_vsx_system-0.5.1-20230626.mkp b/checkpoint_vsx_system-0.5.1-20230626.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..b13b5cfbcb5a6bcf7b8d096183a935983423e903
GIT binary patch
literal 7797
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
bWc@#h>;Lff|41c^UO8F&dTijX;o$xkP{&Jp

literal 0
HcmV?d00001

diff --git a/checkpoint_vsx_system.mkp b/checkpoint_vsx_system.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..b13b5cfbcb5a6bcf7b8d096183a935983423e903
GIT binary patch
literal 7797
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
bWc@#h>;Lff|41c^UO8F&dTijX;o$xkP{&Jp

literal 0
HcmV?d00001

diff --git a/gui/metrics/checkpoint_vsx_system.py b/gui/metrics/checkpoint_vsx_system.py
index 55692d0..451acd0 100644
--- a/gui/metrics/checkpoint_vsx_system.py
+++ b/gui/metrics/checkpoint_vsx_system.py
@@ -7,18 +7,42 @@
 # URL   : https://thl-cmk.hopto.org
 # Date  : 2018-03-13
 #
-# Check Point VSX status metrics plugin
-# checkpoint_vsx
+# Check Point VSX status metrics plugin checkpoint_vsx_system
 #
+
+# 2023-06-23: made '/s' unit output non scientific readable numbers
+#             set predictive metrics to not auto graph
+# 2023-06-26: added definitions for predictive monitoring
+#
+
 from cmk.gui.i18n import _
 
 from cmk.gui.plugins.metrics.utils import (
+    unit_info,
     metric_info,
     graph_info,
     perfometer_info,
     check_metrics,
 )
 
+# make /s unit to use non scientific but readable numbers
+# 60.000.000  ->  becomes 60M/s instead of 6e+07/s
+from cmk.utils.render import fmt_number_with_precision
+from cmk.gui.valuespec import Integer
+
+unit_info["1/s_nonscientific"] = {
+    "title": _("per second"),
+    "description": _("Frequency (displayed in events/s)"),
+    "symbol": _("/s"),
+    # "render": lambda v: "{}{}".format(scientific(v, 2), _("/s")),
+    "render": lambda v: fmt_number_with_precision(v, drop_zeroes=True, unit="/s"),
+    # "js_render": "v => cmk.number_format.scientific(v, 2) + '/s'",
+    "js_render": "v => cmk.number_format.fmt_number_with_precision(v, cmk.number_format.SIUnitPrefixes, 2, true)"
+                 " + '/s'",
+    "stepping": "integer",  # for vertical graph labels
+    "valuespec": Integer,
+}
+
 metric_info['checkpoint_vsx_connections'] = {
     'title': _('Connections active'),
     'unit': 'count',
@@ -37,29 +61,29 @@ metric_info['checkpoint_vsx_connections_limit'] = {
 
 metric_info['checkpoint_vsx_packets_processed'] = {
     'title': _('Packets processed'),
-    'unit': '1/s',
-    'color': '12/a',
+    'unit': '1/s_nonscientific',
+    'color': '13/a',
 }
 metric_info['checkpoint_vsx_packets_dropped'] = {
     'title': _('Packets dropped'),
-    'unit': '1/s',
+    'unit': '1/s_nonscientific',
     'color': '22/a',
 }
 metric_info['checkpoint_vsx_packets_accepted'] = {
     'title': _('Packets accepted'),
-    'unit': '1/s',
+    'unit': '1/s_nonscientific',
     'color': '32/a',
 }
 metric_info['checkpoint_vsx_packets_rejected'] = {
     'title': _('Packets rejected'),
-    'unit': '1/s',
+    'unit': '1/s_nonscientific',
     'color': '42/a',
 }
 
 metric_info['checkpoint_vsx_bytes_accepted'] = {
     'title': _('Bytes accepted'),
     'unit': 'bytes/s',
-    'color': '13/a',
+    'color': '16/a',
 }
 metric_info['checkpoint_vsx_bytes_dropped'] = {
     'title': _('Bytes dropped'),
@@ -74,13 +98,73 @@ metric_info['checkpoint_vsx_bytes_rejected'] = {
 
 metric_info['checkpoint_vsx_loggs_send'] = {
     'title': _('Loggs send'),
-    'unit': '1/s',
+    'unit': '1/s_nonscientific',
     'color': '14/a',
 }
 
+metric_info['predict_checkpoint_vsx_connections'] = {
+    'title': _('Predicted Connections active'),
+    'unit': 'count',
+    'color': '26/b',
+}
+
+metric_info['predict_checkpoint_vsx_packets_processed'] = {
+    'title': _('Predicted Packets processed'),
+    'unit': '1/s_nonscientific',
+    'color': '13/b',
+}
+metric_info['predict_checkpoint_vsx_packets_dropped'] = {
+    'title': _('Predicted Packets dropped'),
+    'unit': '1/s_nonscientific',
+    'color': '22/b',
+}
+metric_info['predict_checkpoint_vsx_packets_accepted'] = {
+    'title': _('Predicted Packets accepted'),
+    'unit': '1/s_nonscientific',
+    'color': '32/b',
+}
+metric_info['predict_checkpoint_vsx_packets_rejected'] = {
+    'title': _('Predicted Packets rejected'),
+    'unit': '1/s_nonscientific',
+    'color': '42/b',
+}
+
+metric_info['predict_checkpoint_vsx_bytes_accepted'] = {
+    'title': _('Predicted Bytes accepted'),
+    'unit': 'bytes/s',
+    'color': '16/b',
+}
+metric_info['predict_checkpoint_vsx_bytes_dropped'] = {
+    'title': _('Predicted Bytes dropped'),
+    'unit': 'bytes/s',
+    'color': '23/b',
+}
+metric_info['predict_checkpoint_vsx_bytes_rejected'] = {
+    'title': _('Predicted Bytes rejected'),
+    'unit': 'bytes/s',
+    'color': '33/b',
+}
+
+metric_info['predict_checkpoint_vsx_loggs_send'] = {
+    'title': _('Predicted Loggs send'),
+    'unit': '1/s_nonscientific',
+    'color': '14/b',
+}
+
+
 check_metrics['check_mk-checkpoint_vsx_system'] = {
-    'checkpoint_vsx_connections_peak':  {'auto_graph': False},
-    'checkpoint_vsx_connections_limit':  {'auto_graph': False},
+    'checkpoint_vsx_connections_peak': {'auto_graph': False},
+    'checkpoint_vsx_connections_limit': {'auto_graph': False},
+    # no autograph for predictive monitoring
+    'predict_checkpoint_vsx_connections': {'auto_graph': False},
+    'predict_checkpoint_vsx_packets_processed': {'auto_graph': False},
+    'predict_checkpoint_vsx_packets_dropped': {'auto_graph': False},
+    'predict_checkpoint_vsx_packets_accepted': {'auto_graph': False},
+    'predict_checkpoint_vsx_packets_rejected': {'auto_graph': False},
+    'predict_checkpoint_vsx_bytes_accepted': {'auto_graph': False},
+    'predict_checkpoint_vsx_bytes_dropped': {'auto_graph': False},
+    'predict_checkpoint_vsx_bytes_rejected': {'auto_graph': False},
+    'predict_checkpoint_vsx_loggs_send': {'auto_graph': False},
 }
 
 graph_info['checkpoint_vsx_connections'] = {
@@ -109,9 +193,9 @@ graph_info['checkpoint_vsx_packets'] = {
 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'),
+        ('checkpoint_vsx_bytes_rejected', 'stack'),
+        ('checkpoint_vsx_bytes_dropped', 'stack'),
+        ('checkpoint_vsx_bytes_accepted', 'stack'),
     ]
 }
 
@@ -126,13 +210,13 @@ perfometer_info.append(('stacked', [
     {
         'type': 'logarithmic',
         'metric': 'checkpoint_vsx_connections',
-        'half_value': 50000.0,
+        'half_value': 1000000.0,
         'exponent': 2,
     },
     {
         'type': 'logarithmic',
-        'metric': 'checkpoint_vsx_packets_processed',
-        'half_value': 50000.0,
+        'metric': 'checkpoint_vsx_bytes_accepted',
+        'half_value': 10000000.0,
         'exponent': 2,
     },
 ]))
diff --git a/gui/wato/check_parameters/checkpoint_vsx_system.py b/gui/wato/check_parameters/checkpoint_vsx_system.py
index f9ad001..804353c 100644
--- a/gui/wato/check_parameters/checkpoint_vsx_system.py
+++ b/gui/wato/check_parameters/checkpoint_vsx_system.py
@@ -16,8 +16,6 @@ from cmk.gui.i18n import _
 from cmk.gui.valuespec import (
     Dictionary,
     TextAscii,
-    Tuple,
-    Integer,
     MonitoringState,
     ListChoice,
     TextUnicode,
@@ -63,7 +61,9 @@ def _parameter_valuespec_checkpoint_vsx_system():
             ('state_sic_not_established',
              MonitoringState(
                  title=_('State if SIC is not established'),
-                 help=_('Monitoring state if SIC (Secure Internal Communication) is not established. Default is "CRIT"'),
+                 help=_(
+                     'Monitoring state if SIC (Secure Internal Communication) is not established. Default is "CRIT"'
+                 ),
                  default_value=2,
              )),
             ('levels_bytes_accepted', Levels(title=_('Levels for Bytes Accepted'), unit=_('Bytes/s'), )),
@@ -77,7 +77,6 @@ def _parameter_valuespec_checkpoint_vsx_system():
             ('levels_packets_processed', Levels(title=_('Levels for Packets Processed'), unit=_('Packets/s'), )),
             # added by plugin discovery function -> hidden key
             ('policyname', TextUnicode()),
-            # added by plugin discovery function -> hidden key
             ('ha_state', TextUnicode()),
         ],
         hidden_keys=['policyname', 'ha_state'],
diff --git a/packages/checkpoint_vsx_system b/packages/checkpoint_vsx_system
index 65f7d43..52b851b 100644
--- a/packages/checkpoint_vsx_system
+++ b/packages/checkpoint_vsx_system
@@ -1,24 +1,40 @@
 {'author': 'Th.L. (thl-cmk[at]outlook[dot]com)',
- 'description': 'Monitor status of virtual systems in Check Point vsx/vsls '
-                'cluster.\n'
+ 'description': 'Monitors the status of a Check Point VSX/VSLS system\n'
                 '\n'
-                ' - creates one check for each virtual system. \n'
-                ' - check goes critical if virtual system status is not '
-                "'Active' or 'Standby'\n"
-                ' - long output gives details for each virtual system.\n'
-                ' - monitors VSX virtual system counters '
-                '(connections/packets/bytes/logs).\n'
-                ' - supersedes checkpoint_vsx, checkpoint_vsx_connections, '
-                'checkpoint_vsx_traffic, checkpoint_vsx_packets and '
-                'checkpoint_vsx_status\n',
+                ' - creates one service for each discovered system (see '
+                'Discovery rules)\n'
+                '   Virtual Systems, VSX Gateways,  Virtual Routers, Virtual '
+                'Switches \n'
+                ' - long output includes:\n'
+                '    System name, Main IP, VS ID and type, HA status, SIC '
+                'status, Weight, Policy name and type\n'
+                ' - performance data include:\n'
+                '    Connections: active/peak/limit\n'
+                '    Packets /s: processed/accepted/dropped/rejected\n'
+                '    Bytes /s: accepted/dropped/rejected\n'
+                '    Logs send /s\n'
+                ' - all performance data allow predictive monitoring\n'
+                ' - monitoring state can be configured for\n'
+                '    HA state not Active/Standby\n'
+                '    HA state has changed from discovery time\n'
+                '    no policy installed\n'
+                '    policy name has changed\n'
+                '    SIC is not established\n'
+                ' - supersedes the build in checks\n'
+                '    checkpoint_vsx\n'
+                '    checkpoint_vsx_connections\n'
+                '    checkpoint_vsx_traffic\n'
+                '    checkpoint_vsx_packets\n'
+                '    checkpoint_vsx_status\n'
+                ' \n',
  'download_url': 'https://thl-cmk.hopto.org/gitlab/checkmk/check-point/gateway/checkpoint_vsx_system',
  'files': {'agent_based': ['checkpoint_vsx_system.py'],
            'checkman': ['checkpoint_vsx_system'],
            'gui': ['metrics/checkpoint_vsx_system.py',
                    'wato/check_parameters/checkpoint_vsx_system.py']},
  'name': 'checkpoint_vsx_system',
- 'title': 'Check Point VSX system status and counter',
- 'version': '0.5.0-20230619',
+ 'title': 'Check Point VSX status and counters',
+ 'version': '0.5.1-20230626',
  'version.min_required': '2.1.0b1',
  'version.packaged': '2.2.0p2',
  'version.usable_until': None}
-- 
GitLab