Issues (2963)

LibreNMS/OS/Timos.php (6 issues)

1
<?php
2
/**
3
 * Timos.php
4
 *
5
 * -Description-
6
 *
7
 * This program is free software: you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation, either version 3 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * This program is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
19
 *
20
 * @link       https://www.librenms.org
21
 *
22
 * @copyright  2019 Vitali Kari
23
 * @copyright  2019 Tony Murray
24
 * @author     Vitali Kari <[email protected]>
25
 * @author     Tony Murray <[email protected]>
26
 */
27
28
namespace LibreNMS\OS;
29
30
use App\Models\Device;
31
use App\Models\MplsLsp;
32
use App\Models\MplsLspPath;
33
use App\Models\MplsSap;
34
use App\Models\MplsSdp;
35
use App\Models\MplsSdpBind;
36
use App\Models\MplsService;
37
use App\Models\MplsTunnelArHop;
38
use App\Models\MplsTunnelCHop;
39
use Illuminate\Support\Collection;
40
use LibreNMS\Device\WirelessSensor;
41
use LibreNMS\Interfaces\Discovery\MplsDiscovery;
42
use LibreNMS\Interfaces\Discovery\Sensors\WirelessPowerDiscovery;
43
use LibreNMS\Interfaces\Polling\MplsPolling;
44
use LibreNMS\OS;
45
use LibreNMS\RRD\RrdDefinition;
46
47
class Timos extends OS implements MplsDiscovery, MplsPolling, WirelessPowerDiscovery
48
{
49
    public function discoverOS(Device $device): void
50
    {
51
        parent::discoverOS($device); // yaml
52
53
        $hardware_index = snmp_get($this->getDeviceArray(), 'tmnxChassisType.1', '-Ovq', 'TIMETRA-CHASSIS-MIB');
54
        $device->hardware = snmp_get($this->getDeviceArray(), "tmnxChassisTypeName.$hardware_index", '-Ovq', 'TIMETRA-CHASSIS-MIB');
55
56
        $hw = snmpwalk_group($this->getDeviceArray(), 'tmnxHwClass', 'TIMETRA-CHASSIS-MIB');
57
        foreach ($hw[1]['tmnxHwClass'] as $unitID => $class) {
58
            if ($class == 3) {
59
                $device->serial = snmp_get($this->getDeviceArray(), "1.3.6.1.4.1.6527.3.1.2.2.1.8.1.5.1.$unitID", '-OQv', 'TIMETRA-CHASSIS-MIB');
60
61
                return;
62
            }
63
        }
64
    }
65
66
    /**
67
     * Discover wireless Rx (Received Signal Strength). This is in dBm. Type is power.
68
     * Returns an array of LibreNMS\Device\Sensor objects that have been discovered
69
     * ALU-MICROWAVE-MIB::aluMwRadioLocalRxMainPower
70
     *
71
     * @return array
72
     */
73
    public function discoverWirelesspower()
74
    {
75
        $name = $this->getCacheByIndex('aluMwRadioName', 'ALU-MICROWAVE-MIB');
76
        $rsl = snmpwalk_cache_oid($this->getDeviceArray(), 'aluMwRadioLocalRxMainPower', [], 'ALU-MICROWAVE-MIB');
77
78
        $sensors = [];
79
        $divisor = 10;
80
81
        foreach ($rsl as $index => $data) {
82
            $sensors[] = new WirelessSensor(
83
                'power',
84
                $this->getDeviceId(),
85
                '.1.3.6.1.4.1.6527.6.1.2.2.7.1.3.1.2.' . $index,
86
                'Nokia-Packet-MW-Rx',
87
                $index,
88
                "Rx ({$name[$index]})",
89
                $data['aluMwRadioLocalRxMainPower'] / $divisor,
90
                '1',
91
                '10'
92
            );
93
        }
94
95
        return $sensors;
96
    }
97
98
    /**
99
     * @param  mixed  $tmnxEncapVal
100
     * @return string encapsulation
101
     *
102
     * @see TIMETRA-TC-MIB::TmnxEncapVal
103
     */
104
    private function nokiaEncap($tmnxEncapVal)
105
    {
106
        // implement other encapsulation values
107
        $map = sprintf('%032b', $tmnxEncapVal);
108
109
        if (substr($map, -32, 20) == '00000000000000000000') { // 12-bit IEEE 802.1Q VLAN ID
110
            if ($tmnxEncapVal == 4095) {
111
                return '*';
112
            }
113
        }
114
115
        return $tmnxEncapVal;
116
    }
117
118
    /**
119
     * @return Collection MplsLsp objects
120
     */
121
    public function discoverMplsLsps()
122
    {
123
        $mplsLspCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'vRtrMplsLspTable', [], 'TIMETRA-MPLS-MIB', 'nokia');
124
        if (! empty($mplsLspCache)) {
125
            $mplsLspCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'vRtrMplsLspLastChange', $mplsLspCache, 'TIMETRA-MPLS-MIB', 'nokia', '-OQUst');
126
        }
127
128
        $lsps = collect();
