Browse Source

add support to display info by snmp for single onu

devel
bashmak 8 years ago
parent
commit
c33ba6e9c9
  1. 2
      agent/commands/dhcp.py
  2. 4
      devapp/base_intr.py
  3. 33
      devapp/dev_types.py
  4. 20
      devapp/migrations/0005_device_snmp_item_num.py
  5. 10
      devapp/models.py
  6. 2
      devapp/templates/devapp/custom_dev_page/olt.html
  7. 44
      devapp/templates/devapp/custom_dev_page/onu.html
  8. 2
      devapp/templates/devapp/custom_dev_page/ports.html
  9. 3
      devapp/templates/devapp/dev.html
  10. 7
      devapp/templates/devapp/devices.html
  11. 2
      devapp/templates/devapp/ext.htm
  12. 12
      devapp/views.py
  13. 6
      djing/settings_example.py

2
agent/commands/dhcp.py

@ -10,7 +10,7 @@ def dhcp_commit(client_ip, client_mac, switch_mac, switch_port):
dev = Device.objects.get(mac_addr=switch_mac)
mngr_class = dev.get_manager_klass()
port = _('<never mind>')
#port = _('<never mind>')
if mngr_class.is_use_device_port():
port = Port.objects.get(device=dev, num=switch_port)
abon = Abon.objects.get(dev_port=port, device=dev)

4
devapp/base_intr.py

@ -4,6 +4,10 @@ from easysnmp import Session
class DevBase(object, metaclass=ABCMeta):
def __init__(self, dev_instance=None):
self.db_instance = dev_instance
@staticmethod
def description():
"""Возвращает текстовое описание"""

33
devapp/dev_types.py

@ -28,9 +28,9 @@ class DLinkPort(BasePort):
class DLinkDevice(DevBase, SNMPBaseWorker):
def __init__(self, ip, snmp_community, ver=2):
DevBase.__init__(self)
SNMPBaseWorker.__init__(self, ip, snmp_community, ver)
def __init__(self, dev_instance):
DevBase.__init__(self, dev_instance)
SNMPBaseWorker.__init__(self, dev_instance.ip_address, dev_instance.man_passw, 2)
@staticmethod
def description():
@ -99,9 +99,9 @@ class ONUdev(BasePort):
class OLTDevice(DevBase, SNMPBaseWorker):
def __init__(self, ip, snmp_community, ver=2):
DevBase.__init__(self)
SNMPBaseWorker.__init__(self, ip, snmp_community, ver)
def __init__(self, dev_instance):
DevBase.__init__(self, dev_instance)
SNMPBaseWorker.__init__(self, dev_instance.ip_address, dev_instance.man_passw, 2)
@staticmethod
def description():
@ -151,6 +151,10 @@ class OLTDevice(DevBase, SNMPBaseWorker):
class OnuDevice(DevBase, SNMPBaseWorker):
def __init__(self, dev_instance):
DevBase.__init__(self, dev_instance)
SNMPBaseWorker.__init__(self, dev_instance.ip_address, dev_instance.man_passw, 2)
@staticmethod
def description():
return _('PON ONU')
@ -178,6 +182,23 @@ class OnuDevice(DevBase, SNMPBaseWorker):
def is_use_device_port():
return False
def get_details(self):
if self.db_instance is None:
return
num = self.db_instance.snmp_item_num
if num == 0:
return
signal = self.get_item('.1.3.6.1.4.1.3320.101.10.5.1.5.%d' % num)
distance = self.get_item('.1.3.6.1.4.1.3320.101.10.1.1.27.%d' % num)
mac = ':'.join(['%x' % ord(i) for i in self.get_item('.1.3.6.1.4.1.3320.101.10.1.1.3.%d' % num)])
return {
'status': int(self.get_item('.1.3.6.1.2.1.2.2.1.8.%d' % num)),
'signal': int(signal) / 10 if signal != 'NOSUCHINSTANCE' else 0,
'name': self.get_item('.1.3.6.1.2.1.2.2.1.2.%d' % num),
'mac': mac,
'distance': int(distance) / 10 if distance != 'NOSUCHINSTANCE' else 0
}
class EltexPort(BasePort):

20
devapp/migrations/0005_device_snmp_item_num.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2017-11-07 16:19
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('devapp', '0004_auto_20171103_0006'),
]
operations = [
migrations.AddField(
model_name='device',
name='snmp_item_num',
field=models.PositiveSmallIntegerField(default=0),
),
]

