From 80902ee2b541917f2707bc5ad06be1503bf2677d Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Sun, 3 Apr 2022 09:43:55 +0200 Subject: [PATCH] update project --- agent_based/bgp_peer.py | 24 ++++++--- bgp_peer.mkp | Bin 8890 -> 9990 bytes web/plugins/views/inv_bgp_peer.py | 3 +- web/plugins/wato/bgp_peer.py | 87 +++++++++++++++++++++++++++--- 4 files changed, 97 insertions(+), 17 deletions(-) diff --git a/agent_based/bgp_peer.py b/agent_based/bgp_peer.py index f3250cd..36d776f 100644 --- a/agent_based/bgp_peer.py +++ b/agent_based/bgp_peer.py @@ -27,6 +27,7 @@ # moved helper functions to utils/bgp_peer # 2021-11-14: merged check function with cisco_bgp_peer # moved parse function to utils/bgp_peer +# 2021-04-02: rewritten bgp neighbor state handling (made configurable) # # ToDo: make check/discovery function the base for huawei_bgp_peer @@ -90,7 +91,18 @@ def discovery_bgp_peer(section: Dict[str, BgpPeer]) -> DiscoveryResult: def check_bgp_peer(item, params, section: Dict[str, BgpPeer]) -> CheckResult: - # read params + # default monitoring states for bgpPeerState + neighborstate = { + '1': 2, # idle + '2': 1, # connect + '3': 1, # active + '4': 1, # opensent + '5': 1, # openconfirm + '6': 0, # established + } + + neighborstate.update(params.get('neighborstate', neighborstate)) # update neighbor status with params + peer_not_found_state = params['peernotfound'] for bgp_connection, bgp_alias, not_found_state in params.get('peer_list', []): @@ -109,20 +121,16 @@ def check_bgp_peer(item, params, section: Dict[str, BgpPeer]) -> CheckResult: if not peer.admin_state == 2: # not start yield Result(state=State(params['admindown']), notice=f'Admin state: {peer.peer_statestr}') else: - if peer.peer_state == 1: # idle - yield Result(state=State.CRIT, notice=f'Peer state: {peer.peer_statestr}') - elif peer.peer_state == 6: # established + if peer.peer_state == 6: # established yield from check_levels( value=peer.fsm_established_time, label='Uptime', levels_lower=params['minuptime'], - render_func=render.timespan, metric_name='bgp_peer_fsmestablishedtime', ) - yield Result(state=State.OK, notice=f'Peer state: {peer.peer_statestr}') - else: # everything else - yield Result(state=State.WARN, notice=f'Peer state: {peer.peer_statestr}') + + yield Result(state=State(neighborstate.get(str(peer.peer_state))), notice=f'Peer state: {peer.peer_statestr}') acceptedprefixes = peer.accepted_prefixes prefixadminlimit = peer.prefix_admin_limit diff --git a/bgp_peer.mkp b/bgp_peer.mkp index c50b3e5c02e095585db2c5aa6c4240f81e966cf1..60157fe0307a7c1b816c097bd33c8256351fab56 100644 GIT binary patch literal 9990 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 E10Q?H#{d8T literal 8890 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 UL8<>Ip!;fsJPCCNbpr+UUm4_rkN^Mx diff --git a/web/plugins/views/inv_bgp_peer.py b/web/plugins/views/inv_bgp_peer.py index 87d1e7a..3d828a1 100644 --- a/web/plugins/views/inv_bgp_peer.py +++ b/web/plugins/views/inv_bgp_peer.py @@ -2,7 +2,8 @@ # -*- coding: utf-8 -*- from cmk.gui.plugins.views import ( - inventory_displayhints, ) + inventory_displayhints, +) from cmk.gui.i18n import _ inventory_displayhints.update({ diff --git a/web/plugins/wato/bgp_peer.py b/web/plugins/wato/bgp_peer.py index e6abc1c..3756c91 100644 --- a/web/plugins/wato/bgp_peer.py +++ b/web/plugins/wato/bgp_peer.py @@ -12,7 +12,8 @@ # 2021-03-27: rewrite for CMK 2.0 # 2021-08-21: modified for bgp_peer plugin (from cisco_bgp_peer) # 2021-08-29: removed htmloutput and infotext_values option - +# 2022-04-02: added bgp neighbour states +# from cmk.gui.i18n import _ from cmk.gui.valuespec import ( Dictionary, @@ -42,18 +43,88 @@ def _parameter_valuespec_bgp_peer(): Integer(title=_('Critical if below'), unit='seconsa', default_value=3600, minvalue=0) ], )), - ('admindown', - MonitoringState( - default_value=1, - title=_('State if peer is admin shutdown.'), - help=_('Monitoring state if the peer is admin shutdown') - )), ('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, @@ -96,7 +167,7 @@ rulespec_registry.register( CheckParameterRulespecWithItem( check_group_name='bgp_peer', group=RulespecGroupCheckParametersNetworking, - item_spec=lambda: TextAscii(title=_('BGP peer specific configuration'), ), + item_spec=lambda: TextAscii(title=_('BGP peer'), ), match_type='dict', parameter_valuespec=_parameter_valuespec_bgp_peer, title=lambda: _('BGP peer'), -- GitLab