diff --git a/checks/cisco_bgp_peer b/checks/cisco_bgp_peer index 9fd01f2ec4beb8d68f740e2075fc801d2992fdbf..64a2a7ae2b7020d4cc2439aaeab9a649d4c44534 100644 --- a/checks/cisco_bgp_peer +++ b/checks/cisco_bgp_peer @@ -19,7 +19,7 @@ # 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) -# +# 02.03.2020: changed handling of perfdata, add only data the are really there (not None, instead of setting them to 0) # # @@ -263,7 +263,6 @@ def parse_cisco_bgp_peer(info): return names[int(byte1, 16)].get(int(byte2, 16)) - # bgp not active if info == [[], []]: return None @@ -277,64 +276,34 @@ def parse_cisco_bgp_peer(info): oid_end, addrfamilyname, acceptedprefixes, deniedprefixes, prefixadminlimit, prefixthreshold, \ prefixclearthreshold, advertisedprefixes, suppressedprefixes, withdrawnprefixes = entry - remoteaddr = cisco_bgp_get_peer(oid_end) + remoteaddr = cisco_bgp_get_peer(entry[0]) + peer = {'remoteaddr': remoteaddr} + + peer.update({'addrfamilyname': addrfamilyname}) - # check if prefixadminlimit is set if prefixadminlimit.isdigit(): - prefixadminlimit = int(prefixadminlimit) - else: - prefixadminlimit = 0 + peer.update({'prefixadminlimit':int(prefixadminlimit)}) - # check if prefixthreshold is set if prefixthreshold.isdigit(): - prefixthreshold = int(prefixthreshold) - else: - prefixthreshold = 0 + peer.update({'prefixthreshold':int(prefixthreshold)}) - # check if prefixclearthreshold is set if prefixclearthreshold.isdigit(): - prefixclearthreshold = int(prefixclearthreshold) - else: - prefixclearthreshold = 0 + peer.update({'prefixclearthreshold':int(prefixclearthreshold)}) if acceptedprefixes.isdigit(): - acceptedprefixes = int(acceptedprefixes) - else: - acceptedprefixes = 0 + peer.update({'acceptedprefixes':int(acceptedprefixes)}) if advertisedprefixes.isdigit(): - advertisedprefixes = int(advertisedprefixes) - else: - advertisedprefixes = 0 + peer.update({'advertisedprefixes':int(advertisedprefixes)}) - # 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 + peer.update({'deniedprefixes':int(deniedprefixes)}) if suppressedprefixes.isdigit(): - suppressedprefixes = int(suppressedprefixes) - else: - suppressedprefixes = 0 + peer.update({'suppressedprefixes':int(suppressedprefixes)}) 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.update({'withdrawnprefixes':int(withdrawnprefixes)}) peer_prefixes.update({'%s %s' % (remoteaddr, addrfamilyname): peer}) @@ -357,23 +326,35 @@ def parse_cisco_bgp_peer(info): inupdateelapsedtime, lasterrortxt, prevstate = entry peer = {'remoteaddr': cisco_bgp_get_peer(oid_end), - 'state': int(state), - 'adminstate': int(adminstatus), 'localaddr': bgp_render_ip_address(localaddr), - 'localas': int(localas), 'localid': localidentifier, - 'remoteas': int(remoteas), 'remoteid': remoteidentifier, - 'inupdates': int(inupdates), - 'outupdates': int(outupdates), - 'intotalmessages': int(intotalmessages), - 'outtotalmessages': int(outtotalmessages), 'lasterror': cisco_bgp_errors(lasterror), - 'fsmestablishedtransitions': int(fsmestablishedtransitions), - 'fsmestablishedtime': int(fsmestablishedtime), 'inupdateelapsedtime': inupdateelapsedtime, 'lasterrortxt': lasterrortxt, - 'prevstate': int(prevstate),} + 'prevstate': int(prevstate), + } + + if state.isdigit(): + peer.update({'state': int(state)}) + if adminstatus.isdigit(): + peer.update({'adminstate': int(adminstatus)}) + if localas.isdigit(): + peer.update({'localas': int(localas)}) + if remoteas.isdigit(): + peer.update({'remoteas': int(remoteas)}) + if inupdates.isdigit(): + peer.update({'inupdates':int(inupdates)}) + if outupdates.isdigit(): + peer.update({'outupdates': int(outupdates)}) + if intotalmessages.isdigit(): + peer.update({'intotalmessages': int(intotalmessages)}) + if outtotalmessages.isdigit(): + peer.update({'outtotalmessages': int(outtotalmessages)}) + if fsmestablishedtransitions.isdigit(): + peer.update({'fsmestablishedtransitions': int(fsmestablishedtransitions)}) + if inupdates.isdigit(): + peer.update({'fsmestablishedtime': int(fsmestablishedtime)}) peer_table.update({'%s' % cisco_bgp_get_peer(oid_end): peer}) @@ -442,7 +423,7 @@ def check_cisco_bgp_peer(item, params, parsed): peer_not_found_state = not_found_state if prefixes: - state = 0 + # state = 0 perfdata = [] infotext = '' longoutput = '' @@ -496,11 +477,6 @@ def check_cisco_bgp_peer(item, params, parsed): else: bgptype = ' (eBGP)' - acceptedprefixes = prefixes.get('acceptedprefixes', 0) - prefixadminlimit = prefixes.get('prefixadminlimit', 0) - prefixthreshold = prefixes.get('prefixthreshold', 0) - warnthreshold = prefixadminlimit / 100.0 * prefixthreshold # use float (100.0) to get xx.xx in division - longoutput_data = [ ['IP-address (remote/local)', peer.get('remoteaddr'), peer.get('localaddr')], ['Router-ID (remote/local)', peer.get('remoteid'), peer.get('localid')], @@ -511,11 +487,20 @@ def check_cisco_bgp_peer(item, params, parsed): ['Last error text', peer.get('lasterrortxt'), ''], ['Previous state', cisco_bgp_peerstate(peer.get('prevstate')), ''], ['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', 0), ''] + , ] + acceptedprefixes = prefixes.get('acceptedprefixes', None) + prefixadminlimit = prefixes.get('prefixadminlimit', None) + prefixthreshold = prefixes.get('prefixthreshold', None) + + if prefixadminlimit is not None and prefixthreshold is not None: + warnthreshold = prefixadminlimit / 100.0 * prefixthreshold # use float (100.0) to get xx.xx in division + longoutput_data.append(['Prefix admin limit (prefixes)', '%.0d' % prefixadminlimit, '']) + longoutput_data.append(['Prefix threshold (prefixes/%)', '%.0d' % warnthreshold, '%.0d' % prefixthreshold]) + else: + warnthreshold = None if params.get('htmloutput', False): # # disable 'Escape HTML codes in plugin output' in wato --> global settings @@ -535,49 +520,52 @@ def check_cisco_bgp_peer(item, params, parsed): else: longoutput += '\n{}: {}'.format(entry[0], entry[1]) - if prefixadminlimit > 0: + if prefixadminlimit is not None and acceptedprefixes is not None and prefixadminlimit is not None and warnthreshold is not None: if acceptedprefixes >= prefixadminlimit: - state = max(2, state) - infotext = 'Prefix admin limit reached(!!) ' + infotext + yield 2, 'Prefix admin limit reached (%d/%d)' % (acceptedprefixes, prefixadminlimit) elif prefixthreshold > 0: perfdata.append(('acceptedprefixes', acceptedprefixes, warnthreshold, prefixadminlimit)) if acceptedprefixes >= warnthreshold: - state = max(1, state) - infotext = 'Prefix warn threshold reached(!) ' + infotext + yield 1, 'Prefix warn threshold reached (%d/%d)' % (acceptedprefixes, warnthreshold) else: perfdata.append(('acceptedprefixes', acceptedprefixes, '', prefixadminlimit)) - else: + elif acceptedprefixes is not None: perfdata.append(('acceptedprefixes', acceptedprefixes)) now_time = time.time() rate_item = item.replace(' ', '_') - 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', 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', 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> - perfdata.append(('deniedprefixes', deniedprefixes)) - perfdata.append(('advertisedprefixes', advertisedprefixes)) - perfdata.append(('withdrawnprefixes', withdrawnprefixes)) - perfdata.append(('suppressedprefixes', suppressedprefixes)) - - perfdata.append(('inupdates', inupdates)) - perfdata.append(('outupdates', outupdates)) - perfdata.append(('intotalmessages', intotalmessages)) - perfdata.append(('outtotalmessages', outtotalmessages)) - - perfdata.append(('fsmestablishedtransitions', peer.get('fsmestablishedtransitions'))) - perfdata.append(('fsmestablishedtime', peer.get('fsmestablishedtime'))) - perfdata.append(('inupdateelapsedtime', peer.get('inupdateelapsedtime'))) + if prefixes.get('deniedprefixes', None) is not None: + deniedprefixes = get_rate('cisco_bgp_peer.%s.%s' % ('deniedprefixes', rate_item), now_time, prefixes.get('deniedprefixes', 0), onwrap=SKIP) + perfdata.append(('deniedprefixes', deniedprefixes)) + if prefixes.get('advertisedprefixes', None) is not None: + advertisedprefixes = get_rate('cisco_bgp_peer.%s.%s' % ('advertisedprefixes', rate_item), now_time, prefixes.get('advertisedprefixes', 0), onwrap=SKIP) + perfdata.append(('advertisedprefixes', advertisedprefixes)) + if prefixes.get('withdrawnprefixes', None) is not None: + withdrawnprefixes = get_rate('cisco_bgp_peer.%s.%s' % ('withdrawnprefixes', rate_item), now_time, prefixes.get('withdrawnprefixes', 0), onwrap=SKIP) + perfdata.append(('withdrawnprefixes', withdrawnprefixes)) + if prefixes.get('suppressedprefixes', None) is not None: + suppressedprefixes = get_rate('cisco_bgp_peer.%s.%s' % ('suppressedprefixes', rate_item), now_time, prefixes.get('suppressedprefixes', 0), onwrap=SKIP) + perfdata.append(('suppressedprefixes', suppressedprefixes)) + + if peer.get('inupdates', None) is not None: + inupdates = get_rate('cisco_bgp_peer.%s.%s' % ('inupdates', rate_item), now_time, peer.get('inupdates', 0), onwrap=SKIP) + perfdata.append(('inupdates', inupdates)) + if peer.get('outupdates', None) is not None: + outupdates = get_rate('cisco_bgp_peer.%s.%s' % ('outupdates', rate_item), now_time, peer.get('outupdates', 0), onwrap=SKIP) + perfdata.append(('outupdates', outupdates)) + if peer.get('intotalmessages', None) is not None: + intotalmessages = get_rate('cisco_bgp_peer.%s.%s' % ('intotalmessages', rate_item), now_time, peer.get('intotalmessages', 0), onwrap=SKIP) + perfdata.append(('intotalmessages', intotalmessages)) + if peer.get('outtotalmessages', None) is not None: + outtotalmessages = get_rate('cisco_bgp_peer.%s.%s' % ('outtotalmessages', rate_item), now_time, peer.get('outtotalmessages', 0), onwrap=SKIP) + perfdata.append(('outtotalmessages', outtotalmessages)) + if peer.get('fsmestablishedtransitions', None) is not None: + perfdata.append(('fsmestablishedtransitions', peer.get('fsmestablishedtransitions'))) + if peer.get('fsmestablishedtime', None) is not None: + perfdata.append(('fsmestablishedtime', peer.get('fsmestablishedtime'))) + if peer.get('inupdateelapsedtime', None) is not None: + perfdata.append(('inupdateelapsedtime', peer.get('inupdateelapsedtime'))) if infotext[0:2] == ', ': infotext = infotext[2:] diff --git a/cisco_bgp_peer.mkp b/cisco_bgp_peer.mkp index 92521c7a27cd8c8bfcb2839d5c687204a62670e6..f38a5837880c0e0eabf8b68b55b52d9765e19a5e 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 12fb6a27de60d4252c5ecb3679532dd8f31f3c92..43fb9401cc63dbca003bcad7583e033e953db9d1 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': '20200224.v.0.2c', + 'version': '20200302.v.0.2d', 'version.min_required': '1.2.8b8', - 'version.packaged': '1.4.0p35'} \ No newline at end of file + 'version.packaged': '1.4.0p38'} \ No newline at end of file diff --git a/web/plugins/wato/cisco_bgp_peer.py b/web/plugins/wato/cisco_bgp_peer.py index ae07b0f47c4e69fb7a517c99c0b1220a89b9e7ca..a4257f74a59bd2ccd583af94c4fa2c16197e019d 100644 --- a/web/plugins/wato/cisco_bgp_peer.py +++ b/web/plugins/wato/cisco_bgp_peer.py @@ -68,19 +68,22 @@ register_check_parameters( title=('BGP Peers'), elements=[ TextUnicode( - title=_('BGP Peer object name'), - help=_('The configured value must match a BGP peer reported by the monitored ' - 'device.'), + title=_('BGP Peer item name'), + help=_('The configured value must match a BGP item reported by the monitored ' + 'device. For example: "10.194.115.98 IPv4 Unicast"'), allow_empty=False, ), TextUnicode( title=_('BGP Peer Alias'), help=_('You can configure an individual alias here for the BGP peer matching ' - 'the IP-Address configured in the field above.'), + 'the text configured in the "BGP Peer item name" field. The alias will ' + 'be shown in the infotext'), ), MonitoringState( default_value=2, - title=_('State if BGP peer is not found'), + title=_('State if not found'), + help=_('You can configure an individual state if the BGP peer matching the text ' + 'configured in the "BGP Peer item name" field is not found') )]), add_label=_('Add BGP peer'), movable=False,