From dabf1604ec201306c049f4a246da1c828b415e74 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Thu, 19 Jan 2017 22:39:39 +0000 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D0=BF=D0=BE=20snmp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abonapp/views.py | 7 +- devapp/base_intr.py | 7 +- devapp/dev_types.py | 49 ++++++------ devapp/tests.py | 2 +- devapp/views.py | 43 ++++++++-- templates/abonapp/complete_service.html | 3 +- templates/devapp/dev.html | 10 +-- templates/devapp/ext.htm | 14 +++- templates/devapp/ports.html | 100 ++++++++++++++++++++++-- 9 files changed, 177 insertions(+), 58 deletions(-) diff --git a/abonapp/views.py b/abonapp/views.py index 13dde83..2273d5a 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -405,12 +405,7 @@ def complete_service(request, gid, uid, srvid): else: raise models.LogicError(u'Действие не подтверждено') - time_use = timezone.now() - abtar.time_start - time_use = { - 'days': time_use.days, - 'hours': time_use.seconds / 3600, - 'minutes': time_use.seconds / 60 % 60 - } + time_use = mydefs.RuTimedelta(timezone.now() - abtar.time_start) except models.LogicError as e: messages.error(request, e.message) diff --git a/devapp/base_intr.py b/devapp/base_intr.py index e0279cf..54af5eb 100644 --- a/devapp/base_intr.py +++ b/devapp/base_intr.py @@ -22,6 +22,10 @@ class DevBase(object): def get_device_name(self): """Получаем имя устройства по snmp""" + @abstractmethod + def uptime(self): + pass + class BasePort(object): __metaclass__ = ABCMeta @@ -67,5 +71,4 @@ class SNMPBaseWorker(object): def get_item(self, oid): var = VarList(Varbind(oid)) - return self.ses.get(var) - + return self.ses.get(var)[0] diff --git a/devapp/dev_types.py b/devapp/dev_types.py index 8f8c3b0..2d832c7 100644 --- a/devapp/dev_types.py +++ b/devapp/dev_types.py @@ -1,17 +1,21 @@ # -*- coding: utf-8 -*- +from mydefs import RuTimedelta from base_intr import DevBase, SNMPBaseWorker, BasePort + oids = { 'reboot': '.1.3.6.1.4.1.2021.8.1.101.1', 'get_ports': { - 'names': 'IF-MIB::ifDescr', - 'stats': 'IF-MIB::ifAdminStatus', - 'macs': 'IF-MIB::ifPhysAddress', - 'speeds': 'IF-MIB::ifHighSpeed' + 'names': '.1.3.6.1.4.1.171.10.134.2.1.1.100.2.1.3', + 'stats': '.1.3.6.1.2.1.2.2.1.7', + 'macs': '.1.3.6.1.2.1.2.2.1.6', + 'speeds': '.1.3.6.1.2.1.31.1.1.1.15' }, - 'name': 'SNMPv2-SMI::mib-2.47.1.1.1.1.7.1', - 'toggle_port': '.1.3.6.1.2.1.2.2.1.7' + 'name': '.1.3.6.1.2.1.1.1.0', + 'position': '.1.3.6.1.2.1.1.5.0', + 'toggle_port': '.1.3.6.1.2.1.2.2.1.7', + 'uptime': '.1.3.6.1.2.1.1.8.0' } @@ -56,34 +60,27 @@ class DLinkDevice(DevBase, SNMPBaseWorker): macs = self.get_list(oids['get_ports']['macs']) speeds = self.get_list(oids['get_ports']['speeds']) res = [] - ln = len(nams) + ln = len(speeds) for n in range(0, ln): status = True if int(stats[n]) == 1 else False - res.append(DLinkPort(n+1, nams[n], status, macs[n], int(speeds[n]), self)) + res.append(DLinkPort( + n+1, + nams[n] if len(nams) > 0 else u'не получил имя', + status, + macs[n] if len(macs) > 0 else u'не нашёл мак', + int(speeds[n]) if len(speeds) > 0 else 0, + self)) return res def get_device_name(self): return self.get_item(oids['name']) + def uptime(self): + uptimestamp = int(self.get_item(oids['uptime'])) + tm = RuTimedelta(seconds=uptimestamp/100) + return tm + DEVICE_TYPES = ( ('Dl', DLinkDevice), ) - - -# Example usage -if __name__ == '__main__': - dev = DLinkDevice('10.115.1.105', 'ertNjuWr', 2) - - print('DevName:', dev.get_device_name()) - ports = dev.get_ports() - print 'gports' - for port in ports: - assert issubclass(port.__class__, BasePort) - print('\tPort:', port.nm, port.st, port.mac(), port.sp) - - - # Disable 2 port - #print ports[1].disable() - # Enable 2 port - print ports[1].enable() diff --git a/devapp/tests.py b/devapp/tests.py index ac39a03..565e169 100644 --- a/devapp/tests.py +++ b/devapp/tests.py @@ -8,7 +8,7 @@ class DevTest(TestCase): pass def snmp(self): - dev = dev_types.DLinkDevice('10.115.1.105', 'ertNjuWr', 2) + dev = dev_types.DLinkDevice('10.115.1.105', '', 2) print('DevName:', dev.get_device_name()) ports = dev.get_ports() diff --git a/devapp/views.py b/devapp/views.py index 465c003..3b5335e 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -5,7 +5,7 @@ from django.shortcuts import render, redirect, get_object_or_404 from django.contrib import messages from models import Device -from mydefs import pag_mn, res_success, res_error, only_admins +from mydefs import pag_mn, res_success, res_error, only_admins, ping from forms import DeviceForm @@ -45,7 +45,7 @@ def dev(request, devid=0): frm = DeviceForm(request.POST, instance=devinst) if frm.is_valid(): frm.save() - return redirect('devapp:devs') + return redirect('devapp:view', did=devid) else: messages.error(request, u'Ошибка в данных, проверте их ещё раз') else: @@ -53,7 +53,7 @@ def dev(request, devid=0): return render(request, 'devapp/dev.html', { 'form': frm, - 'devid': devid + 'dev': devinst }) @@ -62,12 +62,41 @@ def dev(request, devid=0): def devview(request, did): ports = None + uptime = 0 dev = get_object_or_404(Device, id=did) - if dev.man_passw: - manager = dev.get_manager_klass()(dev.ip_address, dev.man_passw) - ports = manager.get_ports() + if ping(dev.ip_address): + if dev.man_passw: + manager = dev.get_manager_klass()(dev.ip_address, dev.man_passw) + uptime = manager.uptime() + ports = manager.get_ports() + else: + messages.warning(request, u'Не указан snmp пароль для устройства') + else: + messages.error(request, u'Эта точка не пингуется') return render(request, 'devapp/ports.html', { 'dev': dev, - 'ports': ports + 'ports': ports, + 'uptime': uptime }) + + +@login_required +@only_admins +def toggle_port(request, did, portid, status=0): + portid = int(portid) + status = int(status) + dev = get_object_or_404(Device, id=int(did)) + if ping(dev.ip_address): + if dev.man_passw: + manager = dev.get_manager_klass()(dev.ip_address, dev.man_passw) + ports = manager.get_ports() + if status: + ports[portid-1].enable() + else: + ports[portid-1].disable() + else: + messages.warning(request, u'Не указан snmp пароль для устройства') + else: + messages.error(request, u'Эта точка не пингуется') + return redirect('devapp:view', did=did) diff --git a/templates/abonapp/complete_service.html b/templates/abonapp/complete_service.html index 6433cdc..8bb90b1 100644 --- a/templates/abonapp/complete_service.html +++ b/templates/abonapp/complete_service.html @@ -31,8 +31,7 @@ Услуга была подключена: {{ abtar.time_start|date:'d F Y, H:i:s' }}
Сегодня: {% now "d F Y, H:i:s" %}
- Время использования: {% if time_use.days %}{{ time_use.days }} дней.{% endif %} - {{ time_use.hours }} часов и {{ time_use.minutes }} минут.
+ Время использования: {{ time_use }}
Полная стоимость услуги: {{ abtar.tariff.amount }}
Итоговая стоимость: {{ abtar.calc_amount_service }}