129
        foreach ($mplsLspCache as $key => $value) {
130
            [$vrf_oid, $lsp_oid] = explode('.', $key);
131
132
            $mplsLspFromAddr = $value['vRtrMplsLspFromAddr'];
133
            if (isset($value['vRtrMplsLspNgFromAddr'])) {
134
                $mplsLspFromAddr = long2ip(hexdec(str_replace(' ', '', $value['vRtrMplsLspNgFromAddr'])));
0 ignored issues
show
It seems like hexdec(str_replace(' ', ...trMplsLspNgFromAddr'])) can also be of type double; however, parameter $ip of long2ip() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

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

134
                $mplsLspFromAddr = long2ip(/** @scrutinizer ignore-type */ hexdec(str_replace(' ', '', $value['vRtrMplsLspNgFromAddr'])));
Loading history...
135
            }
136
            $mplsLspToAddr = $value['vRtrMplsLspToAddr'];
137
            if (isset($value['vRtrMplsLspNgToAddr'])) {
138
                $mplsLspToAddr = long2ip(hexdec(str_replace(' ', '', $value['vRtrMplsLspNgToAddr'])));
139
            }
140
141
            $lsps->push(new MplsLsp([
142
                'vrf_oid' => $vrf_oid,
143
                'lsp_oid' => $lsp_oid,
144
                'device_id' => $this->getDeviceId(),
145
                'mplsLspRowStatus' => $value['vRtrMplsLspRowStatus'],
146
                'mplsLspLastChange' => round($value['vRtrMplsLspLastChange'] / 100),
147
                'mplsLspName' => $value['vRtrMplsLspName'],
148
                'mplsLspAdminState' => $value['vRtrMplsLspAdminState'],
149
                'mplsLspOperState' => $value['vRtrMplsLspOperState'],
150
                'mplsLspFromAddr' => $mplsLspFromAddr,
151
                'mplsLspToAddr' => $mplsLspToAddr,
152
                'mplsLspType' => $value['vRtrMplsLspType'],
153
                'mplsLspFastReroute' => $value['vRtrMplsLspFastReroute'],
154
            ]));
155
        }
156
157
        return $lsps;
158
    }
159
160
    /**
161
     * @param  Collection  $lsps  collecton of synchronized lsp objects from discoverMplsLsps()
162
     * @return Collection MplsLspPath objects
163
     */
164
    public function discoverMplsPaths($lsps)
165
    {
166
        $mplsPathCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'vRtrMplsLspPathTable', [], 'TIMETRA-MPLS-MIB', 'nokia');
167
        if (! empty($mplsPathCache)) {
168
            $mplsPathCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'vRtrMplsLspPathLastChange', $mplsPathCache, 'TIMETRA-MPLS-MIB', 'nokia', '-OQUst');
169
        }
170
171
        $paths = collect();
172
        foreach ($mplsPathCache as $key => $value) {
173
            [$vrf_oid, $lsp_oid, $path_oid] = explode('.', $key);
174
            $lsp_id = $lsps->where('lsp_oid', $lsp_oid)->firstWhere('vrf_oid', $vrf_oid)->lsp_id;
175
            $paths->push(new MplsLspPath([
176
                'lsp_id' => $lsp_id,
177
                'path_oid' => $path_oid,
178
                'device_id' => $this->getDeviceId(),
179
                'mplsLspPathRowStatus' => $value['vRtrMplsLspPathRowStatus'],
180
                'mplsLspPathLastChange' => round($value['vRtrMplsLspPathLastChange'] / 100),
181
                'mplsLspPathType' => $value['vRtrMplsLspPathType'],
182
                'mplsLspPathBandwidth' => $value['vRtrMplsLspPathBandwidth'],
183
                'mplsLspPathOperBandwidth' => $value['vRtrMplsLspPathOperBandwidth'],
184
                'mplsLspPathAdminState' => $value['vRtrMplsLspPathAdminState'],
185
                'mplsLspPathOperState' => $value['vRtrMplsLspPathOperState'],
186
                'mplsLspPathState' => $value['vRtrMplsLspPathState'],
187
                'mplsLspPathFailCode' => $value['vRtrMplsLspPathFailCode'],
188
                'mplsLspPathFailNodeAddr' => $value['vRtrMplsLspPathFailNodeAddr'],
189
                'mplsLspPathMetric' => $value['vRtrMplsLspPathMetric'],
190
                'mplsLspPathOperMetric' => $value['vRtrMplsLspPathOperMetric'],
191
                'mplsLspPathTunnelARHopListIndex' => $value['vRtrMplsLspPathTunnelARHopListIndex'],
192
                'mplsLspPathTunnelCHopListIndex' => $value['vRtrMplsLspPathTunnelCRHopListIndex'],
193
            ]));
194
        }
195
196
        return $paths;
197
    }
198
199
    /**
200
     * @return Collection MplsSdp objects
201
     */
202
    public function discoverMplsSdps()
203
    {
204
        $mplsSdpCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'sdpInfoTable', [], 'TIMETRA-SDP-MIB', 'nokia', '-OQUst');
205
206
        $sdps = collect();
207
        foreach ($mplsSdpCache as $value) {
208
            if ((! empty($value['sdpFarEndInetAddress'])) && ($value['sdpFarEndInetAddressType'] == 'ipv4')) {
209
                $ip = long2ip(hexdec(str_replace(' ', '', $value['sdpFarEndInetAddress'])));
0 ignored issues
show
It seems like hexdec(str_replace(' ', ...dpFarEndInetAddress'])) can also be of type double; however, parameter $ip of long2ip() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

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

209
                $ip = long2ip(/** @scrutinizer ignore-type */ hexdec(str_replace(' ', '', $value['sdpFarEndInetAddress'])));
Loading history...
210
            } else {
211
                //Fixme implement ipv6 conversion
212
                $ip = $value['sdpFarEndInetAddress'];
213
            }
214
            $sdps->push(new MplsSdp([
215
                'sdp_oid' => $value['sdpId'],
216
                'device_id' => $this->getDeviceId(),
217
                'sdpRowStatus' => $value['sdpRowStatus'],
218
                'sdpDelivery' => $value['sdpDelivery'],
219
                'sdpDescription' => $value['sdpDescription'],
220
                'sdpAdminStatus' => $value['sdpAdminStatus'],
221
                'sdpOperStatus' => $value['sdpOperStatus'],
222
                'sdpAdminPathMtu' => $value['sdpAdminPathMtu'],
223
                'sdpOperPathMtu' => $value['sdpOperPathMtu'],
224
                'sdpLastMgmtChange' => round($value['sdpLastMgmtChange'] / 100),
225
                'sdpLastStatusChange' => round($value['sdpLastStatusChange'] / 100),
226
                'sdpActiveLspType' => $value['sdpActiveLspType'],
227
                'sdpFarEndInetAddressType' => $value['sdpFarEndInetAddressType'],
228
                'sdpFarEndInetAddress' => $ip,
229
            ]));
230
        }
231
232
        return $sdps;
233
    }
234
235
    /**
236
     * @return Collection MplsService objects
237
     */
238
    public function discoverMplsServices()
239
    {
240
        $mplsSvcCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'svcBaseInfoTable', [], 'TIMETRA-SERV-MIB', 'nokia', '-OQUst');
241
        $mplsSvcCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'svcTlsInfoTable', $mplsSvcCache, 'TIMETRA-SERV-MIB', 'nokia', '-OQUst');
