From 4e65fe326c971db962435aac80f25f39552387ce Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Sun, 23 Apr 2023 13:37:56 +0200
Subject: [PATCH] update project

---
 CHANGELOG                      |   3 +
 agent_based/checkpoint_raid.py | 153 ++++++++++++++++-----------------
 checkpoint_raid.mkp            | Bin 5222 -> 4295 bytes
 gui/wato/checkpoint_raid.py    |  51 +++++++++++
 packages/checkpoint_raid       |  10 +--
 5 files changed, 133 insertions(+), 84 deletions(-)
 create mode 100644 gui/wato/checkpoint_raid.py

diff --git a/CHANGELOG b/CHANGELOG
index 248ffb5..d21df15 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -9,3 +9,6 @@
 2021-04-29: rename from checkpoint_soft_raid in to checkpoint_raid
 2021-08-10: rewritten for CMK 2.0            
 2022-11-30: WATO: fixed CheckParameterRulespecWithoutItem (from CheckParameterRulespecWithItem)
+2023-04-23: refactoring
+            moved wato file to ~/local/lib/check_mk/gui/plugins/wato
+            moved rule set from networking to hardware
diff --git a/agent_based/checkpoint_raid.py b/agent_based/checkpoint_raid.py
index 3208552..6024403 100644
--- a/agent_based/checkpoint_raid.py
+++ b/agent_based/checkpoint_raid.py
@@ -18,6 +18,7 @@
 #             but only 6 Disks are in the default hardware
 # 2021-04-29: rename from checkpoint_soft_raid in to checkpoint_raid
 # 2021-08-10: rewritten for CMK 2.0
+# 2023-04-23: refactoring
 #
 # sample snmpwalk (one volume / two disks)
 #
@@ -57,21 +58,19 @@
 #
 # 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']]]
+# [[['1', '0', '2', '2', '1952448512', '0', '1', '931']],
+#  [['1', '0', '0', '0', 'ATA     ', 'ST1000NM0033-9ZM', 'SN04', '1953525168', '0', '0', '100', '931'],
+#   ['2', '0', '1', '1', 'ATA     ', 'ST1000NM0033-9ZM', 'SN04', '1953525168', '0', '0', '100', '931']]]
 #
 #
 
 from dataclasses import dataclass
 from typing import List, Dict
-
 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,
