Skip to content

Commit 5dc3cc6

Browse files
committed
[change] Change RAM OIDs, add load info, add wireless interfaces
1 parent 0f37717 commit 5dc3cc6

6 files changed

Lines changed: 162 additions & 71 deletions

File tree

netengine/backends/snmp/airos.py

Lines changed: 62 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
from pytrie import StringTrie as Trie
1313

14+
from netengine.exceptions import NetEngineError
15+
1416
from .base import SNMP
1517

1618
logger = logging.getLogger(__name__)
@@ -278,6 +280,7 @@ def interfaces_MAC(self, snmpdump=None):
278280
return self._interfaces_MAC
279281

280282
_interfaces_type = None
283+
_wireless_interfaces = None
281284

282285
def interfaces_type(self, snmpdump=None):
283286
"""
@@ -310,24 +313,59 @@ def interfaces_type(self, snmpdump=None):
310313

311314
return self._interfaces_type
312315

316+
def get_wireless_interfaces(self, snmpdump=None):
317+
"""
318+
returns the list of all the wireless interfaces of the device
319+
"""
320+
if self._wireless_interfaces is None:
321+
interfaces = []
322+
wireless_if_oid = '1.2.840.10036.1.1.1.1.'
323+
interfaces_oid = '1.3.6.1.2.1.2.2.1.2.'
324+
325+
for i in self._value_to_retrieve(snmpdump=snmpdump):
326+
try:
327+
value_to_get1 = self.get_value(
328+
wireless_if_oid + str(i), snmpdump=snmpdump
329+
)
330+
331+
if value_to_get1:
332+
interfaces.append(
333+
self.get_value(interfaces_oid + str(i), snmpdump=snmpdump)
334+
)
335+
except (NetEngineError, KeyError):
336+
pass
337+
338+
self._wireless_interfaces = [_f for _f in interfaces if _f]
339+
340+
return self._wireless_interfaces
341+
342+
_interfaces_MAC = None
343+
313344
def interfaces_to_dict(self, snmpdump=None):
314345
"""
315346
Returns an ordered dict with all the information available about the interface
316347
"""
317348
results = []
349+
wireless_if = self.get_wireless_interfaces()
318350
for i in range(0, len(self.get_interfaces(snmpdump=snmpdump))):
319351
logger.info(f'===== {i} =====')
352+
logger.info('... name ...')
353+
name = self.interfaces_MAC(snmpdump=snmpdump)[i]['name']
354+
logger.info('... if_type ...')
355+
if_type = self.interfaces_type(snmpdump=snmpdump)[i]['type']
356+
logger.info('... rx_bytes ...')
357+
rx_bytes = int(self.interfaces_bytes(snmpdump=snmpdump)[i]['rx'])
358+
logger.info('... tx_bytes ...')
359+
tx_bytes = int(self.interfaces_bytes(snmpdump=snmpdump)[i]['tx'])
360+
361+
if name in wireless_if:
362+
if_type = 'wireless'
363+
320364
result = self._dict(
321365
{
322-
'name': self.interfaces_MAC(snmpdump=snmpdump)[i]['name'],
323-
'statistics': {
324-
'rx_bytes': int(
325-
self.interfaces_bytes(snmpdump=snmpdump)[i]['rx']
326-
),
327-
'tx_bytes': int(
328-
self.interfaces_bytes(snmpdump=snmpdump)[i]['tx']
329-
),
330-
},
366+
'name': name,
367+
"type": if_type,
368+
'statistics': {'rx_bytes': rx_bytes, 'tx_bytes': tx_bytes},
331369
}
332370
)
333371
results.append(result)
@@ -398,56 +436,56 @@ def local_time(self, snmpdump=None):
398436

399437
def RAM_total(self, snmpdump=None):
400438
"""
401-
Returns the total RAM of the device
439+
Returns the total RAM of the device in bytes
402440
"""
403441
total = self.get_value('1.3.6.1.4.1.10002.1.1.1.1.1.0', snmpdump=snmpdump)
404-
return int(total)
442+
return int(total) * 1024
405443

406444
def RAM_free(self, snmpdump=None):
407445
"""
408-
Returns the free RAM of the device
446+
Returns the free RAM of the device in bytes
409447
"""
410448
free = self.get_value('1.3.6.1.4.1.10002.1.1.1.1.2.0', snmpdump=snmpdump)
411-
return int(free)
449+
return int(free) * 1024
412450

413451
def RAM_buffered(self, snmpdump=None):
414452
"""
415-
Returns the buffered RAM of the device
453+
Returns the buffered RAM of the device in bytes
416454
"""
417455
buffered = self.get_value('1.3.6.1.4.1.10002.1.1.1.1.3.0', snmpdump=snmpdump)
418-
return int(buffered)
456+
return int(buffered) * 1024
419457

420458
def RAM_cached(self, snmpdump=None):
421459
"""
422-
Returns the cached RAM of the device
460+
Returns the cached RAM of the device in bytes
423461
"""
424462
cached = self.get_value('1.3.6.1.4.1.10002.1.1.1.1.4.0', snmpdump=snmpdump)
425-
return int(cached)
463+
return int(cached) * 1024
426464

427465
def load(self, snmpdump=None):
428466
"""
429467
Returns an array with load average values respectively in the last
430468
minute, in the last 5 minutes and in the last 15 minutes
431469
"""
432470
array = self.next('1.3.6.1.4.1.10002.1.1.1.4.2.1.3.', snmpdump=snmpdump)[3]
433-
one = int(array[0][0][1])
434-
five = int(array[1][0][1])
435-
fifteen = int(array[2][0][1])
471+
one = float(array[0][0][1]) / 100
472+
five = float(array[1][0][1]) / 100
473+
fifteen = float(array[2][0][1]) / 100
436474
return [one, five, fifteen]
437475

438476
def SWAP_total(self, snmpdump=None):
439477
"""
440-
Returns the total SWAP of the device
478+
Returns the total SWAP of the device in bytes
441479
"""
442480
total = self.get_value('1.3.6.1.4.1.10002.1.1.1.2.1.0', snmpdump=snmpdump)
443-
return int(total)
481+
return int(total * 1024)
444482

445483
def SWAP_free(self, snmpdump=None):
446484
"""
447-
Returns the free SWAP of the device
485+
Returns the free SWAP of the device in bytes
448486
"""
449487
free = self.get_value('1.3.6.1.4.1.10002.1.1.1.2.2.0', snmpdump=snmpdump)
450-
return int(free)
488+
return int(free * 1024)
451489

452490
def resources_to_dict(self, snmpdump=None):
453491
"""

