From 827e3186cce9ba0122e00d67c11d5772b3a74f39 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Mon, 29 May 2023 16:35:05 +0200
Subject: [PATCH] update project

---
 agent_based/checkpoint_threat_emulation.py    |  21 +--
 ...kpoint_threat_emulation-0.2.0-20230529.mkp | Bin 0 -> 4991 bytes
 checkpoint_threat_emulation.mkp               | Bin 4998 -> 4991 bytes
 gui/metrics/checkpoint_threat_emulation.py    | 163 ++++++++++++++++++
 gui/wato/checkpoint_threat_emulation.py       |  60 +++++++
 packages/checkpoint_threat_emulation          |  11 +-
 6 files changed, 239 insertions(+), 16 deletions(-)
 create mode 100644 checkpoint_threat_emulation-0.2.0-20230529.mkp
 create mode 100644 gui/metrics/checkpoint_threat_emulation.py
 create mode 100644 gui/wato/checkpoint_threat_emulation.py

diff --git a/agent_based/checkpoint_threat_emulation.py b/agent_based/checkpoint_threat_emulation.py
index d17fff2..165816b 100644
--- a/agent_based/checkpoint_threat_emulation.py
+++ b/agent_based/checkpoint_threat_emulation.py
@@ -17,6 +17,7 @@
 # 2021-08-27: rewritten for CMK 2.0
 # 2022-09-08: fixed check_default_parameters
 #             fixed levels for remaining quota in cloud, use lower instead of upper
+# 2023-05-29: moved guis files to ~/local/lib/check_mk/gui/plugins/...
 #
 
 # snmpwalk sample
@@ -25,11 +26,11 @@
 #
 # [
 #  [
-#   [u'0%', u'0', u'up-to-date', u'Gateway is up to date.', u'1548979200', u'100000', u'100000', u'valid', u'ok',
-#    u'Quota subscription is valid', u'990002053', u'0', u'ok', u'']
+#   ['0%', '0', 'up-to-date', 'Gateway is up to date.', '1548979200', '100000', '100000', 'valid', 'ok',
+#    'Quota subscription is valid', '990002053', '0', 'ok', '']
 #   ],
 #  [
-#   [u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0']
+#   ['0', '0', '0', '0', '0', '0', '0', '0']
 #  ]
 # ]
 #
