From 3dc1e60cc18d4b06ca9499fa574c294f8ef0ac3a Mon Sep 17 00:00:00 2001
From: Thl CMK <thl-cmk@outlook.com>
Date: Mon, 24 Feb 2020 21:48:33 +0100
Subject: [PATCH] update project

---
 checks/cisco_bgp_peer   | 164 ++++++++++++++++++++++------------------
 cisco_bgp_peer.mkp      | Bin 9012 -> 9136 bytes
 packages/cisco_bgp_peer |   2 +-
 3 files changed, 91 insertions(+), 75 deletions(-)

diff --git a/checks/cisco_bgp_peer b/checks/cisco_bgp_peer
index f4bc1b4..9fd01f2 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
GIT binary patch
literal 9136
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

literal 9012
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
EADeloMF0Q*

diff --git a/packages/cisco_bgp_peer b/packages/cisco_bgp_peer
index b52887b..12fb6a2 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
-- 
GitLab