242
243
        $svcs = collect();
244
245
        // Workaround, remove some defalt entries we do not want to see
246
        $filter = '/^\w* Service for internal purposes only/';
247
248
        foreach ($mplsSvcCache as $key => $value) {
249
            $garbage = preg_match($filter, $value['svcDescription']);
250
            if ($garbage) {
251
                unset($key);
252
                continue;
253
            }
254
255
            $svcs->push(new MplsService([
256
                'svc_oid' => $value['svcId'],
257
                'device_id' => $this->getDeviceId(),
258
                'svcRowStatus' => $value['svcRowStatus'],
259
                'svcType' => $value['svcType'],
260
                'svcCustId' => $value['svcCustId'],
261
                'svcAdminStatus' => $value['svcAdminStatus'],
262
                'svcOperStatus' => $value['svcOperStatus'],
263
                'svcDescription' => $value['svcDescription'],
264
                'svcMtu' => $value['svcMtu'],
265
                'svcNumSaps' => $value['svcNumSaps'],
266
                'svcNumSdps' => $value['svcNumSdps'],
267
                'svcLastMgmtChange' => round($value['svcLastMgmtChange'] / 100),
268
                'svcLastStatusChange' => round($value['svcLastStatusChange'] / 100),
269
                'svcVRouterId' => $value['svcVRouterId'],
270
                'svcTlsMacLearning' => $value['svcTlsMacLearning'],
271
                'svcTlsStpAdminStatus' => $value['svcTlsStpAdminStatus'],
272
                'svcTlsStpOperStatus' => $value['svcTlsStpOperStatus'],
273
                'svcTlsFdbTableSize' => $value['svcTlsFdbTableSize'],
274
                'svcTlsFdbNumEntries' => $value['svcTlsFdbNumEntries'],
275
            ]));
276
        }
277
278
        return $svcs;
279
    }
280
281
    /**
282
     * @return Collection MplsSap objects
283
     */
284
    public function discoverMplsSaps($svcs)
285
    {
286
        $mplsSapCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'sapBaseInfoTable', [], 'TIMETRA-SAP-MIB', 'nokia', '-OQUst');
287
        $mplsSapTrafficCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'sapBaseStatsTable', [], 'TIMETRA-SAP-MIB', 'nokia', '-OQUst');
288
289
        $saps = collect();
290
291
        // Workaround, there are some oids not covered by actual MIB, try to filter them
292
        // i.e. sapBaseInfoEntry.300.118208001.1342177283.10
293
        $filter_key = '/300\.[0-9]+\.[0-9]+\.[0-9]+/';
294
        // remove some default entries we do not want to see
295
        $filter_value = '/^Internal SAP/';
296
297
        foreach ($mplsSapCache as $key => $value) {
298
            if (preg_match($filter_key, $key) || preg_match($filter_value, $value['sapDescription'])) {
299
                unset($key);
300
                continue;
301
            }
302
            [$svcId, $sapPortId, $sapEncapValue] = explode('.', $key);
303
            $svc_id = $svcs->firstWhere('svc_oid', $svcId)->svc_id;
304
            $traffic_id = $svcId . '.' . $sapPortId . '.' . $this->nokiaEncap($sapEncapValue);
305
306
            $saps->push(new MplsSap([
307
                'svc_id' => $svc_id,
308
                'svc_oid' => $svcId,
309
                'sapPortId' => $sapPortId,
310
                'device_id' => $this->getDeviceId(),
311
                'sapEncapValue' => $this->nokiaEncap($sapEncapValue),
312
                'sapRowStatus' => $value['sapRowStatus'],
313
                'sapType' => $value['sapType'],
314
                'sapDescription' => $value['sapDescription'],
315
                'sapAdminStatus' => $value['sapAdminStatus'],
316
                'sapOperStatus' => $value['sapOperStatus'],
317
                'sapLastMgmtChange' => round($value['sapLastMgmtChange'] / 100),
318
                'sapLastStatusChange' => round($value['sapLastStatusChange'] / 100),
319
                'sapIngressBytes' => $mplsSapTrafficCache[$traffic_id]['sapBaseStatsIngressPchipOfferedLoPrioOctets'],
320
                'sapEgressBytes' => $mplsSapTrafficCache[$traffic_id]['sapBaseStatsEgressQchipForwardedOutProfOctets'],
321
                'sapIngressDroppedBytes' => $mplsSapTrafficCache[$traffic_id]['sapBaseStatsIngressQchipDroppedLoPrioOctets'],
322
                'sapEgressDroppedBytes' => $mplsSapTrafficCache[$traffic_id]['sapBaseStatsEgressQchipDroppedOutProfOctets'],
323
            ]));
324
        }
325
326
        return $saps;
327
    }
328
329
    /**
330
     * @return Collection MplsSdpBind objects
331
     */
332
    public function discoverMplsSdpBinds($sdps, $svcs)
333
    {
334
        $mplsBindCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'sdpBindTable', [], 'TIMETRA-SDP-MIB', 'nokia', '-OQUsbt');
335
        $mplsBindCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'sdpBindBaseStatsTable', $mplsBindCache, 'TIMETRA-SDP-MIB', 'nokia', '-OQUsb');
336
337
        $binds = collect();
