From 88f2903dd9479e69175cf6cfb2b9bee5be0b41d5 Mon Sep 17 00:00:00 2001
From: "th.l" <thl-cmk@outlook.com>
Date: Mon, 18 Apr 2022 10:40:09 +0200
Subject: [PATCH] update project

---
 agent_based/huawei_bgp_peer.py         | 213 +++++++++++++++++++++++++
 huawei_bgp_peers.mkp                   | Bin 5879 -> 3261 bytes
 packages/huawei_bgp_peers              |  28 ++--
 web/plugins/metrics/huawei_bgp_peer.py |  48 ++++++
 4 files changed, 280 insertions(+), 9 deletions(-)
 create mode 100644 agent_based/huawei_bgp_peer.py
 create mode 100644 web/plugins/metrics/huawei_bgp_peer.py

diff --git a/agent_based/huawei_bgp_peer.py b/agent_based/huawei_bgp_peer.py
new file mode 100644
index 0000000..7c5fff3
--- /dev/null
+++ b/agent_based/huawei_bgp_peer.py
@@ -0,0 +1,213 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# License: GNU General Public License v2
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+# Date  : 2020-06-22
+#
+# Huawei BGP Peer
+#
+# Monitor status of Huawei BGP Peers (IPv4 and IPv6)
+#
+# 2020-07-20: added BGP prefix counter
+#
+# snmpwalk sample
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.1.0.2.1.2.16.32.32.9.200.0.2.0.1.0.0.0.0.31.100.0.7 = Gauge32: 4
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.2.0.2.1.2.16.32.32.9.200.0.2.0.1.0.0.0.0.31.100.0.7 = Gauge32: 16374
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.4.0.2.1.2.16.32.32.9.200.0.2.0.1.0.0.0.0.31.100.0.7 = STRING: "2020:9F8:19:1::14F6:7"
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.5.0.2.1.2.16.32.32.9.200.0.2.0.1.0.0.0.0.31.100.0.7 = INTEGER: 6
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.6.0.2.1.2.16.32.32.9.200.0.2.0.1.0.0.0.0.31.100.0.7 = Gauge32: 1
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.7.0.2.1.2.16.32.32.9.200.0.2.0.1.0.0.0.0.31.100.0.7 = Gauge32: 3456508
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.9.0.2.1.2.16.32.32.9.200.0.2.0.1.0.0.0.0.31.100.0.7 = Hex-STRING: 00 00
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.10.0.2.1.2.16.32.32.9.200.0.2.0.1.0.0.0.0.31.100.0.7 = Gauge32: 0
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.11.0.2.1.2.16.32.32.9.200.0.2.0.1.0.0.0.0.31.100.0.7 = INTEGER: 2
+#
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.1.0.1.1.1.4.79.200.120.2 = Gauge32: 4
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.2.0.1.1.1.4.79.200.120.2 = Gauge32: 20676
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.4.0.1.1.1.4.79.200.120.2 = STRING: "79.200.120.2"
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.5.0.1.1.1.4.79.200.120.2 = INTEGER: 6
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.6.0.1.1.1.4.79.200.120.2 = Gauge32: 16
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.7.0.1.1.1.4.79.200.120.2 = Gauge32: 2293069
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.9.0.1.1.1.4.79.200.120.2 = Hex-STRING: 06 05
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.10.0.1.1.1.4.79.200.120.2 = Gauge32: 0
+# .1.3.6.1.4.1.2011.5.25.177.1.1.2.1.11.0.1.1.1.4.79.200.120.2 = INTEGER: 2
+#
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerNegotiatedVersion.0.ipv6.unicast.ipv6."20:20:09:f8:00:19:00:01:00:00:00:00:14:f6:00:07" = Gauge32: 4
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerRemoteAs.0.ipv6.unicast.ipv6."20:20:09:f8:00:19:00:01:00:00:00:00:14:f6:00:07" = Gauge32: 16374
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerRemoteAddr.0.ipv6.unicast.ipv6."20:20:09:f8:00:19:00:01:00:00:00:00:14:f6:00:07" = STRING: "2020:9F8:19:1::14F6:7"
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerState.0.ipv6.unicast.ipv6."20:20:09:f8:00:19:00:01:00:00:00:00:14:f6:00:07" = INTEGER: established(6)
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerFsmEstablishedCounter.0.ipv6.unicast.ipv6."20:20:09:f8:00:19:00:01:00:00:00:00:14:f6:00:07" = Gauge32: 1
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerFsmEstablishedTime.0.ipv6.unicast.ipv6."20:20:09:f8:00:19:00:01:00:00:00:00:14:f6:00:07" = Gauge32: 3456883
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerLastError.0.ipv6.unicast.ipv6."20:20:09:f8:00:19:00:01:00:00:00:00:14:f6:00:07" = Hex-STRING: 00 00
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerUnAvaiReason.0.ipv6.unicast.ipv6."20:20:09:f8:00:19:00:01:00:00:00:00:14:f6:00:07" = Gauge32: 0
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerEntry.11.0.ipv6.unicast.ipv6."20:20:09:f8:00:19:00:01:00:00:00:00:14:f6:00:07" = INTEGER: 2
+#
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerNegotiatedVersion.0.ipv4.unicast.ipv4."79.200.120.2" = Gauge32: 4
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerRemoteAs.0.ipv4.unicast.ipv4."79.200.120.2" = Gauge32: 20676
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerRemoteAddr.0.ipv4.unicast.ipv4."79.200.120.2" = STRING: "79.200.120.2"
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerState.0.ipv4.unicast.ipv4."79.200.120.2" = INTEGER: established(6)
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerFsmEstablishedCounter.0.ipv4.unicast.ipv4."79.200.120.2" = Gauge32: 16
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerFsmEstablishedTime.0.ipv4.unicast.ipv4."79.200.120.2" = Gauge32: 2293069
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerLastError.0.ipv4.unicast.ipv4."79.200.120.2" = Hex-STRING: 06 05 
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerUnAvaiReason.0.ipv4.unicast.ipv4."79.200.120.2" = Gauge32: 0
+# HUAWEI-BGP-VPN-MIB::hwBgpPeerEntry.11.0.ipv4.unicast.ipv4."79.200.120.2" = INTEGER: 2
+
+
+from typing import List, Dict, Optional
+
+from cmk.base.plugins.agent_based.agent_based_api.v1 import (
+    register,
+    SNMPTree,
+    OIDEnd,
+    startswith,
+)
+from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
+    StringTable,
+)
+
+from cmk.base.plugins.agent_based.utils.bgp_peer import (
+    bgp_get_peer,
+    BgpPeer,
+    bgp_get_peer_entry,
+)
+
+
+def _huawei_get_adress_family(OID_END):
+    # HWBgpAfi ::= TEXTUAL-CONVENTION
+    #    STATUS current
+    #    DESCRIPTION
+    #        "Address Family Identifier(AFI) for BGP peer."
+    HWBgpAfi = {
+        1: 'IPv4',
+        2: 'IPv6',
+        25: 'VPLS',
+        196: 'L2VPN',
+    }
+
+    # HWBgpSafi ::= TEXTUAL-CONVENTION
+    #    STATUS current
+    #    DESCRIPTION
+    #        "Subsequent Address Family Identifier(SAFI) for BGP peer."
+    HWBgpSafi = {
+        1: 'Unicast',
+        2: 'Multicast',
+        4: 'MPL',
+        5: 'mcast-vpn',
+        65: 'VPL',
+        66: 'MDT',
+        128: 'VPN',
+        132: 'route-target',
+    }
+
+    OID_END = OID_END.split('.')
+
+    adress_family = HWBgpAfi.get(int(OID_END[1]), OID_END[1])
+    sub_family = HWBgpSafi.get(int(OID_END[2]), OID_END[2])
+
+    return '%s %s' % (adress_family, sub_family)
+
+
+def _huawei_bgp_PeerUnAvaiReason(st):
+    reason = {
+        '1': 'Configuration lead peer down',
+        '2': 'Receive notification',
+        '3': 'Receive error packet',
+        '4': 'Hold timer expire',
+        '5': 'Remote peer not reachable',
+        '6': 'Direct connect-interface down',
+        '7': 'Route limit',
+    }
+    return reason.get(st, st)
+
+
+def parse_huawei_bgp_peer(string_table: List[StringTable]) -> Dict[str, BgpPeer]:
+    hwbgpPeer2Entry, hwBgpPeerRouteEntry = string_table
+
+    peer_table = {}
+    for entry in hwbgpPeer2Entry:
+        oid_end, hwBgpPeerRemoteAddr, hwBgpPeerState, hwBgpPeerFsmEstablishedCounter, hwBgpPeerFsmEstablishedTime, \
+        hwBgpPeerUnAvaiReason = entry
+
+        bgp_peer = bgp_get_peer_entry([
+            hwBgpPeerRemoteAddr,
+            hwBgpPeerState,
+            '2',  # admin_state not admin_down
+            None,  # in_updates
+            None,  # out_updates
+            None,  # in_messages
+            None,  # out_messages
+            hwBgpPeerFsmEstablishedCounter,
+            hwBgpPeerFsmEstablishedTime,
+            None,  # in_update_elapsed_time
+            ]
+        )
+        if bgp_peer:
+            adressfamily = _huawei_get_adress_family(oid_end)
+            remote_address = list(bgp_peer.keys())[0]
+            index = f'{remote_address} {adressfamily}'
+            bgp_peer[remote_address].peer_unavail_reason = int(hwBgpPeerUnAvaiReason)
+            bgp_peer[remote_address].peer_unavail_reason_str = _huawei_bgp_PeerUnAvaiReason(int(hwBgpPeerUnAvaiReason))
+            bgp_peer = {index: bgp_peer[remote_address]}
+            peer_table.update(bgp_peer)
+
+    #     peer = {
+    #         'hwpeerunavireason': _huawei_bgp_PeerUnAvaiReason(hwBgpPeerUnAvaiReason),
+    #     }
+    #
+    # add BGP route counter
+    for entry in hwBgpPeerRouteEntry:
+        oid_end, hwBgpPeerPrefixRcvCounter, hwBgpPeerPrefixActiveCounter, hwBgpPeerPrefixAdvCounter = entry
+        counter = []
+        for key, value in [
+            ('prefixrcvcounter', hwBgpPeerPrefixRcvCounter),
+            ('prefixactivecounter', hwBgpPeerPrefixActiveCounter),
+            ('prefixadvcounter', hwBgpPeerPrefixAdvCounter),
+        ]:
+            try:
+                counter.append((key, int(value)))
+            except TypeError:
+                pass
+
+        # adjust oid_end to match cisco oid_end
+        service = '%s %s' % (bgp_get_peer(f'{oid_end[6:]}.1.1'), _huawei_get_adress_family(oid_end))
+        if service in peer_table.keys():
+            peer_table[service].metric_count += counter
+
+    return peer_table
+
+
+register.snmp_section(
+    name='huawei_bgp_peer',
+    parse_function=parse_huawei_bgp_peer,
+    parsed_section_name='bgp_peer',
+    supersedes=['bgp_peer'],
+    fetch=[
+        SNMPTree(
+            base='.1.3.6.1.4.1.2011.5.25.177.1.1.2.1',  # HUAWEI-BGP-VPN-MIB::hwBgpPeerEntry
+            oids=[
+                OIDEnd(),  # 0.ipv4/ipv6.adressFamily.ipv4/ipv6.RemotePeerIP
+                # '1',  # hwBgpPeerNegotiatedVersion
+                # '2',  # hwBgpPeerRemoteAs
+                '4',  # hwBgpPeerRemoteAddr
+                '5',  # hwBgpPeerState
+                '6',  # hwBgpPeerFsmEstablishedCounter
+                '7',  # hwBgpPeerFsmEstablishedTime
+                # '9',  # hwBgpPeerLastError
+                '10',  # hwBgpPeerUnAvaiReason
+                # '11',  # hwBgpPeerEntry
+            ]
+        ),
+        SNMPTree(
+            base='.1.3.6.1.4.1.2011.5.25.177.1.1.3.1',  # HUAWEI-BGP-VPN-MIB::hwBgpPeerRouteEntry
+            oids=[
+                OIDEnd(),  # 0.ipv4/ipv6.adressFamily.ipv4/ipv6.RemotePeerIP
+                '1',  # hwBgpPeerPrefixRcvCounter
+                '2',  # hwBgpPeerPrefixActiveCounter
+                '3',  # hwBgpPeerPrefixAdvCounter
+            ]
+        ),
+    ],
+    detect=startswith('.1.3.6.1.2.1.1.2.0', '.1.3.6.1.4.1.2011')
+)
diff --git a/huawei_bgp_peers.mkp b/huawei_bgp_peers.mkp
index e60fb90c1dc5fbd675cba47e9e688690e18b647f..8f257de3a7a9111c1dca455af648df420c523466 100644
GIT binary patch
literal 3261
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
Aq5uE@

