diff --git a/agent_based/checkpoint_asg_interface.py b/agent_based/checkpoint_asg_interface.py index e5b5421acabf55513eb72bf29e89ad624eb60349..732f4b1c531219b5c6495d1e2a99499f9031bf9d 100644 --- a/agent_based/checkpoint_asg_interface.py +++ b/agent_based/checkpoint_asg_interface.py @@ -11,6 +11,7 @@ # # 2021-03-03: rewrite for CMK 2.0 # 2021-09-10: changed render function to networkbandwidth +# 2021-09-11: added WTO options # # sample snmpwalk (for one interface) # .1.3.6.1.4.1.2620.1.48.26.1.1.1.4.0 = Gauge32: 4 @@ -47,7 +48,7 @@ import time -from typing import Mapping, Dict, List, Tuple, NamedTuple +from typing import Dict, List, NamedTuple from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( DiscoveryResult, @@ -111,26 +112,6 @@ def parse_checkpoint_asg_interface(string_table: List[StringTable]) -> Dict[str, def discovery_checkpoint_asg_interface(section: Dict[str, CheckPointASGInterface]) -> DiscoveryResult: - # sample section - # - # { - # 'bond2': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:05:09', asgNetIfInfo='Bond Master', asgNetIfState='(up)/(up)', asgNetIfSpeed='20G', asgNetIfMTU='NA', asgNetIfDuplex='Full', asgNetIfRx=3373103274, asgNetIfTx=5007776301), - # 'eth1-05': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:05:09', asgNetIfInfo='Bond slave', asgNetIfState='(up)/(up)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=1014183605, asgNetIfTx=3291515315), - # 'eth2-05': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:05:09', asgNetIfInfo='Bond slave', asgNetIfState='(up)/(up)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=2358951560, asgNetIfTx=1716293763), - # 'bond2.602': CheckPointASGInterface(asgNetIfIPv4Addr='10.9.9.1/25', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:05:09', asgNetIfInfo='Vlan', asgNetIfState='(up)/(up)', asgNetIfSpeed='NA', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=355320533, asgNetIfTx=4673143507), - # 'bond2.3001': CheckPointASGInterface(asgNetIfIPv4Addr='10.0.100.49/27', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:05:09', asgNetIfInfo='Vlan', asgNetIfState='(up)/(up)', asgNetIfSpeed='NA', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=2910413426, asgNetIfTx=229216384), - # 'bond3': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:06:09', asgNetIfInfo='Bond Master', asgNetIfState='(up)/(up)', asgNetIfSpeed='20G', asgNetIfMTU='NA', asgNetIfDuplex='Full', asgNetIfRx=1479928728, asgNetIfTx=133617791), - # 'eth1-06': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:06:09', asgNetIfInfo='Bond slave', asgNetIfState='(up)/(up)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=214459394, asgNetIfTx=131774843), - # 'eth2-06': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:06:09', asgNetIfInfo='Bond slave', asgNetIfState='(up)/(up)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=1265469477, asgNetIfTx=1843158), - # 'bond3.998': CheckPointASGInterface(asgNetIfIPv4Addr='xx.yy.zz.129/28', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:81:06:09', asgNetIfInfo='Vlan', asgNetIfState='(up)/(up)', asgNetIfSpeed='NA', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=1470381718, asgNetIfTx=124676073), - # 'magg1': CheckPointASGInterface(asgNetIfIPv4Addr='10.0.100.9/27', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:6e:9b:dc', asgNetIfInfo='Bond Master', asgNetIfState='(up)/(up)', asgNetIfSpeed='20G', asgNetIfMTU='NA', asgNetIfDuplex='Full', asgNetIfRx=200631796, asgNetIfTx=384654797), - # 'eth1-Mgmt1': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:6e:9b:dc', asgNetIfInfo='Bond slave', asgNetIfState='(Up)/(Up)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=61520991, asgNetIfTx=44776128), - # 'eth2-Mgmt1': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:6e:9b:dc', asgNetIfInfo='Bond slave', asgNetIfState='(Up)/(Up)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=139110651, asgNetIfTx=339878254), - # 'Sync': CheckPointASGInterface(asgNetIfIPv4Addr='192.0.2.1/24', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:01:04:fe', asgNetIfInfo='Bond Master', asgNetIfState='(up)/(up)', asgNetIfSpeed='20G', asgNetIfMTU='NA', asgNetIfDuplex='Full', asgNetIfRx=24549684703, asgNetIfTx=14214325659), - # 'eth1-Sync': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:01:04:fe', asgNetIfInfo='Bond slave', asgNetIfState='(down)/(down)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=1228171, asgNetIfTx=1511513), - # 'eth2-Sync': CheckPointASGInterface(asgNetIfIPv4Addr='-', asgNetIfIPv6Addr='-', asgNetIfMACAddr='00:1c:7f:01:04:fe', asgNetIfInfo='Bond slave', asgNetIfState='(up)/(up)', asgNetIfSpeed='10G', asgNetIfMTU='1500', asgNetIfDuplex='Full', asgNetIfRx=24548432877, asgNetIfTx=14212801896) - # } - # for item in section.keys(): yield Service(item=item, parameters={'asgNetIfSpeed': section[item].asgNetIfSpeed}) @@ -147,47 +128,53 @@ def check_checkpoint_asg_interface(item, params, section: Dict[str, CheckPointAS now = time.time() value_store = get_value_store() - try: - in_rate = get_rate(value_store, 'in', now, asg_interface.asgNetIfRx, raise_overflow=True, ) - except GetRateError as exc: - yield IgnoreResults(str(exc)) - else: - yield from check_levels(in_rate, metric_name='if_in_octets', render_func=render.networkbandwidth, label='In', ) - - out_rate = get_rate(value_store, 'out', now, asg_interface.asgNetIfTx, raise_overflow=True, ) - yield from check_levels(out_rate, metric_name='if_out_octets', render_func=render.networkbandwidth, label='Out', ) + for label, metric, value in [ + ('In', 'if_in_octets', asg_interface.asgNetIfRx), + ('Out', 'if_out_octets', asg_interface.asgNetIfTx), + ]: + try: + value = get_rate(value_store, label, now, value, raise_overflow=True, ) + except GetRateError as exc: + yield IgnoreResults(str(exc)) + else: + yield from check_levels(value, metric_name=metric, render_func=render.networkbandwidth, label=label, ) details = '' - details += '\nIPv4 Address: %s' % asg_interface.asgNetIfIPv4Addr - details += '\nIPv6 Address: %s' % asg_interface.asgNetIfIPv6Addr - details += '\nMAC Address: %s' % asg_interface.asgNetIfMACAddr - details += '\nType: %s' % asg_interface.asgNetIfInfo - details += '\nMTU: %s' % asg_interface.asgNetIfMTU - details += '\nDuplex: %s' % asg_interface.asgNetIfDuplex + details += f'\nIPv4 Address: {asg_interface.asgNetIfIPv4Addr}' + details += f'\nIPv6 Address: {asg_interface.asgNetIfIPv6Addr}' + details += f'\nMAC Address: {asg_interface.asgNetIfMACAddr}' + details += f'\nType: {asg_interface.asgNetIfInfo}' + details += f'\nMTU: {asg_interface.asgNetIfMTU}' + details += f'\nDuplex: {asg_interface.asgNetIfDuplex}' if not asg_interface.asgNetIfIPv4Addr == '-': - summary = 'IPv4: %s' % asg_interface.asgNetIfIPv4Addr + summary = f'IPv4: {asg_interface.asgNetIfIPv4Addr}' else: summary = 'IPv4: N/A' yield Result(state=State.OK, summary=summary, details=details) - yield_text = 'State: %s' % asg_interface.asgNetIfState + yield_text = f'State: {asg_interface.asgNetIfState}' if not asg_interface.asgNetIfState.lower() == '(up)/(up)': - yield Result(state=State.CRIT, summary=yield_text) + yield Result(state=State(params['state_not_up_up']), summary=yield_text) else: yield Result(state=State.OK, summary=yield_text) if not asg_interface.asgNetIfSpeed == inv_asgNetIfSpeed: - yield Result(state=State.WARN, - summary='Speed: %s (%s expected)' % (asg_interface.asgNetIfSpeed, inv_asgNetIfSpeed)) + yield Result( + state=State(params['state_speed_changed']), + summary=f'Speed: {asg_interface.asgNetIfSpeed} ({inv_asgNetIfSpeed} expected)' + ) elif not asg_interface.asgNetIfSpeed == 'NA': - yield Result(state=State.OK, summary='Speed %s' % asg_interface.asgNetIfSpeed) + yield Result(state=State.OK, summary=f'Speed {asg_interface.asgNetIfSpeed}') - if not asg_interface.asgNetIfDuplex.lower(): - yield Result(state=State.CRIT, summary='Duplex: %s (Full expected)' % asg_interface.asgNetIfDuplex) + if not asg_interface.asgNetIfDuplex.lower() == 'full': + yield Result( + state=State(params['state_not_full_duplex']), + summary=f'Duplex: {asg_interface.asgNetIfDuplex} (Full expected)' + ) else: - yield Result(state=State.OK, summary='Duplex: %s' % asg_interface.asgNetIfDuplex) + yield Result(state=State.OK, summary=f'Duplex: {asg_interface.asgNetIfDuplex}') register.snmp_section( @@ -225,6 +212,10 @@ register.check_plugin( service_name='ASG Interface %s', discovery_function=discovery_checkpoint_asg_interface, check_function=check_checkpoint_asg_interface, - check_default_parameters={}, + check_default_parameters={ + 'state_not_full_duplex': 2, + 'state_not_up_up': 2, + 'state_speed_changed': 1, + }, check_ruleset_name='checkpoint_asg_interface', -) \ No newline at end of file +) diff --git a/checkpoint_asg_interface.mkp b/checkpoint_asg_interface.mkp index 8f761411c1f27b9b1ca53ae97818f0d6943510a6..c51fc3c95c7b473741b087ca78e73bbb6d9c3ef2 100644 Binary files a/checkpoint_asg_interface.mkp and b/checkpoint_asg_interface.mkp differ diff --git a/packages/checkpoint_asg_interface b/packages/checkpoint_asg_interface index a7a370c88c964d362a37bcb59ab91c81e5fed38b..039db6191c6eb3e8da8cd612e5e1f773389e1a8c 100644 --- a/packages/checkpoint_asg_interface +++ b/packages/checkpoint_asg_interface @@ -4,11 +4,12 @@ ' - 2021-03-03: rewrite for CMK 2.x\n', 'download_url': 'http://thl-cmk.hopto.org/', 'files': {'agent_based': ['checkpoint_asg_interface.py'], - 'checkman': ['checkpoint_asg_interface']}, + 'checkman': ['checkpoint_asg_interface'], + 'web': ['plugins/wato/checkpoint_asg_interface.py']}, 'name': 'checkpoint_asg_interface', - 'num_files': 2, + 'num_files': 3, 'title': 'Check Point Maestro SMO interfaces', - 'version': '20201109.v0.1', - 'version.min_required': '2.0.0b8', + '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 diff --git a/web/plugins/wato/checkpoint_asg_interface.py b/web/plugins/wato/checkpoint_asg_interface.py new file mode 100644 index 0000000000000000000000000000000000000000..a7c7e7e77c6790736ea986beb8079a8f343153b6 --- /dev/null +++ b/web/plugins/wato/checkpoint_asg_interface.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# +from cmk.gui.i18n import _ +from cmk.gui.valuespec import ( + Dictionary, + TextAscii, + Tuple, + Integer, + Transform, + MonitoringState, +) + +from cmk.gui.plugins.wato import ( + CheckParameterRulespecWithItem, + rulespec_registry, + RulespecGroupCheckParametersNetworking, +) + + +def _parameter_valuespec_checkpoint_asg_interface(): + return Transform( + Dictionary(elements=[ + ('state_not_full_duplex', + MonitoringState( + default_value=2, + title=_('State if not Full duplex'), + help=_('Monitoring state if interface not in Full duplex state'), + )), + ('state_not_up_up', + MonitoringState( + default_value=2, + title=_('State if not Up/Up'), + help=_('Monitoring state if interface not in Up/Up state'), + )), + ('state_speed_changed', + MonitoringState( + default_value=1, + title=_('State if speed changed'), + help=_('Monitoring state if interface is differs from discovery time'), + )), + ])) + + +rulespec_registry.register( + CheckParameterRulespecWithItem( + check_group_name='checkpoint_asg_interface', + group=RulespecGroupCheckParametersNetworking, + match_type='dict', + parameter_valuespec=_parameter_valuespec_checkpoint_asg_interface, + title=lambda: _('Check Point ASG Cores'), + item_spec=lambda: TextAscii(title=_('Interface name'), ), + + ))