338
        foreach ($mplsBindCache as $key => $value) {
339
            [$svcId] = explode('.', $key);
340
            $bind_id = str_replace(' ', '', $value['sdpBindId']);
341
            $sdp_oid = hexdec(substr($bind_id, 0, 8));
342
            $svc_oid = hexdec(substr($bind_id, 9, 16));
343
            $sdp_id = $sdps->firstWhere('sdp_oid', $sdp_oid)->sdp_id;
344
            $svc_id = $svcs->firstWhere('svc_oid', $svcId)->svc_id;
345
            if (isset($sdp_id, $svc_id, $sdp_oid, $svc_oid)) {
346
                $binds->push(new MplsSdpBind([
347
                    'sdp_id' => $sdp_id,
348
                    'svc_id' => $svc_id,
349
                    'sdp_oid' => $sdp_oid,
350
                    'svc_oid' => $svc_oid,
351
                    'device_id' => $this->getDeviceId(),
352
                    'sdpBindRowStatus' => $value['sdpBindRowStatus'],
353
                    'sdpBindAdminStatus' => $value['sdpBindAdminStatus'],
354
                    'sdpBindOperStatus' => $value['sdpBindOperStatus'],
355
                    'sdpBindLastMgmtChange' => round($value['sdpBindLastMgmtChange'] / 100),
356
                    'sdpBindLastStatusChange' => round($value['sdpBindLastStatusChange'] / 100),
357
                    'sdpBindType' => $value['sdpBindType'],
358
                    'sdpBindVcType' => $value['sdpBindVcType'],
359
                    'sdpBindBaseStatsIngFwdPackets' => $value['sdpBindBaseStatsIngressForwardedPackets'],
360
                    'sdpBindBaseStatsIngFwdOctets' => $value['sdpBindBaseStatsIngFwdOctets'],
361
                    'sdpBindBaseStatsEgrFwdPackets' => $value['sdpBindBaseStatsEgressForwardedPackets'],
362
                    'sdpBindBaseStatsEgrFwdOctets' => $value['sdpBindBaseStatsEgressForwardedOctets'],
363
                ]));
364
            }
365
        }
366
367
        return $binds;
368
    }
369
370
    /**
371
     * @return Collection MplsTunnelArHop objects
372
     */
373
    public function discoverMplsTunnelArHops($paths)
374
    {
375
        $mplsTunnelArHopCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'mplsTunnelARHopTable', [], 'MPLS-TE-MIB', 'nokia', '-OQUsbt');
376
        $mplsTunnelArHopCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'vRtrMplsTunnelARHopTable', $mplsTunnelArHopCache, 'TIMETRA-MPLS-MIB', 'nokia', '-OQUsb');
377
378
        // vRtrMplsTunnelARHopProtection Bits
379
        $localAvailable = 0b10000000;
380
        $localInUse = 0b01000000;
381
        $bandwidthProtected = 0b00100000;
382
        $nodeProtected = 0b00010000;
383
        $preemptionPending = 0b00001000;
384
        $nodeId = 0b00000100;
385
386
        $arhops = collect();
387
        foreach ($mplsTunnelArHopCache as $key => $value) {
388
            [$mplsTunnelARHopListIndex, $mplsTunnelARHopIndex] = explode('.', $key);
389
            $lsp_path_id = $paths->firstWhere('mplsLspPathTunnelARHopListIndex', $mplsTunnelARHopListIndex)->lsp_path_id;
390
            $protection = intval($value['vRtrMplsTunnelARHopProtection'], 16);
391
392
            $localLinkProtection = ($protection & $localAvailable) ? 'true' : 'false';
393
            $linkProtectionInUse = ($protection & $localInUse) ? 'true' : 'false';
394
            $bandwidthProtection = ($protection & $bandwidthProtected) ? 'true' : 'false';
395
            $nextNodeProtection = ($protection & $nodeProtected) ? 'true' : 'false';
396
397
            $ARHopRouterId = $value['vRtrMplsTunnelARHopRouterId'];
398
            if (isset($value['vRtrMplsTunnelARHopNgRouterId'])) {
399
                $ARHopRouterId = long2ip(hexdec(str_replace(' ', '', $value['vRtrMplsTunnelARHopNgRouterId'])));
0 ignored issues
show
It seems like hexdec(str_replace(' ', ...nnelARHopNgRouterId'])) can also be of type double; however, parameter $ip of long2ip() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

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

399
                $ARHopRouterId = long2ip(/** @scrutinizer ignore-type */ hexdec(str_replace(' ', '', $value['vRtrMplsTunnelARHopNgRouterId'])));
Loading history...
400
            }
401
402
            if (isset($mplsTunnelARHopListIndex, $mplsTunnelARHopIndex, $lsp_path_id)) {
403
                $arhops->push(new MplsTunnelArHop([
404
                    'mplsTunnelARHopListIndex' => $mplsTunnelARHopListIndex,
405
                    'mplsTunnelARHopIndex' => $mplsTunnelARHopIndex,
406
                    'lsp_path_id' => $lsp_path_id,
407
                    'device_id' => $this->getDeviceId(),
408
                    'mplsTunnelARHopAddrType' => $value['mplsTunnelARHopAddrType'],
409
                    'mplsTunnelARHopIpv4Addr' => $value['mplsTunnelARHopIpv4Addr'],
410
                    'mplsTunnelARHopIpv6Addr' => $value['mplsTunnelARHopIpv6Addr'],
411
                    'mplsTunnelARHopAsNumber' => $value['mplsTunnelARHopAsNumber'],
412
                    'mplsTunnelARHopStrictOrLoose' => $value['mplsTunnelARHopStrictOrLoose'],
413
                    'mplsTunnelARHopRouterId' => $ARHopRouterId,
414
                    'localProtected' => $localLinkProtection,
415
                    'linkProtectionInUse' => $linkProtectionInUse,
416
                    'bandwidthProtected' => $bandwidthProtection,
417
                    'nextNodeProtected' => $nextNodeProtection,
418
                ]));
419
            }
420
        }
421
422
        return $arhops;
423
    }
424
425
    /**
426
     * @return Collection MplsTunnelCHop objects
427
     */
428
    public function discoverMplsTunnelCHops($paths)
429
    {
430
        $mplsTunnelCHopCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'vRtrMplsTunnelCHopTable', [], 'TIMETRA-MPLS-MIB', 'nokia', '-OQUsb');
431
432
        $chops = collect();
433
        foreach ($mplsTunnelCHopCache as $key => $value) {
434
            [$mplsTunnelCHopListIndex, $mplsTunnelCHopIndex] = explode('.', $key);
435
            $lsp_path_id = $paths->firstWhere('mplsLspPathTunnelCHopListIndex', $mplsTunnelCHopListIndex)->lsp_path_id;
436
437
            $chops->push(new MplsTunnelCHop([
438
                'mplsTunnelCHopListIndex' => $mplsTunnelCHopListIndex,
439
                'mplsTunnelCHopIndex' => $mplsTunnelCHopIndex,
440
                'lsp_path_id' => $lsp_path_id,
441
                'device_id' => $this->getDeviceId(),
442
                'mplsTunnelCHopAddrType' => $value['vRtrMplsTunnelCHopAddrType'],
443
                'mplsTunnelCHopIpv4Addr' => $value['vRtrMplsTunnelCHopIpv4Addr'],
444
                'mplsTunnelCHopIpv6Addr' => $value['vRtrMplsTunnelCHopIpv6Addr'],
445
                'mplsTunnelCHopAsNumber' => $value['vRtrMplsTunnelCHopAsNumber'],
446
                'mplsTunnelCHopStrictOrLoose' => $value['vRtrMplsTunnelCHopStrictOrLoose'],
447
                'mplsTunnelCHopRouterId' => $value['vRtrMplsTunnelCHopRtrID'],
448
            ]));
449
        }
450
451
        return $chops;
452
    }