literal 5879
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
N{|8CMPyqm-004eMi+un9

diff --git a/packages/huawei_bgp_peers b/packages/huawei_bgp_peers
index 4d2045d..efb10c1 100644
--- a/packages/huawei_bgp_peers
+++ b/packages/huawei_bgp_peers
@@ -1,12 +1,22 @@
-{'author': u'Th.L. (thl-cmk[at]outlook[dot]com)',
- 'description': u'Monitors Huawei BGP Peers (HUAWEI-BGP-VPN-MIB). \n\n- creates one service for each peer/address family  (IPv4 and IPv6)',
+{'author': 'Th.L. (thl-cmk[at]outlook[dot]com)',
+ 'description': 'Monitors Huawei BGP Peers (HUAWEI-BGP-VPN-MIB). \n'
+                '\n'
+                '- creates one service for each peer/address family  (IPv4 and '
+                'IPv6)\n'
+                '\n'
+                'needs the bgp_peer.mkp (minimum version 20220418.v1.7) '
+                'package to work \n'
+                '\n'
+                'see: '
+                'https://thl-cmk.hopto.org/gitlab/checkmk/vendor-independent/bgp_peer/-/raw/master/bgp_peer.mkp\n'
+                ' \n',
  'download_url': 'https://thl-cmk.hopto.org',
- 'files': {'checks': ['huawei_bgp_peers'],
-           'web': ['plugins/wato/huawei_bgp_peers.py',
-                   'plugins/metrics/huawei_bgp_peers.py']},
+ 'files': {'agent_based': ['huawei_bgp_peer.py'],
+           'web': ['plugins/metrics/huawei_bgp_peer.py']},
  'name': 'huawei_bgp_peers',
- 'num_files': 3,
- 'title': u'Huawei BGP Peer',
- 'version': '20200720.v.0.1a',
+ 'num_files': 2,
+ 'title': 'Huawei BGP Peer',
+ 'version': '20220418.v.0.2',
  'version.min_required': '1.2.8b8',
- 'version.packaged': '1.4.0p38'}
\ No newline at end of file
+ 'version.packaged': '2021.09.20',
+ 'version.usable_until': None}
\ No newline at end of file
diff --git a/web/plugins/metrics/huawei_bgp_peer.py b/web/plugins/metrics/huawei_bgp_peer.py
new file mode 100644
index 0000000..851538e
--- /dev/null
+++ b/web/plugins/metrics/huawei_bgp_peer.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# License: GNU General Public License v2
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+# Date  : 2020-06-22
+#
+# Huawei BGP Peer
+#
+# 2020-07-20: added BGP prefix counter
+#
+#
+from cmk.gui.i18n import _
+
+from cmk.gui.plugins.metrics import (
+    metric_info,
+    graph_info,
+    perfometer_info
+)
+
+
+metric_info['bgp_peer_prefixrcvcounter'] = {
+    'title': _('Prefixes received'),
+    'unit': 'count',
+    'color': '11/a',
+}
+metric_info['bgp_peer_prefixactivecounter'] = {
+    'title': _('Prefixes active'),
+    'unit': 'count',
+    'color': '33/a',
+}
+metric_info['bgp_peer_prefixadvcounter'] = {
+    'title': _('Prefixes advertised'),
+    'unit': 'count',
+    'color': '43/a',
+}
+
+
+graph_info['huawei_bgp_peer_counter']= {
+    'title': _('BGP prefix counter'),
+    'metrics': [
+        ('bgp_peer_prefixrcvcounter', 'line'),
+        ('bgp_peer_prefixactivecounter', 'line'),
+        ('bgp_peer_prefixadvcounter', 'line'),
+    ]
+}
-- 
GitLab