From f298847ba127032529a81466ca6df92f03dc02ab Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Wed, 29 Sep 2021 17:55:38 +0200
Subject: [PATCH] update project

---
 agent_based/checkpoint_asg_sg_diag.py      | 233 +++++++++++++++++++++
 checkpoint_asg_sg_diag.mkp                 | Bin 0 -> 3614 bytes
 packages/checkpoint_asg_sg_diag            |  13 ++
 web/plugins/wato/checkpoint_asg_sg_diag.py |  67 ++++++
 4 files changed, 313 insertions(+)
 create mode 100644 agent_based/checkpoint_asg_sg_diag.py
 create mode 100644 checkpoint_asg_sg_diag.mkp
 create mode 100644 packages/checkpoint_asg_sg_diag
 create mode 100644 web/plugins/wato/checkpoint_asg_sg_diag.py

diff --git a/agent_based/checkpoint_asg_sg_diag.py b/agent_based/checkpoint_asg_sg_diag.py
new file mode 100644
index 0000000..4841c08
--- /dev/null
+++ b/agent_based/checkpoint_asg_sg_diag.py
@@ -0,0 +1,233 @@
+#!/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-03
+#
+# Monitor Check Point Maestro SG Test status (asg diag verify)
+#
+# 2021-03-01: rewrite for CMK 2.x
+# 2021-03-03: fixed date/time in parse function
+# 2021-09-10: fixed duplicate detail output
+# 2021-09-29: renamed checkpoint_asg_diag to checkpoint_asg_sg_diag
+#
+# sample snmpwalk for one passed asg test
+# .1.3.6.1.4.1.2620.1.48.31.1.1.1.21.0 = Wrong Type (should be OCTET STRING): Gauge32: 21
+# .1.3.6.1.4.1.2620.1.48.31.1.1.1.21.0 = Wrong Type (should be OCTET STRING): Gauge32: 21
+# .1.3.6.1.4.1.2620.1.48.31.1.1.2.21.0 = STRING: Bond
+# .1.3.6.1.4.1.2620.1.48.31.1.1.3.21.0 = STRING: 2020-10-23 01:00:02
+# .1.3.6.1.4.1.2620.1.48.31.1.1.4.21.0 = STRING: Passed
+# .1.3.6.1.4.1.2620.1.48.31.1.1.5.21.0 = STRING:
+#
+# sample snmpwalk for one failed asg test
+# .1.3.6.1.4.1.2620.1.48.31.1.1.1.28.0 = Wrong Type (should be OCTET STRING): Gauge32: 28
+# .1.3.6.1.4.1.2620.1.48.31.1.1.2.28.0 = STRING: Core Dumps
+# .1.3.6.1.4.1.2620.1.48.31.1.1.3.28.0 = STRING: 2020-10-23 01:00:02
+# .1.3.6.1.4.1.2620.1.48.31.1.1.4.28.0 = STRING: Failed (!)
+# .1.3.6.1.4.1.2620.1.48.31.1.1.5.28.0 = STRING:
+#
+# sample snmpwalk for asg test summary
+# .1.3.6.1.4.1.2620.1.48.31.2.0 = STRING: On 2020-10-23, At 01:00:02, Passed: 28/30 tests. Failed tests: 11,28
+#
+# sample section
+# [
+#  [
+#   ['On 2020-10-23, At 01:00:02, Passed: 28/30 tests. Failed tests: 11,28']
+#  ],
+#  [
+#   ['1', 'System Health', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['2', 'Resources', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['3', 'Software Provision', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['4', 'Media Details', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['5', 'SSD Health', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['6', 'Firmware Verifier', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['7', 'Distribution Mode', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['8', 'DXL Balance', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['9', 'Policy', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['10', 'AMW Policy', '2020-10-23 01:00:02', 'Passed', 'Not configured'],
+#   ['11', 'SWB Updates', '2020-10-23 01:00:02', 'Failed (!)', ''],
+#   ['12', 'Installation', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['13', 'Security Group', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['14', 'Cores Distribution', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['15', 'Clock', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['16', 'Licenses', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['17', 'IPS Enhancement', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['18', 'Configuration Files', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['19', 'MAC Setting', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['20', 'ARP Consistency', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['21', 'Bond', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['22', 'IPv4 Route', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['23', 'IPv6 Route', '2020-10-23 01:00:02', 'Passed', 'Not configured'],
+#   ['24', 'Dynamic Routing', '2020-10-23 01:00:02', 'Passed', 'Not configured'],
+#   ['25', 'Local ARP', '2020-10-23 01:00:02', 'Passed', 'Not configured'],
+#   ['26', 'IGMP Consistency', '2020-10-23 01:00:02', 'Passed', 'Not configured'],
+#   ['27', 'PIM Neighbors', '2020-10-23 01:00:02', 'Passed', 'Not configured'],
+#   ['28', 'Core Dumps', '2020-10-23 01:00:02', 'Failed (!)', ''],
+#   ['29', 'Processes', '2020-10-23 01:00:02', 'Passed', ''],
+#   ['30', 'Performance hogs', '2020-10-23 01:00:02', 'Passed', '']
+#  ]
+# ]
+#
+
+import time
+from typing import List, NamedTuple
+
+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,
+    check_levels,
+)
+
+
+class CheckpointAsgSgDiagSummary(NamedTuple):
+    date: str
+    time: str
+    days_ago: int
+    passed: int
+    maxtest: int
+    failed: list
+
+
+class CheckpointAsgSgDiagTest(NamedTuple):
+    index: str
+    name: str
+    lastrun: str
+    result: str
+    comment: str
+
+
+class CheckpointAsgDiag(NamedTuple):
+    summary: CheckpointAsgSgDiagSummary
+    tests: List[CheckpointAsgSgDiagTest]
+
+
+def parse_checkpoint_asg_sg_diag(string_table: List[StringTable]) -> CheckpointAsgDiag:
+    asgSummary, asgTests = string_table
+
+    # sample asgSummary [['On 2020-10-23, At 01:00:02, Passed: 28/30 tests. Failed tests: 11,28']]
+    if len(asgSummary) != 0:
+        asgSummary = asgSummary[0][0]
+        passed, max = asgSummary[28:].split('.')[0].split(' ')[1].split('/')
+        return CheckpointAsgDiag(
+            summary=CheckpointAsgSgDiagSummary(
+                date=asgSummary[3:13],
+                time=asgSummary[18:26],
+                days_ago=int((time.time() - time.mktime(time.strptime(asgSummary[3:13], '%Y-%m-%d'))) / 86400),
+                passed=int(passed),
+                maxtest=int(max),
+                failed=list(map(int, asgSummary.split(':')[-1].strip(' ').split(',')))
+            ),
+            tests=[CheckpointAsgSgDiagTest(*test) for test in asgTests]
+        )
+
+
+def discovery_checkpoint_asg_sg_diag(section: CheckpointAsgDiag) -> DiscoveryResult:
+    yield Service(parameters={})
+
+
+def check_checkpoint_asg_sg_diag(params, section: CheckpointAsgDiag) -> CheckResult:
+    state = 0
+    asg_diag_ignore = params['asg_diag_ignore']
+    asg_diag_warning = params['asg_diag_warning']
+    asg_diag_ignore.sort()
+    asg_diag_warning.sort()
+
+    yield Result(state=State.OK, summary=f'Last run on: {section.summary.date} at: {section.summary.time}')
+    yield from check_levels(
+        value=section.summary.days_ago,
+        label='Days ago',
+        levels_upper=params['levels_upper_last_run'],
+        render_func=lambda v: str(v)
+    )
+
+    summary = f'Tests Passed {section.summary.passed}/{section.summary.maxtest},'
+    if len(section.summary.failed) > 0:
+        summary += f' Failed: {",".join(map(str, section.summary.failed))}'
+    if len(asg_diag_ignore) > 0:
+        summary += f', Ignored: {",".join(map(str, asg_diag_ignore))}'
+
+    for test in section.summary.failed:
+        if test not in asg_diag_ignore:
+            if test in asg_diag_warning:
+                state = max(state, 1)
+            else:
+                state = 2
+
+    yield Result(state=State(state), summary=summary)
+
+    yield Result(
+        state=State.OK,
+        notice='\nTo verify this output use the "asg diag verify" command on the Check Point SG CLI.\n'
+    )
+
+    for test in section.tests:
+        result = test.result
+        if result.lower().startswith('failed'):
+            if int(test.index) in asg_diag_ignore:
+                result = result.replace(' (!)', '')
+            elif int(test.index) not in asg_diag_warning:
+                result = result.replace(' (!)', ' (!!)')
+        notice = f'Index: {test.index}, Name: {test.name}, LastRun: {test.lastrun}, Restult: {result}'
+        if test.comment != '':
+            notice += f', Comment: {test.comment}'
+        yield Result(state=State.OK, notice=notice)
+
+
+register.snmp_section(
+    name='checkpoint_asg_sg_diag',
+    parse_function=parse_checkpoint_asg_sg_diag,
+    fetch=[
+        SNMPTree(
+            base='.1.3.6.1.4.1.2620.1.48.31',  # CHECKPOINT-MIB::asgDiagnostic
+            oids=[
+                '2',  # asgDiagSummary
+            ]
+        ),
+        SNMPTree(
+            base='.1.3.6.1.4.1.2620.1.48.31.1.1',  # CHECKPOINT-MIB::asgTestsResEntry
+            oids=[
+                '1',  # asgTestIndex
+                '2',  # TestName
+                '3',  # LastRun
+                '4',  # Result
+                '5',  # Comment
+            ]
+        ),
+    ],
+    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_asg_sg_diag',
+    service_name='ASG SG Diag',
+    discovery_function=discovery_checkpoint_asg_sg_diag,
+    check_function=check_checkpoint_asg_sg_diag,
+    check_default_parameters={
+        'levels_upper_last_run': (3, 5),
+        'asg_diag_ignore': [],
+        'asg_diag_warning': [],
+    },
+    check_ruleset_name='checkpoint_asg_sg_diag',
+)
diff --git a/checkpoint_asg_sg_diag.mkp b/checkpoint_asg_sg_diag.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..43c9abc3e99291aef06ff4b62c24787717e8b944
GIT binary patch
literal 3614
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

