Browse Source

добавил работу по snmp

devel
Dmitry 9 years ago
parent
commit
dabf1604ec
  1. 7
      abonapp/views.py
  2. 7
      devapp/base_intr.py
  3. 49
      devapp/dev_types.py
  4. 2
      devapp/tests.py
  5. 43
      devapp/views.py
  6. 3
      templates/abonapp/complete_service.html
  7. 10
      templates/devapp/dev.html
  8. 14
      templates/devapp/ext.htm
  9. 100
      templates/devapp/ports.html

7
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)

7
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]

49
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()

2
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', '<community>', 2)
print('DevName:', dev.get_device_name())
ports = dev.get_ports()

43
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)

3
templates/abonapp/complete_service.html

@ -31,8 +31,7 @@
Услуга была подключена: {{ abtar.time_start|date:'d F Y, H:i:s' }}<br/>
Сегодня: {% now "d F Y, H:i:s" %}<br/>
Время использования: {% if time_use.days %}{{ time_use.days }} дней.{% endif %}
{{ time_use.hours }} часов и {{ time_use.minutes }} минут.<br/>
Время использования: {{ time_use }}<br/>
Полная стоимость услуги: {{ abtar.tariff.amount }}<br/>
Итоговая стоимость: {{ abtar.calc_amount_service }}
</p>

10
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 %}
<div class="panel panel-default">
<div class="panel-heading">
@ -10,10 +8,10 @@
<div class="panel-body">
<form role="form" action="
{% if devid == 0 %}
{% if dev.id == 0 %}
{% url 'devapp:add' %}
{% else %}
{% url 'devapp:edit' devid %}
{% url 'devapp:edit' dev.id %}
{% endif %}" method="post">{% csrf_token %}
<div class="form-group">

14
templates/devapp/ext.htm

@ -14,9 +14,17 @@
</div>
<ul class="nav nav-tabs">
<li class="active"><a href="#livetab_content" data-tab-remote="{% url 'devapp:view' dev.id %}" role="tab"
data-toggle="tab">Порты {{ dev.ip_address }}</a></li>
<li><a href="#livetab_content" data-tab-remote="{% url 'devapp:edit' dev.id %}" role="tab" data-toggle="tab">Редактировать</a>
{% url 'devapp:view' dev.id as devapp_view %}
<li{% if devapp_view == request.path %} class="active"{% endif %}>
<a href="{{ devapp_view }}">
Порты {{ dev.ip_address }}
</a>
</li>
{% url 'devapp:edit' dev.id as devapp_edit %}
<li{% if devapp_edit == request.path %} class="active"{% endif %}>
<a href="{{ devapp_edit }}">Редактировать</a>
</li>
</ul>

100
templates/devapp/ports.html

@ -1,9 +1,98 @@
{% extends request.is_ajax|yesno:'nullcont.htm,devapp/ext.htm' %}
{% block content %}
<div class="row">
<div class="col-sm-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Лог устройства</h3>
</div>
<div class="panel-body">
<table class="table table-responsive">
<thead>
<tr>
<td>ID</td>
<td>уровень</td>
<td>описание</td>
<td>дата</td>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Err:Disable</td>
<td>port Eth1 state Down</td>
<td>21 Dec 12:14:55</td>
</tr>
<tr>
<td>2</td>
<td>Err:bug</td>
<td>port Eth1 state Up</td>
<td>21 Dec 12:15:23</td>
</tr>
<tr>
<td>3</td>
<td>Err:Other</td>
<td>port Eth1 state Up</td>
<td>21 Dec 12:15:45</td>
</tr>
<tr>
<td>1</td>
<td>Err:Disable</td>
<td>port Eth1 state Down</td>
<td>21 Dec 12:14:55</td>
</tr>
<tr>
<td>1</td>
<td>Err:Disable</td>
<td>port Eth1 state Down</td>
<td>21 Dec 12:14:55</td>
</tr>
<tr>
<td>1</td>
<td>Err:Disable</td>
<td>port Eth1 state Down</td>
<td>21 Dec 12:14:55</td>
</tr>
<tr>
<td>1</td>
<td>Err:Disable</td>
<td>port Eth1 state Down</td>
<td>21 Dec 12:14:55</td>
</tr>
<tr>
<td>1</td>
<td>Err:Disable</td>
<td>port Eth1 state Down</td>
<td>21 Dec 12:14:55</td>
</tr>
<tr>
<td>1</td>
<td>Err:Disable</td>
<td>port Eth1 state Down</td>
<td>21 Dec 12:14:55</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-sm-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Что-то ещё</h3>
</div>
<div class="panel-body">
<h2>тут содержимое чего-то ещё</h2>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="switch_ports">
<h4>{{ dev.get_devtype_display|default:'Название типа свича' }}</h4>
<h4>{{ dev.get_devtype_display|default:'Название типа свича' }}, без перезагрузки {{ uptime }}</h4>
{% for port in ports %}
{% if port.st %}
@ -24,10 +113,10 @@
<b>{{ port.num }}</b>
</a>
<div class="btn-group btn-group-xs btn-group-justified">
<a href="#" class="btn btn-success">
<a href="{% url 'devapp:port_toggle' dev.id port.num 1 %}" class="btn btn-success">
<span class="glyphicon glyphicon-ok"></span>
</a>
<a href="#" class="btn btn-danger">
<a href="{% url 'devapp:port_toggle' dev.id port.num 0 %}" class="btn btn-danger">
<span class="glyphicon glyphicon-off"></span>
</a>
</div>
@ -36,6 +125,7 @@
<h3>Порты не найдены :(</h3>
{% endfor %}
</div>
</div>
</div>
{% endblock %}
Loading…
Cancel
Save