10
devapp/models.py

@ -26,8 +26,8 @@ class DeviceDBException(Exception):
class DeviceManager(models.Manager):
@staticmethod
def wrap_monitoring_info(devices_queryset):
nag_url = getattr(settings, 'NAGIOS_URL')
if nag_url:
nag_url = getattr(settings, 'NAGIOS_URL', None)
if nag_url is not None:
addrs = ['h=%s' % hex(ip2int(dev.ip_address))[2:] for dev in devices_queryset]
url = '%s/host/status/arr?%s' % (nag_url, '&'.join(addrs))
try:
@ -50,6 +50,8 @@ class Device(models.Model):
user_group = models.ForeignKey('abonapp.AbonGroup', verbose_name=_('User group'), on_delete=models.SET_NULL, null=True, blank=True)
parent_dev = models.ForeignKey('self', verbose_name=_('Parent device'), blank=True, null=True, on_delete=models.SET_NULL)
snmp_item_num = models.PositiveSmallIntegerField(_('SNMP Number'), default=0)
objects = DeviceManager()
class Meta:
@ -76,6 +78,10 @@ class Device(models.Model):
return res
return
def get_manager_object(self):
man_klass = self.get_manager_klass()
return man_klass(self)
# Можно-ли подключать устройство к абоненту
def has_attachable_to_subscriber(self):
mngr_class = self.get_manager_klass()

2
devapp/templates/devapp/custom_dev_page/olt.html

@ -5,9 +5,11 @@
<div class="row">
<div class="col-sm-12">
<div class="table-responsive">
{% with uptime=dev_manager.uptime %}
{% if uptime %}
{% trans 'Uptime' %} {{ uptime }}
{% endif %}
{% endwith %}
<table class="table table-striped table-bordered">
<thead>
<tr>

44
devapp/templates/devapp/custom_dev_page/onu.html

@ -2,8 +2,9 @@
{% load i18n %}
{% block content %}
{% with uptime=dev_manager.uptime onu_details=dev_manager.get_details %}
<div class="row">
<div class="col-sm-12">
<div class="col-xs-12 col-sm-6">
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title">{{ dev.get_devtype_display|default:_('Title of the type of switch') }}.
@ -40,6 +41,47 @@
</div>
</div>
</div>
<div class="col-xs-12 col-sm-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{% trans 'ONU Status' %}</h3>
</div>
<div class="panel-body">
{% if onu_details %}
<div class="media">
<div class="media-left">
{% if onu_details.status == 1 %}
<span class="media-object glyphicon glyphicon-ok-sign text-success" style="font-size: 75px;"></span>
{% elif onu_details.status == 2 %}
<span class="media-object glyphicon glyphicon-remove-sign text-danger" style="font-size: 75px;"></span>
{% else %}
<span class="media-object glyphicon glyphicon-question-sign" style="font-size: 75px;"></span>
{% endif %}
</div>
<div class="media-body">
<b>{% trans 'Name on OLT' %}</b>: {{ onu_details.name }}<br>
<b>{% trans 'Distance(m)' %}</b>: {{ onu_details.distance }}<br>
<b>{% trans 'Signal' %}</b>: {{ onu_details.signal }}<br>
{% if dev.mac_addr != onu_details.mac %}
<span class="text-danger">
<b>{% trans 'Mac on OLT' %}</b>: {{ onu_details.mac }}
<h4 class="glyphicon glyphicon-exclamation-sign" title="{% trans 'Mac-addresses does not match' %}" data-toggle="tooltip"></h4>
</span>
{% else %}
<b>{% trans 'Mac on OLT' %}</b>: {{ onu_details.mac }}
{% endif %}<br>
</div>
</div>
{% else %}
<h3>{% trans 'Info does not fetch' %}</h3>
{% endif %}
</div>
</div>
</div>
</div>
{% endwith %}
{% endblock %}

2
devapp/templates/devapp/custom_dev_page/ports.html

@ -5,6 +5,7 @@
<div class="row">
<div class="col-sm-12">
<div class="panel panel-default">
{% with uptime=dev_manager.uptime %}
<div class="panel-heading">
<div class="panel-title">{{ dev.get_devtype_display|default:_('Title of the type of switch') }}.
{% if uptime %}
@ -12,6 +13,7 @@
{% endif %}
</div>
</div>
{% endwith %}
<div class="panel-body">
{% for port in ports %}

