Browse Source

Make huawei support

devel
Dmitry Novikov 7 years ago
parent
commit
a51791b643
  1. 5
      devapp/base_intr.py
  2. 53
      devapp/dev_types.py
  3. 3
      devapp/models.py
  4. 18
      devapp/templates/devapp/custom_dev_page/generic_switch.html
  5. 52
      devapp/urls.py

5
devapp/base_intr.py

@ -120,7 +120,10 @@ class SNMPBaseWorker(object, metaclass=ABCMeta):
def start_ses(self): def start_ses(self):
if self.ses is None: 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): def set_int_value(self, oid: str, value):
self.start_ses() self.start_ses()

53
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')) 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')) 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')) speeds = tuple(self.get_list('.1.3.6.1.2.1.2.2.1.5'))
res = []
try: try:
for n in range(interfaces_count): for n in range(interfaces_count):
status = True if int(stats[n]) == 1 else False status = True if int(stats[n]) == 1 else False
res.append(DLinkPort(
yield DLinkPort(
n + 1, n + 1,
nams[n] if len(nams) > 0 else '', nams[n] if len(nams) > 0 else '',
status, status,
macs[n] if len(macs) > 0 else _('does not fetch the mac'), macs[n] if len(macs) > 0 else _('does not fetch the mac'),
int(speeds[n]) if len(speeds) > 0 else 0, int(speeds[n]) if len(speeds) > 0 else 0,
self))
return res
self)
except IndexError: except IndexError:
return DeviceImplementationError('Dlink port index error'), res
return DeviceImplementationError('Dlink port index error')
def get_device_name(self): def get_device_name(self):
return self.get_item('.1.3.6.1.2.1.1.1.0') return self.get_item('.1.3.6.1.2.1.1.1.0')
@ -293,11 +291,12 @@ class OnuDevice(DevBase, SNMPBaseWorker):
class EltexPort(BasePort): class EltexPort(BasePort):
def __init__(self, snmp_worker, *args, **kwargs):
def __init__(self, snmp_worker, writable=True, *args, **kwargs):
BasePort.__init__(self, *args, **kwargs) BasePort.__init__(self, *args, **kwargs)
if not issubclass(snmp_worker.__class__, SNMPBaseWorker): if not issubclass(snmp_worker.__class__, SNMPBaseWorker):
raise TypeError raise TypeError
self.snmp_worker = snmp_worker self.snmp_worker = snmp_worker
self.writable = writable
def disable(self): def disable(self):
self.snmp_worker.set_int_value( self.snmp_worker.set_int_value(
@ -319,17 +318,16 @@ class EltexSwitch(DLinkDevice):
tech_code = 'eltex_sw' tech_code = 'eltex_sw'
def get_ports(self) -> ListOrError: def get_ports(self) -> ListOrError:
res = []
for i, n in enumerate(range(49, 77), 1): 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) 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): def get_device_name(self):
return self.get_item('.1.3.6.1.2.1.1.5.0') 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' % ( return 'gpon-onu_1/%d/%d:%s' % (
rack_num, fiber_num, onu_port_num 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
)

3
devapp/models.py

@ -32,7 +32,8 @@ class Device(models.Model):
('On', dev_types.OnuDevice), ('On', dev_types.OnuDevice),
('Ex', dev_types.EltexSwitch), ('Ex', dev_types.EltexSwitch),
('Zt', dev_types.Olt_ZTE_C320), ('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], devtype = models.CharField(_('Device type'), max_length=2, default=DEVICE_TYPES[0][0],
choices=MyChoicesAdapter(DEVICE_TYPES)) choices=MyChoicesAdapter(DEVICE_TYPES))

18
devapp/templates/devapp/custom_dev_page/generic_switch.html

@ -40,13 +40,19 @@
<a href="javascript:void(0);" class="port-img" title="{{ port.nm }}"> <a href="javascript:void(0);" class="port-img" title="{{ port.nm }}">
<b>{{ port.num }}</b> <b>{{ port.num }}</b>
</a> </a>
{% if port.st %}
<a href="{% url 'devapp:port_toggle' dev.group.pk|default:0 dev.id port.num 0 %}" class="btn btn-xs btn-danger" title="{% trans 'Disable port' %}">
<span class="glyphicon glyphicon-off"></span>
</a>
{% if port.writable %}
{% if port.st %}
<a href="{% url 'devapp:port_toggle' dev.group.pk|default:0 dev.id port.num 0 %}" class="btn btn-xs btn-danger" title="{% trans 'Disable port' %}">
<span class="glyphicon glyphicon-off"></span>
</a>
{% else %}
<a href="{% url 'devapp:port_toggle' dev.group.pk|default:0 dev.id port.num 1 %}" class="btn btn-xs btn-success" title="{% trans 'Enable port' %}">
<span class="glyphicon glyphicon-ok"></span>
</a>
{% endif %}
{% else %} {% else %}
<a href="{% url 'devapp:port_toggle' dev.group.pk|default:0 dev.id port.num 1 %}" class="btn btn-xs btn-success" title="{% trans 'Enable port' %}">
<span class="glyphicon glyphicon-ok"></span>
<a href="#" class="btn btn-xs btn-danger disabled">
<span class="glyphicon glyphicon-off"></span>
</a> </a>
{% endif %} {% endif %}
</div> </div>