@@ -269,13 +270,13 @@ register.check_plugin(
 #     #
 #     # sample te_analysis
 #     #
-#     # [[u'1', u'Image', u'1afbde2e-d593-45a8-a686-6cbd42f37823', u'', u'0', u'0', u'0', u'0', u'0', u'0', u'0'],
-#     #  [u'2', u'Image', u'1b0c5014-714d-47f3-9b10-0b7ee386e745', u'', u'0', u'0', u'0', u'0', u'0', u'0', u'0'],
-#     #  [u'3', u'Image', u'5e5de275-a103-4f67-b55b-47532918fa59', u'Win7,Office 2013,Adobe 11', u'0', u'0', u'0', u'0', u'0', u'0', u'0'],
-#     #  [u'4', u'Image', u'e50e99f3-5963-4573-af9e-e3f4750b55e2', u'WinXP,Office 2003/7,Adobe 9', u'0', u'0', u'0', u'0', u'0', u'0', u'0'],
-#     #  [u'5', u'Detection Rules', u'5e5de275-a103-4f67-b55b-47532918fa59', u'Win7,Office 2013,Adobe 11', u'56431', u'46960', u'Thu Mar 15 08:39:31 2018', u'0', u'0', u'0', u'0'],
-#     #  [u'6', u'Detection Rules', u'e50e99f3-5963-4573-af9e-e3f4750b55e2', u'WinXP,Office 2003/7,Adobe 9', u'56431', u'52602', u'Thu Mar 15 08:39:26 2018', u'0', u'0', u'0', u'0'],
-#     #  [u'7', u'Static Analysis Rules', u'496149D5-0689-472B-8F50-21DD409F0EC6', u'Static Analysis Detection Rules', u'53030', u'25049', u'Thu Mar 15 08:39:24 2018', u'0', u'0', u'0', u'0']]
+#     # [['1', 'Image', '1afbde2e-d593-45a8-a686-6cbd42f37823', '', '0', '0', '0', '0', '0', '0', '0'],
+#     #  ['2', 'Image', '1b0c5014-714d-47f3-9b10-0b7ee386e745', '', '0', '0', '0', '0', '0', '0', '0'],
+#     #  ['3', 'Image', '5e5de275-a103-4f67-b55b-47532918fa59', 'Win7,Office 2013,Adobe 11', '0', '0', '0', '0', '0', '0', '0'],
+#     #  ['4', 'Image', 'e50e99f3-5963-4573-af9e-e3f4750b55e2', 'WinXP,Office 2003/7,Adobe 9', '0', '0', '0', '0', '0', '0', '0'],
+#     #  ['5', 'Detection Rules', '5e5de275-a103-4f67-b55b-47532918fa59', 'Win7,Office 2013,Adobe 11', '56431', '46960', 'Thu Mar 15 08:39:31 2018', '0', '0', '0', '0'],
+#     #  ['6', 'Detection Rules', 'e50e99f3-5963-4573-af9e-e3f4750b55e2', 'WinXP,Office 2003/7,Adobe 9', '56431', '52602', 'Thu Mar 15 08:39:26 2018', '0', '0', '0', '0'],
+#     #  ['7', 'Static Analysis Rules', '496149D5-0689-472B-8F50-21DD409F0EC6', 'Static Analysis Detection Rules', '53030', '25049', 'Thu Mar 15 08:39:24 2018', '0', '0', '0', '0']]
 #     #
 #     #  eher fuer inventory (?)
 #     #
diff --git a/checkpoint_threat_emulation-0.2.0-20230529.mkp b/checkpoint_threat_emulation-0.2.0-20230529.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..3b8da48a1fa7ed59c7ae9dcafd7ff15ad9b1617b
GIT binary patch
literal 4991
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
VhWNiGaZ&`X2DWB8$^;6^e*jh;fv5lg

literal 0
HcmV?d00001

diff --git a/checkpoint_threat_emulation.mkp b/checkpoint_threat_emulation.mkp
index 14504dfd7880a29ca5139855f5b8b4828b4ce668..3b8da48a1fa7ed59c7ae9dcafd7ff15ad9b1617b 100644
GIT binary patch
literal 4991
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
VhWNiGaZ&`X2DWB8$^;6^e*jh;fv5lg

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

diff --git a/gui/metrics/checkpoint_threat_emulation.py b/gui/metrics/checkpoint_threat_emulation.py
new file mode 100644
index 0000000..81d8fa8
--- /dev/null
+++ b/gui/metrics/checkpoint_threat_emulation.py
@@ -0,0 +1,163 @@
+#!/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  : 2018-03-19
+#
+# Check Point Threat Emulation metrics plugin
+# checkpoint_threat_emulation
+#
+
+from cmk.gui.i18n import _
+
+from cmk.gui.plugins.metrics.utils import (
+    metric_info,
+    graph_info,
+    perfometer_info,
+)
+
+metric_info['checkpoint_threat_emulation_remaining_quota_on_cloud'] = {
+    'title': _('Remaining quota on cloud'),
+    'unit': 'count',
+    'color': '11/a',
+}
+metric_info['checkpoint_threat_emulation_monthly_quota_on_cloud_used'] = {
+    'title': _('Used monthly quota on cloud'),
+    'unit': '%',
+    'color': '12/a',
+}
+metric_info['checkpoint_threat_emulation_current_files_waiting_for_emulation'] = {
+    'title': _('Files waiting for emulation'),
+    'unit': 'count',
+    'color': '13/a',
+}
+
+metric_info['checkpoint_threat_emulation_scanned_files_current'] = {
+    'title': _('Scanned files (current)'),
+    'unit': 'count',
+    'color': '14/a',
+}
+
+metric_info['checkpoint_threat_emulation_malicious_files_detected_current'] = {
+    'title': _('Malicious files detected (current)'),
+    'unit': 'count',
+    'color': '15/a',
+}
+
+metric_info['checkpoint_threat_emulation_files_scanned_by_threat_cloud_current'] = {
+    'title': _('Files scanned by threat cloud (current)'),
+    'unit': 'count',
+    'color': '16/a',
+}
+
+metric_info['checkpoint_threat_emulation_malicious_files_detected_by_threat_cloud_current'] = {
+    'title': _('Malicious files detected by threat cloud (current)'),
+    'unit': 'count',
+    'color': '21/a',
+}
+
+metric_info['checkpoint_threat_emulation_average_process_time_current'] = {
+    'title': _('Average process time (current)'),
+    'unit': 's',
+    'color': '22/a',
+}
+
+metric_info['checkpoint_threat_emulation_average_emulated_file_size_current'] = {
+    'title': _('Average emulated file size (current)'),
+    'unit': 'bytes',
+    'color': '23/a',
+}
+
+metric_info['checkpoint_threat_emulation_average_queue_size_current'] = {
+    'title': _('Average queue size (current)'),
+    'unit': 'count',
+    'color': '24/a',
+}
+
+metric_info['checkpoint_threat_emulation_peak_queue_size_current'] = {
+    'title': _('Peak queue size (current)'),
+    'unit': 'count',
+    'color': '25/a',
+}
+
+graph_info['checkpoint_threat_emulation_remaining_quota_on_cloud'] = {
+    'title': _('Check Point Threat Emulation remaining quota on cloud'),
+    'metrics': [
+        ('checkpoint_threat_emulation_remaining_quota_on_cloud', 'line'),
+    ],
+    'scalars': [
+        ('checkpoint_threat_emulation_remaining_quota_on_cloud:crit'),
+        ('checkpoint_threat_emulation_remaining_quota_on_cloud:warn'),
+    ],
+}
+graph_info['checkpoint_threat_emulation_monthly_quota_on_cloud_used'] = {
+    'title': _('Check Point Threat Emulation monthly used quota on cloud used'),
+    'metrics': [
+        ('checkpoint_threat_emulation_monthly_quota_on_cloud_used', 'line'),
+    ],
+    'scalars': [
+        ('checkpoint_threat_emulation_monthly_quota_on_cloud_used:crit'),
+        ('checkpoint_threat_emulation_monthly_quota_on_cloud_used:warn'),
+    ],
+}
+graph_info['checkpoint_threat_emulation_current_files_waiting_for_emulation'] = {
+    'title': _('Check Point Threat Emulation files waiting for emulation'),
+    'metrics': [
+        ('checkpoint_threat_emulation_current_files_waiting_for_emulation', 'line'),
+    ],
+    'scalars': [
+        ('checkpoint_threat_emulation_current_files_waiting_for_emulation:crit'),
+        ('checkpoint_threat_emulation_current_files_waiting_for_emulation:warn'),
+    ],
+}
+graph_info['checkpoint_threat_emulation_scanned_files_current'] = {
+    'title': _('Check Point Threat Emulation scanned files'),
+    'metrics': [
+        ('checkpoint_threat_emulation_scanned_files_current', 'line'),
+    ],
+}
+graph_info['checkpoint_threat_emulation_malicious_files_detected_current'] = {
+    'title': _('Check Point Threat Emulation malicious files detected'),
+    'metrics': [
+        ('checkpoint_threat_emulation_malicious_files_detected_current', 'line'),
+    ],
+}
+graph_info['checkpoint_threat_emulation_files_scanned_by_threat_cloud_current'] = {
+    'title': _('Check Point Threat Emulation files scanned by Threat Cloud'),
+    'metrics': [
+        ('checkpoint_threat_emulation_files_scanned_by_threat_cloud_current', 'line'),
+    ],
+}
+graph_info['checkpoint_threat_emulation_malicious_files_detected_by_threat_cloud_current'] = {
+    'title': _('Check Point Threat Emulation malicious files detected by Threat Cloud'),
+    'metrics': [
+        ('checkpoint_threat_emulation_malicious_files_detected_by_threat_cloud_current', 'line'),
+    ],
+}
+graph_info['checkpoint_threat_emulation_average_process_time_current'] = {
+    'title': _('Check Point Threat Emulation average process time'),
+    'metrics': [
+        ('checkpoint_threat_emulation_average_process_time_current', 'line'),
+    ],
+}
+graph_info['checkpoint_threat_emulation_average_emulated_file_size_current'] = {
+    'title': _('Check Point Threat Emulation average emulated file size'),
+    'metrics': [
+        ('checkpoint_threat_emulation_average_emulated_file_size_current', 'line'),
+    ],
+}
+graph_info['checkpoint_threat_emulation_average_queue_size_current'] = {
+    'title': _('Check Point Threat Emulation average queue size'),
+    'metrics': [
+        ('checkpoint_threat_emulation_average_queue_size_current', 'line'),
+    ],
+}
+graph_info['checkpoint_threat_emulation_peak_queue_size_current'] = {
+    'title': _('Check Point Threat Emulation peak queue size'),
+    'metrics': [
+        ('checkpoint_threat_emulation_peak_queue_size_current', 'line'),
+    ],
+}
diff --git a/gui/wato/checkpoint_threat_emulation.py b/gui/wato/checkpoint_threat_emulation.py
new file mode 100644
index 0000000..9d5a3d7
--- /dev/null
+++ b/gui/wato/checkpoint_threat_emulation.py
@@ -0,0 +1,60 @@
+#!/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
+#
+# 2022-11-30: fixed CheckParameterRulespecWithoutItem (from CheckParameterRulespecWithItem)'
+
+from cmk.gui.i18n import _
+from cmk.gui.valuespec import (
+    Dictionary,
+    Tuple,
+    Integer,
+)
+
+from cmk.gui.plugins.wato.utils import (
+    CheckParameterRulespecWithoutItem,
+    rulespec_registry,
+    RulespecGroupCheckParametersNetworking,
+)
+
+
+def _parameter_valuespec_checkpoint_threat_emulation():
+    return Dictionary(
+        elements=[
+            ('used_monthly_quota_levels',
+             Tuple(
+                 title=_('Levels for used monthly quota on cloud'),
+                 elements=[
+                     Integer(title=_('Warning at'), default_value=90, unit=_('%')),
+                     Integer(title=_('Critical at'), default_value=95, unit=_('%')),
+                 ])),
+            ('remaining_quota_levels',
+             Tuple(
+                 title=_('Levels for remaining quota on cloud'),
+                 elements=[
+                     Integer(title=_('Warning at'), default_value=10000, unit=_('Files')),
+                     Integer(title=_('Critical at'), default_value=5000, unit=_('Files')),
+                 ])),
+            ('files_waiting_levels',
+             Tuple(
+                 title=_('Levels for files waiting for emulation'),
+                 elements=[
+                     Integer(title=_('Warning at'), default_value=5, unit=_('Files')),
+                     Integer(title=_('Critical at'), default_value=10, unit=_('Files')),
+                 ])),
+        ],
+    )
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithoutItem(
+        check_group_name='checkpoint_threat_emulation',
+        group=RulespecGroupCheckParametersNetworking,
+        match_type='dict',
+        parameter_valuespec=_parameter_valuespec_checkpoint_threat_emulation,
+        title=lambda: _('Check Point Threat Emulation status'),
+    ))
diff --git a/packages/checkpoint_threat_emulation b/packages/checkpoint_threat_emulation
index fd231cb..52eb521 100644
--- a/packages/checkpoint_threat_emulation
+++ b/packages/checkpoint_threat_emulation
@@ -10,12 +10,11 @@
                 'subscription\n',
  'download_url': 'https://thl-cmk.hopto.org',
  'files': {'agent_based': ['checkpoint_threat_emulation.py'],
-           'web': ['plugins/metrics/checkpoint_threat_emulation.py',
-                   'plugins/wato/checkpoint_threat_emulation.py']},
+           'gui': ['metrics/checkpoint_threat_emulation.py',
+                   'wato/checkpoint_threat_emulation.py']},
  'name': 'checkpoint_threat_emulation',
- 'num_files': 3,
  'title': 'Check Point Threat Emulation',
- 'version': '20221130.v.0.0.3c',
- 'version.min_required': '2.0.0',
- 'version.packaged': '2021.09.20',
+ 'version': '0.2.0-20230529',
+ 'version.min_required': '2.1.0b1',
+ 'version.packaged': '2.1.0p21',
  'version.usable_until': None}
\ No newline at end of file
-- 
GitLab