diff --git a/devapp/base_intr.py b/devapp/base_intr.py index d317748..fb2fe7f 100644 --- a/devapp/base_intr.py +++ b/devapp/base_intr.py @@ -5,6 +5,8 @@ from easysnmp import Session from django.utils.translation import gettext, gettext_lazy as _ +from djing.lib import RuTimedelta + ListOrError = Union[ Iterable, Union[Exception, Iterable] @@ -93,17 +95,23 @@ class DevBase(object, metaclass=ABCMeta): class BasePort(object, metaclass=ABCMeta): - __slots__ = 'num', 'snmp_num', 'nm', 'st', '_mac', 'sp', 'writable' + __slots__ = 'num', 'snmp_num', 'nm', 'st', '_mac', 'sp', 'uptime', 'writable' - def __init__(self, num, name, status, mac, speed, snmp_num=None, writable=False): + def __init__(self, num, name, status, mac, speed, uptime: int=None, snmp_num=None, writable=False): self.num = int(num) self.snmp_num = int(num) if snmp_num is None else int(snmp_num) self.nm = name self.st = status self._mac = mac self.sp = speed + self.uptime = int(uptime) if uptime else None self.writable = writable + def uptime_str(self): + if self.uptime: + return str(RuTimedelta(seconds=self.uptime / 100)) + return '' + @abstractmethod def disable(self): pass diff --git a/devapp/dev_types.py b/devapp/dev_types.py index 6365e18..3c887df 100644 --- a/devapp/dev_types.py +++ b/devapp/dev_types.py @@ -1,7 +1,6 @@ import os import re from typing import AnyStr, Iterable, Optional, Dict -from datetime import timedelta from easysnmp import EasySNMPTimeoutError from pexpect import TIMEOUT from transliterate import translit @@ -106,20 +105,22 @@ class DLinkDevice(DevBase, SNMPBaseWorker): )), None def get_ports(self) -> ListOrError: - interfaces_count = safe_int(self.get_item('.1.3.6.1.2.1.2.1.0')) - nams = tuple(self.get_list('.1.3.6.1.4.1.171.10.134.2.1.1.100.2.1.3')) - stats = tuple(self.get_list('.1.3.6.1.2.1.2.2.1.7')) - macs = tuple(self.get_list('.1.3.6.1.2.1.2.2.1.6')) - speeds = tuple(self.get_list('.1.3.6.1.2.1.2.2.1.5')) + ints = self.get_list('.1.3.6.1.2.1.10.7.2.1.1') + nams = self.get_list('.1.3.6.1.2.1.2.2.1.2') + stats = self.get_list('.1.3.6.1.2.1.2.2.1.7') + macs = self.get_list('.1.3.6.1.2.1.2.2.1.6') + speeds = self.get_list('.1.3.6.1.2.1.2.2.1.5') + uptimes = self.get_list('.1.3.6.1.2.1.2.2.1.9') try: - for n in range(interfaces_count): - status = True if int(stats[n]) == 1 else False + for num in ints: + status = True if int(next(stats)) == 1 else False yield DLinkPort( - num=n + 1, - name=nams[n] if len(nams) > 0 else '', + num=num, + name=next(nams), status=status, - mac=macs[n] if len(macs) > 0 else _('does not fetch the mac'), - speed=int(speeds[n]) if len(speeds) > 0 else 0, + mac=next(macs), + speed=int(next(speeds)), + uptime=next(uptimes), snmp_worker=self) except IndexError: return DeviceImplementationError('Dlink port index error') @@ -127,9 +128,9 @@ class DLinkDevice(DevBase, SNMPBaseWorker): def get_device_name(self): return self.get_item('.1.3.6.1.2.1.1.1.0') - def uptime(self) -> timedelta: + def uptime(self): uptimestamp = safe_int(self.get_item('.1.3.6.1.2.1.1.8.0')) - tm = RuTimedelta(timedelta(seconds=uptimestamp / 100)) or RuTimedelta(timedelta()) + tm = RuTimedelta(seconds=uptimestamp / 100) return tm def get_template_name(self): @@ -203,7 +204,7 @@ class OLTDevice(DevBase, SNMPBaseWorker): def uptime(self): up_timestamp = safe_int(self.get_item('.1.3.6.1.2.1.1.9.1.4.1')) - tm = RuTimedelta(timedelta(seconds=up_timestamp / 100)) or RuTimedelta(timedelta()) + tm = RuTimedelta(seconds=up_timestamp / 100) return tm def get_template_name(self): @@ -358,7 +359,7 @@ class EltexSwitch(DLinkDevice): def uptime(self): uptimestamp = safe_int(self.get_item('.1.3.6.1.2.1.1.3.0')) - tm = RuTimedelta(timedelta(seconds=uptimestamp / 100)) or RuTimedelta(timedelta()) + tm = RuTimedelta(seconds=uptimestamp / 100) return tm def monitoring_template(self, *args, **kwargs) -> Optional[str]: @@ -429,7 +430,7 @@ class Olt_ZTE_C320(OLTDevice): def uptime(self): up_timestamp = safe_int(self.get_item('.1.3.6.1.2.1.1.3.0')) - tm = RuTimedelta(timedelta(seconds=up_timestamp / 100)) or RuTimedelta(timedelta()) + tm = RuTimedelta(seconds=up_timestamp / 100) return tm def get_long_description(self): diff --git a/devapp/templates/devapp/custom_dev_page/generic_switch.html b/devapp/templates/devapp/custom_dev_page/generic_switch.html index 918ae7c..47b4b2f 100644 --- a/devapp/templates/devapp/custom_dev_page/generic_switch.html +++ b/devapp/templates/devapp/custom_dev_page/generic_switch.html @@ -21,15 +21,19 @@ {% if port.sp == 10000000 %}
10 mbps + {{ port.uptime_str }} {% elif port.sp == 100000000 %}
100 mbps + {{ port.uptime_str }} {% elif port.sp == 1000000000 %}
1 gbps + {{ port.uptime_str }} {% elif port.sp == 10000000000 %}
10 gbps + {{ port.uptime_str }} {% else %}
{% endif %} diff --git a/djing/lib/__init__.py b/djing/lib/__init__.py index 3e66880..c141f63 100644 --- a/djing/lib/__init__.py +++ b/djing/lib/__init__.py @@ -37,14 +37,6 @@ class MyChoicesAdapter(Iterator): # Russian localized timedelta class RuTimedelta(timedelta): - def __new__(cls, tm): - if isinstance(tm, timedelta): - return timedelta.__new__( - cls, - days=tm.days, - seconds=tm.seconds, - microseconds=tm.microseconds - ) def __str__(self): # hours, remainder = divmod(self.seconds, 3600) diff --git a/docs/dev.md b/docs/dev.md index 4a7415d..7191d0b 100644 --- a/docs/dev.md +++ b/docs/dev.md @@ -69,7 +69,7 @@ class EltexSwitch(DLinkDevice): def uptime(self): uptimestamp = safe_int(self.get_item('.1.3.6.1.2.1.1.3.0')) - tm = RuTimedelta(timedelta(seconds=uptimestamp/100)) or RuTimedelta(timedelta()) + tm = RuTimedelta(seconds=uptimestamp/100) return tm def monitoring_template(self, *args, **kwargs) -> Optional[str]: