Browse Source

Базовая часть модуля железок

devel
Dmitry 9 years ago
parent
commit
30dbd46cf7
  1. 92
      devapp/base_intr.py
  2. 86
      devapp/dev_types.py
  3. 23
      devapp/tests.py
  4. 7
      devapp/views.py
  5. 1
      requirements.txt
  6. 34
      static/css/custom.css
  7. 59
      templates/devapp/ports.html

92
devapp/base_intr.py

@ -1,6 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
from netsnmp import Session, VarList, Varbind from netsnmp import Session, VarList, Varbind
@ -15,24 +14,18 @@ class DevBase(object):
def reboot(self): def reboot(self):
"""Перезагружает устройство""" """Перезагружает устройство"""
@abstractmethod
def get_statistics(self):
"""Получаем статистику"""
@abstractmethod
def get_vlan(self):
"""Получаем инфу о VLAN"""
@abstractmethod @abstractmethod
def get_ports(self): def get_ports(self):
"""Получаем инфу о портах""" """Получаем инфу о портах"""
@abstractmethod @abstractmethod
def toggle_port(self, port_num):
pass
def get_device_name(self):
"""Получаем имя устройства по snmp"""
class BasePort(object):
__metaclass__ = ABCMeta
class Port(object):
def __init__(self, num, name, status, mac, speed): def __init__(self, num, name, status, mac, speed):
self.num = int(num) self.num = int(num)
self.nm = name self.nm = name
@ -40,70 +33,39 @@ class Port(object):
self._mac = mac self._mac = mac
self.sp = speed self.sp = speed
@abstractmethod
def disable(self):
pass
@abstractmethod
def enable(self):
pass
def mac(self): def mac(self):
m = self._mac m = self._mac
return "%x:%x:%x:%x:%x:%x" % (ord(m[0]), ord(m[1]), ord(m[2]), ord(m[3]), ord(m[4]), ord(m[5])) return "%x:%x:%x:%x:%x:%x" % (ord(m[0]), ord(m[1]), ord(m[2]), ord(m[3]), ord(m[4]), ord(m[5]))
class SNMPBaseWorker(object): class SNMPBaseWorker(object):
__metaclass__ = ABCMeta
ses = None ses = None
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'
},
'name': 'SNMPv2-SMI::mib-2.47.1.1.1.1.7.1',
'toggle_port': '.1.3.6.1.2.1.2.2.1.7'
}
def __init__(self, ip, passw='public', ver=2):
self.ses = Session(DestHost=ip, Version=ver, Community=passw)
def _get_vars(self, oid):
vs = VarList(Varbind(oid))
return self.ses.walk(vs)
def __init__(self, ip, community='public', ver=2):
self.ses = Session(DestHost=ip, Version=ver, Community=community)
def _get_var(self, oid):
var = VarList(Varbind(oid))
return self.ses.get(var)
# Enable/Disable port
def toggle_port(self, port_num, status=True):
def set_int_value(self, oid, value):
vs = VarList(Varbind( vs = VarList(Varbind(
tag="%s.%d" % (self.oids['toggle_port'], port_num),
val=1 if status else 2,
tag=oid,
val=int(value),
type='INTEGER' type='INTEGER'
)) ))
return self.ses.set(vs) return self.ses.set(vs)
def get_ports(self):
nams = self._get_vars(self.oids['get_ports']['names'])
stats = self._get_vars(self.oids['get_ports']['stats'])
macs = self._get_vars(self.oids['get_ports']['macs'])
speeds = self._get_vars(self.oids['get_ports']['speeds'])
res = []
ln = len(nams)
for n in range(0, ln):
res.append(Port(n, nams[n], bool(stats[n]), macs[n], int(speeds[n])))
return res
def get_name(self):
return self._get_var(self.oids['name'])
# Example usage
if __name__ == '__main__':
wrk = SNMPBaseWorker('10.115.1.104', 'private', 2)
print(wrk.get_name())
for pr in wrk.get_ports():
assert isinstance(pr, Port)
print(pr.nm, pr.st, pr.mac(), pr.sp)
# Enable 2 port
print wrk.toggle_port(2, True)
# Disable 2 port
print wrk.toggle_port(2, False)
def get_list(self, oid):
vs = VarList(Varbind(oid))
return self.ses.walk(vs)
def get_item(self, oid):
var = VarList(Varbind(oid))
return self.ses.get(var)

86
devapp/dev_types.py