453
454
    /**
455
     * @return Collection MplsLsp objects
456
     */
457
    public function pollMplsLsps()
458
    {
459
        $mplsLspCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'vRtrMplsLspTable', [], 'TIMETRA-MPLS-MIB', 'nokia');
460
        if (! empty($mplsLspCache)) {
461
            $mplsLspCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'vRtrMplsLspLastChange', $mplsLspCache, 'TIMETRA-MPLS-MIB', 'nokia', '-OQUst');
462
            $mplsLspCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'vRtrMplsLspStatTable', $mplsLspCache, 'TIMETRA-MPLS-MIB', 'nokia');
463
        }
464
465
        $lsps = collect();
466
        foreach ($mplsLspCache as $key => $value) {
467
            [$vrf_oid, $lsp_oid] = explode('.', $key);
468
469
            $mplsLspFromAddr = $value['vRtrMplsLspFromAddr'];
470
            if (isset($value['vRtrMplsLspNgFromAddr'])) {
471
                $mplsLspFromAddr = long2ip(hexdec(str_replace(' ', '', $value['vRtrMplsLspNgFromAddr'])));
0 ignored issues
show
It seems like hexdec(str_replace(' ', ...trMplsLspNgFromAddr'])) can also be of type double; however, parameter $ip of long2ip() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

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

471
                $mplsLspFromAddr = long2ip(/** @scrutinizer ignore-type */ hexdec(str_replace(' ', '', $value['vRtrMplsLspNgFromAddr'])));
Loading history...
472
            }
473
            $mplsLspToAddr = $value['vRtrMplsLspToAddr'];
474
            if (isset($value['vRtrMplsLspNgToAddr'])) {
475
                $mplsLspToAddr = long2ip(hexdec(str_replace(' ', '', $value['vRtrMplsLspNgToAddr'])));
476
            }
477
478
            $lsps->push(new MplsLsp([
479
                'vrf_oid' => $vrf_oid,
480
                'lsp_oid' => $lsp_oid,
481
                'device_id' => $this->getDeviceId(),
482
                'mplsLspRowStatus' => $value['vRtrMplsLspRowStatus'],
483
                'mplsLspLastChange' => round($value['vRtrMplsLspLastChange'] / 100),
484
                'mplsLspName' => $value['vRtrMplsLspName'],
485
                'mplsLspAdminState' => $value['vRtrMplsLspAdminState'],
486
                'mplsLspOperState' => $value['vRtrMplsLspOperState'],
487
                'mplsLspFromAddr' => $mplsLspFromAddr,
488
                'mplsLspToAddr' => $mplsLspToAddr,
489
                'mplsLspType' => $value['vRtrMplsLspType'],
490
                'mplsLspFastReroute' => $value['vRtrMplsLspFastReroute'],
491
                'mplsLspAge' => abs($value['vRtrMplsLspAge']),
492
                'mplsLspTimeUp' => abs($value['vRtrMplsLspTimeUp']),
493
                'mplsLspTimeDown' => abs($value['vRtrMplsLspTimeDown']),
494
                'mplsLspPrimaryTimeUp' => abs($value['vRtrMplsLspPrimaryTimeUp']),
495
                'mplsLspTransitions' => $value['vRtrMplsLspTransitions'],
496
                'mplsLspLastTransition' => abs(round($value['vRtrMplsLspLastTransition'] / 100)),
497
                'mplsLspConfiguredPaths' => $value['vRtrMplsLspConfiguredPaths'],
498
                'mplsLspStandbyPaths' => $value['vRtrMplsLspStandbyPaths'],
499
                'mplsLspOperationalPaths' => $value['vRtrMplsLspOperationalPaths'],
500
            ]));
501
        }
502
503
        return $lsps;
504
    }
505
506
    /**
507
     * @param  Collection  $lsps  collecton of synchronized lsp objects from pollMplsLsps()
508
     * @return Collection MplsLspPath objects
509
     */
510
    public function pollMplsPaths($lsps)
511
    {
512
        $mplsPathCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'vRtrMplsLspPathTable', [], 'TIMETRA-MPLS-MIB', 'nokia');
513
        if (! empty($mplsPathCache)) {
514
            $mplsPathCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'vRtrMplsLspPathLastChange', $mplsPathCache, 'TIMETRA-MPLS-MIB', 'nokia', '-OQUst');
515
            $mplsPathCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'vRtrMplsLspPathStatTable', $mplsPathCache, 'TIMETRA-MPLS-MIB', 'nokia');
516
        }
517
518
        $paths = collect();
