diff --git a/agent_based/huawei_bgp_peer.py b/agent_based/huawei_bgp_peer.py index 7c5fff3ff2dd5e02498d653f2643e5f93c3fd2d3..7746ade3df0a246d4e0c5e753c958c4a8858df75 100644 --- a/agent_based/huawei_bgp_peer.py +++ b/agent_based/huawei_bgp_peer.py @@ -12,7 +12,9 @@ # Monitor status of Huawei BGP Peers (IPv4 and IPv6) # # 2020-07-20: added BGP prefix counter +# 2022-04-30: code cleanup/streamlining # + # 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 @@ -55,7 +57,7 @@ # HUAWEI-BGP-VPN-MIB::hwBgpPeerEntry.11.0.ipv4.unicast.ipv4."79.200.120.2" = INTEGER: 2 -from typing import List, Dict, Optional +from typing import List, Dict from cmk.base.plugins.agent_based.agent_based_api.v1 import ( register, @@ -68,13 +70,13 @@ from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( ) from cmk.base.plugins.agent_based.utils.bgp_peer import ( - bgp_get_peer, + bgp_get_ip_address_from_oid, BgpPeer, bgp_get_peer_entry, ) -def _huawei_get_adress_family(OID_END): +def _huawei_get_adress_family(afi, safi): # HWBgpAfi ::= TEXTUAL-CONVENTION # STATUS current # DESCRIPTION @@ -101,15 +103,13 @@ def _huawei_get_adress_family(OID_END): 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]) + address_family = HWBgpAfi.get(int(afi), afi) + sub_family = HWBgpSafi.get(int(safi), safi) - return '%s %s' % (adress_family, sub_family) + return f'{address_family} {sub_family}' -def _huawei_bgp_PeerUnAvaiReason(st): +def _huawei_bgp_peer_unavail_reason(st): reason = { '1': 'Configuration lead peer down', '2': 'Receive notification', @@ -127,43 +127,39 @@ def parse_huawei_bgp_peer(string_table: List[StringTable]) -> Dict[str, BgpPeer] peer_table = {} for entry in hwbgpPeer2Entry: - oid_end, hwBgpPeerRemoteAddr, hwBgpPeerState, hwBgpPeerFsmEstablishedCounter, hwBgpPeerFsmEstablishedTime, \ - hwBgpPeerUnAvaiReason = entry + oid_end, remote_address, state, fsm_established_counter, fsm_established_time, unavail_reason = entry bgp_peer = bgp_get_peer_entry([ - hwBgpPeerRemoteAddr, - hwBgpPeerState, + remote_address, + state, '2', # admin_state not admin_down None, # in_updates None, # out_updates None, # in_messages None, # out_messages - hwBgpPeerFsmEstablishedCounter, - hwBgpPeerFsmEstablishedTime, + fsm_established_counter, + fsm_established_time, 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]} + afi, safi = oid_end.split('.')[1:3] + adress_family = _huawei_get_adress_family(afi, safi) + item = f'{remote_address} {adress_family}' + bgp_peer[remote_address].peer_unavail_reason = int(unavail_reason) + bgp_peer[remote_address].peer_unavail_reason_str = _huawei_bgp_peer_unavail_reason(int(unavail_reason)) + bgp_peer = {item: 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 + oid_end, prefix_rcv_counter, prefix_active_counter, prefix_adv_counter = entry + afi, safi = oid_end.split('.')[1:3] counter = [] for key, value in [ - ('prefixrcvcounter', hwBgpPeerPrefixRcvCounter), - ('prefixactivecounter', hwBgpPeerPrefixActiveCounter), - ('prefixadvcounter', hwBgpPeerPrefixAdvCounter), + ('prefixrcvcounter', prefix_rcv_counter), + ('prefixactivecounter', prefix_active_counter), + ('prefixadvcounter', prefix_adv_counter), ]: try: counter.append((key, int(value))) @@ -171,9 +167,9 @@ def parse_huawei_bgp_peer(string_table: List[StringTable]) -> Dict[str, BgpPeer] 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 + item = f'{bgp_get_ip_address_from_oid(f"{oid_end[6:]}.1.1")} {_huawei_get_adress_family(afi, safi)}' + if item in peer_table.keys(): + peer_table[item].metric_count += counter return peer_table @@ -187,7 +183,7 @@ register.snmp_section( 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 + OIDEnd(), # 0.afi.safi.adresstype.length.RemotePeerIP # '1', # hwBgpPeerNegotiatedVersion # '2', # hwBgpPeerRemoteAs '4', # hwBgpPeerRemoteAddr @@ -202,12 +198,23 @@ register.snmp_section( 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 + OIDEnd(), # 0.afi.safi.adresstype.length.RemotePeerIP '1', # hwBgpPeerPrefixRcvCounter '2', # hwBgpPeerPrefixActiveCounter '3', # hwBgpPeerPrefixAdvCounter ] ), + # ToDo: sample need to add counters :-( + # SNMPTree( + # base='.1.3.6.1.4.1.2011.5.25.177.1.1.4.1', # HUAWEI-BGP-VPN-MIB::hwBgpPeerMessageEntry + # oids=[ + # OIDEnd(), # 0.afi.safi.adresstype.length.RemotePeerIP(?) + # '1', # hwBgpPeerInTotalMsgCounter + # '2', # hwBgpPeerOutTotalMsgCounter + # '4', # hwBgpPeerInUpdateMsgCounter + # '9', # hwBgpPeerOutUpdateMsgCounter + # ] + # ), ], detect=startswith('.1.3.6.1.2.1.1.2.0', '.1.3.6.1.4.1.2011') ) diff --git a/huawei_bgp_peer.mkp b/huawei_bgp_peer.mkp index 0daaee78511b9f9e8a49389f2c78a3bbb26fb746..f675408e006c0873df195f239d39afc3ee38a059 100644 Binary files a/huawei_bgp_peer.mkp and b/huawei_bgp_peer.mkp differ