3
devapp/templates/devapp/dev.html

@ -51,6 +51,9 @@
</div>
</div>
{% bootstrap_icon 'list-alt' as ic %}
{% bootstrap_field form.snmp_item_num addon_before=ic %}
<div class="btn-group">
<button type="submit" class="btn btn-sm btn-primary">
<span class="glyphicon glyphicon-save"></span> {% trans 'Save' %}

7
devapp/templates/devapp/devices.html

@ -22,13 +22,14 @@
</a>
{% if order_by == 'ip_address' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th class="col-xs-4">
<th class="col-xs-3">
<a href="{% url 'devapp:devs' group.pk %}?order_by=comment&dir={{ dir|default:"down" }}">
{% trans 'Comment' %}
</a>
{% if order_by == 'comment' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th class="col-xs-2">{% trans 'Mac address' %}</th>
<th class="col-xs-1">{% trans 'Plugin output' %}</th>
<th class="col-xs-2">
<a href="{% url 'devapp:devs' group.pk %}?order_by=devtype&dir={{ dir|default:"down" }}">
{% trans 'Device type' %}
@ -44,16 +45,18 @@
{% for dev in devices %}
<tr>
<td>
{% if dev.mon %}
{% if dev.mon.current_state == '0' %}
<span class="glyphicon glyphicon-ok-circle text-success"></span>
{% else %}
<span class="glyphicon glyphicon-exclamation-sign text-danger"></span>
{% endif %}
{% else %}&ndash;{% endif %}
</td>
<td><a href="{% url 'devapp:view' dev.user_group.pk dev.pk %}">{{ dev.ip_address }}</a></td>
<td>{{ dev.comment }}</td>
<td>{{ dev.mac_addr|default:_('Not assigned') }}</td>
<td>{{ dev.mon.plugin_output }}</td>
<td>{{ dev.mon.plugin_output|default:'&ndash;' }}</td>
<td>{{ dev.get_devtype_display }}</td>
<td class="btn-group btn-group-xs btn-group-justified">
{% if can_del_dev %}

2
devapp/templates/devapp/ext.htm

@ -19,7 +19,7 @@
<h2>{{ dev.comment|default:_('Not assigned') }}</h2>
</div>
<ul class="nav nav-tabs nav-justified">
<ul class="nav nav-tabs">
{% url 'devapp:view' dev.user_group.pk|default:0 dev.pk as devapp_view %}
<li{% if devapp_view == request.path %} class="active"{% endif %}>

12
devapp/views.py

@ -205,7 +205,7 @@ def add_ports(request, devid):
db_ports = Port.objects.filter(device=dev)
db_ports = [TempPort(p.num, p.descr, None, True, p.pk) for p in db_ports]
manager = dev.get_manager_klass()(dev.ip_address, dev.man_passw)
manager = dev.get_manager_object()
ports = manager.get_ports()
if ports is not None:
ports = [TempPort(p.num, p.nm, p.st, False) for p in ports]
@ -308,8 +308,7 @@ def add_single_port(request, grp, did):
@login_required
@permission_required('devapp.can_view_device')
def devview(request, did):
ports = None
uptime = 0
ports, manager = None, None
dev = get_object_or_404(Device, id=did)
if not dev.user_group:
@ -320,8 +319,7 @@ def devview(request, did):
try:
if ping(dev.ip_address):
if dev.man_passw:
manager = dev.get_manager_klass()(dev.ip_address, dev.man_passw)
uptime = manager.uptime()
manager = dev.get_manager_object()
ports = manager.get_ports()
template_name = manager.get_template_name()
else:
@ -338,8 +336,8 @@ def devview(request, did):
return render(request, 'devapp/custom_dev_page/' + template_name, {
'dev': dev,
'ports': ports,
'uptime': uptime,
'dev_accs': Abon.objects.filter(device=dev)
'dev_accs': Abon.objects.filter(device=dev),
'dev_manager': manager
})

6
djing/settings_example.py

@ -44,7 +44,11 @@ INSTALLED_APPS = [
'chatbot',
'msg_app',
'dialing_app',
'guardian'
'guardian',
'pinax_theme_bootstrap',
'bootstrapform',
'bootstrap3'
]
MIDDLEWARE_CLASSES = [

Loading…
Cancel
Save