From 4d0d68b696da46e7ad5ad8adb8067d9ff0c1ef48 Mon Sep 17 00:00:00 2001
From: OMD site cmk16x <thl-cmk@outlook.com>
Date: Thu, 29 Apr 2021 15:07:47 +0200
Subject: [PATCH] update project

---
 checkman/checkpoint_raid               |  45 ++++
 checkpoint_raid.mkp                    | Bin 0 -> 5472 bytes
 checks/checkpoint_raid                 | 320 +++++++++++++++++++++++++
 packages/checkpoint_raid               |  14 ++
 web/plugins/metrics/checkpoint_raid.py |  82 +++++++
 web/plugins/wato/checkpoint_raid.py    |  33 +++
 6 files changed, 494 insertions(+)
 create mode 100644 checkman/checkpoint_raid
 create mode 100644 checkpoint_raid.mkp
 create mode 100644 checks/checkpoint_raid
 create mode 100644 packages/checkpoint_raid
 create mode 100644 web/plugins/metrics/checkpoint_raid.py
 create mode 100644 web/plugins/wato/checkpoint_raid.py

diff --git a/checkman/checkpoint_raid b/checkman/checkpoint_raid
new file mode 100644
index 0000000..08ef898
--- /dev/null
+++ b/checkman/checkpoint_raid
@@ -0,0 +1,45 @@
+title: Dummy check man page - used as template for new check manuals
+agents: linux, windows, aix, solaris, hpux, vms, freebsd, snmp
+catalog: see modules/catalog.py for possible values
+license: GPL
+distribution: check_mk
+description:
+ Describe here: (1) what the check actually does, (2) under which
+ circumstances it goes warning/critical, (3) which devices are supported
+ by the check, (4) if the check requires a separated plugin or
+ tool or separate configuration on the target host.
+
+item:
+ Describe the syntax and meaning of the check's item here. Provide all
+ information one needs if coding a manual check with {checks +=} in {main.mk}.
+ Give an example.  If the check uses {None} as sole item,
+ then leave out this section.
+
+examples:
+ # Give examples for configuration in {main.mk} here. If the check has
+ # configuration variable, then give example for them here.
+
+ # set default levels to 40 and 60 percent:
+ foo_default_values = (40, 60)
+
+ # another configuration variable here:
+ inventory_foo_filter = [ "superfoo", "superfoo2" ]
+
+perfdata:
+ Describe precisely the number and meaning of performance variables
+ the check sends. If it outputs no performance data, then leave out this
+ section.
+
+inventory:
+ Describe how the inventory for the check works. Which items
+ will it find? Describe the influence of check specific
+ configuration parameters to the inventory.
+
+[parameters]
+foofirst(int): describe the first parameter here (if parameters are grouped
+        as tuple)
+fooother(string): describe another parameter here.
+
+[configuration]
+foo_default_levels(int, int): Describe global configuration variable of
+    foo here. Important: also tell the user how they are preset.
diff --git a/checkpoint_raid.mkp b/checkpoint_raid.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..7c55592269c286133ae444d39e7616bbdcb05fe4
GIT binary patch
literal 5472
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

literal 0
HcmV?d00001

