diff --git a/agent_based/checkpoint_asg_chassis.py b/agent_based/checkpoint_asg_chassis.py index 3295b0f16153b5a5f95d05a5ad2fffac6f095a62..919ac7db0f7d2ba88d8ae676acb0701195f755c7 100644 --- a/agent_based/checkpoint_asg_chassis.py +++ b/agent_based/checkpoint_asg_chassis.py @@ -12,8 +12,7 @@ # 2021-02-25: rewrite for CMK 2.x # added warning/critical is chassis grade not equeal maxGrade # 2021-09-10: rewrite parse function -# -# ToDo: add warning if SGM/Chassis is missing compared to inventory time +# 2021-09-11: added WATO, cleanup # # sample snmpwalk # .1.3.6.1.4.1.2620.1.48.28.1.0 = STRING: "Multi" @@ -48,25 +47,24 @@ # .1.3.6.1.4.1.2620.1.48.28.5.1.5.2.0 = STRING: "N/A" # .1.3.6.1.4.1.2620.1.48.28.5.1.5.3.0 = STRING: "N/A" # -# sample info +# sample string_table # [ # [ -# [u'Multi', u'Primary Up', u'Enabled', u'Enabled'] +# ['Multi', 'Primary Up', 'Enabled', 'Enabled'] # ], # [ -# [u'1', u'ACTIVE', u'34', u'34', u'N/A'], -# [u'2', u'STANDBY', u'28', u'28', u'N/A'] +# ['1', 'ACTIVE', '34', '34', 'N/A'], +# ['2', 'STANDBY', '28', '28', 'N/A'] # ], # [ -# [u'1_01', u'ACTIVE'], -# [u'1_02', u'ACTIVE'], -# [u'2_01', u'ACTIVE'] +# ['1_01', 'ACTIVE'], +# ['1_02', 'ACTIVE'], +# ['2_01', 'ACTIVE'] # ] # ] # -from pprint import pprint -from typing import Mapping, Dict, List, Tuple, NamedTuple, Optional +from typing import List, NamedTuple, Optional from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( DiscoveryResult, @@ -117,55 +115,74 @@ def parse_checkpoint_asg_chassis(string_table: List[StringTable]) -> Optional[Ch try: return CheckPointASGChassis( info=CheckPointASGChassisInfo(*string_table[0][0]), - chassis=string_table[1], - sgms=string_table[2] + chassis=[CheckPointASGChassisParams(*chassis) for chassis in string_table[1]], + sgms=[CheckPointASGChassisSgms(*sgm) for sgm in string_table[2]] ) except (TypeError, IndexError): pass def discovery_checkpoint_asg_chassis(section: CheckPointASGChassis) -> DiscoveryResult: - yield Service(parameters={'inv_chassis_parms': section.chassis}) + yield Service(parameters={ + 'discovery_chassis': len(section.chassis), + 'discovery_sgms': len(section.sgms), + }) def check_checkpoint_asg_chassis(params, section: CheckPointASGChassis) -> CheckResult: - details = '' - details += '\nTo verify this output use the "asg monitor" CLI command on the Check Point SMO,\n' - details += '\nChassis Mode: %s' % section.info.mode - details += '\nH/A Mode: %s' % section.info.hamode - details += '\nSync to active: %s' % section.info.synctoactive - details += '\nSync to standby: %s' % section.info.synctostandby + notice = '' + notice += '\nTo verify this output use the "asg monitor" CLI command on the Check Point SMO,\n' + notice += f'\nChassis Mode: {section.info.mode}' + notice += f'\nH/A Mode: {section.info.hamode}' + notice += f'\nSync to active: {section.info.synctoactive}' + notice += f'\nSync to standby: {section.info.synctostandby}' - inv_chassis_parms = params['inv_chassis_parms'] + yield Result(state=State.OK, notice=notice) for chassis in section.chassis: - chassis = CheckPointASGChassisParams(*chassis) - if chassis.uniqueip != 'N/A': - details += '\nChassis %s unique IP: %s' % (chassis.id, chassis.uniqueip) - - for inv_chassis in inv_chassis_parms: - inv_chassis = CheckPointASGChassisParams(*inv_chassis) - if chassis.id == inv_chassis.id: - yield_text = 'Chassis %s: %s, grade: %s/%s' % (chassis.id, chassis.status, chassis.grade, chassis.maxgrade) - if not chassis.status.lower() in ['active', 'standby'] or chassis.grade != chassis.maxgrade: - yield Result(state=State.CRIT, summary=yield_text) - elif (chassis.status != inv_chassis.status) or (chassis.grade != inv_chassis.grade) or (chassis.maxgrade != inv_chassis.maxgrade): - yield Result(state=State.WARN, notice=yield_text + ' (expected: %s, grade: %s/%s)' % (inv_chassis.status, inv_chassis.grade, inv_chassis.maxgrade)) - else: - yield Result(state=State.OK, summary=yield_text) + yield Result(state=State.OK, notice=f'\nChassis {chassis.id} unique IP: {chassis.uniqueip}') + + if not chassis.status.lower() in ['active', 'standby']: + yield Result( + state=State(params['state_chassis_not_active_standby']), + summary=f'Chassis {chassis.id}: {chassis.status}' + ) + elif chassis.id == params['desired_chassis_active'] and chassis.status.lower() != 'active': + yield Result( + state=State(params['state_chassis_not_desired_active']), + notice=f'Chassis {chassis.id}: {chassis.status} should be active' + ) + else: + yield Result(state=State.OK, summary=f'Chassis {chassis.id}: {chassis.status}') + + summary = f'grade: {chassis.grade}/{chassis.maxgrade}' + details = f'Chassis {chassis.id} grade: {chassis.grade}/{chassis.maxgrade}' + if chassis.grade != chassis.maxgrade: + yield Result(state=State(params['state_chassis_not_max_grade']), summary=summary, details=details) + else: + yield Result(state=State.OK, summary=summary, details=details) + + if len(section.chassis) != params['discovery_chassis']: + yield Result( + state=State(params['state_chassis_number_changed']), + notice=f'Number of chassis changed ({len(section.chassis)}/{params["discovery_chassis"]}' + ) active_sgms = 0 - for asgSgm in section.sgms: - asgSgm = CheckPointASGChassisSgms(*asgSgm) - if asgSgm.status.lower() == 'active': + for sgm in section.sgms: + if sgm.status.lower() == 'active': active_sgms += 1 else: - yield Result(state=State.CRIT, notice='SGM %s state: %s' % (asgSgm.id, asgSgm.status)) + yield Result(state=State(params['state_sgm_not_active']), notice=f'SGM {sgm.id} state: {sgm.status}') - yield Result(state=State.OK, - summary='%d/%d SGMs active' % (active_sgms, len(section.sgms)), - details=details) + yield Result(state=State.OK, summary=f'{active_sgms}/{len(section.sgms)} SGMs active') + + if len(section.sgms) != params['discovery_sgms']: + yield Result( + state=State(params['state_sgms_number_changed']), + notice=f'Number of SGMs changed ({len(section.sgms)}/{params["state_sgms_number_changed"]}' + ) register.snmp_section( @@ -213,5 +230,14 @@ register.check_plugin( service_name='ASG Chassis', discovery_function=discovery_checkpoint_asg_chassis, check_function=check_checkpoint_asg_chassis, - check_default_parameters={}, -) \ No newline at end of file + check_default_parameters={ + 'state_chassis_number_changed': 2, + 'desired_chassis_active': '1', + 'state_chassis_not_desired_active': 1, + 'state_chassis_not_active_standby': 2, + 'state_chassis_not_max_grade': 2, + 'state_sgm_not_active': 2, + 'state_sgms_number_changed': 2, + }, + check_ruleset_name='checkpoint_asg_chassis', +) diff --git a/checkpoint_asg_chassis.mkp b/checkpoint_asg_chassis.mkp index a2106c38776678c9d46049dedfdde96fa06e9c70..8f4289ccd901f69457f4758bf2883f3e4e4028b0 100644 Binary files a/checkpoint_asg_chassis.mkp and b/checkpoint_asg_chassis.mkp differ diff --git a/packages/checkpoint_asg_chassis b/packages/checkpoint_asg_chassis index 1fde3a6d0fe3674f289a75a2e1bae4f3f263ea1c..0cff4721417c1758d94ce272e0687385873f380d 100644 --- a/packages/checkpoint_asg_chassis +++ b/packages/checkpoint_asg_chassis @@ -3,11 +3,12 @@ 'monitor)\n', 'download_url': 'http://thl-cmk.hopto.org/', 'files': {'agent_based': ['checkpoint_asg_chassis.py'], - 'checkman': ['checkpoint_asg_chassis']}, + 'checkman': ['checkpoint_asg_chassis'], + 'web': ['plugins/wato/checkpoint_asg_chassis.py']}, 'name': 'checkpoint_asg_chassis', - 'num_files': 2, + 'num_files': 3, 'title': 'Check Point Maestro SMO ASG Chassis', - 'version': '20210225.v0.2', + 'version': '20210911.v0.3', 'version.min_required': '2.0.0b8', 'version.packaged': '2021.07.14', 'version.usable_until': None} \ No newline at end of file diff --git a/web/plugins/wato/checkpoint_asg_chassis.py b/web/plugins/wato/checkpoint_asg_chassis.py new file mode 100644 index 0000000000000000000000000000000000000000..70dea0e4d610cd9c40302d6be339078ee8f4ff25 --- /dev/null +++ b/web/plugins/wato/checkpoint_asg_chassis.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# +from cmk.gui.i18n import _ +from cmk.gui.valuespec import ( + Dictionary, + TextAscii, + DropdownChoice, + MonitoringState, + Transform, +) + +from cmk.gui.plugins.wato import ( + CheckParameterRulespecWithItem, + rulespec_registry, + RulespecGroupCheckParametersNetworking, +) + + +def _parameter_valuespec_checkpoint_asg_chassis(): + return Transform( + Dictionary(elements=[ + ('desired_chassis_active', + DropdownChoice( + title=_('Desired active chassis'), + help=_('Select witch chassis should be active'), + sorted=True, + default_value='1', + choices=[ + ('1', _('Chassis ID 1')), + ('2', _('Chassis ID 2')), + ], + )), + ('state_chassis_not_desired_active', + MonitoringState( + default_value=1, + title=_('State if desired chassis not active'), + help=_('Monitoring state if the desired chassis not active'), + )), + ('state_chassis_number_changed', + MonitoringState( + default_value=2, + title=_('State if number of chassis has changed'), + help=_('Monitoring state if number of chassis differs from discovery time'), + )), + ('state_chassis_not_active_standby', + MonitoringState( + default_value=2, + title=_('State if chassis not active/standby'), + help=_('Monitoring state if the chassis not active or standby'), + )), + ('state_chassis_not_max_grade', + MonitoringState( + default_value=2, + title=_('State if chassis is not optimal'), + help=_('Monitoring state if the chassis grade is less than max grade'), + )), + ('state_sgm_not_active', + MonitoringState( + default_value=2, + title=_('State if SGM is not active'), + help=_('Monitoring state if the SGM state is not active'), + )), + ('state_sgms_number_changed', + MonitoringState( + default_value=2, + title=_('State if number of SGMs has canged'), + help=_('Monitoring state if number of SGMs differs from discovery time'), + )), + ])) + + +rulespec_registry.register( + CheckParameterRulespecWithItem( + check_group_name='checkpoint_asg_chassis', + group=RulespecGroupCheckParametersNetworking, + match_type='dict', + parameter_valuespec=_parameter_valuespec_checkpoint_asg_chassis, + title=lambda: _('Check Point ASG Monitor'), + ))