From 09844c63fb531026db31de252b80d548f256d12c Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Mon, 23 Dec 2024 16:03:30 +0100 Subject: [PATCH] added local address/as/identifier for bgp_topology --- README.md | 2 +- mkp/cisco_bgp_peer-1.0.2-20241220.mkp | Bin 0 -> 5316 bytes source/agent_based/cisco_bgp_peer.py | 181 ++++++++++++++++------- source/agent_based/inv_cisco_bgp_peer.py | 28 ++-- source/packages/cisco_bgp_peer | 6 +- 5 files changed, 153 insertions(+), 64 deletions(-) create mode 100644 mkp/cisco_bgp_peer-1.0.2-20241220.mkp diff --git a/README.md b/README.md index f2d0b58..48a8679 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[PACKAGE]: ../../raw/master/mkp/cisco_bgp_peer-1.0.0-20230613.mkp "cisco_bgp_peer-1.0.0-20230613.mkp" +[PACKAGE]: ../../raw/master/mkp/cisco_bgp_peer-1.0.2-20241220.mkp "cisco_bgp_peer-1.0.2-20241220.mkp" # Cisco BGP Peer Monitors status of Cisco BGP peers (IPv4 and IPv6, with basic support for VRFs on NXOS) diff --git a/mkp/cisco_bgp_peer-1.0.2-20241220.mkp b/mkp/cisco_bgp_peer-1.0.2-20241220.mkp new file mode 100644 index 0000000000000000000000000000000000000000..2cc84073d786e387917b039e1f2b314f2cc45f04 GIT binary patch literal 5316 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 D6H#0( literal 0 HcmV?d00001 diff --git a/source/agent_based/cisco_bgp_peer.py b/source/agent_based/cisco_bgp_peer.py index cbf1259..a39204b 100644 --- a/source/agent_based/cisco_bgp_peer.py +++ b/source/agent_based/cisco_bgp_peer.py @@ -54,30 +54,30 @@ # 2022-05-09: added item to BgpPeer class, this is used in the discovery function # 2022-05-11: changed bgp_get_peer_entry to get proper parameters instead of Nontransparent list # added remote_as to BgpPeerItem -# +# 2024-07-19: added in peerv2 local/remote AS/ID/Address for BGP topology +# 2024-12-20: added local address/as/identifier in cisco_bgp_peer for bgp_topology +# 2024-12-23: added local address/as/identifier in cisco_bgp_peer_3 for bgp_topology +# fixed item in cisco_bgp_peer_3 -import copy -from typing import List, Dict, Optional, Tuple from dataclasses import dataclass +from typing import List, Dict, Optional, Tuple +import copy from cmk.base.plugins.agent_based.agent_based_api.v1 import ( - register, + OIDBytes, + OIDEnd, SNMPTree, - exists, - contains, all_of, - OIDEnd, - OIDBytes, -) -from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( - StringTable, - StringByteTable, + contains, + exists, + register, ) - +from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import StringByteTable from cmk.base.plugins.agent_based.utils.bgp_peer import ( - bgp_get_ip_address_from_oid, BgpPeer, + bgp_get_ip_address_from_oid, bgp_get_peer_entry, + bgp_render_ip_address, ) ########################################################################### @@ -98,31 +98,46 @@ class CiscoPrefixes: prefix_threshold: Optional[int] -def parse_cisco_bgp_peer(string_table: List[StringTable]) -> Dict[str, BgpPeer]: - cbgpPeer2Entry, cbgpPeer2AddrFamily = string_table +def parse_cisco_bgp_peer(string_table: List[StringByteTable]) -> Dict[str, BgpPeer]: + peer2_entry, peer2_addr_family, base_local_as = string_table + + try: + base_local_as = base_local_as[0][0] + except (ValueError, IndexError): + base_local_as = None peer_prefixes = {} # create dictionary by peer address and list of entries per address family - for entry in cbgpPeer2AddrFamily: - oid_end, addrfamilyname, acceptedprefixes, deniedprefixes, prefixadminlimit, prefixthreshold, \ - prefixclearthreshold, advertisedprefixes, suppressedprefixes, withdrawnprefixes = entry + for entry in peer2_addr_family: + ( + oid_end, + addr_family_name, + accepted_prefixes, + denied_prefixes, + prefix_admin_limit, + prefix_threshold, + prefix_clear_threshold, + advertised_prefixes, + suppressed_prefixes, + withdrawn_prefixes + ) = entry if not oid_end == '': remote_addr = bgp_get_ip_address_from_oid(oid_end) prefixes = CiscoPrefixes( - address_family=addrfamilyname, + address_family=addr_family_name, metric_count=[], metric_rate=[], - accepted_prefixes=int(acceptedprefixes) if acceptedprefixes.isdigit() else None, - prefix_admin_limit=int(prefixadminlimit) if prefixadminlimit.isdigit() else None, - prefix_clear_threshold=int(prefixthreshold) if prefixthreshold.isdigit() else None, - prefix_threshold=int(prefixthreshold) if prefixthreshold.isdigit() else None + accepted_prefixes=int(accepted_prefixes) if accepted_prefixes.isdigit() else None, + prefix_admin_limit=int(prefix_admin_limit) if prefix_admin_limit.isdigit() else None, + prefix_clear_threshold=int(prefix_threshold) if prefix_threshold.isdigit() else None, + prefix_threshold=int(prefix_threshold) if prefix_threshold.isdigit() else None ) for key, value in [ - ('advertisedprefixes', advertisedprefixes), - ('deniedprefixes', deniedprefixes), - ('suppressedprefixes', suppressedprefixes), - ('withdrawnprefixes', withdrawnprefixes), + ('advertisedprefixes', advertised_prefixes), + ('deniedprefixes', denied_prefixes), + ('suppressedprefixes', suppressed_prefixes), + ('withdrawnprefixes', withdrawn_prefixes), ]: try: prefixes.metric_rate.append((key, int(value))) @@ -136,23 +151,49 @@ def parse_cisco_bgp_peer(string_table: List[StringTable]) -> Dict[str, BgpPeer]: # create dictionary from cbgpPeer2Entry (peer ip address as index) peer_table: Dict[str, BgpPeer] = {} - for entry in cbgpPeer2Entry: - remote_addr, peer_state, admin_state, remote_as, in_updates, out_updates, in_messages, out_messages, \ - fsm_established_transitions, fsm_established_time, in_update_elapsed_time = entry + for entry in peer2_entry: + ( + remote_addr, + peer_state, + admin_state, + local_addr, + local_as, + local_id, + remote_as, + remote_id, + in_updates, + out_updates, + in_messages, + out_messages, + fsm_established_transitions, + fsm_established_time, + in_update_elapsed_time + ) = entry + + if len(local_addr) == 4: + local_addr_type = '1' # IPv4 + elif len(local_addr) == 16: + local_addr_type = '2' # IPv6 + else: + local_addr_type = '0' remote_addr = bgp_get_ip_address_from_oid(remote_addr) bgp_peer = bgp_get_peer_entry( - remote_addr=remote_addr, - peer_state=peer_state, admin_state=admin_state, - remote_as=remote_as, - in_updates=in_updates, - out_updates=out_updates, + fsm_established_time=fsm_established_time, + fsm_established_transitions=fsm_established_transitions, in_messages=in_messages, + in_update_elapsed_time=in_update_elapsed_time, + in_updates=in_updates, + local_addr=bgp_render_ip_address(local_addr_type, local_addr), + local_as=local_as if local_as != '0' else base_local_as, + local_id=local_id, out_messages=out_messages, - fsm_established_transitions=fsm_established_transitions, - fsm_established_time=fsm_established_time, - in_update_elapsed_time=in_update_elapsed_time + out_updates=out_updates, + peer_state=peer_state, + remote_addr=remote_addr, + remote_as=remote_as, + remote_id=remote_id, ) if bgp_peer: prefixes = peer_prefixes.get(remote_addr, []) @@ -187,7 +228,11 @@ register.snmp_section( OIDEnd(), '3', # cbgpPeer2State '4', # cbgpPeer2AdminStatus + OIDBytes('6'), # cbgpPeer2LocalAddr + '8', # cbgpPeer2LocalAs -> empty + '9', # cbgpPeer2LocalIdentifier '11', # cbgpPeer2RemoteAs + '12', # cbgpPeer2RemoteIdentifier '13', # cbgpPeer2InUpdates '14', # cbgpPeer2OutUpdates '15', # cbgpPeer2InTotalMessages @@ -214,6 +259,12 @@ register.snmp_section( '8.1.8', # cbgpPeer2WithdrawnPrefixes ] ), + SNMPTree( + base='.1.3.6.1.2.1.15', # BGP-4-MIB + oids=[ + '2', # bgpLocalAs + ] + ) ], detect=all_of( contains('.1.3.6.1.2.1.1.1.0', 'Cisco'), @@ -232,31 +283,55 @@ register.snmp_section( def parse_cisco_bgp_peer_3(string_table: StringByteTable) -> Optional[Dict[str, BgpPeer]]: peer_table = {} for entry in string_table: - remote_addr_type, remote_addr, routing_instance, peer_state, admin_state, remote_as, in_updates, out_updates, \ - in_messages, out_messages, fsm_established_transitions, fsm_established_time, in_update_elapsed_time = entry + ( + remote_addr_type, + remote_addr, + routing_instance, + peer_state, + admin_state, + local_addr, + local_as, + local_id, + remote_as, + remote_id, + in_updates, + out_updates, + in_messages, + out_messages, + fsm_established_transitions, + fsm_established_time, + in_update_elapsed_time + ) = entry if remote_addr_type == '1': # IPv4 address remote_addr = '.'.join(f'{m}' for m in remote_addr) - routing_instance = None + local_addr = '.'.join(f'{m}' for m in local_addr) + if routing_instance != 'default': routing_instance = f'vrf {routing_instance}' + else: + routing_instance = None bgp_peer = bgp_get_peer_entry( - remote_addr=remote_addr, - peer_state=peer_state, admin_state=admin_state, - remote_as=remote_as, - in_updates=in_updates, - out_updates=out_updates, + fsm_established_time=fsm_established_time, + fsm_established_transitions=fsm_established_transitions, in_messages=in_messages, + in_update_elapsed_time=in_update_elapsed_time, + in_updates=in_updates, out_messages=out_messages, - fsm_established_transitions=fsm_established_transitions, - fsm_established_time=fsm_established_time, - in_update_elapsed_time=in_update_elapsed_time + out_updates=out_updates, + peer_state=peer_state, + remote_addr=remote_addr, + remote_as=remote_as, + remote_id=remote_id, + local_addr=local_addr, + local_as=local_as, + local_id=local_id, ) if bgp_peer: - bgp_peer[remote_addr].item['routing_instance'] = routing_instance if routing_instance: + bgp_peer[remote_addr].item['routing_instance'] = routing_instance item = f'{remote_addr} {routing_instance}' bgp_peer = {item: bgp_peer[remote_addr]} peer_table.update(bgp_peer) @@ -276,7 +351,11 @@ register.snmp_section( '4', # cbgpPeer3VrfName '5', # cbgpPeer3State '6', # cbgpPeer3AdminStatus + OIDBytes('8'), # cbgpPeer3LocalAddr + '10', # cbgpPeer3LocalAs + '11', # cbgpPeer3LocalIdentifier '13', # cbgpPeer3RemoteAs + '14', # cbgpPeer3RemoteIdentifier '15', # cbgpPeer3InUpdates '16', # cbgpPeer3OutUpdates '17', # cbgpPeer3InTotalMessages diff --git a/source/agent_based/inv_cisco_bgp_peer.py b/source/agent_based/inv_cisco_bgp_peer.py index bf074b4..c2db485 100644 --- a/source/agent_based/inv_cisco_bgp_peer.py +++ b/source/agent_based/inv_cisco_bgp_peer.py @@ -15,13 +15,13 @@ from typing import List from cmk.base.plugins.agent_based.agent_based_api.v1 import ( - register, + OIDBytes, + OIDEnd, SNMPTree, - exists, - contains, all_of, - OIDEnd, - OIDBytes, + contains, + exists, + register, ) from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( StringByteTable @@ -29,9 +29,9 @@ from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( from cmk.base.plugins.agent_based.utils.bgp_peer import ( InvBgpPeer, bgp_error_as_string, - bgp_render_ip_address, - bgp_get_ip_address_from_oid, bgp_error_code_as_hex, + bgp_get_ip_address_from_oid, + bgp_render_ip_address, get_bgp_type, ) @@ -49,8 +49,18 @@ def parse_inv_cisco_bgp_peer(string_table: List[StringByteTable]): for entry in peers: try: - oid_end, state, local_addr, local_as, local_id, remote_as, remote_id, last_error, \ - fsm_established_time, last_errortxt = entry + ( + oid_end, + state, + local_addr, + local_as, + local_id, + remote_as, + remote_id, + last_error, + fsm_established_time, + last_error_txt + ) = entry except ValueError: return diff --git a/source/packages/cisco_bgp_peer b/source/packages/cisco_bgp_peer index d758634..16c0651 100644 --- a/source/packages/cisco_bgp_peer +++ b/source/packages/cisco_bgp_peer @@ -20,7 +20,7 @@ 'files': {'agent_based': ['cisco_bgp_peer.py', 'inv_cisco_bgp_peer.py']}, 'name': 'cisco_bgp_peer', 'title': 'Cisco BGP Peer', - 'version': '1.0.0-20230613', + 'version': '1.0.2-20241220', 'version.min_required': '2.0.0b1', - 'version.packaged': '2.2.0p24', - 'version.usable_until': None} + 'version.packaged': 'cmk-mkp-tool 0.2.0', + 'version.usable_until': '2.4.0b1'} -- GitLab