diff --git a/checks/checkpoint_raid b/checks/checkpoint_raid
new file mode 100644
index 0000000..9293e03
--- /dev/null
+++ b/checks/checkpoint_raid
@@ -0,0 +1,320 @@
+#!/usr/bin/python
+# -*- encoding: utf-8; py-indent-offset: 4 -*-
+#
+# License: GNU General Public License v2
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+#
+# 2016-05-31 : monitor Check Point appliance soft RAID
+# 2018-03-08 : changed snmp scan function
+# 2018-03-13 : code cleanup
+# 2018-03-15 : more code cleanup
+# 2020-06-08 : changed snmp-scan function
+# 2020-11-10 : removed perfdata
+#              added wato option to configure 'ignore disks'. For example on the Smart-1 5150 (Array has 12 Disks,
+#              but only 6 Disks are in the default hardware
+# 2021-04-29 : rename from checkpoint_soft_raid in to checkpoint_raid
+#
+# sample snmpwalk (one volume / two disks)
+#
+#  .1.3.6.1.4.1.2620.1.6.7.7.1.1.1.1.0 = INTEGER: 1
+#  .1.3.6.1.4.1.2620.1.6.7.7.1.1.2.1.0 = INTEGER: 0
+#  .1.3.6.1.4.1.2620.1.6.7.7.1.1.3.1.0 = INTEGER: 2
+#  .1.3.6.1.4.1.2620.1.6.7.7.1.1.4.1.0 = INTEGER: 2
+#  .1.3.6.1.4.1.2620.1.6.7.7.1.1.5.1.0 = INTEGER: 1952448512
+#  .1.3.6.1.4.1.2620.1.6.7.7.1.1.6.1.0 = INTEGER: 0
+#  .1.3.6.1.4.1.2620.1.6.7.7.1.1.7.1.0 = INTEGER: 1
+#  .1.3.6.1.4.1.2620.1.6.7.7.1.1.8.1.0 = Gauge32: 931
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.1.1.0 = INTEGER: 1
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.1.2.0 = INTEGER: 2
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.2.1.0 = INTEGER: 0
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.2.2.0 = INTEGER: 0
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.3.1.0 = INTEGER: 0
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.3.2.0 = INTEGER: 1
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.4.1.0 = INTEGER: 0
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.4.2.0 = INTEGER: 1
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.5.1.0 = STRING: "ATA     "
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.5.2.0 = STRING: "ATA     "
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.6.1.0 = STRING: "ST1000NM0033-9ZM"
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.6.2.0 = STRING: "ST1000NM0033-9ZM"
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.7.1.0 = STRING: "SN04"
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.7.2.0 = STRING: "SN04"
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.8.1.0 = INTEGER: 1953525168
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.8.2.0 = INTEGER: 1953525168
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.9.1.0 = INTEGER: 0
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.9.2.0 = INTEGER: 0
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.10.1.0 = INTEGER: 0
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.10.2.0 = INTEGER: 0
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.11.1.0 = INTEGER: 100
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.11.2.0 = INTEGER: 100
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.12.1.0 = Gauge32: 931
+#  .1.3.6.1.4.1.2620.1.6.7.7.2.1.12.2.0 = Gauge32: 931
+#
+#
+# sample info
+#
+# [[[u'1', u'0', u'2', u'2', u'1952448512', u'0', u'1', u'931']],
+#  [[u'1', u'0', u'0', u'0', u'ATA     ', u'ST1000NM0033-9ZM', u'SN04', u'1953525168', u'0', u'0', u'100', u'931'],
+#   [u'2', u'0', u'1', u'1', u'ATA     ', u'ST1000NM0033-9ZM', u'SN04', u'1953525168', u'0', u'0', u'100', u'931']]]
+#
+#
+
+factory_settings['checkpoint_raid_defaults'] = {
+    'ignore_disks': '',
+}
+
+
+def parse_checkpoint_raid(info):
+    raidvolumetype = {
+        0 : 'RAID-0',
+        1 : 'RAID-1E',
+        2 : 'RAID-1',
+        3 : 'RAID_10',
+        4 : 'RAID-4',
+        5 : 'RAID-5',
+        6 : 'RAID-6',
+        7 : 'RAID-60',
+        8 : 'RAID-50',
+    }
+
+    raw_volumes, raw_disks = info
+    volumes = []
+    disks = []
+
+    for volume in raw_volumes:
+        volumeindex, volumeid, volumetype, numofdisksonraid, volumemaxlba, volumestate, volumeflags, volumesize = volume
+
+        if volumeindex.isdigit():
+            volumes.append({'volumeindex'     : int(volumeindex),
+                            'volumeid'        : int(volumeid),
+                            'volumetype'      : raidvolumetype.get(int(volumetype)),
+                            'numofdisksonraid': int(numofdisksonraid),
+                            'volumemaxlba'    : int(volumemaxlba),
+                            'volumestate'     : int(volumestate),
+                            'volumeflags'     : volumeflags,
+                            'volumesize'      : int(volumesize),
+                            })
+
+    for disk in raw_disks:
+        diskindex, diskvolumeid, diskid, disknumber, diskvendor, diskproductid, diskrevision, diskmaxlba, diskstate, \
+        diskflags, disksyncstate, disksize = disk
+
+        if diskindex.isdigit():
+            disks.append({'diskindex'    : int(diskindex),
+                          'diskvolumeid' : int(diskvolumeid),
+                          'diskid'       : int(disknumber),
+                          'diskvendor'   : diskvendor,
+                          'diskproductid': diskproductid,
+                          'diskrevision' : diskrevision,
+                          'diskmaxlba'   : int(diskmaxlba),
+                          'diskstate'    : int(diskstate),
+                          'diskflags'    : diskflags,
+                          'disksyncstate': int(disksyncstate),
+                          'disksize'     : int(disksize)
+                          })
+
+    parse = [volumes, disks]
+    return parse
+
+
+def inventory_checkpoint_raid(parse):
+    volumes, disks = parse
+    disksonvolume = []
+    if len(volumes) != 0:
+        for volume in volumes:
+            volumeid = volume.get('volumeid')
+            item = 'Volume %d' % volumeid
+            for disk in disks:
+                if disk.get('diskvolumeid') == volumeid:
+                    disksonvolume.append(disk)
+                    disks.remove(disk)
+            yield item, None
+
+
+def check_checkpoint_raid(item, params, parse):
+    raidvolumestate = {
+        0: 'OPTIMAL',
+        1: 'DEGRADED',
+        2: 'FAILED',
+    }
+
+    raidvolumeflags = {
+        0 : 'NONE',
+        1 : 'ENABLED',
+        2 : 'QUIESCED',
+        3 : 'RESYNC IN PROGRESS',
+        4 : 'VOLUME INACTIVE',
+        5 : 'NOT CONFIGURED',
+        6 : 'USING INTERIM RECOVERY MODE',
+        7 : 'READY FOR RECOVERY OPERATION',
+        8 : 'WRONG PHYSICAL DRIVE WAS REPLACED',
+        9 : 'A PHYSICAL DRIVE IS NOT PROPERLY CONNECTED',
+        10: 'HARDWARE IS OVER HEATING',
+        11: 'HARDWARE WAS OVERHEATED',
+        12: 'CURRENTLY EXPENDING',
+        13: 'NOT YET AVAILABLE',
+        14: 'QUEUED FOR EXPENSION',
+        15: 'MIGRATING',
+        16: 'IMPACTED',
+        17: 'OFFLINE',
+        18: 'CLEARING',
+    }
+
+    raiddiskstate = {
+        0  : 'ONLINE',
+        1  : 'MISSING',
+        2  : 'NOT COMPATIBLE',
+        3  : 'DISC FAILED',
+        4  : 'INITIALIZING',
+        5  : 'OFFLINE REQUESTED',
+        6  : 'FAILED REQUESTED',
+        7  : 'UNCONFIGURED GOOD SPUN UP',
+        8  : 'UNCONFIGURED GOOD SPUN DOWN',
+        9  : 'UNCONFIGURED BAD',
+        10 : 'HOTSPARE',
+        11 : 'DRIVE OFFLINE',
+        12 : 'REBUILD',
+        13 : 'FAILED',
+        14 : 'COPYBACK',
+        255: 'OTHER OFFLINE',
+    }
+
+    raiddiskflags = {
+        0: 'NONE',
+        1: 'OUT OF SYNC',
+        2: 'QUIESCED',
+        3: 'VERIFYING',
+        4: 'READY',
+    }
+
+    raiddiskid = {
+        0: 'Upper',
+        1: 'Lower',
+    }
+
+    def getflags(flags, flags_description):
+        description = ''
+        flags = int(flags)
+        if flags == 0:
+            return flags_description.get(0)
+        else:
+            for x in range(0, len(flags_description)):
+                if flags & (1 << x) != 0:
+                    if flags_description.get(x + 1) is not None:
+                        description += '%s,' % flags_description.get(x + 1)
+            return description
+
+    volumes, disks = parse
+    infotext = ''
+    longoutput = ''
+    perfdata = []
+    ignore_disks = []
+
+    if params:
+        ignore_disks = params.get('ignore_disks', '').split(',')
+
+    if len(volumes) != 0:
+        for volume in volumes:
+            volumeid = volume.get('volumeid')
+            if item == "Volume %d" % volumeid:
+                for disk in disks:
+                    if disk.get('diskvolumeid') != volumeid:
+                        disks.remove(disk)
+
+                # volume infos
+                if volume.get('volumestate') != 0:
+                    yield 2, 'Volume state %s' % raidvolumestate.get(volume.get('volumestate'))
+                else:
+                    yield 0, 'Volume state: %s' % raidvolumestate.get(volume.get('volumestate'))
+
+                infotext += '%s, '       % volume.get('volumetype')
+                infotext += '%d disks, ' % volume.get('numofdisksonraid')
+                infotext += '%d GB, '    % volume.get('volumesize')
+
+                longoutput += '\nVolume state: %s, ' % raidvolumestate.get(volume.get('volumestate'))
+                longoutput += 'Type: %s, '           % volume.get('volumetype')
+                longoutput += '# of disks: %d , '    % volume.get('numofdisksonraid')
+                longoutput += 'Size: %d GB, '        % volume.get('volumesize')
+                longoutput += 'max LBA: %d, '        % volume.get('volumemaxlba')
+                longoutput += 'Flags: %s'            % getflags(volume.get('volumeflags'), raidvolumeflags)
+
+                # disk infos
+                disks_in_array = 0
+                disks_online = 0
+                disks_ignored = 0
+                for disk in disks:
+                    diskid = disk.get('diskid')
+                    if not str(diskid) in ignore_disks:
+                        disks_in_array += 1
+                        syncstate = disk.get('disksyncstate')
+                        if disk.get('diskstate') != 0:
+                            yield 2, 'Disk ID: %d state: %s' % (diskid, raiddiskstate.get(disk.get('diskstate')))
+                        else:
+                            # yield 0, 'Disk ID %d state %s' % (diskid, raiddiskstate.get(disk.get('diskstate')))
+                            disks_online += 1
+
+                        longoutput += '\n%s disk (id %d): ' % (raiddiskid.get(diskid), diskid)
+                        longoutput += 'State: %s, '         % raiddiskstate.get(disk.get('diskstate'))
+                        longoutput += 'Sync: %d%s, '        % (syncstate, '%')
+                        longoutput += 'Size: %d GB, '       % disk.get('disksize')
+                        longoutput += 'max LBA: %d, '       % disk.get('diskmaxlba')
+                        longoutput += 'Vendor: %s, '        % disk.get('diskvendor')
+                        longoutput += 'Product id: %s, '    % disk.get('diskproductid')
+                        longoutput += 'Revision: %s, '      % disk.get('diskrevision')
+                        longoutput += 'Flags: %s'           % getflags(disk.get('diskflags'), raiddiskflags)
+
+                        # perfdata.append(('disk_id_%d' % diskid, syncstate, None, None, 0, 100))
+                    else:
+                        disks_ignored += 1
+
+                # remove last ', '
+                # infotext = infotext[:-2]
+
+                if disks_in_array == disks_online:
+                    yield 0, '%d/%d Disks online' % (disks_online, disks_in_array)
+                else:
+                    yield 2, '%d/%d Disks online' % (disks_online, disks_in_array)
+
+                if disks_ignored > 0:
+                    yield 0, '%d Disks ignored' % disks_ignored
+
+                yield 0, infotext + longoutput # , perfdata
+
+
+check_info['checkpoint_raid'] = {
+    'check_function'          : check_checkpoint_raid,
+    'inventory_function'      : inventory_checkpoint_raid,
+    'parse_function'          : parse_checkpoint_raid,
+    'default_levels_variable' : 'checkpoint_raid_defaults',
+    'service_description'     : 'Soft RAID %s',
+    'group'                   : 'checkpoint_raid',
+    # 'has_perfdata'           : True,
+    'snmp_scan_function': lambda oid: (oid('.1.3.6.1.2.1.1.2.0').startswith('.1.3.6.1.4.1.2620.1.6.123.1') or
+                                       oid('.1.3.6.1.2.1.1.2.0').startswith('.1.3.6.1.4.1.8072.3.2.10')) and
+                                      oid('.1.3.6.1.4.1.2620.1.6.1.0', '').lower().startswith('svn foundation'),
+    'snmp_info'               : [('.1.3.6.1.4.1.2620.1.6.7.7.1.1', [  # CHECKPOINT-MIB::raidVolumeEntry
+                                  '1',   # raidVolumeIndex
+                                  '2',   # raidVolumeID
+                                  '3',   # raidVolumeType
+                                  '4',   # numOfDisksOnRaid
+                                  '5',   # raidVolumeMaxLBA
+                                  '6',   # raidVolumeState
+                                  '7',   # raidVolumeFlags
+                                  '8',   # raidVolumeSize
+                                  ]),
+                                 ('.1.3.6.1.4.1.2620.1.6.7.7.2.1', [  # CHECKPOINT-MIB::raidDiskEntry
+                                  '1',   # raidDiskIndex
+                                  '2',   # raidDiskVolumeID
+                                  '3',   # raidDiskID
+                                  '4',   # raidDiskNumber
+                                  '5',   # raidDiskVendor
+                                  '6',   # raidDiskProductID
+                                  '7',   # raidDiskRevision
+                                  '8',   # raidDiskMaxLBA
+                                  '9',   # raidDiskState
+                                  '10',  # raidDiskFlags
+                                  '11',  # raidDiskSyncState
+                                  '12',  # raidDiskSize
+                                  ])],
+}
\ No newline at end of file
diff --git a/packages/checkpoint_raid b/packages/checkpoint_raid
new file mode 100644
index 0000000..cb964e8
--- /dev/null
+++ b/packages/checkpoint_raid
@@ -0,0 +1,14 @@
+{'author': u'Th.L. (thl-cmk[at]outlook[dot]com)',
+ 'description': u'monitor Check Point appliance RAID\n',
+ 'download_url': 'http://thl-cmk.hopto.org/',
+ 'files': {'checkman': ['checkpoint_raid'],
+           'checks': ['checkpoint_raid'],
+           'web': ['plugins/metrics/checkpoint_raid.py',
+                   'plugins/wato/checkpoint_raid.py']},
+ 'name': 'checkpoint_raid',
+ 'num_files': 4,
+ 'title': u'Check Point appliance RAID',
+ 'version': '20210429.v0.3',
+ 'version.min_required': '1.2.8b8',
+ 'version.packaged': '1.6.0p12',
+ 'version.usable_until': None}
\ No newline at end of file
diff --git a/web/plugins/metrics/checkpoint_raid.py b/web/plugins/metrics/checkpoint_raid.py
new file mode 100644
index 0000000..a9482d7
--- /dev/null
+++ b/web/plugins/metrics/checkpoint_raid.py
@@ -0,0 +1,82 @@
+#!/usr/bin/python
+# -*- encoding: utf-8; py-indent-offset: 4 -*-
+#
+# License: GNU General Public License v2
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+# Date  : 2018-04-11
+#
+# Check Point soft RAID metrics plugin
+#
+
+##############################################################################
+#
+# define units for perfdata
+#
+##############################################################################
+
+
+##############################################################################
+#
+# define metrics for perfdata
+#
+##############################################################################
+
+metric_info['checkpoint_raid_disk_id_0'] = {
+    'title': _('Sync Disk 0'),
+    'unit': '%',
+    'color': '11/a',
+}
+
+
+metric_info['checkpoint_raid_disk_id_1'] = {
+    'title': _('Sync Disk 1'),
+    'unit': '%',
+    'color': '21/a',
+}
+
+##############################################################################
+#
+# map perfdata to metric
+#
+##############################################################################
+
+check_metrics['check_mk-checkpoint_raid'] = {
+    'disk_id_0': {'name': 'checkpoint_raid_disk_id_0', },
+    'disk_id_1': {'name': 'checkpoint_raid_disk_id_1', }
+}
+
+##############################################################################
+#
+# how to graph perdata
+#
+##############################################################################
+
+graph_info.append({
+    'title': _('Check Point soft RAID sync status'),
+    'metrics': [
+        ('checkpoint_raid_disk_id_0', 'area'),
+        ('checkpoint_raid_disk_id_1', '-area'),
+    ],
+})
+
+##############################################################################
+#
+# define perf-o-meter
+#
+##############################################################################
+
+
+perfometer_info.append(('stacked', [
+    {
+        'type': 'linear',
+        'segments': ['checkpoint_raid_disk_id_0',],
+        'total': 100,
+    },
+    {
+        'type': 'linear',
+        'segments': ['checkpoint_raid_disk_id_1',],
+        'total': 100,
+    }
+]))
\ No newline at end of file
diff --git a/web/plugins/wato/checkpoint_raid.py b/web/plugins/wato/checkpoint_raid.py
new file mode 100644
index 0000000..5c07a44
--- /dev/null
+++ b/web/plugins/wato/checkpoint_raid.py
@@ -0,0 +1,33 @@
+#!/usr/bin/python
+# -*- encoding: utf-8; py-indent-offset: 4 -*-
+#
+# License: GNU General Public License v2
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+#
+# Check_MK checkpoint_soft_rais WATO plugin
+#
+#
+#
+
+register_check_parameters(
+    subgroup_networking,
+    'checkpoint_raid',
+    _('Check Point Soft Raid'),
+    Dictionary(
+        help=_(''),
+        elements=[
+            ('ignore_disks',
+             TextUnicode(
+                 title=_('list of comma separated disk IDs to ignore'),
+                 help=_('This is usefull for RAID Arrays with missing disks like on the Smart-1 5150. There the '
+                        'array is configured for 12 Disk but in the default Hardware are only 6 Disks.'),
+                 default_value=None,
+                 allow_empty=False,
+             )),
+        ],
+    ),
+    None,
+    match_type='dict',
+)
-- 
GitLab