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