diff --git a/agent_based/bgp_peer.py b/agent_based/bgp_peer.py index f3250cdff09135568b53c034de621e376851bf7f..36d776fea88b7f0d17669973fa2373b9cdc52fc8 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 Binary files a/bgp_peer.mkp and b/bgp_peer.mkp differ diff --git a/web/plugins/views/inv_bgp_peer.py b/web/plugins/views/inv_bgp_peer.py index 87d1e7a875b41837177e507705b7f30429d1ce45..3d828a1c6d8d54c3a58d7e921dedf05eeae00c80 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 e6abc1c773727de781ea4657aac80ff51d0d0cc5..3756c91874973b5b896b20839623a80b85d36f04 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'),