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 %}