diff --git a/devapp/base_intr.py b/devapp/base_intr.py index 92ac57e..e0279cf 100644 --- a/devapp/base_intr.py +++ b/devapp/base_intr.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- from abc import ABCMeta, abstractmethod - from netsnmp import Session, VarList, Varbind @@ -15,24 +14,18 @@ class DevBase(object): def reboot(self): """Перезагружает устройство""" - @abstractmethod - def get_statistics(self): - """Получаем статистику""" - - @abstractmethod - def get_vlan(self): - """Получаем инфу о VLAN""" - @abstractmethod def get_ports(self): """Получаем инфу о портах""" @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): self.num = int(num) self.nm = name @@ -40,70 +33,39 @@ class Port(object): self._mac = mac self.sp = speed + @abstractmethod + def disable(self): + pass + + @abstractmethod + def enable(self): + pass + def mac(self): 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])) class SNMPBaseWorker(object): + __metaclass__ = ABCMeta 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( - tag="%s.%d" % (self.oids['toggle_port'], port_num), - val=1 if status else 2, + tag=oid, + val=int(value), type='INTEGER' )) 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) + diff --git a/devapp/dev_types.py b/devapp/dev_types.py index dcec6d3..8f8c3b0 100644 --- a/devapp/dev_types.py +++ b/devapp/dev_types.py @@ -1,8 +1,48 @@ # -*- 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 def description(): return u"Свич D'Link" @@ -10,20 +50,40 @@ class DLinkDevice(DevBase): def reboot(self): 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 = ( ('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() diff --git a/devapp/tests.py b/devapp/tests.py index a39b155..ac39a03 100644 --- a/devapp/tests.py +++ b/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() diff --git a/devapp/views.py b/devapp/views.py index c4bfb86..465c003 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -61,8 +61,13 @@ def dev(request, devid=0): @only_admins def devview(request, did): + ports = None 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', { - 'dev': dev + 'dev': dev, + 'ports': ports }) diff --git a/requirements.txt b/requirements.txt index cde549f..9071e7b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ Django==1.9 -requests Pillow MySQL-python telepot diff --git a/static/css/custom.css b/static/css/custom.css index d8559a5..9ac4fc1 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -134,19 +134,41 @@ td.btn-group { margin: 10px; border: 1px solid #7B7B7B; border-radius: 3px; + padding: 6px; + width: 79px; +} +.port .port-img{ background-image: url(/static/img/icon-port-64x64-grey.png); width: 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--------*/ /* Table filter */ diff --git a/templates/devapp/ports.html b/templates/devapp/ports.html index 4df4f75..2019154 100644 --- a/templates/devapp/ports.html +++ b/templates/devapp/ports.html @@ -5,34 +5,37 @@