519
        foreach ($mplsPathCache as $key => $value) {
520
            [$vrf_oid, $lsp_oid, $path_oid] = explode('.', $key);
521
            $lsp_id = $lsps->where('lsp_oid', $lsp_oid)->firstWhere('vrf_oid', $vrf_oid)->lsp_id;
522
            $paths->push(new MplsLspPath([
523
                'lsp_id' => $lsp_id,
524
                'path_oid' => $path_oid,
525
                'device_id' => $this->getDeviceId(),
526
                'mplsLspPathRowStatus' => $value['vRtrMplsLspPathRowStatus'],
527
                'mplsLspPathLastChange' => round($value['vRtrMplsLspPathLastChange'] / 100),
528
                'mplsLspPathType' => $value['vRtrMplsLspPathType'],
529
                'mplsLspPathBandwidth' => $value['vRtrMplsLspPathBandwidth'],
530
                'mplsLspPathOperBandwidth' => $value['vRtrMplsLspPathOperBandwidth'],
531
                'mplsLspPathAdminState' => $value['vRtrMplsLspPathAdminState'],
532
                'mplsLspPathOperState' => $value['vRtrMplsLspPathOperState'],
533
                'mplsLspPathState' => $value['vRtrMplsLspPathState'],
534
                'mplsLspPathFailCode' => $value['vRtrMplsLspPathFailCode'],
535
                'mplsLspPathFailNodeAddr' => $value['vRtrMplsLspPathFailNodeAddr'],
536
                'mplsLspPathMetric' => $value['vRtrMplsLspPathMetric'],
537
                'mplsLspPathOperMetric' => $value['vRtrMplsLspPathOperMetric'],
538
                'mplsLspPathTimeUp' => abs($value['vRtrMplsLspPathTimeUp']),
539
                'mplsLspPathTimeDown' => abs($value['vRtrMplsLspPathTimeDown']),
540
                'mplsLspPathTransitionCount' => $value['vRtrMplsLspPathTransitionCount'],
541
                'mplsLspPathTunnelARHopListIndex' => $value['vRtrMplsLspPathTunnelARHopListIndex'],
542
                'mplsLspPathTunnelCHopListIndex' => $value['vRtrMplsLspPathTunnelCRHopListIndex'],
543
            ]));
544
        }
545
546
        return $paths;
547
    }
548
549
    /**
550
     * @return Collection MplsSdp objects
551
     */
552
    public function pollMplsSdps()
553
    {
554
        $mplsSdpCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'sdpInfoTable', [], 'TIMETRA-SDP-MIB', 'nokia', '-OQUst');
555
556
        $sdps = collect();
557
        foreach ($mplsSdpCache as $value) {
558
            if ((! empty($value['sdpFarEndInetAddress'])) && ($value['sdpFarEndInetAddressType'] == 'ipv4')) {
559
                $ip = long2ip(hexdec(str_replace(' ', '', $value['sdpFarEndInetAddress'])));
0 ignored issues
show
It seems like hexdec(str_replace(' ', ...dpFarEndInetAddress'])) can also be of type double; however, parameter $ip of long2ip() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

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

559
                $ip = long2ip(/** @scrutinizer ignore-type */ hexdec(str_replace(' ', '', $value['sdpFarEndInetAddress'])));
Loading history...
560
            } else {
561
                //Fixme implement ipv6 conversion
562
                $ip = $value['sdpFarEndInetAddress'];
563
            }
564
            $sdps->push(new MplsSdp([
565
                'sdp_oid' => $value['sdpId'],
566
                'device_id' => $this->getDeviceId(),
567
                'sdpRowStatus' => $value['sdpRowStatus'],
568
                'sdpDelivery' => $value['sdpDelivery'],
569
                'sdpDescription' => $value['sdpDescription'],
570
                'sdpAdminStatus' => $value['sdpAdminStatus'],
571
                'sdpOperStatus' => $value['sdpOperStatus'],
572
                'sdpAdminPathMtu' => $value['sdpAdminPathMtu'],
573
                'sdpOperPathMtu' => $value['sdpOperPathMtu'],
574
                'sdpLastMgmtChange' => round($value['sdpLastMgmtChange'] / 100),
575
                'sdpLastStatusChange' => round($value['sdpLastStatusChange'] / 100),
576
                'sdpActiveLspType' => $value['sdpActiveLspType'],
577
                'sdpFarEndInetAddressType' => $value['sdpFarEndInetAddressType'],
578
                'sdpFarEndInetAddress' => $ip,
579
            ]));
580
        }
581
582
        return $sdps;
583
    }
584
585
    /**
586
     * @return Collection MplsService objects
587
     */
588
    public function pollMplsServices()
589
    {
590
        $mplsSvcCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'svcBaseInfoTable', [], 'TIMETRA-SERV-MIB', 'nokia', '-OQUst');
591
        $mplsSvcCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'svcTlsInfoTable', $mplsSvcCache, 'TIMETRA-SERV-MIB', 'nokia', '-OQUst');
592
593
        $svcs = collect();
594
595
        // Workaround, remove some default entries we do not want to see
596
        $filter = '/^\w* Service for internal purposes only/';
597
598
        foreach ($mplsSvcCache as $key => $value) {
599
            $garbage = preg_match($filter, $value['svcDescription']);
600
            if ($garbage) {
601
                unset($key);
602
                continue;
603
            }
604
            $svcs->push(new MplsService([
605
                'svc_oid' => $value['svcId'],
606
                'device_id' => $this->getDeviceId(),
607
                'svcRowStatus' => $value['svcRowStatus'],
608
                'svcType' => $value['svcType'],
609
                'svcCustId' => $value['svcCustId'],
610
                'svcAdminStatus' => $value['svcAdminStatus'],
611
                'svcOperStatus' => $value['svcOperStatus'],
612
                'svcDescription' => $value['svcDescription'],
613
                'svcMtu' => $value['svcMtu'],
614
                'svcNumSaps' => $value['svcNumSaps'],
615
                'svcNumSdps' => $value['svcNumSdps'],
616
                'svcLastMgmtChange' => round($value['svcLastMgmtChange'] / 100),
617
                'svcLastStatusChange' => round($value['svcLastStatusChange'] / 100),
618
                'svcVRouterId' => $value['svcVRouterId'],
619
                'svcTlsMacLearning' => $value['svcTlsMacLearning'],
620
                'svcTlsStpAdminStatus' => $value['svcTlsStpAdminStatus'],
621
                'svcTlsStpOperStatus' => $value['svcTlsStpOperStatus'],
622
                'svcTlsFdbTableSize' => $value['svcTlsFdbTableSize'],
623
                'svcTlsFdbNumEntries' => $value['svcTlsFdbNumEntries'],
624
            ]));
625
        }
626
627
        return $svcs;
628
    }
629
630
    /**
631
     * @return Collection MplsSap objects
632
     */
633
    public function pollMplsSaps($svcs)