@@ -87,28 +86,28 @@ from cmk.base.plugins.agent_based.agent_based_api.v1 import (
 
 @dataclass
 class RaidDisk:
-    diskindex: int
-    diskvolumeid: str
-    diskid: int
-    diskvendor: str
-    diskproductid: str
-    diskrevision: str
-    diskmaxlba: int
-    diskstate: int
-    diskflags: str
-    disksyncstate: int
-    disksize: int
+    index: int
+    volume_id: str
+    disk_id: int
+    vendor: str
+    product_id: str
+    revision: str
+    max_lba: int
+    state: int
+    flags: str
+    sync_state: int
+    size: int
 
 
 @dataclass
 class RaidVolume:
-    volumeindex: int
-    volumetype: str
-    numofdisksonraid: int
-    volumemaxlba: int
-    volumestate: int
-    volumeflags: str
-    volumesize: int
+    index: int
+    type: str
+    num_of_disks_on_raid: int
+    max_lba: int
+    state: int
+    flags: str
+    size: int
     disks: List[RaidDisk]
    
 
@@ -201,41 +200,40 @@ def parse_checkpoint_raid(string_table: List[StringTable]) -> Dict[str, RaidVolu
     disks = []
 
     for disk in raw_disks:
-        diskindex, diskvolumeid, diskid, disknumber, diskvendor, diskproductid, diskrevision, diskmaxlba, diskstate, \
-            diskflags, disksyncstate, disksize = disk
+        index, volume_id, disk_id, number, vendor, product_id, revision, max_lba, state, flags, sync_state, size = disk
 
-        if diskindex.isdigit():
+        if index.isdigit():
             disks.append(RaidDisk(
-                diskindex=int(diskindex),
-                diskvolumeid=diskvolumeid,
-                diskid=int(disknumber),
-                diskvendor=diskvendor,
-                diskproductid=diskproductid,
-                diskrevision=diskrevision,
-                diskmaxlba=int(diskmaxlba),
-                diskstate=int(diskstate),
-                diskflags=_get_flags(diskflags, _raid_disk_flags),
-                disksyncstate=int(disksyncstate),
-                disksize=int(disksize)
+                index=int(index),
+                volume_id=volume_id.strip(),
+                disk_id=int(number),
+                vendor=vendor.strip(),
+                product_id=product_id.strip(),
+                revision=revision.strip(),
+                max_lba=int(max_lba),
+                state=int(state),
+                flags=_get_flags(flags, _raid_disk_flags),
+                sync_state=int(sync_state),
+                size=int(size)
             ))
 
     for volume in raw_volumes:
-        volumeindex, volumeid, volumetype, numofdisksonraid, volumemaxlba, volumestate, volumeflags, volumesize = volume
-
-        if volumeindex.isdigit():
-            volumes[volumeid] = RaidVolume(
-                volumeindex=int(volumeindex),
-                volumetype=_raid_volume_type.get(int(volumetype), f'unknown ({volumetype}'),
-                numofdisksonraid=int(numofdisksonraid),
-                volumemaxlba=int(volumemaxlba),
-                volumestate=int(volumestate),
-                volumeflags=_get_flags(volumeflags, _raid_volume_flags),
-                volumesize=int(volumesize),
+        index, volume_id, _type, num_of_disks_on_raid, max_lba, state, flags, size = volume
+
+        if index.isdigit():
+            volumes[volume_id] = RaidVolume(
+                index=int(index),
+                type=_raid_volume_type.get(int(_type), f'unknown ({_type}'),
+                num_of_disks_on_raid=int(num_of_disks_on_raid),
+                max_lba=int(max_lba),
+                state=int(state),
+                flags=_get_flags(flags, _raid_volume_flags),
+                size=int(size),
                 disks=[]
             )
             for disk in disks:
-                if disk.diskvolumeid == volumeid:
-                    volumes[volumeid].disks.append(disk)
+                if disk.volume_id == volume_id:
+                    volumes[volume_id].disks.append(disk)
 
     return volumes
 
@@ -254,52 +252,51 @@ def check_checkpoint_raid(item, params, section: Dict[str, RaidVolume]) -> Check
         yield Result(state=State.CRIT, summary='Volume not found in SNMP Data')
         return
 
-    # volume infos
+    # volume info
 
     details = ''
-    details += f'Volume Type: {volume.volumetype}, '
-    details += f'# of Disks: {volume.numofdisksonraid}, '
-    details += f'Size: {volume.volumesize}GB, '
-    details += f'max LBA: {volume.volumemaxlba}, '
-    details += f'Flags: {volume.volumeflags}'
+    details += f'Volume Type: {volume.type}, '
+    details += f'# of Disks: {volume.num_of_disks_on_raid}, '
+    details += f'Size: {volume.size}GB, '
+    details += f'max LBA: {volume.max_lba}, '
+    details += f'Flags: {volume.flags}'
 
     summary = ''
-    summary += f'{volume.volumetype}, '
-    summary += f'{volume.numofdisksonraid} disks, '
-    summary += f'{volume.volumesize}GB, '
-    summary += f'State: {_raid_volume_state.get(volume.volumestate)}'
+    summary += f'{volume.type}, '
+    summary += f'{volume.num_of_disks_on_raid} disks, '
+    summary += f'{volume.size}GB, '
+    summary += f'State: {_raid_volume_state.get(volume.state)}'
 
-    if volume.volumestate != 0:
+    if volume.state != 0:
         yield Result(state=State.CRIT, summary=summary, details=details)
     else:
         yield Result(state=State.OK, summary=summary, details=details)
 
-    # disk infos
+    # disk info
     disks = volume.disks
     disks_in_array = 0
     disks_online = 0
     disks_ignored = 0
     for disk in disks:
-        diskid = disk.diskid
-        if not str(diskid) in ignore_disks:
+        if str(disk.disk_id) not in ignore_disks:
             disks_in_array += 1
-            syncstate = disk.disksyncstate
+            syncstate = disk.sync_state
             details = ''
-            details += f'Disk ID: {diskid}, '
-            details += f'State: {_raid_disk_state.get(disk.diskstate)}, '
+            details += f'Disk ID: {disk.disk_id}, '
+            details += f'State: {_raid_disk_state.get(disk.state)}, '
             details += f'Sync: {syncstate}%, '
-            details += f'Size: {disk.disksize}GB, '
-            if disk.diskmaxlba > 0:
-                details += f'max LBA: {disk.diskmaxlba}, '
-            if disk.diskvendor != 'UNKNOWN':
-                details += f'Vendor: {disk.diskvendor}, '
-            details += f'Product ID: {disk.diskproductid}, '
-            if disk.diskrevision != '':
-                details += f'Revision: {disk.diskrevision}, '
-            details += f'Flags: {disk.diskflags}'
-            if disk.diskstate != 0:
+            details += f'Size: {disk.size}GB, '
+            if disk.max_lba > 0:
+                details += f'max LBA: {disk.max_lba}, '
+            if disk.vendor != 'UNKNOWN':
+                details += f'Vendor: {disk.vendor}, '
+            details += f'Product ID: {disk.product_id}, '
+            if disk.revision != '':
+                details += f'Revision: {disk.revision}, '
+            details += f'Flags: {disk.flags}'
+            if disk.state != 0:
                 yield Result(state=State.CRIT,
-                             notice=f'Disk ID: {diskid}, state: {_raid_disk_state.get(disk.diskstate)}',
+                             notice=f'Disk ID: {disk.disk_id}, state: {_raid_disk_state.get(disk.state)}',
                              details=details)
             else:
                 yield Result(state=State.OK, notice=details,
diff --git a/checkpoint_raid.mkp b/checkpoint_raid.mkp
index 2f91b54a32afecadceafd6a0df09d1425942ebdd..ccd9616e9527e761c260ba99eebd4a1e0d57923b 100644
GIT binary patch
literal 4295
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
I*;rWr1Fp+$`~Uy|

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

diff --git a/gui/wato/checkpoint_raid.py b/gui/wato/checkpoint_raid.py
new file mode 100644
index 0000000..3c57522
--- /dev/null
+++ b/gui/wato/checkpoint_raid.py
@@ -0,0 +1,51 @@
+#!/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-10
+#
+# Check_MK checkpoint_raid WATO plugin
+#
+# 2023-04-23: moved wato file to ~/local/lib/check_mk/gui/plugins/wato
+#             moved rule set from networking to hardware
+
+from cmk.gui.i18n import _
+from cmk.gui.valuespec import (
+    Dictionary,
+    TextAscii,
+    TextUnicode,
+)
+from cmk.gui.plugins.wato.utils import (
+    CheckParameterRulespecWithItem,
+    rulespec_registry,
+    RulespecGroupCheckParametersHardware,
+)
+
+
+def _parameter_valuespec_checkpoint_raid():
+    return Dictionary(
+        help=_(''),
+        elements=[
+            ('ignore_disks',
+             TextUnicode(
+                 title=_('list of comma separated disk IDs to ignore'),
+                 help=_('This is useful 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.'),
+                 allow_empty=False,
+             )),
+        ],
+    )
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithItem(
+        check_group_name='checkpoint_raid',
+        group=RulespecGroupCheckParametersHardware,
+        item_spec=lambda: TextAscii(title=_('RAID ID'), ),
+        match_type='dict',
+        parameter_valuespec=_parameter_valuespec_checkpoint_raid,
+        title=lambda: _('Check Point RAID'),
+    ))
diff --git a/packages/checkpoint_raid b/packages/checkpoint_raid
index b29eb9f..1665477 100644
--- a/packages/checkpoint_raid
+++ b/packages/checkpoint_raid
@@ -2,12 +2,10 @@
  'description': 'monitor Check Point appliance RAID arrays\n',
  'download_url': 'https://thl-cmk.hopto.org',
  'files': {'agent_based': ['checkpoint_raid.py'],
-           'checkman': ['checkpoint_raid'],
-           'web': ['plugins/wato/checkpoint_raid.py']},
+           'gui': ['wato/checkpoint_raid.py']},
  'name': 'checkpoint_raid',
- 'num_files': 3,
  'title': 'Check Point appliance RAID',
- 'version': '20221130.v0.4a',
- 'version.min_required': '2.0.0',
- 'version.packaged': '2021.09.20',
+ 'version': '1.0.0-20230422',
+ 'version.min_required': '2.1.0b1',
+ 'version.packaged': '2.1.0p21',
  'version.usable_until': None}
\ No newline at end of file
-- 
GitLab