1 | <?php |
||
2 | |||
3 | use Illuminate\Support\Str; |
||
4 | use LibreNMS\Exceptions\InvalidIpException; |
||
5 | use LibreNMS\RRD\RrdDefinition; |
||
6 | use LibreNMS\Util\IP; |
||
7 | |||
8 | if (\LibreNMS\Config::get('enable_bgp')) { |
||
9 | $peers = dbFetchRows('SELECT * FROM `bgpPeers` AS B LEFT JOIN `vrfs` AS V ON `B`.`vrf_id` = `V`.`vrf_id` WHERE `B`.`device_id` = ?', [$device['device_id']]); |
||
10 | |||
11 | if (! empty($peers)) { |
||
12 | $generic = false; |
||
13 | if ($device['os'] == 'junos') { |
||
14 | $peer_data_check = snmpwalk_cache_long_oid($device, 'jnxBgpM2PeerIndex', '.1.3.6.1.4.1.2636.5.1.1.2.1.1.1.14', $peer_data_tmp, 'BGP4-V2-MIB-JUNIPER', 'junos'); |
||
15 | } elseif ($device['os_group'] === 'arista') { |
||
16 | $peer_data_check = snmpwalk_cache_oid($device, 'aristaBgp4V2PeerRemoteAs', [], 'ARISTA-BGP4V2-MIB'); |
||
17 | } elseif ($device['os'] === 'dell-os10') { |
||
18 | $peer_data_check = snmpwalk_cache_oid($device, 'os10bgp4V2PeerRemoteAs', [], 'DELLEMC-OS10-BGP4V2-MIB', 'dell'); // practically identical MIB as arista |
||
19 | } elseif ($device['os'] === 'timos') { |
||
20 | $peer_data_check = snmpwalk_cache_multi_oid($device, 'tBgpInstanceRowStatus', [], 'TIMETRA-BGP-MIB', 'nokia'); |
||
21 | } elseif ($device['os'] === 'firebrick') { |
||
22 | $peer_data_check = snmpwalk_cache_multi_oid($device, 'fbBgpPeerTable', [], 'FIREBRICK-BGP-MIB', 'firebrick'); |
||
23 | } elseif ($device['os'] === 'aos7') { |
||
24 | $peer_data_check = snmpwalk_cache_multi_oid($device, 'alaBgpPeerAS', [], 'ALCATEL-IND1-BGP-MIB', 'aos7'); |
||
25 | } elseif ($device['os'] === 'vrp') { |
||
26 | $peer_data_check = snmpwalk_cache_multi_oid($device, 'hwBgpPeerEntry', [], 'HUAWEI-BGP-VPN-MIB', 'huawei'); |
||
27 | } elseif ($device['os_group'] == 'cisco') { |
||
28 | $peer_data_check = snmpwalk_cache_oid($device, 'cbgpPeer2RemoteAs', [], 'CISCO-BGP4-MIB'); |
||
29 | } else { |
||
30 | $peer_data_check = snmpwalk_cache_oid($device, 'bgpPeerRemoteAs', [], 'BGP4-MIB'); |
||
31 | } |
||
32 | if (empty($peer_data_check)) { |
||
33 | $peer_data_check = snmpwalk_cache_oid($device, 'bgpPeerRemoteAs', [], 'BGP4-MIB'); |
||
34 | $generic = true; |
||
35 | } |
||
36 | |||
37 | foreach ($peers as $peer) { |
||
38 | //add context if exist |
||
39 | $device['context_name'] = $peer['context_name']; |
||
40 | $vrfOid = $peer['vrf_oid']; |
||
41 | $vrfId = $peer['vrf_id']; |
||
42 | |||
43 | try { |
||
44 | $peer_ip = IP::parse($peer['bgpPeerIdentifier']); |
||
45 | |||
46 | echo "Checking BGP peer $peer_ip "; |
||
47 | |||
48 | // --- Collect BGP data --- |
||
49 | if (count($peer_data_check) > 0) { |
||
50 | if ($generic) { |
||
51 | echo "\nfallback to default mib"; |
||
52 | |||
53 | $peer_identifier = $peer['bgpPeerIdentifier']; |
||
54 | $mib = 'BGP4-MIB'; |
||
55 | $oid_map = [ |
||
56 | 'bgpPeerState' => 'bgpPeerState', |
||
57 | 'bgpPeerAdminStatus' => 'bgpPeerAdminStatus', |
||
58 | 'bgpPeerInUpdates' => 'bgpPeerInUpdates', |
||
59 | 'bgpPeerOutUpdates' => 'bgpPeerOutUpdates', |
||
60 | 'bgpPeerInTotalMessages' => 'bgpPeerInTotalMessages', |
||
61 | 'bgpPeerOutTotalMessages' => 'bgpPeerOutTotalMessages', |
||
62 | 'bgpPeerFsmEstablishedTime' => 'bgpPeerFsmEstablishedTime', |
||
63 | 'bgpPeerInUpdateElapsedTime' => 'bgpPeerInUpdateElapsedTime', |
||
64 | 'bgpPeerLocalAddr' => 'bgpLocalAddr', // silly db field name |
||
65 | 'bgpPeerLastError' => 'bgpPeerLastErrorCode', |
||
66 | ]; |
||
67 | } elseif ($device['os'] == 'junos') { |
||
68 | if (! isset($junos)) { |
||
69 | echo "\nCaching Oids..."; |
||
70 | |||
71 | foreach ($peer_data_check as $hash => $index) { |
||
72 | $peer_ip_snmp = ltrim($index['orig'], '.'); |
||
73 | $exploded_ip = explode('.', $peer_ip_snmp); |
||
74 | if (count($exploded_ip) > 11) { |
||
75 | // ipv6 |
||
76 | $tmp_peer_ip = (string) IP::parse(snmp2ipv6($peer_ip_snmp), true); |
||
77 | } else { |
||
78 | // ipv4 |
||
79 | $tmp_peer_ip = implode('.', array_slice($exploded_ip, -4)); |
||
80 | } |
||
81 | $junos[$tmp_peer_ip]['hash'] = $hash; |
||
82 | $junos[$tmp_peer_ip]['index'] = $index['jnxBgpM2PeerIndex']; |
||
83 | } |
||
84 | } |
||
85 | |||
86 | if (! isset($peer_data_tmp)) { |
||
87 | $peer_data_tmp = snmpwalk_cache_long_oid($device, 'jnxBgpM2PeerState', '.1.3.6.1.4.1.2636.5.1.1.2.1.1.1.2', $peer_data_tmp, 'BGP4-V2-MIB-JUNIPER', 'junos'); |
||
88 | $peer_data_tmp = snmpwalk_cache_long_oid($device, 'jnxBgpM2PeerStatus', '.1.3.6.1.4.1.2636.5.1.1.2.1.1.1.3', $peer_data_tmp, 'BGP4-V2-MIB-JUNIPER', 'junos'); |
||
89 | $peer_data_tmp = snmpwalk_cache_long_oid($device, 'jnxBgpM2PeerInUpdates', '.1.3.6.1.4.1.2636.5.1.1.2.6.1.1.1', $peer_data_tmp, 'BGP4-V2-MIB-JUNIPER', 'junos'); |
||
90 | $peer_data_tmp = snmpwalk_cache_long_oid($device, 'jnxBgpM2PeerOutUpdates', '.1.3.6.1.4.1.2636.5.1.1.2.6.1.1.2', $peer_data_tmp, 'BGP4-V2-MIB-JUNIPER', 'junos'); |
||
91 | $peer_data_tmp = snmpwalk_cache_long_oid($device, 'jnxBgpM2PeerInTotalMessages', '.1.3.6.1.4.1.2636.5.1.1.2.6.1.1.3', $peer_data_tmp, 'BGP4-V2-MIB-JUNIPER', 'junos'); |
||
92 | $peer_data_tmp = snmpwalk_cache_long_oid($device, 'jnxBgpM2PeerOutTotalMessages', '.1.3.6.1.4.1.2636.5.1.1.2.6.1.1.4', $peer_data_tmp, 'BGP4-V2-MIB-JUNIPER', 'junos'); |
||
93 | $peer_data_tmp = snmpwalk_cache_long_oid($device, 'jnxBgpM2PeerFsmEstablishedTime', '.1.3.6.1.4.1.2636.5.1.1.2.4.1.1.1', $peer_data_tmp, 'BGP4-V2-MIB-JUNIPER', 'junos'); |
||
94 | $peer_data_tmp = snmpwalk_cache_long_oid($device, 'jnxBgpM2PeerInUpdatesElapsedTime', '.1.3.6.1.4.1.2636.5.1.1.2.4.1.1.2', $peer_data_tmp, 'BGP4-V2-MIB-JUNIPER', 'junos'); |
||
95 | $peer_data_tmp = snmpwalk_cache_long_oid($device, 'jnxBgpM2PeerLocalAddr', '.1.3.6.1.4.1.2636.5.1.1.2.1.1.1.7', $peer_data_tmp, 'BGP4-V2-MIB-JUNIPER', 'junos'); |
||
96 | $peer_data_tmp = snmpwalk_cache_long_oid($device, 'jnxBgpM2PeerRemoteAddrType', '.1.3.6.1.4.1.2636.5.1.1.2.1.1.1.10', $peer_data_tmp, 'BGP4-V2-MIB-JUNIPER', 'junos'); |
||
97 | $peer_data_tmp = snmpwalk_cache_long_oid($device, 'jnxBgpM2PeerLastErrorReceived', '.1.3.6.1.4.1.2636.5.1.1.2.2.1.1.1', $peer_data_tmp, 'BGP4-V2-MIB-JUNIPER', 'junos'); |
||
98 | $peer_data_tmp = snmpwalk_cache_long_oid($device, 'jnxBgpM2PeerLastErrorReceivedText', '.1.3.6.1.4.1.2636.5.1.1.2.2.1.1.5', $peer_data_tmp, 'BGP4-V2-MIB-JUNIPER', 'junos'); |
||
99 | d_echo($peer_data_tmp); |
||
100 | } |
||
101 | |||
102 | $peer_hash = $junos[(string) $peer_ip]['hash']; |
||
103 | $peer_data = []; |
||
104 | $peer_data['bgpPeerState'] = $peer_data_tmp[$peer_hash]['jnxBgpM2PeerState']; |
||
105 | $peer_data['bgpPeerAdminStatus'] = $peer_data_tmp[$peer_hash]['jnxBgpM2PeerStatus']; |
||
106 | $peer_data['bgpPeerInUpdates'] = $peer_data_tmp[$peer_hash]['jnxBgpM2PeerInUpdates']; |
||
107 | $peer_data['bgpPeerOutUpdates'] = $peer_data_tmp[$peer_hash]['jnxBgpM2PeerOutUpdates']; |
||
108 | $peer_data['bgpPeerInTotalMessages'] = $peer_data_tmp[$peer_hash]['jnxBgpM2PeerInTotalMessages']; |
||
109 | $peer_data['bgpPeerOutTotalMessages'] = $peer_data_tmp[$peer_hash]['jnxBgpM2PeerOutTotalMessages']; |
||
110 | $peer_data['bgpPeerFsmEstablishedTime'] = $peer_data_tmp[$peer_hash]['jnxBgpM2PeerFsmEstablishedTime']; |
||
111 | $peer_data['bgpPeerLastErrorText'] = $peer_data_tmp[$peer_hash]['jnxBgpM2PeerLastErrorReceivedText']; |
||
112 | |||
113 | $error_data = explode(' ', $peer_data_tmp[$peer_hash]['jnxBgpM2PeerLastErrorReceived']); |
||
114 | $peer_data['bgpPeerLastErrorCode'] = intval($error_data[0]); |
||
115 | $peer_data['bgpPeerLastErrorSubCode'] = intval($error_data[1]); |
||
116 | |||
117 | try { |
||
118 | $peer_data['bgpLocalAddr'] = IP::fromHexString($peer_data_tmp[$peer_hash]['jnxBgpM2PeerLocalAddr'])->uncompressed(); |
||
119 | } catch (InvalidIpException $e) { |
||
120 | $peer_data['bgpLocalAddr'] = ''; |
||
121 | } |
||
122 | d_echo("State = {$peer_data['bgpPeerState']} - AdminStatus: {$peer_data['bgpPeerAdminStatus']}\n"); |
||
123 | } elseif ($device['os'] == 'vrp') { |
||
124 | echo "\nCaching Oids VRP..."; |
||
125 | if (! isset($bgpPeers)) { |
||
126 | //if not available, we timeout each time, to be fixed when split |
||
127 | $bgpPeersCache = snmpwalk_cache_oid($device, 'hwBgpPeerEntry', [], 'HUAWEI-BGP-VPN-MIB', 'huawei'); |
||
128 | $bgpPeersStats = snmpwalk_cache_oid($device, 'hwBgpPeerStatisticTable', [], 'HUAWEI-BGP-VPN-MIB', 'huawei', '-OQUbs'); |
||
129 | $bgp4updates = snmpwalk_cache_oid($device, 'bgpPeerEntry', [], 'BGP4-MIB', 'huawei', '-OQUbs'); |
||
130 | foreach ($bgpPeersCache as $key => $value) { |
||
131 | $oid = explode('.', $key, 5); |
||
132 | $vrfInstance = $oid[0]; |
||
133 | $afi = $oid[1]; |
||
134 | $safi = $oid[2]; |
||
135 | $transp = $oid[3]; |
||
136 | $address = $oid[4]; |
||
137 | if (strlen($address) > 15) { |
||
138 | $address = IP::fromHexString($address)->compressed(); |
||
139 | } |
||
140 | if (! isset($bgpPeers[$address][$vrfInstance])) { |
||
141 | $bgpPeers[$address][$vrfInstance] = []; |
||
142 | } |
||
143 | $bgpPeers[$address][$vrfInstance] = array_merge($bgpPeers[$address][$vrfInstance], $value); |
||
144 | //d_echo("$vrfInstance -- $address \t-- $value"); |
||
145 | } |
||
146 | foreach ($bgpPeersStats as $key => $value) { |
||
147 | $oid = explode('.', $key, 4); |
||
148 | $vrfInstance = $oid[1]; |
||
149 | $address = $oid[3]; |
||
150 | if ($oid[2] > 4) { //ipv6 so we have to translate |
||
151 | $address = IP::fromSnmpString($oid[3])->compressed(); |
||
152 | } |
||
153 | $bgpPeers[$address][$vrfInstance] = array_merge($bgpPeers[$address][$vrfInstance], $value); |
||
154 | //d_echo("$vrfInstance -- $address \t-- $value"); |
||
155 | //d_echo($value); |
||
156 | } |
||
157 | //d_echo($bgpPeersCache); |
||
158 | //d_echo($bgpPeersStats); |
||
159 | } |
||
160 | //d_echo($bgpPeers); |
||
161 | $address = (string) $peer_ip; |
||
162 | $bgpPeer = $bgpPeers[$address]; |
||
163 | $peer_data = []; |
||
164 | if (count(array_keys($bgpPeer)) == 1) { // We have only one vrf with a peer with this IP |
||
165 | $vrfInstance = array_keys($bgpPeer)[0]; |
||
166 | $peer_data['bgpPeerState'] = $bgpPeers[$address][$vrfInstance]['hwBgpPeerState']; |
||
167 | $peer_data['bgpPeerAdminStatus'] = $bgpPeers[$address][$vrfInstance]['hwBgpPeerAdminStatus']; |
||
168 | $peer_data['bgpPeerInUpdates'] = $bgpPeers[$address][$vrfInstance]['hwBgpPeerInUpdateMsgs']; |
||
169 | $peer_data['bgpPeerOutUpdates'] = $bgpPeers[$address][$vrfInstance]['hwBgpPeerOutUpdateMsgs']; |
||
170 | $peer_data['bgpPeerInTotalMessages'] = $bgpPeers[$address][$vrfInstance]['hwBgpPeerInTotalMsgs']; |
||
171 | $peer_data['bgpPeerOutTotalMessages'] = $bgpPeers[$address][$vrfInstance]['hwBgpPeerOutTotalMsgs']; |
||
172 | $peer_data['bgpPeerFsmEstablishedTime'] = $bgpPeers[$address][$vrfInstance]['hwBgpPeerFsmEstablishedTime']; |
||
173 | $peer_data['bgpPeerLastError'] = $bgpPeers[$address][$vrfInstance]['hwBgpPeerLastError']; |
||
174 | } |
||
175 | d_echo("VPN : $vrfInstance for $address :\n"); |
||
176 | d_echo($peer_data); |
||
177 | if (empty($peer_data['bgpPeerInUpdates']) || empty($peer_data['bgpPeerOutUpdates'])) { |
||
178 | $peer_data['bgpPeerInUpdates'] = $bgp4updates[$address]['bgpPeerInUpdates']; |
||
179 | $peer_data['bgpPeerOutUpdates'] = $bgp4updates[$address]['bgpPeerOutUpdates']; |
||
180 | } |
||
181 | if (empty($peer_data['bgpPeerInTotalMessages']) || empty($peer_data['bgpPeerOutTotalMessages'])) { |
||
182 | $peer_data['bgpPeerInTotalMessages'] = $bgp4updates[$address]['bgpPeerInTotalMessages']; |
||
183 | $peer_data['bgpPeerOutTotalMessages'] = $bgp4updates[$address]['bgpPeerOutTotalMessages']; |
||
184 | } |
||
185 | if (empty($peer_data['bgpPeerState'])) { |
||
186 | $peer_data['bgpPeerState'] = $bgp4updates[$address]['bgpPeerState']; |
||
187 | } |
||
188 | if (empty($peer_data['bgpPeerAdminStatus'])) { |
||
189 | $peer_data['bgpPeerAdminStatus'] = $bgp4updates[$address]['bgpPeerAdminStatus']; |
||
190 | } |
||
191 | if (empty($peer_data['bgpPeerLastError'])) { |
||
192 | $peer_data['bgpPeerLastError'] = $bgp4updates[$address]['bgpPeerLastError']; |
||
193 | } |
||
194 | $error_data = explode(' ', $peer_data['bgpPeerLastError']); |
||
195 | $peer_data['bgpPeerLastErrorCode'] = intval($error_data[0]); |
||
196 | $peer_data['bgpPeerLastErrorSubCode'] = intval($error_data[1]); |
||
197 | unset($peer_data['bgpPeerLastError']); |
||
198 | } elseif ($device['os'] == 'timos') { |
||
199 | if (! isset($bgpPeers)) { |
||
200 | echo "\nCaching Oids..."; |
||
201 | $bgpPeersCache = snmpwalk_cache_multi_oid($device, 'tBgpPeerNgTable', [], 'TIMETRA-BGP-MIB', 'nokia'); |
||
202 | $bgpPeersCache = snmpwalk_cache_multi_oid($device, 'tBgpPeerNgOperEntry', $bgpPeersCache, 'TIMETRA-BGP-MIB', 'nokia'); |
||
203 | foreach ($bgpPeersCache as $key => $value) { |
||
204 | $oid = explode('.', $key); |
||
205 | $vrfInstance = $oid[0]; |
||
206 | $address = str_replace($oid[0] . '.' . $oid[1] . '.', '', $key); |
||
207 | if (strlen($address) > 15) { |
||
208 | $address = IP::fromHexString($address)->compressed(); |
||
209 | } |
||
210 | $bgpPeers[$vrfInstance][$address] = $value; |
||
211 | } |
||
212 | } |
||
213 | $address = (string) $peer_ip; |
||
214 | $tmpTime = $bgpPeers[$vrfOid][$address]['tBgpPeerNgLastChanged']; |
||
215 | $tmpTime = explode('.', $tmpTime); |
||
216 | $tmpTime = explode(':', $tmpTime[0]); |
||
217 | $establishedTime = ($tmpTime[0] * 86400) + ($tmpTime[1] * 3600) + ($tmpTime[2] * 60) + $tmpTime[3]; |
||
218 | |||
219 | $peer_data = []; |
||
220 | $peer_data['bgpPeerState'] = $bgpPeers[$vrfOid][$address]['tBgpPeerNgConnState']; |
||
221 | if ($bgpPeers[$vrfOid][$address]['tBgpPeerNgShutdown'] == '1') { |
||
222 | $peer_data['bgpPeerAdminStatus'] = 'adminShutdown'; |
||
223 | } else { |
||
224 | $peer_data['bgpPeerAdminStatus'] = $bgpPeers[$vrfOid][$address]['tBgpPeerNgOperLastEvent']; |
||
225 | } |
||
226 | $peer_data['bgpPeerInTotalMessages'] = $bgpPeers[$vrfOid][$address]['tBgpPeerNgOperMsgOctetsRcvd']; // That are actually only octets available, |
||
227 | $peer_data['bgpPeerOutTotalMessages'] = $bgpPeers[$vrfOid][$address]['tBgpPeerNgOperMsgOctetsSent']; // not messages |
||
228 | $peer_data['bgpPeerFsmEstablishedTime'] = $establishedTime; |
||
229 | } elseif ($device['os'] == 'firebrick') { |
||
230 | // ToDo, It seems that bgpPeer(In|Out)Updates and bgpPeerInUpdateElapsedTime are actually not available over SNMP |
||
231 | $bgpPeer = null; |
||
232 | foreach ($peer_data_check as $key => $value) { |
||
233 | $oid = explode('.', $key); |
||
234 | $protocol = $oid[0]; |
||
235 | $address = str_replace($oid[0] . '.', '', $key); |
||
236 | if (strlen($address) > 15) { |
||
237 | $address = IP::fromHexString($address)->compressed(); |
||
238 | } |
||
239 | |||
240 | // Some older Firebrick software versions don't have this field |
||
241 | if (isset($value['fbBgpPeerLocalAddress'])) { |
||
242 | $peer_data['bgpLocalAddr'] = IP::fromHexString($value['fbBgpPeerLocalAddress'])->uncompressed(); |
||
243 | } |
||
244 | |||
245 | if ($address == $peer_ip) { |
||
246 | switch ($value['fbBgpPeerState']) { |
||
247 | case 0: |
||
248 | $peer_data['bgpPeerState'] = 'idle'; |
||
249 | break; |
||
250 | case 1: |
||
251 | case 2: |
||
252 | $peer_data['bgpPeerState'] = 'active'; |
||
253 | break; |
||
254 | case 3: |
||
255 | $peer_data['bgpPeerState'] = 'opensent'; |
||
256 | break; |
||
257 | case 4: |
||
258 | $peer_data['bgpPeerState'] = 'openconfig'; |
||
259 | break; |
||
260 | case 5: |
||
261 | $peer_data['bgpPeerState'] = 'established'; |
||
262 | break; |
||
263 | case 6: |
||
264 | $peer_data['bgpPeerState'] = 'closed'; |
||
265 | break; |
||
266 | case 7: |
||
267 | $peer_data['bgpPeerState'] = 'free'; |
||
268 | break; |
||
269 | } |
||
270 | $peer_data['bgpPeerRemoteAddr'] = $address; |
||
271 | $peer_data['bgpPeerRemoteAs'] = $value['fbBgpPeerRemoteAS']; |
||
272 | $peer_data['bgpPeerAdminStatus'] = 'start'; |
||
273 | $peer_data['bgpPeerInUpdates'] = 0; |
||
274 | $peer_data['bgpPeerOutUpdates'] = 0; |
||
275 | $peer_data['bgpPeerInTotalMessages'] = 0; |
||
276 | $peer_data['bgpPeerOutTotalMessages'] = 0; |
||
277 | $peer_data['bgpPeerFsmEstablishedTime'] = 0; |
||
278 | break; |
||
279 | } |
||
280 | } |
||
281 | } else { |
||
282 | $bgp_peer_ident = $peer_ip->toSnmpIndex(); |
||
283 | $ip_ver = $peer_ip->getFamily(); |
||
284 | if ($ip_ver == 'ipv6') { |
||
285 | $ip_type = 2; |
||
286 | $ip_len = 16; |
||
287 | } else { |
||
288 | $ip_type = 1; |
||
289 | $ip_len = 4; |
||
290 | } |
||
291 | |||
292 | if ($device['os_group'] === 'arista') { |
||
293 | $peer_identifier = '1.' . $ip_type . '.' . $ip_len . '.' . $bgp_peer_ident; |
||
294 | $mib = 'ARISTA-BGP4V2-MIB'; |
||
295 | $oid_map = [ |
||
296 | 'aristaBgp4V2PeerState' => 'bgpPeerState', |
||
297 | 'aristaBgp4V2PeerAdminStatus' => 'bgpPeerAdminStatus', |
||
298 | 'aristaBgp4V2PeerInUpdates' => 'bgpPeerInUpdates', |
||
299 | 'aristaBgp4V2PeerOutUpdates' => 'bgpPeerOutUpdates', |
||
300 | 'aristaBgp4V2PeerInTotalMessages' => 'bgpPeerInTotalMessages', |
||
301 | 'aristaBgp4V2PeerOutTotalMessages' => 'bgpPeerOutTotalMessages', |
||
302 | 'aristaBgp4V2PeerFsmEstablishedTime' => 'bgpPeerFsmEstablishedTime', |
||
303 | 'aristaBgp4V2PeerInUpdatesElapsedTime' => 'bgpPeerInUpdateElapsedTime', |
||
304 | 'aristaBgp4V2PeerLocalAddr' => 'bgpLocalAddr', |
||
305 | 'aristaBgp4V2PeerDescription' => 'bgpPeerDescr', |
||
306 | 'aristaBgp4V2PeerLastErrorCodeReceived' => 'bgpPeerLastErrorCode', |
||
307 | 'aristaBgp4V2PeerLastErrorSubCodeReceived' => 'bgpPeerLastErrorSubCode', |
||
308 | 'aristaBgp4V2PeerLastErrorReceivedText' => 'bgpPeerLastErrorText', |
||
309 | ]; |
||
310 | } elseif ($device['os'] == 'dell-os10') { |
||
311 | $peer_identifier = '1.' . $ip_type . '.' . $ip_len . '.' . $bgp_peer_ident; |
||
312 | $mib = 'DELLEMC-OS10-BGP4V2-MIB'; |
||
313 | $oid_map = [ |
||
314 | 'os10bgp4V2PeerState' => 'bgpPeerState', |
||
315 | 'os10bgp4V2PeerAdminStatus' => 'bgpPeerAdminStatus', |
||
316 | 'os10bgp4V2PeerInUpdates' => 'bgpPeerInUpdates', |
||
317 | 'os10bgp4V2PeerOutUpdates' => 'bgpPeerOutUpdates', |
||
318 | 'os10bgp4V2PeerInTotalMessages' => 'bgpPeerInTotalMessages', |
||
319 | 'os10bgp4V2PeerOutTotalMessages' => 'bgpPeerOutTotalMessages', |
||
320 | 'os10bgp4V2PeerFsmEstablishedTime' => 'bgpPeerFsmEstablishedTime', |
||
321 | 'os10bgp4V2PeerInUpdatesElapsedTime' => 'bgpPeerInUpdateElapsedTime', |
||
322 | 'os10bgp4V2PeerLocalAddr' => 'bgpLocalAddr', |
||
323 | 'os10bgp4V2PeerDescription' => 'bgpPeerDescr', |
||
324 | 'os10bgp4V2PeerLastErrorCodeReceived' => 'bgpPeerLastErrorCode', |
||
325 | 'os10bgp4V2PeerLastErrorSubCodeReceived' => 'bgpPeerLastErrorSubCode', |
||
326 | 'os10bgp4V2PeerLastErrorReceivedText' => 'bgpPeerLastErrorText', |
||
327 | ]; |
||
328 | } elseif ($device['os'] == 'aos7') { |
||
329 | $peer_identifier = $peer['bgpPeerIdentifier']; |
||
330 | $peer_data = []; |
||
331 | $al_descr = snmpwalk_cache_multi_oid($device, 'alaBgpPeerName', $al_descr, 'ALCATEL-IND1-BGP-MIB', 'aos7', '-OQUs'); |
||
332 | $al_peer = snmpwalk_cache_multi_oid($device, 'BgpPeerEntry', [], 'BGP4-MIB', 'aos7', '-OQUs'); |
||
333 | $peer_data['bgpPeerDescr'] = $al_descr[$peer_identifier]['alaBgpPeerName']; |
||
334 | $peer_data['bgpPeerState'] = $al_peer[$peer_identifier]['bgpPeerState']; |
||
335 | $peer_data['bgpPeerAdminStatus'] = $al_peer[$peer_identifier]['bgpPeerAdminStatus']; |
||
336 | $peer_data['bgpPeerInUpdates'] = $al_peer[$peer_identifier]['bgpPeerInUpdates']; |
||
337 | $peer_data['bgpPeerOutUpdates'] = $al_peer[$peer_identifier]['bgpPeerOutUpdates']; |
||
338 | $peer_data['bgpPeerInTotalMessages'] = $al_peer[$peer_identifier]['bgpPeerInTotalMessages']; |
||
339 | $peer_data['bgpPeerOutTotalMessages'] = $al_peer[$peer_identifier]['bgpPeerOutTotalMessages']; |
||
340 | $peer_data['bgpPeerFsmEstablishedTime'] = $al_peer[$peer_identifier]['bgpPeerFsmEstablishedTime']; |
||
341 | $peer_data['bgpPeerInUpdateElapsedTime'] = $al_peer[$peer_identifier]['bgpPeerInUpdateElapsedTime']; |
||
342 | $error_data = explode(' ', $al_peer[$peer_identifier]['bgpPeerLastError']); |
||
343 | $peer_data['bgpPeerLastErrorCode'] = intval($error_data[0]); |
||
344 | $peer_data['bgpPeerLastErrorSubCode'] = intval($error_data[1]); |
||
345 | } elseif ($device['os_group'] == 'cisco') { |
||
346 | $peer_identifier = $ip_type . '.' . $ip_len . '.' . $bgp_peer_ident; |
||
347 | $mib = 'CISCO-BGP4-MIB'; |
||
348 | $oid_map = [ |
||
349 | 'cbgpPeer2State' => 'bgpPeerState', |
||
350 | 'cbgpPeer2AdminStatus' => 'bgpPeerAdminStatus', |
||
351 | 'cbgpPeer2InUpdates' => 'bgpPeerInUpdates', |
||
352 | 'cbgpPeer2OutUpdates' => 'bgpPeerOutUpdates', |
||
353 | 'cbgpPeer2InTotalMessages' => 'bgpPeerInTotalMessages', |
||
354 | 'cbgpPeer2OutTotalMessages' => 'bgpPeerOutTotalMessages', |
||
355 | 'cbgpPeer2FsmEstablishedTime' => 'bgpPeerFsmEstablishedTime', |
||
356 | 'cbgpPeer2InUpdateElapsedTime' => 'bgpPeerInUpdateElapsedTime', |
||
357 | 'cbgpPeer2LocalAddr' => 'bgpLocalAddr', |
||
358 | 'cbgpPeer2LastError' => 'bgpPeerLastErrorCode', |
||
359 | 'cbgpPeer2LastErrorTxt' => 'bgpPeerLastErrorText', |
||
360 | ]; |
||
361 | } else { |
||
362 | $peer_identifier = $peer['bgpPeerIdentifier']; |
||
363 | $mib = 'BGP4-MIB'; |
||
364 | $oid_map = [ |
||
365 | 'bgpPeerState' => 'bgpPeerState', |
||
366 | 'bgpPeerAdminStatus' => 'bgpPeerAdminStatus', |
||
367 | 'bgpPeerInUpdates' => 'bgpPeerInUpdates', |
||
368 | 'bgpPeerOutUpdates' => 'bgpPeerOutUpdates', |
||
369 | 'bgpPeerInTotalMessages' => 'bgpPeerInTotalMessages', |
||
370 | 'bgpPeerOutTotalMessages' => 'bgpPeerOutTotalMessages', |
||
371 | 'bgpPeerFsmEstablishedTime' => 'bgpPeerFsmEstablishedTime', |
||
372 | 'bgpPeerInUpdateElapsedTime' => 'bgpPeerInUpdateElapsedTime', |
||
373 | 'bgpPeerLocalAddr' => 'bgpLocalAddr', // silly db field name |
||
374 | 'bgpPeerLastError' => 'bgpPeerLastErrorCode', |
||
375 | ]; |
||
376 | } |
||
377 | } |
||
378 | } |
||
379 | |||
380 | // --- Build peer data if it is not already filled in --- |
||
381 | if (empty($peer_data) && isset($peer_identifier, $oid_map, $mib)) { |
||
382 | echo "Fetching $mib data... \n"; |
||
383 | |||
384 | $get_oids = array_map(function ($oid) use ($peer_identifier) { |
||
385 | return "$oid.$peer_identifier"; |
||
386 | }, array_keys($oid_map)); |
||
387 | $peer_data_raw = snmp_get_multi($device, $get_oids, '-OQUs', $mib); |
||
388 | $peer_data_raw = reset($peer_data_raw); // get the first element of the array |
||
389 | |||
390 | $peer_data = []; |
||
391 | |||
392 | foreach ($oid_map as $source => $target) { |
||
393 | $v = isset($peer_data_raw[$source]) ? $peer_data_raw[$source] : ''; |
||
394 | |||
395 | if (Str::contains($source, 'LocalAddr')) { |
||
396 | try { |
||
397 | $v = IP::fromHexString($v)->uncompressed(); |
||
398 | } catch (InvalidIpException $e) { |
||
399 | // if parsing fails, leave the data as-is |
||
400 | } |
||
401 | } |
||
402 | $peer_data[$target] = $v; |
||
403 | } |
||
404 | if (strpos($peer_data['bgpPeerLastErrorCode'], ' ')) { |
||
405 | // Some device return both Code and SubCode in the same snmp field, we need to split it |
||
406 | $splitted_codes = explode(' ', $peer_data['bgpPeerLastErrorCode']); |
||
407 | $error_code = intval($splitted_codes[0]); |
||
408 | $error_subcode = intval($splitted_codes[1]); |
||
409 | $peer_data['bgpPeerLastErrorCode'] = $error_code; |
||
410 | $peer_data['bgpPeerLastErrorSubCode'] = $error_subcode; |
||
411 | } |
||
412 | } |
||
413 | |||
414 | d_echo($peer_data); |
||
415 | } catch (InvalidIpException $e) { |
||
416 | // ignore |
||
417 | } |
||
418 | // --- Send event log notices --- |
||
419 | if ($peer_data['bgpPeerFsmEstablishedTime']) { |
||
420 | if (! (is_array(\LibreNMS\Config::get('alerts.bgp.whitelist')) |
||
421 | && ! in_array($peer['bgpPeerRemoteAs'], \LibreNMS\Config::get('alerts.bgp.whitelist'))) |
||
422 | && ($peer_data['bgpPeerFsmEstablishedTime'] < $peer['bgpPeerFsmEstablishedTime'] |
||
423 | || $peer_data['bgpPeerState'] != $peer['bgpPeerState']) |
||
424 | ) { |
||
425 | if ($peer['bgpPeerState'] == $peer_data['bgpPeerState']) { |
||
426 | log_event('BGP Session Flap: ' . $peer['bgpPeerIdentifier'] . ' (AS' . $peer['bgpPeerRemoteAs'] . '), last error: ' . describe_bgp_error_code($peer['bgpPeerLastErrorCode'], $peer['bgpPeerLastErrorSubCode']), $device, 'bgpPeer', 4, $peer_ip); |
||
0 ignored issues
–
show
Bug
introduced
by
Loading history...
|
|||
427 | } elseif ($peer_data['bgpPeerState'] == 'established') { |
||
428 | log_event('BGP Session Up: ' . $peer['bgpPeerIdentifier'] . ' (AS' . $peer['bgpPeerRemoteAs'] . ')', $device, 'bgpPeer', 1, $peer_ip); |
||
429 | } elseif ($peer['bgpPeerState'] == 'established') { |
||
430 | log_event('BGP Session Down: ' . $peer['bgpPeerIdentifier'] . ' (AS' . $peer['bgpPeerRemoteAs'] . '), last error: ' . describe_bgp_error_code($peer['bgpPeerLastErrorCode'], $peer['bgpPeerLastErrorSubCode']), $device, 'bgpPeer', 5, $peer_ip); |
||
431 | } |
||
432 | } |
||
433 | } |
||
434 | |||
435 | // --- Update rrd data --- |
||
436 | $peer_rrd_name = \LibreNMS\Data\Store\Rrd::safeName('bgp-' . $peer['bgpPeerIdentifier']); |
||
437 | $peer_rrd_def = RrdDefinition::make() |
||
438 | ->addDataset('bgpPeerOutUpdates', 'COUNTER', null, 100000000000) |
||
439 | ->addDataset('bgpPeerInUpdates', 'COUNTER', null, 100000000000) |
||
440 | ->addDataset('bgpPeerOutTotal', 'COUNTER', null, 100000000000) |
||
441 | ->addDataset('bgpPeerInTotal', 'COUNTER', null, 100000000000) |
||
442 | ->addDataset('bgpPeerEstablished', 'GAUGE', 0); |
||
443 | // Validate data |
||
444 | $peer_data['bgpPeerFsmEstablishedTime'] = set_numeric($peer_data['bgpPeerFsmEstablishedTime']); |
||
445 | $peer_data['bgpPeerInUpdates'] = set_numeric($peer_data['bgpPeerInUpdates']); |
||
446 | $peer_data['bgpPeerOutUpdates'] = set_numeric($peer_data['bgpPeerOutUpdates']); |
||
447 | |||
448 | $fields = [ |
||
449 | 'bgpPeerOutUpdates' => $peer_data['bgpPeerOutUpdates'], |
||
450 | 'bgpPeerInUpdates' => $peer_data['bgpPeerInUpdates'], |
||
451 | 'bgpPeerOutTotal' => $peer_data['bgpPeerOutTotalMessages'], |
||
452 | 'bgpPeerInTotal' => $peer_data['bgpPeerInTotalMessages'], |
||
453 | 'bgpPeerEstablished' => $peer_data['bgpPeerFsmEstablishedTime'], |
||
454 | ]; |
||
455 | |||
456 | $tags = [ |
||
457 | 'bgpPeerIdentifier' => $peer['bgpPeerIdentifier'], |
||
458 | 'rrd_name' => $peer_rrd_name, |
||
459 | 'rrd_def' => $peer_rrd_def, |
||
460 | ]; |
||
461 | data_update($device, 'bgp', $tags, $fields); |
||
462 | |||
463 | // --- Update Database data --- |
||
464 | $peer['update'] = array_diff_assoc($peer_data, $peer); |
||
465 | unset($peer_data); |
||
466 | |||
467 | if ($peer['update']) { |
||
468 | if ($vrfId) { |
||
469 | dbUpdate($peer['update'], 'bgpPeers', '`device_id` = ? AND `bgpPeerIdentifier` = ? AND `vrf_id` = ?', [$device['device_id'], $peer['bgpPeerIdentifier'], $vrfId]); |
||
470 | } else { |
||
471 | dbUpdate($peer['update'], 'bgpPeers', '`device_id` = ? AND `bgpPeerIdentifier` = ?', [$device['device_id'], $peer['bgpPeerIdentifier']]); |
||
472 | } |
||
473 | } |
||
474 | |||
475 | // --- Populate cbgp data --- |
||
476 | if ($device['os_group'] == 'vrp' || $device['os_group'] == 'cisco' || $device['os'] == 'junos' || $device['os'] == 'aos7' || $device['os_group'] === 'arista' || $device['os'] == 'dell-os10' || $device['os'] == 'firebrick') { |
||
477 | // Poll each AFI/SAFI for this peer (using CISCO-BGP4-MIB or BGP4-V2-JUNIPER MIB) |
||
478 | $peer_afis = dbFetchRows('SELECT * FROM bgpPeers_cbgp WHERE `device_id` = ? AND bgpPeerIdentifier = ?', [$device['device_id'], $peer['bgpPeerIdentifier']]); |
||
479 | foreach ($peer_afis as $peer_afi) { |
||
480 | $afi = $peer_afi['afi']; |
||
481 | $safi = $peer_afi['safi']; |
||
482 | d_echo("$afi $safi\n"); |
||
483 | if ($device['os_group'] == 'cisco') { |
||
484 | $bgp_peer_ident = $peer_ip->toSnmpIndex(); |
||
485 | |||
486 | $ip_ver = $peer_ip->getFamily(); |
||
487 | if ($ip_ver == 'ipv6') { |
||
488 | $ip_type = 2; |
||
489 | $ip_len = 16; |
||
490 | } else { |
||
491 | $ip_type = 1; |
||
492 | $ip_len = 4; |
||
493 | } |
||
494 | |||
495 | $ip_cast = 1; |
||
496 | if ($peer_afi['safi'] == 'multicast') { |
||
497 | $ip_cast = 2; |
||
498 | } elseif ($peer_afi['safi'] == 'unicastAndMulticast') { |
||
499 | $ip_cast = 3; |
||
500 | } elseif ($peer_afi['safi'] == 'vpn') { |
||
501 | $ip_cast = 128; |
||
502 | } |
||
503 | |||
504 | $check = snmp_get($device, 'cbgpPeer2AcceptedPrefixes.' . $ip_type . '.' . $ip_len . '.' . $bgp_peer_ident . '.' . $ip_type . '.' . $ip_cast, '', 'CISCO-BGP4-MIB'); |
||
505 | |||
506 | if (! empty($check)) { |
||
507 | $cgp_peer_identifier = $ip_type . '.' . $ip_len . '.' . $bgp_peer_ident . '.' . $ip_type . '.' . $ip_cast; |
||
508 | $cbgp2_oids = [ |
||
509 | 'cbgpPeer2AcceptedPrefixes.' . $cgp_peer_identifier, |
||
510 | 'cbgpPeer2DeniedPrefixes.' . $cgp_peer_identifier, |
||
511 | 'cbgpPeer2PrefixAdminLimit.' . $cgp_peer_identifier, |
||
512 | 'cbgpPeer2PrefixThreshold.' . $cgp_peer_identifier, |
||
513 | 'cbgpPeer2PrefixClearThreshold.' . $cgp_peer_identifier, |
||
514 | 'cbgpPeer2AdvertisedPrefixes.' . $cgp_peer_identifier, |
||
515 | 'cbgpPeer2SuppressedPrefixes.' . $cgp_peer_identifier, |
||
516 | 'cbgpPeer2WithdrawnPrefixes.' . $cgp_peer_identifier, |
||
517 | ]; |
||
518 | $cbgp_data_tmp = snmp_get_multi($device, $cbgp2_oids, '-OQUs', 'CISCO-BGP4-MIB'); |
||
519 | $ident = "$ip_ver.\"" . $peer['bgpPeerIdentifier'] . '"' . '.' . $ip_type . '.' . $ip_cast; |
||
520 | |||
521 | $key = key($cbgp_data_tmp); // get key of item |
||
522 | $cbgp_data = [ |
||
523 | 'cbgpPeerAcceptedPrefixes' => $cbgp_data_tmp[$key]['cbgpPeer2AcceptedPrefixes'], |
||
524 | 'cbgpPeerDeniedPrefixes' => $cbgp_data_tmp[$key]['cbgpPeer2DeniedPrefixes'], |
||
525 | 'cbgpPeerPrefixAdminLimit' => $cbgp_data_tmp[$key]['cbgpPeer2PrefixAdminLimit'], |
||
526 | 'cbgpPeerPrefixThreshold' => $cbgp_data_tmp[$key]['cbgpPeer2PrefixThreshold'], |
||
527 | 'cbgpPeerPrefixClearThreshold' => $cbgp_data_tmp[$key]['cbgpPeer2PrefixClearThreshold'], |
||
528 | 'cbgpPeerAdvertisedPrefixes' => $cbgp_data_tmp[$key]['cbgpPeer2AdvertisedPrefixes'], |
||
529 | 'cbgpPeerSuppressedPrefixes' => $cbgp_data_tmp[$key]['cbgpPeer2SuppressedPrefixes'], |
||
530 | 'cbgpPeerWithdrawnPrefixes' => $cbgp_data_tmp[$key]['cbgpPeer2WithdrawnPrefixes'], |
||
531 | ]; |
||
532 | } else { |
||
533 | $cbgp_oids = [ |
||
534 | 'cbgpPeerAcceptedPrefixes.' . $peer['bgpPeerIdentifier'] . ".$afi.$safi", |
||
535 | 'cbgpPeerDeniedPrefixes.' . $peer['bgpPeerIdentifier'] . ".$afi.$safi", |
||
536 | 'cbgpPeerPrefixAdminLimit.' . $peer['bgpPeerIdentifier'] . ".$afi.$safi", |
||
537 | 'cbgpPeerPrefixThreshold.' . $peer['bgpPeerIdentifier'] . ".$afi.$safi", |
||
538 | 'cbgpPeerPrefixClearThreshold.' . $peer['bgpPeerIdentifier'] . ".$afi.$safi", |
||
539 | 'cbgpPeerAdvertisedPrefixes.' . $peer['bgpPeerIdentifier'] . ".$afi.$safi", |
||
540 | 'cbgpPeerSuppressedPrefixes.' . $peer['bgpPeerIdentifier'] . ".$afi.$safi", |
||
541 | 'cbgpPeerWithdrawnPrefixes.' . $peer['bgpPeerIdentifier'] . ".$afi.$safi", |
||
542 | ]; |
||
543 | |||
544 | $cbgp_data = snmp_get_multi($device, $cbgp_oids, '-OUQs', 'CISCO-BGP4-MIB'); |
||
545 | $cbgp_data = reset($cbgp_data); // get first entry |
||
546 | } |
||
547 | d_echo($cbgp_data); |
||
548 | |||
549 | $cbgpPeerAcceptedPrefixes = $cbgp_data['cbgpPeerAcceptedPrefixes']; |
||
550 | $cbgpPeerDeniedPrefixes = $cbgp_data['cbgpPeerDeniedPrefixes']; |
||
551 | $cbgpPeerPrefixAdminLimit = $cbgp_data['cbgpPeerPrefixAdminLimit']; |
||
552 | $cbgpPeerPrefixThreshold = $cbgp_data['cbgpPeerPrefixThreshold']; |
||
553 | $cbgpPeerPrefixClearThreshold = $cbgp_data['cbgpPeerPrefixClearThreshold']; |
||
554 | $cbgpPeerAdvertisedPrefixes = $cbgp_data['cbgpPeerAdvertisedPrefixes']; |
||
555 | $cbgpPeerSuppressedPrefixes = $cbgp_data['cbgpPeerSuppressedPrefixes']; |
||
556 | $cbgpPeerWithdrawnPrefixes = $cbgp_data['cbgpPeerWithdrawnPrefixes']; |
||
557 | unset($cbgp_data); |
||
558 | } //end if |
||
559 | |||
560 | if ($device['os'] == 'junos') { |
||
561 | $afis['ipv4'] = 1; |
||
562 | $afis['ipv6'] = 2; |
||
563 | $afis['l2vpn'] = 25; |
||
564 | $safis['unicast'] = 1; |
||
565 | $safis['multicast'] = 2; |
||
566 | $safis['unicastAndMulticast'] = 3; |
||
567 | $safis['labeledUnicast'] = 4; |
||
568 | $safis['mvpn'] = 5; |
||
569 | $safis['vpls'] = 65; |
||
570 | $safis['evpn'] = 70; |
||
571 | $safis['vpn'] = 128; |
||
572 | $safis['rtfilter'] = 132; |
||
573 | $safis['flow'] = 133; |
||
574 | |||
575 | if (! isset($j_prefixes)) { |
||
576 | $j_prefixes = snmpwalk_cache_multi_oid($device, 'jnxBgpM2PrefixInPrefixesAccepted', $j_prefixes, 'BGP4-V2-MIB-JUNIPER', 'junos', '-OQnU'); |
||
577 | $j_prefixes = snmpwalk_cache_multi_oid($device, 'jnxBgpM2PrefixInPrefixesRejected', $j_prefixes, 'BGP4-V2-MIB-JUNIPER', 'junos', '-OQnU'); |
||
578 | $j_prefixes = snmpwalk_cache_multi_oid($device, 'jnxBgpM2PrefixOutPrefixes', $j_prefixes, 'BGP4-V2-MIB-JUNIPER', 'junos', '-OQnU'); |
||
579 | d_echo($j_prefixes); |
||
580 | } |
||
581 | |||
582 | $cbgpPeerAcceptedPrefixes = array_shift($j_prefixes['1.3.6.1.4.1.2636.5.1.1.2.6.2.1.8.' . $junos[(string) $peer_ip]['index'] . ".$afis[$afi]." . $safis[$safi]]); |
||
583 | $cbgpPeerDeniedPrefixes = array_shift($j_prefixes['1.3.6.1.4.1.2636.5.1.1.2.6.2.1.9.' . $junos[(string) $peer_ip]['index'] . ".$afis[$afi]." . $safis[$safi]]); |
||
584 | $cbgpPeerAdvertisedPrefixes = array_shift($j_prefixes['1.3.6.1.4.1.2636.5.1.1.2.6.2.1.10.' . $junos[(string) $peer_ip]['index'] . ".$afis[$afi]." . $safis[$safi]]); |
||
585 | }//end if |
||
586 | |||
587 | if ($device['os_group'] === 'arista') { |
||
588 | $safis['unicast'] = 1; |
||
589 | $safis['multicast'] = 2; |
||
590 | $afis['ipv4'] = 1; |
||
591 | $afis['ipv6'] = 2; |
||
592 | if (preg_match('/:/', $peer['bgpPeerIdentifier'])) { |
||
593 | $tmp_peer = str_replace(':', '', $peer['bgpPeerIdentifier']); |
||
594 | $tmp_peer = preg_replace('/([\w\d]{2})/', '\1:', $tmp_peer); |
||
595 | $tmp_peer = rtrim($tmp_peer, ':'); |
||
596 | } else { |
||
597 | $tmp_peer = $peer['bgpPeerIdentifier']; |
||
598 | } |
||
599 | $a_prefixes = snmpwalk_cache_multi_oid($device, 'aristaBgp4V2PrefixInPrefixesAccepted', $a_prefixes, 'ARISTA-BGP4V2-MIB', null, '-OQUs'); |
||
600 | $out_prefixes = snmpwalk_cache_multi_oid($device, 'aristaBgp4V2PrefixOutPrefixes', $out_prefixes, 'ARISTA-BGP4V2-MIB', null, '-OQUs'); |
||
601 | |||
602 | $cbgpPeerAcceptedPrefixes = $a_prefixes["1.$afi.$tmp_peer.$afi.$safi"]['aristaBgp4V2PrefixInPrefixesAccepted']; |
||
603 | $cbgpPeerAdvertisedPrefixes = $out_prefixes["1.$afi.$tmp_peer.$afi.$safi"]['aristaBgp4V2PrefixOutPrefixes']; |
||
604 | } |
||
605 | |||
606 | if ($device['os'] == 'dell-os10') { |
||
607 | $safis['unicast'] = 1; |
||
608 | $safis['multicast'] = 2; |
||
609 | $afis['ipv4'] = 1; |
||
610 | $afis['ipv6'] = 2; |
||
611 | if (preg_match('/:/', $peer['bgpPeerIdentifier'])) { |
||
612 | $tmp_peer = str_replace(':', '', $peer['bgpPeerIdentifier']); |
||
613 | $tmp_peer = preg_replace('/([\w\d]{2})/', '\1:', $tmp_peer); |
||
614 | $tmp_peer = rtrim($tmp_peer, ':'); |
||
615 | } else { |
||
616 | $tmp_peer = $peer['bgpPeerIdentifier']; |
||
617 | } |
||
618 | $a_prefixes = snmpwalk_cache_multi_oid($device, 'os10bgp4V2PrefixInPrefixesAccepted', $a_prefixes, 'DELLEMC-OS10-BGP4V2-MIB', null, '-OQUs'); |
||
619 | $out_prefixes = snmpwalk_cache_multi_oid($device, 'os10bgp4V2PrefixOutPrefixes', $out_prefixes, 'DELLEMC-OS10-BGP4V2-MIB', null, '-OQUs'); |
||
620 | |||
621 | $cbgpPeerAcceptedPrefixes = $a_prefixes["1.$afi.$tmp_peer.$afi.$safi"]['os10bgp4V2PrefixInPrefixesAccepted']; |
||
622 | $cbgpPeerAdvertisedPrefixes = $out_prefixes["1.$afi.$tmp_peer.$afi.$safi"]['os10bgp4V2PrefixOutPrefixes']; |
||
623 | } |
||
624 | |||
625 | if ($device['os'] === 'aos7') { |
||
626 | $tmp_peer = $peer['bgpPeerIdentifier']; |
||
627 | $al_prefixes = snmpwalk_cache_multi_oid($device, 'alaBgpPeerRcvdPrefixes', $al_prefixes, 'ALCATEL-IND1-BGP-MIB', 'aos7', '-OQUs'); |
||
628 | $cbgpPeerAcceptedPrefixes = $al_prefixes[$tmp_peer]['alaBgpPeerRcvdPrefixes']; |
||
629 | } |
||
630 | |||
631 | if ($device['os_group'] === 'vrp') { |
||
632 | $vrpPrefixes = snmpwalk_cache_multi_oid($device, 'hwBgpPeerPrefixRcvCounter', $vrpPrefixes, 'HUAWEI-BGP-VPN-MIB', null, '-OQUs'); |
||
633 | $vrpPrefixes = snmpwalk_cache_multi_oid($device, 'hwBgpPeerPrefixAdvCounter', $vrpPrefixes, 'HUAWEI-BGP-VPN-MIB', null, '-OQUs'); |
||
634 | |||
635 | // only works in global routing table, as the vpnInstanceId is not available |
||
636 | // for now in the VRF discovery of VRP devices |
||
637 | $key4 = $vrfInstance . '.' . $afi . '.' . $safi . '.ipv4.' . $peer['bgpPeerIdentifier']; |
||
638 | $key6 = $vrfInstance . '.' . $afi . '.' . $safi . '.ipv6.' . $peer['bgpPeerIdentifier']; |
||
639 | |||
640 | if (isset($vrpPrefixes[$key4])) { |
||
641 | $cbgpPeerAcceptedPrefixes = $vrpPrefixes[$key4]['hwBgpPeerPrefixRcvCounter']; |
||
642 | $cbgpPeerAdvertisedPrefixes = $vrpPrefixes[$key4]['hwBgpPeerPrefixAdvCounter']; |
||
643 | } |
||
644 | if (isset($vrpPrefixes[$key6])) { |
||
645 | $cbgpPeerAcceptedPrefixes = $vrpPrefixes[$key6]['hwBgpPeerPrefixRcvCounter']; |
||
646 | $cbgpPeerAdvertisedPrefixes = $vrpPrefixes[$key6]['hwBgpPeerPrefixAdvCounter']; |
||
647 | } |
||
648 | } |
||
649 | |||
650 | if ($devices['os'] == 'firebrick') { |
||
651 | foreach ($peer_data_check as $key => $value) { |
||
652 | $oid = explode('.', $key); |
||
653 | $protocol = $oid[0]; |
||
654 | $address = str_replace($oid[0] . '.', '', $key); |
||
655 | if (strlen($address) > 15) { |
||
656 | $address = IP::fromHexString($address)->compressed(); |
||
657 | } |
||
658 | if ($address == $peer['bgpPeerIdentifier']) { |
||
659 | $cbgpPeerAcceptedPrefixes = $value['fbBgpPeerReceivedIpv4Prefixes'] + $value['fbBgpPeerReceivedIpv6Prefixes']; |
||
660 | $cbgpPeerAdvertisedPrefixes = $value['fbBgpPeerExported']; |
||
661 | break; |
||
662 | } |
||
663 | } |
||
664 | } |
||
665 | |||
666 | // Validate data |
||
667 | $cbgpPeerAcceptedPrefixes = set_numeric($cbgpPeerAcceptedPrefixes); |
||
668 | $cbgpPeerDeniedPrefixes = set_numeric($cbgpPeerDeniedPrefixes); |
||
669 | $cbgpPeerPrefixAdminLimit = set_numeric($cbgpPeerPrefixAdminLimit); |
||
670 | $cbgpPeerPrefixThreshold = set_numeric($cbgpPeerPrefixThreshold); |
||
671 | $cbgpPeerPrefixClearThreshold = set_numeric($cbgpPeerPrefixClearThreshold); |
||
672 | $cbgpPeerAdvertisedPrefixes = set_numeric($cbgpPeerAdvertisedPrefixes); |
||
673 | $cbgpPeerSuppressedPrefixes = set_numeric($cbgpPeerSuppressedPrefixes); |
||
674 | $cbgpPeerWithdrawnPrefixes = set_numeric($cbgpPeerWithdrawnPrefixes); |
||
675 | |||
676 | $cbgpPeers_cbgp_fields = [ |
||
677 | 'AcceptedPrefixes' => $cbgpPeerAcceptedPrefixes, |
||
678 | 'DeniedPrefixes' => $cbgpPeerDeniedPrefixes, |
||
679 | 'PrefixAdminLimit' => $cbgpPeerPrefixAdminLimit, |
||
680 | 'PrefixThreshold' => $cbgpPeerPrefixThreshold, |
||
681 | 'PrefixClearThreshold' => $cbgpPeerPrefixClearThreshold, |
||
682 | 'AdvertisedPrefixes' => $cbgpPeerAdvertisedPrefixes, |
||
683 | 'SuppressedPrefixes' => $cbgpPeerSuppressedPrefixes, |
||
684 | 'WithdrawnPrefixes' => $cbgpPeerWithdrawnPrefixes, |
||
685 | ]; |
||
686 | |||
687 | foreach ($cbgpPeers_cbgp_fields as $field => $value) { |
||
688 | if ($peer_afi[$field] != $value) { |
||
689 | $peer['c_update'][$field] = $value; |
||
690 | } |
||
691 | } |
||
692 | |||
693 | $oids = [ |
||
694 | 'AcceptedPrefixes', |
||
695 | 'DeniedPrefixes', |
||
696 | 'AdvertisedPrefixes', |
||
697 | 'SuppressedPrefixes', |
||
698 | 'WithdrawnPrefixes', |
||
699 | ]; |
||
700 | |||
701 | foreach ($oids as $oid) { |
||
702 | $tmp_prev = set_numeric($peer_afi[$oid]); |
||
703 | $tmp_delta = $cbgpPeers_cbgp_fields[$oid] - $tmp_prev; |
||
704 | if ($peer_afi[$oid . '_delta'] != $tmp_delta) { |
||
705 | $peer['c_update'][$oid . '_delta'] = $tmp_delta; |
||
706 | } |
||
707 | if ($peer_afi[$oid . '_prev'] != $tmp_prev) { |
||
708 | $peer['c_update'][$oid . '_prev'] = $tmp_prev; |
||
709 | } |
||
710 | } |
||
711 | |||
712 | if ($peer['c_update']) { |
||
713 | dbUpdate( |
||
714 | $peer['c_update'], |
||
715 | 'bgpPeers_cbgp', |
||
716 | '`device_id` = ? AND bgpPeerIdentifier = ? AND afi = ? AND safi = ?', |
||
717 | [$device['device_id'], $peer['bgpPeerIdentifier'], $afi, $safi] |
||
718 | ); |
||
719 | } |
||
720 | |||
721 | $cbgp_rrd_name = \LibreNMS\Data\Store\Rrd::safeName('cbgp-' . $peer['bgpPeerIdentifier'] . ".$afi.$safi"); |
||
722 | $cbgp_rrd_def = RrdDefinition::make() |
||
723 | ->addDataset('AcceptedPrefixes', 'GAUGE', null, 100000000000) |
||
724 | ->addDataset('DeniedPrefixes', 'GAUGE', null, 100000000000) |
||
725 | ->addDataset('AdvertisedPrefixes', 'GAUGE', null, 100000000000) |
||
726 | ->addDataset('SuppressedPrefixes', 'GAUGE', null, 100000000000) |
||
727 | ->addDataset('WithdrawnPrefixes', 'GAUGE', null, 100000000000); |
||
728 | |||
729 | $fields = [ |
||
730 | 'AcceptedPrefixes' => $cbgpPeerAcceptedPrefixes, |
||
731 | 'DeniedPrefixes' => $cbgpPeerDeniedPrefixes, |
||
732 | 'AdvertisedPrefixes' => $cbgpPeerAdvertisedPrefixes, |
||
733 | 'SuppressedPrefixes' => $cbgpPeerSuppressedPrefixes, |
||
734 | 'WithdrawnPrefixes' => $cbgpPeerWithdrawnPrefixes, |
||
735 | ]; |
||
736 | |||
737 | $tags = [ |
||
738 | 'bgpPeerIdentifier' => $peer['bgpPeerIdentifier'], |
||
739 | 'afi' => $afi, |
||
740 | 'safi' => $safi, |
||
741 | 'rrd_name' => $cbgp_rrd_name, |
||
742 | 'rrd_def' => $cbgp_rrd_def, |
||
743 | ]; |
||
744 | data_update($device, 'cbgp', $tags, $fields); |
||
745 | } //end foreach |
||
746 | } //end if |
||
747 | echo "\n"; |
||
748 | } //end foreach |
||
749 | } //end if |
||
750 | } //end if |
||
751 | |||
752 | unset($peers, $peer_data_tmp, $j_prefixes); |
||
753 |