634
    {
635
        $mplsSapCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'sapBaseInfoTable', [], 'TIMETRA-SAP-MIB', 'nokia', '-OQUst');
636
        $mplsSapTrafficCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'sapBaseStatsTable', [], 'TIMETRA-SAP-MIB', 'nokia', '-OQUst');
637
638
        $saps = collect();
639
640
        // Workaround, there are some oids not covered by actual MIB, try to filter them
641
        // i.e. sapBaseInfoEntry.300.118208001.1342177283.10
642
        $filter_key = '/300\.[0-9]+\.[0-9]+\.[0-9]+/';
643
        // remove some default entries we do not want to see
644
        $filter_value = '/^Internal SAP/';
645
646
        // cache a ifIndex -> ifName
647
        $ifIndexNames = $this->getDevice()->ports()->pluck('ifName', 'ifIndex');
648
649
        foreach ($mplsSapCache as $key => $value) {
650
            if (preg_match($filter_key, $key) || preg_match($filter_value, $value['sapDescription'])) {
651
                unset($key);
652
                continue;
653
            }
654
            [$svcId, $sapPortId, $sapEncapValue] = explode('.', $key);
655
            $svc_id = $svcs->firstWhere('svc_oid', $svcId)->svc_id;
656
            $traffic_id = $svcId . '.' . $sapPortId . '.' . $this->nokiaEncap($sapEncapValue);
657
658
            $saps->push(new MplsSap([
659
                'svc_id' => $svc_id,
660
                'svc_oid' => $svcId,
661
                'sapPortId' => $sapPortId,
662
                'ifName' => $ifIndexNames->get($sapPortId),
663
                'device_id' => $this->getDeviceId(),
664
                'sapEncapValue' => $this->nokiaEncap($sapEncapValue),
665
                'sapRowStatus' => $value['sapRowStatus'],
666
                'sapType' => $value['sapType'],
667
                'sapDescription' => $value['sapDescription'],
668
                'sapAdminStatus' => $value['sapAdminStatus'],
669
                'sapOperStatus' => $value['sapOperStatus'],
670
                'sapLastMgmtChange' => round($value['sapLastMgmtChange'] / 100),
671
                'sapLastStatusChange' => round($value['sapLastStatusChange'] / 100),
672
            ]));
673
            //create SAP graphs
674
            $rrd_name = \LibreNMS\Data\Store\Rrd::safeName('sap-' . $traffic_id);
675
            $rrd_def = RrdDefinition::make()
676
            ->addDataset('sapIngressBits', 'COUNTER', 0)
677
            ->addDataset('sapEgressBits', 'COUNTER', 0)
678
            ->addDataset('sapIngressDroppedBits', 'COUNTER', 0)
679
            ->addDataset('sapEgressDroppedBits', 'COUNTER', 0);
680
681
            $fields = [
682
                'sapIngressBits' => $mplsSapTrafficCache[$traffic_id]['sapBaseStatsIngressPchipOfferedLoPrioOctets'] * 8,
683
                'sapEgressBits' => $mplsSapTrafficCache[$traffic_id]['sapBaseStatsEgressQchipForwardedOutProfOctets'] * 8,
684
                'sapIngressDroppedBits' => $mplsSapTrafficCache[$traffic_id]['sapBaseStatsIngressQchipDroppedLoPrioOctets'] * 8,
685
                'sapEgressDroppedBits' => $mplsSapTrafficCache[$traffic_id]['sapBaseStatsEgressQchipDroppedOutProfOctets'] * 8,
686
            ];
687
688
            $tags = [
689
                'traffic_id' => $traffic_id,
690
                'rrd_name' => $rrd_name,
691
                'rrd_def' => $rrd_def,
692
            ];
693
694
            data_update($this->getDeviceArray(), 'sap', $tags, $fields);
695
            $this->enableGraph('sap');
696
        }
697
698
        return $saps;
699
    }
700
701
    /**
702
     * @return Collection MplsSDpBind objects
703
     */
704
    public function pollMplsSdpBinds($sdps, $svcs)
705
    {
706
        $mplsBindCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'sdpBindTable', [], 'TIMETRA-SDP-MIB', 'nokia', '-OQUsbt');
707
        $mplsBindCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'sdpBindBaseStatsTable', $mplsBindCache, 'TIMETRA-SDP-MIB', 'nokia', '-OQUsb');
708
709
        $binds = collect();
710
        foreach ($mplsBindCache as $key => $value) {
711
            [$svcId] = explode('.', $key);
712
            $bind_id = str_replace(' ', '', $value['sdpBindId']);
713
            $sdp_oid = hexdec(substr($bind_id, 0, 8));
714
            $svc_oid = hexdec(substr($bind_id, 9, 16));
715
            $sdp_id = $sdps->firstWhere('sdp_oid', $sdp_oid)->sdp_id;
716
            $svc_id = $svcs->firstWhere('svc_oid', $svcId)->svc_id;
717
            if (isset($sdp_id, $svc_id, $sdp_oid, $svc_oid)) {
718
                $binds->push(new MplsSdpBind([
719
                    'sdp_id' => $sdp_id,
720
                    'svc_id' => $svc_id,
721
                    'sdp_oid' => $sdp_oid,
722
                    'svc_oid' => $svc_oid,
723
                    'device_id' => $this->getDeviceId(),
724
                    'sdpBindRowStatus' => $value['sdpBindRowStatus'],
725
                    'sdpBindAdminStatus' => $value['sdpBindAdminStatus'],
726
                    'sdpBindOperStatus' => $value['sdpBindOperStatus'],
727
                    'sdpBindLastMgmtChange' => round($value['sdpBindLastMgmtChange'] / 100),
728
                    'sdpBindLastStatusChange' => round($value['sdpBindLastStatusChange'] / 100),
729
                    'sdpBindType' => $value['sdpBindType'],
730
                    'sdpBindVcType' => $value['sdpBindVcType'],
731
                    'sdpBindBaseStatsIngFwdPackets' => $value['sdpBindBaseStatsIngressForwardedPackets'],
732
                    'sdpBindBaseStatsIngFwdOctets' => $value['sdpBindBaseStatsIngFwdOctets'],
733
                    'sdpBindBaseStatsEgrFwdPackets' => $value['sdpBindBaseStatsEgressForwardedPackets'],
734
                    'sdpBindBaseStatsEgrFwdOctets' => $value['sdpBindBaseStatsEgressForwardedOctets'],
735
                ]));
736
            }
737
        }
