From 6692bc13831c09105c243054d19626ba28cddfb9 Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Mon, 5 Sep 2022 19:33:43 +0200 Subject: [PATCH] update project --- agent_based/bgp_peer.py | 51 +++--- bgp_peer.mkp | Bin 15450 -> 15203 bytes packages/bgp_peer | 2 +- web/plugins/wato/bgp_peer.py | 306 ++++++++++++++++++----------------- 4 files changed, 179 insertions(+), 180 deletions(-) diff --git a/agent_based/bgp_peer.py b/agent_based/bgp_peer.py index fa8a2c9..a36a35f 100644 --- a/agent_based/bgp_peer.py +++ b/agent_based/bgp_peer.py @@ -1,24 +1,13 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -############################################################################### -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -############################################################################### +# License: GNU General Public License v2 -############################################################################### -# Author: Thomas Wollner (tw@wollner-net.de) -############################################################################### +# Author: thl-cmk[at]outlook[dot]com +# URL : https://thl-cmk.hopto.org +# Date : 2021-10-25 + +# based on the BGP peer plugin by Thomas Wollner (tw@wollner-net.de) # # 2021-08-20: rewritten for CMK 2.0 by thl-cmk[at]outlook[dot]com # 2021-08-21: added more perfdata, added metrics file @@ -33,6 +22,7 @@ # 2022-05-09: made item name configurable (don't use address-family/routing-instance/VRF) # 2022-05-11: changed bgp_get_peer_entry to get proper parameters instead of Nontransparent list # added remote_as to BgpPeerItem +# 2022-09-05: added missing wato parameters to register.check_plugin check_default_parameters # # Example Agent Output: @@ -49,7 +39,7 @@ # .1.3.6.1.2.1.15.3.1.11.192.168.254.2 = Counter32: 5 # .1.3.6.1.2.1.15.3.1.14.192.168.254.2 = Hex-STRING: 04 00 # .1.3.6.1.2.1.15.3.1.16.192.168.254.2 = Gauge32: 6586822 -############################################################################### +# import time from typing import Dict, Optional @@ -122,20 +112,8 @@ def discovery_bgp_peer(params, section: Dict[str, BgpPeer]) -> DiscoveryResult: def check_bgp_peer(item, params, section: Dict[str, BgpPeer]) -> CheckResult: - # default monitoring states for bgpPeerState - neighborstate = { - '1': 2, # idle - '2': 1, # connect - '3': 1, # active - '4': 1, # opensent - '5': 1, # openconfirm - '6': 0, # established - } - item = params.get('internal_item', item) - - neighborstate.update(params.get('neighborstate', neighborstate)) # update neighbor status with params - + neighborstate = params['neighborstate'] peer_not_found_state = params['peernotfound'] for bgp_connection, bgp_alias, not_found_state in params.get('peer_list', []): @@ -251,6 +229,17 @@ register.check_plugin( 'peernotfound': 2, 'admindown': 1, 'noprefixlimit': 1, + 'accepted_prefixes_upper_levels': (None, None), + 'accepted_prefixes_lower_levels': (None, None), + 'neighborstate': { + '1': 2, # idle + '2': 1, # connect + '3': 1, # active + '4': 1, # opensent + '5': 1, # openconfirm + '6': 0, # established + }, + 'internal_item': None, }, check_ruleset_name='bgp_peer', ) diff --git a/bgp_peer.mkp b/bgp_peer.mkp index 685389e92076764703ab453c17472d4fd0001ac6..6e2180eca3d94dd4e65d876df55c747e87108fe9 100644 GIT binary patch delta 15115 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 delta 15329 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 diff --git a/packages/bgp_peer b/packages/bgp_peer index fc7af17..a896845 100644 --- a/packages/bgp_peer +++ b/packages/bgp_peer @@ -20,7 +20,7 @@ 'name': 'bgp_peer', 'num_files': 8, 'title': 'BGP Peer State Check', - 'version': '20220512.v1.8', + 'version': '220905.v1.8a', 'version.min_required': '2.0.0', 'version.packaged': '2021.09.20', 'version.usable_until': None} \ No newline at end of file diff --git a/web/plugins/wato/bgp_peer.py b/web/plugins/wato/bgp_peer.py index 9f80635..8d5d1ba 100644 --- a/web/plugins/wato/bgp_peer.py +++ b/web/plugins/wato/bgp_peer.py @@ -16,6 +16,7 @@ # 2022-04-29: added upper/lower prefix limit # 2022-05-09: added discovery rule set # 2022-05-11: added remote_as to build_item +# 2022-09-05: added internal_item to avoid warnings on cmk updates from cmk.gui.i18n import _ from cmk.gui.valuespec import ( @@ -39,157 +40,166 @@ from cmk.gui.plugins.wato import ( def _parameter_valuespec_bgp_peer(): - return Dictionary(elements=[ - ('minuptime', - Tuple( - title=_('Minimum uptime for peer'), - orientation='horizontal', - help=_('Set the time in seconds, a peer must be up before the peer is considered sable.'), - elements=[ - Integer(title=_('Warning below'), unit='seconds', default_value=7200, minvalue=0), - Integer(title=_('Critical below'), unit='seconds', default_value=3600, minvalue=0) - ], - )), - ('accepted_prefixes_upper_levels', - Tuple( - title=_('Accepted prefixes upper levels'), - help=_('The values from WATO are preferred to the values from the device.'), - orientation='horizontal', - elements=[ - Integer(title=_('Warning at'), minvalue=0, unit=_('prefixes'), size=5), - Integer(title=_('Critical at'), minvalue=0, unit=_('prefixes'), size=5), - ], - )), - ('accepted_prefixes_lower_levels', - Tuple( - title=_('Accepted prefixes lower levels'), - orientation='horizontal', - elements=[ - Integer(title=_('Warning below'), minvalue=0, unit=_('prefixes'), size=5), - Integer(title=_('Critical below'), minvalue=0, unit=_('prefixes'), size=5), - ], - )), - ('peernotfound', - MonitoringState( - default_value=2, - title=_('State if peer is no not found.'), - help=_('Default monitoring state if the peer is not found in the SNMP data') - )), - ('admindown', - MonitoringState( - default_value=1, - title=_('State if peer is admin shutdown.'), - help=_('Monitoring state if the peer is admin shutdown') - )), - ('neighborstate', - Dictionary( - title=_('State to report for BGP neighbor state'), - help=_('Map each BGP state to a CheckMK monitoring state'), - elements=[ - ('1', - MonitoringState( - title=_('1 - idle'), - help=_('This is the first stage of the BGP FSM. BGP detects a start event, tries to initiate a ' - 'TCP connection to the BGP peer, and also listens for a new connect from a peer router. ' - 'If an error causes BGP to go back to the Idle state for a second time, the ' - 'ConnectRetryTimer is set to 60 seconds and must decrement to zero before the connection ' - 'is initiated again. Further failures to leave the Idle state result in the ' - 'ConnectRetryTimer doubling in length from the previous time. ' - 'Default monitoring state is "CRIT"'), - default_value=2, - )), - ('2', - MonitoringState( - title=_('2 - connect'), - help=_('In this state, BGP initiates the TCP connection. If the 3-way TCP handshake completes, ' - 'the established BGP Session BGP process resets the ConnectRetryTimer and sends the Open ' - 'message to the neighbor, and then changes to the OpenSent State.' - 'Default monitoring state is "WARN"'), - default_value=1, - )), - ('3', - MonitoringState( - title=_('3 - active'), - help=_('In this state, BGP starts a new 3-way TCP handshake. If a connection is established, ' - 'an Open message is sent, the Hold Timer is set to 4 minutes, and the state moves to ' - 'OpenSent. If this attempt for TCP connection fails, the state moves back to the Connect ' - 'state and resets the ConnectRetryTimer. ' - 'Default monitoring state is "WARN"'), - default_value=1, - )), - ('4', - MonitoringState( - title=_('4 - opensent'), - help=_('In this state, an Open message has been sent from the originating router and is awaiting ' - 'an Open message from the other router. After the originating router receives the OPEN ' - 'message from the other router, both OPEN messages are checked for errors. If the Open ' - 'messages do not have any errors, the Hold Time is negotiated (using the lower value), ' - 'and a KEEPALIVE message is sent (assuming the value is not set to zero). The connection ' - 'state is then moved to OpenConfirm. If an error is found in the OPEN message, a ' - 'Notification message is sent, and the state is moved back to Idle.' - ' Default monitoring state is "WARN"'), - default_value=1, - )), - ('5', - MonitoringState( - title=_('5 - openconfirm'), - help=_('In this state, BGP waits for a Keepalive or Notification message. Upon receipt of a ' - 'neighbor’s Keepalive, the state is moved to Established. If the hold timer expires, a ' - 'stop event occurs, or a Notification message is received, and the state is moved to ' - 'Idle. ' - 'Default monitoring state is "WARN"'), - default_value=1, - )), - ('6', - MonitoringState( - title=_('6 - established'), - help=_('In this state, the BGP session is established. BGP neighbors exchange routes via Update ' - 'messages. As Update and Keepalive messages are received, the Hold Timer is reset. If the ' - 'Hold Timer expires, an error is detected and BGP moves the neighbor back to the Idle ' - 'state. ' - 'Default monitoring state is "OK"'), - default_value=0, - )), - ])), - ('noprefixlimit', - MonitoringState( - default_value=1, - title=_('State if no admin prefix limit/warn threshold is configured.'), - help=_('The admin prefix limit and warn threshold needs to be configured on the device. ' - 'For example: "neighbor 172.17.10.10 maximum-prefix 10000 80". The threshold is in percentage ' - 'of the prefix limit.') - )), - ('peer_list', - ListOf( + return Dictionary( + elements=[ + ('minuptime', Tuple( + title=_('Minimum uptime for peer'), orientation='horizontal', + help=_('Set the time in seconds, a peer must be up before the peer is considered sable.'), elements=[ - TextUnicode( - title=_('BGP Peer'), - help=_('The configured value must match a BGP item reported by the monitored ' - 'device. For example: "10.194.115.98" or "2A10:1CD0:1020:135::20 IPv6 Unicast"'), - allow_empty=False, - size=50, - ), - TextUnicode( - title=_('BGP Peer Alias'), - help=_('You can configure an individual alias here for the BGP peer matching ' - 'the text configured in the "BGP Peer IP-address" field. The alias will ' - 'be shown in the check info'), - size=50, - ), - MonitoringState( - default_value=2, - title=_('State if not found'), - help=_('You can configure an individual state if the BGP peer matching the text ' - 'configured in the "BGP Peer IP-address" field is not found') - ), - ]), - add_label=_('Add BGP peer'), - movable=False, - title=_('BGP Peers'), - )), - ]) + Integer(title=_('Warning below'), unit='seconds', default_value=7200, minvalue=0), + Integer(title=_('Critical below'), unit='seconds', default_value=3600, minvalue=0) + ], + )), + ('accepted_prefixes_upper_levels', + Tuple( + title=_('Accepted prefixes upper levels'), + help=_('The values from WATO are preferred to the values from the device.'), + orientation='horizontal', + elements=[ + Integer(title=_('Warning at'), minvalue=0, unit=_('prefixes'), size=5), + Integer(title=_('Critical at'), minvalue=0, unit=_('prefixes'), size=5), + ], + )), + ('accepted_prefixes_lower_levels', + Tuple( + title=_('Accepted prefixes lower levels'), + orientation='horizontal', + elements=[ + Integer(title=_('Warning below'), minvalue=0, unit=_('prefixes'), size=5), + Integer(title=_('Critical below'), minvalue=0, unit=_('prefixes'), size=5), + ], + )), + ('peernotfound', + MonitoringState( + default_value=2, + title=_('State if peer is no not found.'), + help=_('Default monitoring state if the peer is not found in the SNMP data') + )), + ('admindown', + MonitoringState( + default_value=1, + title=_('State if peer is admin shutdown.'), + help=_('Monitoring state if the peer is admin shutdown') + )), + ('neighborstate', + Dictionary( + title=_('State to report for BGP neighbor state'), + help=_('Map each BGP state to a CheckMK monitoring state'), + elements=[ + ('1', + MonitoringState( + title=_('1 - idle'), + help=_( + 'This is the first stage of the BGP FSM. BGP detects a start event, tries to initiate a ' + 'TCP connection to the BGP peer, and also listens for a new connect from a peer router. ' + 'If an error causes BGP to go back to the Idle state for a second time, the ' + 'ConnectRetryTimer is set to 60 seconds and must decrement to zero before the connection ' + 'is initiated again. Further failures to leave the Idle state result in the ' + 'ConnectRetryTimer doubling in length from the previous time. ' + 'Default monitoring state is "CRIT"'), + default_value=2, + )), + ('2', + MonitoringState( + title=_('2 - connect'), + help=_( + 'In this state, BGP initiates the TCP connection. If the 3-way TCP handshake completes, ' + 'the established BGP Session BGP process resets the ConnectRetryTimer and sends the Open ' + 'message to the neighbor, and then changes to the OpenSent State.' + 'Default monitoring state is "WARN"'), + default_value=1, + )), + ('3', + MonitoringState( + title=_('3 - active'), + help=_('In this state, BGP starts a new 3-way TCP handshake. If a connection is established, ' + 'an Open message is sent, the Hold Timer is set to 4 minutes, and the state moves to ' + 'OpenSent. If this attempt for TCP connection fails, the state moves back to the Connect ' + 'state and resets the ConnectRetryTimer. ' + 'Default monitoring state is "WARN"'), + default_value=1, + )), + ('4', + MonitoringState( + title=_('4 - opensent'), + help=_( + 'In this state, an Open message has been sent from the originating router and is awaiting ' + 'an Open message from the other router. After the originating router receives the OPEN ' + 'message from the other router, both OPEN messages are checked for errors. If the Open ' + 'messages do not have any errors, the Hold Time is negotiated (using the lower value), ' + 'and a KEEPALIVE message is sent (assuming the value is not set to zero). The connection ' + 'state is then moved to OpenConfirm. If an error is found in the OPEN message, a ' + 'Notification message is sent, and the state is moved back to Idle.' + ' Default monitoring state is "WARN"'), + default_value=1, + )), + ('5', + MonitoringState( + title=_('5 - openconfirm'), + help=_('In this state, BGP waits for a Keepalive or Notification message. Upon receipt of a ' + 'neighbor’s Keepalive, the state is moved to Established. If the hold timer expires, a ' + 'stop event occurs, or a Notification message is received, and the state is moved to ' + 'Idle. ' + 'Default monitoring state is "WARN"'), + default_value=1, + )), + ('6', + MonitoringState( + title=_('6 - established'), + help=_( + 'In this state, the BGP session is established. BGP neighbors exchange routes via Update ' + 'messages. As Update and Keepalive messages are received, the Hold Timer is reset. If the ' + 'Hold Timer expires, an error is detected and BGP moves the neighbor back to the Idle ' + 'state. ' + 'Default monitoring state is "OK"'), + default_value=0, + )), + ])), + ('noprefixlimit', + MonitoringState( + default_value=1, + title=_('State if no admin prefix limit/warn threshold is configured.'), + help=_('The admin prefix limit and warn threshold needs to be configured on the device. ' + 'For example: "neighbor 172.17.10.10 maximum-prefix 10000 80". The threshold is in percentage ' + 'of the prefix limit.') + )), + ('peer_list', + ListOf( + Tuple( + orientation='horizontal', + elements=[ + TextUnicode( + title=_('BGP Peer'), + help=_('The configured value must match a BGP item reported by the monitored ' + 'device. For example: "10.194.115.98" or "2A10:1CD0:1020:135::20 IPv6 Unicast"'), + allow_empty=False, + size=50, + ), + TextUnicode( + title=_('BGP Peer Alias'), + help=_('You can configure an individual alias here for the BGP peer matching ' + 'the text configured in the "BGP Peer IP-address" field. The alias will ' + 'be shown in the check info'), + size=50, + ), + MonitoringState( + default_value=2, + title=_('State if not found'), + help=_('You can configure an individual state if the BGP peer matching the text ' + 'configured in the "BGP Peer IP-address" field is not found') + ), + ]), + add_label=_('Add BGP peer'), + movable=False, + title=_('BGP Peers'), + )), + ('internal_item', # added by plugin discovery function + TextUnicode()), + ], + hidden_keys=['internal_item'], + ) rulespec_registry.register( -- GitLab