Issues (2963)

includes/polling/bgp-peers.inc.php (1 issue)

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
$peer_ip of type LibreNMS\Util\IPv4|LibreNMS\Util\IPv6 is incompatible with the type integer expected by parameter $reference of log_event(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

426
                        log_event('BGP Session Flap: ' . $peer['bgpPeerIdentifier'] . ' (AS' . $peer['bgpPeerRemoteAs'] . '), last error: ' . describe_bgp_error_code($peer['bgpPeerLastErrorCode'], $peer['bgpPeerLastErrorSubCode']), $device, 'bgpPeer', 4, /** @scrutinizer ignore-type */ $peer_ip);
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