netengine/backends/snmp/openwrt.py

Lines changed: 72 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from pytrie import StringTrie as Trie
1616

1717
from netengine.backends.snmp import SNMP
18+
from netengine.exceptions import NetEngineError
1819

1920
logger = logging.getLogger(__name__)
2021

@@ -77,6 +78,7 @@ def uptime_tuple(self, snmpdump=None):
7778
return td.days, td.seconds // 3600, (td.seconds // 60) % 60
7879

7980
_interfaces = None
81+
_wireless_interfaces = None
8082

8183
def get_interfaces(self, snmpdump=None):
8284
"""
@@ -96,6 +98,32 @@ def get_interfaces(self, snmpdump=None):
9698

9799
return self._interfaces
98100

101+
def get_wireless_interfaces(self, snmpdump=None):
102+
"""
103+
returns the list of all the wireless interfaces of the device
104+
"""
105+
if self._wireless_interfaces is None:
106+
interfaces = []
107+
wireless_if_oid = '1.2.840.10036.1.1.1.1.'
108+
interfaces_oid = '1.3.6.1.2.1.2.2.1.2.'
109+
110+
for i in self._value_to_retrieve(snmpdump=snmpdump):
111+
try:
112+
value_to_get1 = self.get_value(
113+
wireless_if_oid + str(i), snmpdump=snmpdump
114+
)
115+
116+
if value_to_get1:
117+
interfaces.append(
118+
self.get_value(interfaces_oid + str(i), snmpdump=snmpdump)
119+
)
120+
except (NetEngineError, KeyError):
121+
pass
122+
123+
self._wireless_interfaces = [_f for _f in interfaces if _f]
124+
125+
return self._wireless_interfaces
126+
99127
_interfaces_MAC = None
100128

101129
def interfaces_MAC(self, snmpdump=None):
@@ -320,15 +348,19 @@ def interface_addr_and_mask(self, snmpdump=None):
320348

321349
results = {}
322350

351+
# TODO: Add ipv6 addresses
323352
for i in range(0, len(interface_ip_address)):
324353
a = interface_ip_address[i][0][1].asNumbers()
325354
ip_address = '.'.join(str(a[i]) for i in range(0, len(a)))
326355
b = interface_netmask[i][0][1].asNumbers()
327356
netmask = '.'.join(str(b[i]) for i in range(0, len(b)))
328357

329358
name = self._interface_dict[int(interface_index[i][0][1])]
330-
331-
results[name] = {'address': ip_address, 'netmask': netmask}
359+
results[name] = {
360+
'family': 'ipv4',
361+
'address': ip_address,
362+
'mask': netmask,
363+
}
332364

333365
self._interface_addr_and_mask = results
334366

@@ -339,6 +371,7 @@ def interfaces_to_dict(self, snmpdump=None):
339371
Returns an ordered dict with all the information available about the interface
340372
"""
341373
results = []
374+
wireless_if = self.get_wireless_interfaces()
342375
for i in range(0, len(self.get_interfaces(snmpdump=snmpdump))):
343376

