From a51791b64311ad0ec2110592e7ebafa73a834221 Mon Sep 17 00:00:00 2001 From: Dmitry Novikov Date: Wed, 19 Dec 2018 13:48:37 +0300 Subject: [PATCH] Make huawei support --- devapp/base_intr.py | 5 +- devapp/dev_types.py | 53 +++++++++++++------ devapp/models.py | 3 +- .../custom_dev_page/generic_switch.html | 18 ++++--- devapp/urls.py | 52 ++++++------------ 5 files changed, 72 insertions(+), 59 deletions(-) diff --git a/devapp/base_intr.py b/devapp/base_intr.py index bc080b9..415898b 100644 --- a/devapp/base_intr.py +++ b/devapp/base_intr.py @@ -120,7 +120,10 @@ class SNMPBaseWorker(object, metaclass=ABCMeta): def start_ses(self): if self.ses is None: - self.ses = Session(hostname=self._ip, community=self._community, version=self._ver) + self.ses = Session( + hostname=self._ip, community=self._community, + version=self._ver, use_numeric=True + ) def set_int_value(self, oid: str, value): self.start_ses() diff --git a/devapp/dev_types.py b/devapp/dev_types.py index 5ce3dbd..4df380e 100644 --- a/devapp/dev_types.py +++ b/devapp/dev_types.py @@ -78,20 +78,18 @@ class DLinkDevice(DevBase, SNMPBaseWorker): 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')) - res = [] try: for n in range(interfaces_count): status = True if int(stats[n]) == 1 else False - res.append(DLinkPort( + yield DLinkPort( n + 1, nams[n] if len(nams) > 0 else '', status, macs[n] if len(macs) > 0 else _('does not fetch the mac'), int(speeds[n]) if len(speeds) > 0 else 0, - self)) - return res + self) except IndexError: - return DeviceImplementationError('Dlink port index error'), res + return DeviceImplementationError('Dlink port index error') def get_device_name(self): return self.get_item('.1.3.6.1.2.1.1.1.0') @@ -293,11 +291,12 @@ class OnuDevice(DevBase, SNMPBaseWorker): class EltexPort(BasePort): - def __init__(self, snmp_worker, *args, **kwargs): + def __init__(self, snmp_worker, writable=True, *args, **kwargs): BasePort.__init__(self, *args, **kwargs) if not issubclass(snmp_worker.__class__, SNMPBaseWorker): raise TypeError self.snmp_worker = snmp_worker + self.writable = writable def disable(self): self.snmp_worker.set_int_value( @@ -319,17 +318,16 @@ class EltexSwitch(DLinkDevice): tech_code = 'eltex_sw' def get_ports(self) -> ListOrError: - res = [] for i, n in enumerate(range(49, 77), 1): speed = self.get_item('.1.3.6.1.2.1.2.2.1.5.%d' % n) - res.append(EltexPort(self, - i, - self.get_item('.1.3.6.1.2.1.31.1.1.1.18.%d' % n), - self.get_item('.1.3.6.1.2.1.2.2.1.8.%d' % n), - self.get_item('.1.3.6.1.2.1.2.2.1.6.%d' % n), - int(speed or 0), - )) - return res + yield EltexPort(self, + num=i, + name=self.get_item('.1.3.6.1.2.1.31.1.1.1.18.%d' % n), + status=self.get_item('.1.3.6.1.2.1.2.2.1.8.%d' % n), + mac=self.get_item('.1.3.6.1.2.1.2.2.1.6.%d' % n), + speed=int(speed or 0), + writable=False, + ) def get_device_name(self): return self.get_item('.1.3.6.1.2.1.1.5.0') @@ -544,3 +542,28 @@ class ZteOnuDevice(OnuDevice): return 'gpon-onu_1/%d/%d:%s' % ( rack_num, fiber_num, onu_port_num ) + + +class HuaweiSwitch(EltexSwitch): + description = _('Huawei switch') + is_use_device_port = True + has_attachable_to_subscriber = True + tech_code = 'huawei_s2300' + + def get_ports(self): + interfaces_ids = self.get_list('.1.3.6.1.2.1.17.1.4.1.2') + if interfaces_ids is None: + raise DeviceImplementationError('Switch returned null') + for i, n in enumerate(interfaces_ids): + n = int(n) + speed = self.get_item('.1.3.6.1.2.1.2.2.1.5.%d' % n) + status = self.get_item('.1.3.6.1.2.1.2.2.1.8.%d' % n) + yield EltexPort( + self, + num=i+1, + name=self.get_item('.1.3.6.1.2.1.2.2.1.2.%d' % n), # name + status=int(status or 0), # status + mac=self.get_item('.1.3.6.1.2.1.2.2.1.6.%d' % n), # mac + speed=int(speed or 0), # speed + writable=False + ) diff --git a/devapp/models.py b/devapp/models.py index a8ad8d5..c47ee6b 100644 --- a/devapp/models.py +++ b/devapp/models.py @@ -32,7 +32,8 @@ class Device(models.Model): ('On', dev_types.OnuDevice), ('Ex', dev_types.EltexSwitch), ('Zt', dev_types.Olt_ZTE_C320), - ('Zo', dev_types.ZteOnuDevice) + ('Zo', dev_types.ZteOnuDevice), + ('Hw', dev_types.HuaweiSwitch) ) devtype = models.CharField(_('Device type'), max_length=2, default=DEVICE_TYPES[0][0], choices=MyChoicesAdapter(DEVICE_TYPES)) diff --git a/devapp/templates/devapp/custom_dev_page/generic_switch.html b/devapp/templates/devapp/custom_dev_page/generic_switch.html index 8f9a633..f8d1765 100644 --- a/devapp/templates/devapp/custom_dev_page/generic_switch.html +++ b/devapp/templates/devapp/custom_dev_page/generic_switch.html @@ -40,13 +40,19 @@ {{ port.num }} - {% if port.st %} - - - + {% if port.writable %} + {% if port.st %} + + + + {% else %} + + + + {% endif %} {% else %} - - + + {% endif %} diff --git a/devapp/urls.py b/devapp/urls.py index fd84e72..c3d9daf 100644 --- a/devapp/urls.py +++ b/devapp/urls.py @@ -5,52 +5,32 @@ app_name = 'devapp' urlpatterns = [ path('', views.GroupsListView.as_view(), name='group_list'), - path('devices_without_groups/', - views.DevicesWithoutGroupsListView.as_view(), - name='devices_null_group'), + path('devices_without_groups/', views.DevicesWithoutGroupsListView.as_view(), name='devices_null_group'), path('fix_onu/', views.fix_onu, name='fix_onu'), path('/', views.DevicesListView.as_view(), name='devs'), path('/add/', views.DeviceCreateView.as_view(), name='add'), path('//', views.devview, name='view'), - path('//del/', - views.DeviceDeleteView.as_view(), name='del'), - path('//add/', views.add_single_port, - name='add_port'), - path('//edit/', views.DeviceUpdate.as_view(), - name='edit'), - path('//edit_extra/', - views.DeviceUpdateExtra.as_view(), name='extra_data_edit'), - path( - '//ports//fix_port_conflict/', - views.fix_port_conflict, - name='fix_port_conflict'), - path( - '//ports//show_subscriber_on_port/', - views.ShowSubscriberOnPort.as_view(), name='show_subscriber_on_port'), - path('//ports_add/', views.add_ports, - name='add_ports'), - path('//register_device/', - views.register_device, name='dev_register'), - re_path('^(\d+)/(?P\d+)/(?P\d+)_(?P[0-1]{1})$', - views.toggle_port, name='port_toggle'), - path('///del/', - views.delete_single_port, name='del_port'), - path('///edit/', - views.EditSinglePort.as_view(), name='edit_port'), - path('fix_device_group//', views.fix_device_group, - name='fix_device_group'), + path('//del/', views.DeviceDeleteView.as_view(), name='del'), + path('//add/', views.add_single_port, name='add_port'), + path('//edit/', views.DeviceUpdate.as_view(), name='edit'), + path('//edit_extra/', views.DeviceUpdateExtra.as_view(), name='extra_data_edit'), + path('//ports//fix_port_conflict/', views.fix_port_conflict, name='fix_port_conflict'), + path('//ports//show_subscriber_on_port/', views.ShowSubscriberOnPort.as_view(), name='show_subscriber_on_port'), + path('//ports_add/', views.add_ports, name='add_ports'), + path('//register_device/', views.register_device, name='dev_register'), + re_path('^(\d+)/(?P\d+)/(?P\d+)_(?P[0-1]{1})$', views.toggle_port, name='port_toggle'), + path('///del/', views.delete_single_port, name='del_port'), + path('///edit/', views.EditSinglePort.as_view(), name='edit_port'), + path('fix_device_group//', views.fix_device_group, name='fix_device_group'), path('search_dev/', views.search_dev), # ZTE ports under fibers - path('///', - views.zte_port_view_uncfg, name='zte_port_view_uncfg'), + path('///', views.zte_port_view_uncfg, name='zte_port_view_uncfg'), # Monitoring api path('on_device_event/', views.OnDeviceMonitoringEvent.as_view()), # Nagios mon generate - path('nagios/hosts/', views.nagios_objects_conf, - name='nagios_objects_conf'), - path('api/getall/', views.DevicesGetListView.as_view(), - name='nagios_get_all_hosts') + path('nagios/hosts/', views.nagios_objects_conf, name='nagios_objects_conf'), + path('api/getall/', views.DevicesGetListView.as_view(), name='nagios_get_all_hosts') ]