diff --git a/agent_based/checkpoint_asg_vsls.py b/agent_based/checkpoint_asg_vsls.py new file mode 100644 index 0000000000000000000000000000000000000000..43ce98e5f83cc9469e02a64323956ef659f3e281 --- /dev/null +++ b/agent_based/checkpoint_asg_vsls.py @@ -0,0 +1,189 @@ +#!/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-07 +# +# Monitor Check Point Maestro SMO Vsls Chassis status +# +# 2021-09-11: rewritten for CMK 2.0 +# +# sample snmpwalk +# .1.3.6.1.4.1.2620.1.48.30.20.1.0 = Gauge32: 50 +# .1.3.6.1.4.1.2620.1.48.30.20.2.0 = STRING: "1 2 " +# .1.3.6.1.4.1.2620.1.48.30.20.10.1.1.1.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.48.30.20.10.1.2.1.0 = STRING: "k01001s11-017500009" +# .1.3.6.1.4.1.2620.1.48.30.20.10.1.3.1.0 = Gauge32: 1 +# .1.3.6.1.4.1.2620.1.48.30.20.10.1.4.1.0 = Gauge32: 1 +# .1.3.6.1.4.1.2620.1.48.30.20.10.1.5.1.0 = STRING: "OK" +# .1.3.6.1.4.1.2620.1.48.30.20.10.1.6.1.0 = STRING: "Primary chassis health is good." +# .1.3.6.1.4.1.2620.1.48.30.20.10.1.7.1.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.48.30.20.10.1.8.1.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.48.30.20.10.1.9.1.0 = Gauge32: 2 +# .1.3.6.1.4.1.2620.1.48.30.20.10.1.10.1.0 = Gauge32: 2 +# .1.3.6.1.4.1.2620.1.48.30.20.10.1.21.1.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.48.30.20.10.1.22.1.0 = Gauge32: 0 +# .1.3.6.1.4.1.2620.1.48.30.20.10.1.23.1.0 = Gauge32: 1 +# .1.3.6.1.4.1.2620.1.48.30.20.10.1.24.1.0 = Gauge32: 1 +# +# sample string_table +# [ +# [ +# ['50', '1 2'] +# ], +# [ +# ['0', 'k01001s11-017500009', '1', '1', 'OK', 'Primary chassis health is good.', '2', '2', '1', '1', '', ''] +# ] +# ] +# +# +# sample section +# CheckpointAsgVsls(SgmRatio='50', SystemPrimaryChassis='1 2 ', Vsid='0', VsName='k01001s11-017500009', +# VsPrimaryChassis='1', VsActiveChassis='1', VsHealth='OK', +# VsReason='Primary chassis health is good.', ChassisState=[(2, 2), (1, 1)]) + +from typing import List, Tuple, Optional +from dataclasses import dataclass +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, +) + + +@dataclass +class CheckpointAsgVsls: + SgmRatio: str + SystemPrimaryChassis: str + Vsid: str + VsName: str + VsPrimaryChassis: str + VsActiveChassis: str + VsHealth: str + VsReason: str + ChassisState: List[Tuple[int, int]] + + +def parse_checkpoint_asg_vsls(string_table: List[StringTable]) -> Optional[CheckpointAsgVsls]: + chassis_info, chassis_state = string_table + try: + SgmRatio, SystemPrimaryChassis = chassis_info[0] + except (IndexError, ValueError): + return + + try: + Vsid, VsName, VsPrimaryChassis, VsActiveChassis, VsHealth, VsReason, VsChassis1FwksUp, VsChassis1FwksTotal, \ + VsChassis2FwksUp, VsChassis2FwksTotal, VsChassis3FwksUp, VsChassis3FwksTotal = chassis_state[0] + except (IndexError, ValueError): + return + + return CheckpointAsgVsls( + SgmRatio=SgmRatio, + SystemPrimaryChassis=SystemPrimaryChassis, + Vsid=Vsid, + VsName=VsName, + VsPrimaryChassis=VsPrimaryChassis, + VsActiveChassis=VsActiveChassis, + VsHealth=VsHealth, + VsReason=VsReason, + ChassisState=[ + (int(VsChassis1FwksUp), int(VsChassis1FwksTotal)), + (int(VsChassis2FwksUp), int(VsChassis2FwksTotal)), + # (int(VsChassis3FwksUp), int(VsChassis3FwksTotal)), + ] + ) + + +def discovery_checkpoint_asg_vsls(section: CheckpointAsgVsls) -> DiscoveryResult: + yield Service(parameters={'discovery_active_chassis': section.VsActiveChassis}) + + +def check_checkpoint_asg_vsls(params, section: CheckpointAsgVsls) -> CheckResult: + SystemPrimaryChassis = section.SystemPrimaryChassis.strip().split(' ') + inv_asgVslsVsActiveChassis = params['discovery_active_chassis'] + + longoutput = '' + longoutput += f'\nSystem name: {section.VsName}' + longoutput += f'\nHealth status: {section.VsHealth}' + longoutput += f'\nHealth reason: {section.VsReason}' + yield Result(state=State.OK, notice=longoutput) + + if section.VsHealth != 'OK': + yield Result(state=State.WARN, notice=f'Health: {section.VsHealth}, Reason: {section.VsReason}') + + yield_text = f'Primary/Active chassis: {section.VsPrimaryChassis}/{section.VsActiveChassis}' + if inv_asgVslsVsActiveChassis != section.VsActiveChassis: + yield Result(state=State.WARN, notice=yield_text) + else: + yield Result(state=State.OK, notice=yield_text) + + for chassis in SystemPrimaryChassis: + VsChassisFwksUp, VsChassisFwksTotal = section.ChassisState[int(chassis) - 1] + yield_text = f'Chassis {chassis}: {VsChassisFwksUp}/{VsChassisFwksTotal} SGMs UP' + if VsChassisFwksUp != VsChassisFwksTotal: + yield Result(state=State.CRIT, notice=yield_text) + else: + yield Result(state=State.OK, summary=yield_text) + + +register.snmp_section( + name='checkpoint_asg_vsls', + parse_function=parse_checkpoint_asg_vsls, + fetch=[ + SNMPTree( + base='.1.3.6.1.4.1.2620.1.48.30.20', # CHECKPOINT-MIB::asgVslsInfo + oids=[ + '1', # asgVslsSgmRatio + '2', # asgVslsSystemPrimaryChassis + ] + ), + SNMPTree( + base='.1.3.6.1.4.1.2620.1.48.30.20.10.1', # CHECKPOINT-MIB::asgVslsStateEntry + oids=[ + '1', # asgVslsVsid + '2', # asgVslsVsName + '3', # asgVslsVsPrimaryChassis + '4', # asgVslsVsActiveChassis + '5', # asgVslsVsHealth + '6', # asgVslsVsReason + '9', # asgVslsVsChassis1FwksUp + '10', # asgVslsVsChassis1FwksTotal + '23', # asgVslsVsChassis2FwksUp + '24', # asgVslsVsChassis2FwksTotal + '33', # asgVslsVsChassis3FwksUp + '34', # asgVslsVsChassis3FwksTotal + ] + ), + ], + 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_vsls', + service_name='ASG VSLS', + discovery_function=discovery_checkpoint_asg_vsls, + check_function=check_checkpoint_asg_vsls, + check_default_parameters={}, + check_ruleset_name='checkpoint_asg_vsls', +) diff --git a/checkpoint_asg_vsls.mkp b/checkpoint_asg_vsls.mkp index b3ef880568d8256383aa7cb46d180c45363ba00d..6c2bd0bc6b58a8046603c103a61fada1adfec2eb 100644 Binary files a/checkpoint_asg_vsls.mkp and b/checkpoint_asg_vsls.mkp differ diff --git a/packages/checkpoint_asg_vsls b/packages/checkpoint_asg_vsls index 06a26a4fef531762c34330adae574385e8cdab35..910b669ac782b86463e3bfe7cdd68a1e267c4760 100644 --- a/packages/checkpoint_asg_vsls +++ b/packages/checkpoint_asg_vsls @@ -1,11 +1,11 @@ -{'author': u'Th.L. (thl-cmk[at]outlook[dot]com)', - 'description': u'Monitor Check Point Maestro SMO VSLS Chassis status', +{'author': 'Th.L. (thl-cmk[at]outlook[dot]com)', + 'description': 'Monitor Check Point Maestro SMO VSLS Chassis status\n', 'download_url': 'http://thl-cmk.hopto.org/', - 'files': {'checks': ['checkpoint_asg_vsls']}, + 'files': {'agent_based': ['checkpoint_asg_vsls.py']}, 'name': 'checkpoint_asg_vsls', 'num_files': 1, - 'title': u'Check Point Maestro SMO ASG VSLS Chassis', - 'version': '20201107.v0.1', - 'version.min_required': '1.4.0p38', - 'version.packaged': '1.6.0p15', + 'title': 'Check Point Maestro SMO ASG VSLS Chassis', + 'version': '20210911.v0.2', + 'version.min_required': '2.0.0', + 'version.packaged': '2021.07.14', 'version.usable_until': None} \ No newline at end of file