344377
logger.info(f'====== {i} ======')
@@ -358,11 +391,11 @@ def interfaces_to_dict(self, snmpdump=None):
358391
logger.info('... mtu ...')
359392
mtu = int(self.interfaces_mtu(snmpdump=snmpdump)[i]['mtu'])
360393
logger.info('... if_ip ...')
361-
if_ip = (
362-
self.interface_addr_and_mask(snmpdump=snmpdump)
363-
.get(name, {})
364-
.get('address', '')
365-
)
394+
addr = self.interface_addr_and_mask(snmpdump=snmpdump).get(name)
395+
addresses = [addr] if addr is not None else []
396+
397+
if name in wireless_if:
398+
if_type = 'wireless'
366399

367400
result = self._dict(
368401
{
@@ -374,7 +407,7 @@ def interfaces_to_dict(self, snmpdump=None):
374407
'rx_bytes': rx_bytes,
375408
'tx_bytes': tx_bytes,
376409
"mtu": mtu,
377-
"ip": if_ip,
410+
"addresses": addresses,
378411
},
379412
}
380413
)
@@ -435,82 +468,81 @@ def local_time(self, snmpdump=None):
435468

436469
def RAM_total(self, snmpdump=None):
437470
"""
438-
returns the total RAM of the device
471+
returns the total RAM of the device in bytes
439472
"""
440-
return int(self.get_value('1.3.6.1.2.1.25.2.3.1.5.1', snmpdump=snmpdump))
473+
return int(self.get_value('1.3.6.1.4.1.2021.4.5.0', snmpdump=snmpdump)) * 1024
441474

442475
def RAM_shared(self, snmpdump=None):
443476
"""
444-
returns the shared RAM of the device
477+
returns the shared RAM of the device in bytes
445478
"""
446-
return int(self.get_value('1.3.6.1.2.1.25.2.3.1.6.8', snmpdump=snmpdump))
479+
return int(self.get_value('1.3.6.1.4.1.2021.4.13.0', snmpdump=snmpdump)) * 1024
447480

448481
def RAM_cached(self, snmpdump=None):
449482
"""
450-
returns the cached RAM of the device
451-
"""
452-
return int(self.get_value('1.3.6.1.2.1.25.2.3.1.5.7', snmpdump=snmpdump))
453-
454-
def RAM_used(self, snmpdump=None):
455-
"""
456-
returns the used RAM of the device
483+
returns the cached RAM of the device in bytes
457484
"""
458-
return int(self.get_value('1.3.6.1.2.1.25.2.3.1.6.1', snmpdump=snmpdump))
485+
return int(self.get_value('1.3.6.1.4.1.2021.4.15.0', snmpdump=snmpdump)) * 1024
459486

460487
def RAM_free(self, snmpdump=None):
461488
"""
462-
returns the free RAM of the device
489+
returns the free RAM of the device in bytes
463490
"""
464-
return int(
465-
self.RAM_total(snmpdump=snmpdump)
466-
- (self.RAM_used(snmpdump=snmpdump) - self.RAM_cached(snmpdump=snmpdump))
467-
)
491+
return int(self.get_value('1.3.6.1.4.1.2021.4.11.0', snmpdump=snmpdump)) * 1024
468492