literal 0
HcmV?d00001

diff --git a/packages/checkpoint_asg_sg_diag b/packages/checkpoint_asg_sg_diag
new file mode 100644
index 0000000..a5cf2a5
--- /dev/null
+++ b/packages/checkpoint_asg_sg_diag
@@ -0,0 +1,13 @@
+{'author': 'Th.L. (thl-cmk[at]outlook[dot]com)',
+ 'description': 'Monitor Check Point Maestro SG Test status (asg diag verify)\n'
+                '\n',
+ 'download_url': 'http://thl-cmk.hopto.org/',
+ 'files': {'agent_based': ['checkpoint_asg_sg_diag.py'],
+           'web': ['plugins/wato/checkpoint_asg_sg_diag.py']},
+ 'name': 'checkpoint_asg_sg_diag',
+ 'num_files': 2,
+ 'title': 'Check Point Maestro SG ASG Diag',
+ 'version': '20210929.v0.3',
+ '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/wato/checkpoint_asg_sg_diag.py b/web/plugins/wato/checkpoint_asg_sg_diag.py
new file mode 100644
index 0000000..292cf67
--- /dev/null
+++ b/web/plugins/wato/checkpoint_asg_sg_diag.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+#
+from cmk.gui.i18n import _
+from cmk.gui.valuespec import (
+    Dictionary,
+    Integer,
+    ListOfStrings,
+    Tuple,
+)
+
+from cmk.gui.plugins.wato import (
+    CheckParameterRulespecWithItem,
+    rulespec_registry,
+    RulespecGroupCheckParametersNetworking,
+)
+
+
+def _parameter_valuespec_checkpoint_asg_sg_diag():
+    return Dictionary(elements=[
+        ('levels_upper_last_run',
+         Tuple(
+             title=_('Maximum days no run "asg diag verify"'),
+             elements=[
+                 Integer(
+                     title=_('Warning at'),
+                     unit='days',
+                     default_value=3,
+                     minvalue=1,
+                 ),
+                 Integer(
+                     title=_('Critical at'),
+                     unit='days',
+                     default_value=5,
+                     minvalue=1,
+                 )
+             ],
+         )),
+        ('asg_diag_ignore',
+         ListOfStrings(
+             title=_('Index list of ignored failde tests'),
+             orientation='horizontal',
+             allow_empty=False,
+             valuespec=Integer(minvalue=1, maxvalue=99),
+             help=_('This tests will be ignored if the are not "Passed". The monitoring state will stay OK'),
+         )),
+        ('asg_diag_warning',
+         ListOfStrings(
+             title=_('Indix list of WARNING only failed tests'),
+             orientation='horizontal',
+             allow_empty=False,
+             valuespec=Integer(minvalue=1, maxvalue=99),
+             help=_('For this tests the monitoring state will be WARNING if the test result is not "Passed", '
+                    'all other failed tests set the monitoring state to CRITICAL.'),
+         )),
+    ])
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithItem(
+        check_group_name='checkpoint_asg_sg_diag',
+        group=RulespecGroupCheckParametersNetworking,
+        match_type='dict',
+        parameter_valuespec=_parameter_valuespec_checkpoint_asg_sg_diag,
+        title=lambda: _('Check Point ASG Diag'),
+    ))
-- 
GitLab