diff --git a/checks/cisco_bgp_peer b/checks/cisco_bgp_peer index f4bc1b4ea943eefdd550d807b16e3914ef0e7353..9fd01f2ec4beb8d68f740e2075fc801d2992fdbf 100644 --- a/checks/cisco_bgp_peer +++ b/checks/cisco_bgp_peer @@ -18,6 +18,8 @@ # 29.05.2018: fixed longoutpout (removed not configured) # 02.11.2018: modified scanfunction (from "find 'cisco' =-1" to "'cisco' in OID" # 02.18.2019: added fix for empty values ("" instead of "0") sugested by Laurent Barbier (lbarbier[at]arkane-studios[dot]com) +# 24.02.2020: added workaround for missing cbgpPeer2AddrFamily (example L2VPN EVPN peers, Fix for jonale82[at]gmail[dot]com) +# # # @@ -208,8 +210,8 @@ def parse_cisco_bgp_peer(info): peer_ip = '' OID_END = OID_END.split('.') if int(OID_END[1]) == 4: # length of ip address - peer_ip = '.'.join(OID_END[2:6]) # ip v4 address - elif int(OID_END[1]) == 16: + peer_ip = '.'.join(OID_END[2:6]) # ipv4 address + elif int(OID_END[1]) == 16: # ipv6 address peer_ip = ':'.join('%02s' % hex(int(m))[2:] for m in OID_END[2:18]).replace(' ', '0').upper() peer_ip = bgp_shorten_ipv6_adress(peer_ip) @@ -261,81 +263,95 @@ def parse_cisco_bgp_peer(info): return names[int(byte1, 16)].get(int(byte2, 16)) + # bgp not active if info == [[], []]: return None - cbgpPeer2Table, cbgpPeer2AddrFamily = info + cbgpPeer2Entry, cbgpPeer2AddrFamily = info peer_prefixes = {} # create dictionary from cbgpPeer2AddrFamily ('remoteip addrfamilyname' as index) - for entry in cbgpPeer2AddrFamily: - oid_end, addrfamilyname, acceptedprefixes, deniedprefixes, prefixadminlimit, prefixthreshold, \ - prefixclearthreshold, advertisedprefixes, suppressedprefixes, withdrawnprefixes = entry + if len(cbgpPeer2AddrFamily) > 0 : + for entry in cbgpPeer2AddrFamily: + oid_end, addrfamilyname, acceptedprefixes, deniedprefixes, prefixadminlimit, prefixthreshold, \ + prefixclearthreshold, advertisedprefixes, suppressedprefixes, withdrawnprefixes = entry - remoteaddr = cisco_bgp_get_peer(oid_end) + remoteaddr = cisco_bgp_get_peer(oid_end) - # check if prefixadminlimit is set - if prefixadminlimit.isdigit(): - prefixadminlimit = int(prefixadminlimit) - else: - prefixadminlimit = 0 + # check if prefixadminlimit is set + if prefixadminlimit.isdigit(): + prefixadminlimit = int(prefixadminlimit) + else: + prefixadminlimit = 0 - # check if prefixthreshold is set - if prefixthreshold.isdigit(): - prefixthreshold = int(prefixthreshold) - else: - prefixthreshold = 0 + # check if prefixthreshold is set + if prefixthreshold.isdigit(): + prefixthreshold = int(prefixthreshold) + else: + prefixthreshold = 0 - # check if prefixclearthreshold is set - if prefixclearthreshold.isdigit(): - prefixclearthreshold = int(prefixclearthreshold) - else: - prefixclearthreshold = 0 + # check if prefixclearthreshold is set + if prefixclearthreshold.isdigit(): + prefixclearthreshold = int(prefixclearthreshold) + else: + prefixclearthreshold = 0 - if acceptedprefixes.isdigit(): - acceptedprefixes = int(acceptedprefixes) - else: - acceptedprefixes = 0 + if acceptedprefixes.isdigit(): + acceptedprefixes = int(acceptedprefixes) + else: + acceptedprefixes = 0 - if advertisedprefixes.isdigit(): - advertisedprefixes = int(advertisedprefixes) - else: - advertisedprefixes = 0 + if advertisedprefixes.isdigit(): + advertisedprefixes = int(advertisedprefixes) + else: + advertisedprefixes = 0 - # fix sugested by Laurent Barbier (lbarbier[at]arkane-studios[dot]com) - # some Cisco devices report not "0" if the value is 0, instead the report "". for example Nexus devices behave like this. - if deniedprefixes.isdigit(): - deniedprefixes = int(deniedprefixes) - else: - deniedprefixes = 0 + # fix sugested by Laurent Barbier (lbarbier[at]arkane-studios[dot]com) + # some Cisco devices report not "0" if the value is 0, instead the report "". for example Nexus devices behave like this. + if deniedprefixes.isdigit(): + deniedprefixes = int(deniedprefixes) + else: + deniedprefixes = 0 - if suppressedprefixes.isdigit(): - suppressedprefixes = int(suppressedprefixes) - else: - suppressedprefixes = 0 + if suppressedprefixes.isdigit(): + suppressedprefixes = int(suppressedprefixes) + else: + suppressedprefixes = 0 - if withdrawnprefixes.isdigit(): - withdrawnprefixes = int(withdrawnprefixes) - else: - withdrawnprefixes = 0 - - peer = {'remoteaddr': remoteaddr, - 'addrfamilyname': addrfamilyname, - 'acceptedprefixes': acceptedprefixes, - 'deniedprefixes': deniedprefixes, - 'prefixadminlimit': prefixadminlimit, - 'prefixthreshold': prefixthreshold, - 'prefixclearthreshold': prefixclearthreshold, - 'advertisedprefixes': advertisedprefixes, - 'suppressedprefixes': suppressedprefixes, - 'withdrawnprefixes': withdrawnprefixes, } - - peer_prefixes.update({'%s %s' % (remoteaddr, addrfamilyname): peer}) - - # create dictionary from cbgpPeer2Table (peer ip address as index) + if withdrawnprefixes.isdigit(): + withdrawnprefixes = int(withdrawnprefixes) + else: + withdrawnprefixes = 0 + + + peer = {'remoteaddr': remoteaddr, + 'addrfamilyname': addrfamilyname, + 'acceptedprefixes': acceptedprefixes, + 'deniedprefixes': deniedprefixes, + 'prefixadminlimit': prefixadminlimit, + 'prefixthreshold': prefixthreshold, + 'prefixclearthreshold': prefixclearthreshold, + 'advertisedprefixes': advertisedprefixes, + 'suppressedprefixes': suppressedprefixes, + 'withdrawnprefixes': withdrawnprefixes, } + + peer_prefixes.update({'%s %s' % (remoteaddr, addrfamilyname): peer}) + + # workaround: get remote ip from cbgpPeer2Entry if cbgpPeer2AddrFamilyName is missing :-( + elif len(cbgpPeer2Entry) > 0: + for entry in cbgpPeer2Entry: + remoteaddr = cisco_bgp_get_peer(entry[0]) + addrfamilyname = '' + + peer = {'remoteaddr': remoteaddr, + } + + peer_prefixes.update({'%s %s' % (remoteaddr, addrfamilyname): peer}) + + # create dictionary from cbgpPeer2Entry (peer ip address as index) peer_table = {} - for entry in cbgpPeer2Table: + for entry in cbgpPeer2Entry: oid_end, state, adminstatus, localaddr, localas, localidentifier, remoteas, remoteidentifier, inupdates, \ outupdates, intotalmessages, outtotalmessages, lasterror, fsmestablishedtransitions, fsmestablishedtime, \ inupdateelapsedtime, lasterrortxt, prevstate = entry @@ -494,10 +510,10 @@ def check_cisco_bgp_peer(item, params, parsed): ['Last error', peer.get('lasterror'), ''], ['Last error text', peer.get('lasterrortxt'), ''], ['Previous state', cisco_bgp_peerstate(peer.get('prevstate')), ''], - ['Address family name', prefixes.get('addrfamilyname'), ''], + ['Address family name', prefixes.get('addrfamilyname', 'unknown'), ''], ['Prefix admin limit (prefixes)', '%.0d' % prefixadminlimit, ''], ['Prefix threshold (prefixes/%)', '%.0d' % warnthreshold, '%.0d' % prefixthreshold], - ['Prefix clear threshold (%)', '%.0d' % prefixes.get('prefixclearthreshold'), ''] + ['Prefix clear threshold (%)', '%.0d' % prefixes.get('prefixclearthreshold', 0), ''] ] if params.get('htmloutput', False): @@ -512,8 +528,7 @@ def check_cisco_bgp_peer(item, params, parsed): longoutput = '\n' + table_bracket % (''.join([line_bracket % cell_seperator.join([cell_bracket % (entry[0], entry[1], entry[2])]) for entry in longoutput_data])) else: longoutput += '\nfor nicer output' \ - '\ndisable \'Escape HTML codes in plugin output\' in wato --> global settings and' \ - '\nenable HTML output in \'Parameters for this service\'' + '\ndisable \'Escape HTML codes in plugin output\' in wato --> global settings and enable HTML output in \'Parameters for this service\'' for entry in longoutput_data: if not entry[2] == '': longoutput += '\n{}: {} / {}'.format(entry[0], entry[1], entry[2]) @@ -537,16 +552,16 @@ def check_cisco_bgp_peer(item, params, parsed): now_time = time.time() rate_item = item.replace(' ', '_') - deniedprefixes = get_rate('cisco_bgp_peer.%s.%s' % ('deniedprefixes', rate_item), now_time, prefixes.get('deniedprefixes'), onwrap=SKIP) - advertisedprefixes = get_rate('cisco_bgp_peer.%s.%s' % ('advertisedprefixes', rate_item), now_time, prefixes.get('advertisedprefixes'), onwrap=SKIP) - withdrawnprefixes = get_rate('cisco_bgp_peer.%s.%s' % ('withdrawnprefixes', rate_item), now_time, prefixes.get('withdrawnprefixes'), onwrap=SKIP) - suppressedprefixes = get_rate('cisco_bgp_peer.%s.%s' % ('suppressedprefixes', rate_item), now_time, prefixes.get('suppressedprefixes'), onwrap=SKIP) + deniedprefixes = get_rate('cisco_bgp_peer.%s.%s' % ('deniedprefixes', rate_item), now_time, prefixes.get('deniedprefixes', 0), onwrap=SKIP) + advertisedprefixes = get_rate('cisco_bgp_peer.%s.%s' % ('advertisedprefixes', rate_item), now_time, prefixes.get('advertisedprefixes', 0), onwrap=SKIP) + withdrawnprefixes = get_rate('cisco_bgp_peer.%s.%s' % ('withdrawnprefixes', rate_item), now_time, prefixes.get('withdrawnprefixes', 0), onwrap=SKIP) + suppressedprefixes = get_rate('cisco_bgp_peer.%s.%s' % ('suppressedprefixes', rate_item), now_time, prefixes.get('suppressedprefixes', 0), onwrap=SKIP) - inupdates = get_rate('cisco_bgp_peer.%s.%s' % ('inupdates', rate_item), now_time, peer.get('inupdates'), onwrap=SKIP) - outupdates = get_rate('cisco_bgp_peer.%s.%s' % ('outupdates', rate_item), now_time, peer.get('outupdates'), onwrap=SKIP) + inupdates = get_rate('cisco_bgp_peer.%s.%s' % ('inupdates', rate_item), now_time, peer.get('inupdates', 0), onwrap=SKIP) + outupdates = get_rate('cisco_bgp_peer.%s.%s' % ('outupdates', rate_item), now_time, peer.get('outupdates', 0), onwrap=SKIP) - intotalmessages = get_rate('cisco_bgp_peer.%s.%s' % ('intotalmessages', rate_item), now_time, peer.get('intotalmessages'), onwrap=SKIP) - outtotalmessages = get_rate('cisco_bgp_peer.%s.%s' % ('outtotalmessages', rate_item), now_time, peer.get('outtotalmessages'), onwrap=SKIP) + intotalmessages = get_rate('cisco_bgp_peer.%s.%s' % ('intotalmessages', rate_item), now_time, peer.get('intotalmessages', 0), onwrap=SKIP) + outtotalmessages = get_rate('cisco_bgp_peer.%s.%s' % ('outtotalmessages', rate_item), now_time, peer.get('outtotalmessages', 0), onwrap=SKIP) # prefixes # 'unit', <value>, <warn-at>, <crit-at>, <min value>, <max value> @@ -593,7 +608,7 @@ check_info['cisco_bgp_peer'] = { 'parse_function' : parse_cisco_bgp_peer, 'snmp_scan_function' : lambda oid: 'cisco'in oid('.1.3.6.1.2.1.1.1.0').lower(), 'snmp_info' : [ - ('.1.3.6.1.4.1.9.9.187.1.2.5.1', # cbgpPeer2Table + ('.1.3.6.1.4.1.9.9.187.1.2.5.1', # CISCO-BGP4-MIB::cbgpPeer2Entry [OID_END, '3', # cbgpPeer2State '4', # cbgpPeer2AdminStatus @@ -627,5 +642,6 @@ check_info['cisco_bgp_peer'] = { '8.1.7', # cbgpPeer2SuppressedPrefixes '8.1.8', # cbgpPeer2WithdrawnPrefixes ]), - ] + ] + } diff --git a/cisco_bgp_peer.mkp b/cisco_bgp_peer.mkp index 7becccbd2f5418e3799b70d0a01a7e0583974830..92521c7a27cd8c8bfcb2839d5c687204a62670e6 100644 Binary files a/cisco_bgp_peer.mkp and b/cisco_bgp_peer.mkp differ diff --git a/packages/cisco_bgp_peer b/packages/cisco_bgp_peer index b52887b2165890c662b022a717242a7d00c0311f..12fb6a27de60d4252c5ecb3679532dd8f31f3c92 100644 --- a/packages/cisco_bgp_peer +++ b/packages/cisco_bgp_peer @@ -7,6 +7,6 @@ 'name': 'cisco_bgp_peer', 'num_files': 3, 'title': u'Cisco BGP Peer', - 'version': '20190218.v.0.2b', + 'version': '20200224.v.0.2c', 'version.min_required': '1.2.8b8', 'version.packaged': '1.4.0p35'} \ No newline at end of file