469-
def SWAP_total(self, snmpdump=None):
493+
def RAM_buffered(self, snmpdump=None):
470494
"""
471-
returns the total SWAP of the device
495+
returns the buffered RAM of the device in bytes
472496
"""
473-
return int(self.get_value('1.3.6.1.2.1.25.2.3.1.5.10', snmpdump=snmpdump))
497+
return int(self.get_value('1.3.6.1.4.1.2021.4.14.0', snmpdump=snmpdump)) * 1024
474498

475-
def SWAP_used(self, snmpdump=None):
499+
def SWAP_total(self, snmpdump=None):
476500
"""
477-
returns the used SWAP of the device
501+
returns the total SWAP of the device in bytes
478502
"""
479-
return int(self.get_value('1.3.6.1.2.1.25.2.3.1.6.10', snmpdump=snmpdump))
503+
return int(self.get_value('1.3.6.1.4.1.2021.4.3.0', snmpdump=snmpdump)) * 1024
480504

481505
def SWAP_free(self, snmpdump=None):
482506
"""
483-
returns the free SWAP of the device
507+
returns the free SWAP of the device in bytes
484508
"""
485-
SWAP_free = self.SWAP_total(snmpdump=snmpdump) - self.SWAP_used(
486-
snmpdump=snmpdump
487-
)
488-
return SWAP_free
509+
return int(self.get_value('1.3.6.1.4.1.2021.4.4.0', snmpdump=snmpdump)) * 1024
489510

490511
def CPU_count(self, snmpdump=None):
491512
"""
492513
returns the count of CPUs of the device
493514
"""
494515
return len(self.next('1.3.6.1.2.1.25.3.3.1.2.', snmpdump=snmpdump)[3])
495516

517+
def load(self, snmpdump=None):
518+
"""
519+
Returns an array with load average values respectively in the last
520+
minute, in the last 5 minutes and in the last 15 minutes
521+
"""
522+
array = self.next('1.3.6.1.4.1.2021.10.1.3.', snmpdump=snmpdump)[3]
523+
one = float(array[0][0][1])
524+
five = float(array[1][0][1])
525+
fifteen = float(array[2][0][1])
526+
return [one, five, fifteen]
527+
496528
def resources_to_dict(self, snmpdump=None):
497529
"""
498530
returns an ordered dict with hardware resources information
499531
"""
500532
result = self._dict(
501533
{
534+
'load': self.load(snmpdump=snmpdump),
502535
'cpus': self.CPU_count(snmpdump=snmpdump),
503536
'memory': {
504537
'total': self.RAM_total(snmpdump=snmpdump),
505538
'shared': self.RAM_shared(snmpdump=snmpdump),
506-
'used': self.RAM_used(snmpdump=snmpdump),
507539
'free': self.RAM_free(snmpdump=snmpdump),
508540
'cached': self.RAM_cached(snmpdump=snmpdump),
541+
'buffered': self.RAM_buffered(snmpdump=snmpdump),
509542
},
510543
'swap': {
511544
'total': self.SWAP_total(snmpdump=snmpdump),
512545
'free': self.SWAP_free(snmpdump=snmpdump),
513-
'used': self.SWAP_used(snmpdump=snmpdump),
514546
},
515547
}
516548
)
@@ -574,12 +606,12 @@ def neighbors(self, snmpdump=None):
574606

575607
def to_dict(self, snmpdump=None, autowalk=True):
576608
if autowalk:
577-
snmpdump = Trie(self.walk('1.3.6'))
609+
snmpdump = Trie(self.walk('1.2'))
578610
result = self._dict(
579611
{
580612
'type': 'DeviceMonitoring',
581613
'general': {
582-
'name': self.name(snmpdump=snmpdump),
614+
'hostname': self.name(snmpdump=snmpdump),
583615
'uptime': self.uptime(snmpdump=snmpdump),
584616
'local_time': self.local_time(snmpdump=snmpdump),
585617
},

0 commit comments

Comments
 (0)