diff --git a/templates/devapp/dev.html b/templates/devapp/dev.html index 50ea0ce..c73bd49 100644 --- a/templates/devapp/dev.html +++ b/templates/devapp/dev.html @@ -1,7 +1,5 @@ -{% extends request.is_ajax|yesno:'bajax.html,base.html' %} -{% block main %} - - {% include 'message_block.html' %} +{% extends request.is_ajax|yesno:'nullcont.htm,devapp/ext.htm' %} +{% block content %}
@@ -10,10 +8,10 @@
{% csrf_token %}
diff --git a/templates/devapp/ext.htm b/templates/devapp/ext.htm index 5996149..488a5c7 100644 --- a/templates/devapp/ext.htm +++ b/templates/devapp/ext.htm @@ -14,9 +14,17 @@
diff --git a/templates/devapp/ports.html b/templates/devapp/ports.html index 2019154..234e08e 100644 --- a/templates/devapp/ports.html +++ b/templates/devapp/ports.html @@ -1,9 +1,98 @@ {% extends request.is_ajax|yesno:'nullcont.htm,devapp/ext.htm' %} - {% block content %} +
+
+
+
+

Лог устройства

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDуровеньописаниедата
1Err:Disableport Eth1 state Down21 Dec 12:14:55
2Err:bugport Eth1 state Up21 Dec 12:15:23
3Err:Otherport Eth1 state Up21 Dec 12:15:45
1Err:Disableport Eth1 state Down21 Dec 12:14:55
1Err:Disableport Eth1 state Down21 Dec 12:14:55
1Err:Disableport Eth1 state Down21 Dec 12:14:55
1Err:Disableport Eth1 state Down21 Dec 12:14:55
1Err:Disableport Eth1 state Down21 Dec 12:14:55
1Err:Disableport Eth1 state Down21 Dec 12:14:55
+
+
+
+
+
+
+

Что-то ещё

+
+
+

тут содержимое чего-то ещё

+
+
+
+
+ +
+
-

{{ dev.get_devtype_display|default:'Название типа свича' }}

+

{{ dev.get_devtype_display|default:'Название типа свича' }}, без перезагрузки {{ uptime }}

{% for port in ports %} {% if port.st %} @@ -24,10 +113,10 @@ {{ port.num }} @@ -36,6 +125,7 @@

Порты не найдены :(

{% endfor %} - +
+
{% endblock %} \ No newline at end of file