diff --git a/CHANGELOG b/CHANGELOG index 248ffb511aa60577951f9ba611e6bf3d462d6bbb..d21df1514f9c1daf80d6f81975f35656f4830e0f 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 3208552f2f21c86b2ed17732c39346d14e58f482..60244032ed4d9ca37a9ce2c140612d8444753eb0 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 Binary files a/checkpoint_raid.mkp and b/checkpoint_raid.mkp differ diff --git a/gui/wato/checkpoint_raid.py b/gui/wato/checkpoint_raid.py new file mode 100644 index 0000000000000000000000000000000000000000..3c575226c378d50d227c903ef7536676db86a6b6 --- /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 b29eb9f464d24d443a7f09c260a835375b44f6da..1665477c8a5db38225aadb35aa9251728cc41daa 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