738
739
        return $binds;
740
    }
741
742
    /**
743
     * @return Collection MplsTunnelArHop objects
744
     */
745
    public function pollMplsTunnelArHops($paths)
746
    {
747
        $mplsTunnelArHopCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'mplsTunnelARHopTable', [], 'MPLS-TE-MIB', 'nokia', '-OQUsbt');
748
        $mplsTunnelArHopCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'vRtrMplsTunnelARHopTable', $mplsTunnelArHopCache, 'TIMETRA-MPLS-MIB', 'nokia', '-OQUsb');
749
750
        // vRtrMplsTunnelARHopProtection Bits
751
        $localAvailable = 0b10000000;
752
        $localInUse = 0b01000000;
753
        $bandwidthProtected = 0b00100000;
754
        $nodeProtected = 0b00010000;
755
        $preemptionPending = 0b00001000;
756
        $nodeId = 0b00000100;
757
758
        $arhops = collect();
759
        foreach ($mplsTunnelArHopCache as $key => $value) {
760
            [$mplsTunnelARHopListIndex, $mplsTunnelARHopIndex] = explode('.', $key);
761
            $lsp_path_id = $paths->firstWhere('mplsLspPathTunnelARHopListIndex', $mplsTunnelARHopListIndex)->lsp_path_id;
762
            $protection = intval($value['vRtrMplsTunnelARHopProtection'], 16);
763
764
            $localLinkProtection = ($protection & $localAvailable) ? 'true' : 'false';
765
            $linkProtectionInUse = ($protection & $localInUse) ? 'true' : 'false';
766
            $bandwidthProtection = ($protection & $bandwidthProtected) ? 'true' : 'false';
767
            $nextNodeProtection = ($protection & $nodeProtected) ? 'true' : 'false';
768
769
            $ARHopRouterId = $value['vRtrMplsTunnelARHopRouterId'];
770
            if (isset($value['vRtrMplsTunnelARHopNgRouterId'])) {
771
                $ARHopRouterId = long2ip(hexdec(str_replace(' ', '', $value['vRtrMplsTunnelARHopNgRouterId'])));
0 ignored issues
show
It seems like hexdec(str_replace(' ', ...nnelARHopNgRouterId'])) can also be of type double; however, parameter $ip of long2ip() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

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

771
                $ARHopRouterId = long2ip(/** @scrutinizer ignore-type */ hexdec(str_replace(' ', '', $value['vRtrMplsTunnelARHopNgRouterId'])));
Loading history...
772
            }
773
774
            if (isset($mplsTunnelARHopListIndex, $mplsTunnelARHopIndex, $lsp_path_id)) {
775
                $arhops->push(new MplsTunnelArHop([
776
                    'mplsTunnelARHopListIndex' => $mplsTunnelARHopListIndex,
777
                    'mplsTunnelARHopIndex' => $mplsTunnelARHopIndex,
778
                    'lsp_path_id' => $lsp_path_id,
779
                    'device_id' => $this->getDeviceId(),
780
                    'mplsTunnelARHopAddrType' => $value['mplsTunnelARHopAddrType'],
781
                    'mplsTunnelARHopIpv4Addr' => $value['mplsTunnelARHopIpv4Addr'],
782
                    'mplsTunnelARHopIpv6Addr' => $value['mplsTunnelARHopIpv6Addr'],
783
                    'mplsTunnelARHopAsNumber' => $value['mplsTunnelARHopAsNumber'],
784
                    'mplsTunnelARHopStrictOrLoose' => $value['mplsTunnelARHopStrictOrLoose'],
785
                    'mplsTunnelARHopRouterId' => $ARHopRouterId,
786
                    'localProtected' => $localLinkProtection,
787
                    'linkProtectionInUse' => $linkProtectionInUse,
788
                    'bandwidthProtected' => $bandwidthProtection,
789
                    'nextNodeProtected' => $nextNodeProtection,
790
                ]));
791
            }
792
        }
793
794
        return $arhops;
795
    }
796
797
    /**
798
     * @return Collection MplsTunnelCHop objects
799
     */
800
    public function pollMplsTunnelCHops($paths)
801
    {
802
        $mplsTunnelCHopCache = snmpwalk_cache_multi_oid($this->getDeviceArray(), 'vRtrMplsTunnelCHopTable', [], 'TIMETRA-MPLS-MIB', 'nokia', '-OQUsb');
803
804
        $chops = collect();
805
        foreach ($mplsTunnelCHopCache as $key => $value) {
806
            [$mplsTunnelCHopListIndex, $mplsTunnelCHopIndex] = explode('.', $key);
807
            $lsp_path_id = $paths->firstWhere('mplsLspPathTunnelCHopListIndex', $mplsTunnelCHopListIndex)->lsp_path_id;
808
809
            $chops->push(new MplsTunnelCHop([
810
                'mplsTunnelCHopListIndex' => $mplsTunnelCHopListIndex,
811
                'mplsTunnelCHopIndex' => $mplsTunnelCHopIndex,
812
                'lsp_path_id' => $lsp_path_id,
813
                'device_id' => $this->getDeviceId(),
814
                'mplsTunnelCHopAddrType' => $value['vRtrMplsTunnelCHopAddrType'],
815
                'mplsTunnelCHopIpv4Addr' => $value['vRtrMplsTunnelCHopIpv4Addr'],
816
                'mplsTunnelCHopIpv6Addr' => $value['vRtrMplsTunnelCHopIpv6Addr'],
817
                'mplsTunnelCHopAsNumber' => $value['vRtrMplsTunnelCHopAsNumber'],
818
                'mplsTunnelCHopStrictOrLoose' => $value['vRtrMplsTunnelCHopStrictOrLoose'],
819
                'mplsTunnelCHopRouterId' => $value['vRtrMplsTunnelCHopRtrID'],
820
            ]));
821
        }
822
823
        return $chops;
824
    }
825
826
    // End Class Timos
827
}
828