52
devapp/urls.py

@ -5,52 +5,32 @@ app_name = 'devapp'
urlpatterns = [ urlpatterns = [
path('', views.GroupsListView.as_view(), name='group_list'), 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('fix_onu/', views.fix_onu, name='fix_onu'),
path('<int:group_id>/', views.DevicesListView.as_view(), name='devs'), path('<int:group_id>/', views.DevicesListView.as_view(), name='devs'),
path('<int:group_id>/add/', views.DeviceCreateView.as_view(), name='add'), path('<int:group_id>/add/', views.DeviceCreateView.as_view(), name='add'),
path('<int:group_id>/<int:device_id>/', views.devview, name='view'), path('<int:group_id>/<int:device_id>/', views.devview, name='view'),
path('<int:group_id>/<int:device_id>/del/',
views.DeviceDeleteView.as_view(), name='del'),
path('<int:group_id>/<int:device_id>/add/', views.add_single_port,
name='add_port'),
path('<int:group_id>/<int:device_id>/edit/', views.DeviceUpdate.as_view(),
name='edit'),
path('<int:group_id>/<int:device_id>/edit_extra/',
views.DeviceUpdateExtra.as_view(), name='extra_data_edit'),
path(
'<int:group_id>/<int:device_id>/ports/<int:port_id>/fix_port_conflict/',
views.fix_port_conflict,
name='fix_port_conflict'),
path(
'<int:group_id>/<int:device_id>/ports/<int:port_id>/show_subscriber_on_port/',
views.ShowSubscriberOnPort.as_view(), name='show_subscriber_on_port'),
path('<int:group_id>/<int:device_id>/ports_add/', views.add_ports,
name='add_ports'),
path('<int:group_id>/<int:device_id>/register_device/',
views.register_device, name='dev_register'),
re_path('^(\d+)/(?P<device_id>\d+)/(?P<port_id>\d+)_(?P<status>[0-1]{1})$',
views.toggle_port, name='port_toggle'),
path('<int:group_id>/<int:device_id>/<int:port_id>/del/',
views.delete_single_port, name='del_port'),
path('<int:group_id>/<int:device_id>/<int:port_id>/edit/',
views.EditSinglePort.as_view(), name='edit_port'),
path('fix_device_group/<int:device_id>/', views.fix_device_group,
name='fix_device_group'),
path('<int:group_id>/<int:device_id>/del/', views.DeviceDeleteView.as_view(), name='del'),
path('<int:group_id>/<int:device_id>/add/', views.add_single_port, name='add_port'),
path('<int:group_id>/<int:device_id>/edit/', views.DeviceUpdate.as_view(), name='edit'),
path('<int:group_id>/<int:device_id>/edit_extra/', views.DeviceUpdateExtra.as_view(), name='extra_data_edit'),
path('<int:group_id>/<int:device_id>/ports/<int:port_id>/fix_port_conflict/', views.fix_port_conflict, name='fix_port_conflict'),
path('<int:group_id>/<int:device_id>/ports/<int:port_id>/show_subscriber_on_port/', views.ShowSubscriberOnPort.as_view(), name='show_subscriber_on_port'),
path('<int:group_id>/<int:device_id>/ports_add/', views.add_ports, name='add_ports'),
path('<int:group_id>/<int:device_id>/register_device/', views.register_device, name='dev_register'),
re_path('^(\d+)/(?P<device_id>\d+)/(?P<port_id>\d+)_(?P<status>[0-1]{1})$', views.toggle_port, name='port_toggle'),
path('<int:group_id>/<int:device_id>/<int:port_id>/del/', views.delete_single_port, name='del_port'),
path('<int:group_id>/<int:device_id>/<int:port_id>/edit/', views.EditSinglePort.as_view(), name='edit_port'),
path('fix_device_group/<int:device_id>/', views.fix_device_group, name='fix_device_group'),
path('search_dev/', views.search_dev), path('search_dev/', views.search_dev),
# ZTE ports under fibers # ZTE ports under fibers
path('<int:group_id>/<int:device_id>/<int:fiber_id>/',
views.zte_port_view_uncfg, name='zte_port_view_uncfg'),
path('<int:group_id>/<int:device_id>/<int:fiber_id>/', views.zte_port_view_uncfg, name='zte_port_view_uncfg'),
# Monitoring api # Monitoring api
path('on_device_event/', views.OnDeviceMonitoringEvent.as_view()), path('on_device_event/', views.OnDeviceMonitoringEvent.as_view()),
# Nagios mon generate # 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')
] ]
Loading…
Cancel
Save