@ -1,8 +1,48 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from base_intr import DevBase, SNMPBaseWorker
from base_intr import DevBase, SNMPBaseWorker, BasePort
class DLinkDevice(DevBase):
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'
},
'name': 'SNMPv2-SMI::mib-2.47.1.1.1.1.7.1',
'toggle_port': '.1.3.6.1.2.1.2.2.1.7'
}
class DLinkPort(BasePort):
def __init__(self, num, name, status, mac, speed, snmpWorker):
BasePort.__init__(self, num, name, status, mac, speed)
assert issubclass(snmpWorker.__class__ , SNMPBaseWorker)
self.snmp_worker = snmpWorker
# выключаем этот порт
def disable(self):
self.snmp_worker.set_int_value(
"%s.%d" % (oids['toggle_port'], self.num),
2
)
# включаем этот порт
def enable(self):
self.snmp_worker.set_int_value(
"%s.%d" % (oids['toggle_port'], self.num),
1
)
class DLinkDevice(DevBase, SNMPBaseWorker):
def __init__(self, ip, snmp_community, ver=2):
DevBase.__init__(self)
SNMPBaseWorker.__init__(self, ip, snmp_community, ver)
@staticmethod @staticmethod
def description(): def description():
return u"Свич D'Link" return u"Свич D'Link"
@ -10,20 +50,40 @@ class DLinkDevice(DevBase):
def reboot(self): def reboot(self):
pass pass
def get_ports(self):
nams = self.get_list(oids['get_ports']['names'])
stats = self.get_list(oids['get_ports']['stats'])
macs = self.get_list(oids['get_ports']['macs'])
speeds = self.get_list(oids['get_ports']['speeds'])
res = []
ln = len(nams)
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))
return res
def get_device_name(self):
return self.get_item(oids['name'])
DEVICE_TYPES = ( DEVICE_TYPES = (
('Dl', DLinkDevice), ('Dl', DLinkDevice),
) )
class SNMPDlinkWorker(SNMPBaseWorker):
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'
},
'name': 'SNMPv2-SMI::mib-2.47.1.1.1.1.7.1'
}
# 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()

23
devapp/tests.py

@ -1 +1,22 @@
# Create your tests here.
from django.test import TestCase
import dev_types
class DevTest(TestCase):
def setUp(self):
pass
def snmp(self):
dev = dev_types.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__, dev_types.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()

7
devapp/views.py

@ -61,8 +61,13 @@ def dev(request, devid=0):
@only_admins @only_admins
def devview(request, did): def devview(request, did):
ports = None
dev = get_object_or_404(Device, id=did) 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()
return render(request, 'devapp/ports.html', { return render(request, 'devapp/ports.html', {
'dev': dev
'dev': dev,
'ports': ports
}) })

1
requirements.txt

@ -1,5 +1,4 @@
Django==1.9 Django==1.9
requests
Pillow Pillow
MySQL-python MySQL-python
telepot telepot

34
static/css/custom.css

@ -134,19 +134,41 @@ td.btn-group {
margin: 10px; margin: 10px;
border: 1px solid #7B7B7B; border: 1px solid #7B7B7B;
border-radius: 3px; border-radius: 3px;
padding: 6px;
width: 79px;
}
.port .port-img{
background-image: url(/static/img/icon-port-64x64-grey.png); background-image: url(/static/img/icon-port-64x64-grey.png);
width: 64px; width: 64px;
height: 64px; height: 64px;
text-align: center;
} }
.port.giga {
background-color: #B5FFB5;
.port-img b {
color: #ebe8d8;
position: relative;
top: 27px;
} }
.port.kilo {
background-color: #FBEB79;
a.port-img{
display: block;
text-decoration: none;
} }
/* 1GBit/s */
.port.giga{background-color: #caccfb;}
/* 100 MBit/s */
.port.mega{background-color: #B5FFB5;}
/* 10 MBit/s */
.port.kilo{background-color: #f9c76e;}
/* Disabled */
.port.dis{background-color: #ff9c99;}
/* Not connected */
.port.na{background-color: white;}
/*-------END-Switch--------*/ /*-------END-Switch--------*/
/* Table filter */ /* Table filter */

59
templates/devapp/ports.html

@ -5,34 +5,37 @@
<div class="switch_ports"> <div class="switch_ports">
<h4>{{ dev.get_devtype_display|default:'Название типа свича' }}</h4> <h4>{{ dev.get_devtype_display|default:'Название типа свича' }}</h4>
<div class="port"></div>
<div class="port giga"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port kilo"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
<div class="port"></div>
{% for port in ports %}
{% if port.st %}
{% if port.sp == 10 %}
<div class="port kilo">
{% elif port.sp == 100 %}
<div class="port mega">
{% elif port.sp == 1000 %}
<div class="port giga">
{% else %}
<div class="port">
{% endif %}
{% else %}
<div class="port dis">
{% endif %}
<a href="#" class="port-img" title="{{ port.nm }}">
<b>{{ port.num }}</b>
</a>
<div class="btn-group btn-group-xs btn-group-justified">
<a href="#" class="btn btn-success">
<span class="glyphicon glyphicon-ok"></span>
</a>
<a href="#" class="btn btn-danger">
<span class="glyphicon glyphicon-off"></span>
</a>
</div>
</div>
{% empty %}
<h3>Порты не найдены :(</h3>
{% endfor %}
</div> </div>
{% endblock %} {% endblock %}
Loading…
Cancel
Save