12 changed files with 0 additions and 393 deletions
-
1ip_pool/__init__.py
-
6ip_pool/admin.py
-
6ip_pool/apps.py
-
22ip_pool/forms.py
-
23ip_pool/migrations/0001_initial.py
-
0ip_pool/migrations/__init__.py
-
59ip_pool/models.py
-
48ip_pool/templates/ip_pool/add_pool.html
-
73ip_pool/templates/ip_pool/index.html
-
59ip_pool/templates/ip_pool/ips.html
-
15ip_pool/urls.py
-
81ip_pool/views.py
@ -1 +0,0 @@ |
|||||
default_app_config = 'ip_pool.apps.IpPoolConfig' |
|
||||
@ -1,6 +0,0 @@ |
|||||
from django.contrib import admin |
|
||||
|
|
||||
from . import models |
|
||||
|
|
||||
|
|
||||
admin.site.register(models.IpPoolItem) |
|
||||
@ -1,6 +0,0 @@ |
|||||
from django.apps import AppConfig |
|
||||
|
|
||||
|
|
||||
class IpPoolConfig(AppConfig): |
|
||||
name = 'ip_pool' |
|
||||
verbose_name = "Ip pool" |
|
||||
@ -1,22 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
from django import forms |
|
||||
|
|
||||
from mydefs import ip_addr_regex |
|
||||
|
|
||||
|
|
||||
class PoolForm(forms.Form): |
|
||||
start_ip = forms.GenericIPAddressField(protocol='ipv4', widget=forms.TextInput(attrs={ |
|
||||
'pattern': ip_addr_regex, |
|
||||
'placeholder': '127.0.0.1', |
|
||||
'id': 'start_ip', |
|
||||
'class': 'form-control', |
|
||||
'required': '' |
|
||||
}), required=True) |
|
||||
|
|
||||
end_ip = forms.GenericIPAddressField(protocol='ipv4', widget=forms.TextInput(attrs={ |
|
||||
'pattern': ip_addr_regex, |
|
||||
'placeholder': '127.0.0.1', |
|
||||
'id': 'end_ip', |
|
||||
'class': 'form-control', |
|
||||
'required': '' |
|
||||
}), required=True) |
|
||||
@ -1,23 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
# Generated by Django 1.9 on 2016-06-28 23:51 |
|
||||
|
|
||||
from django.db import migrations, models |
|
||||
|
|
||||
import mydefs |
|
||||
|
|
||||
|
|
||||
class Migration(migrations.Migration): |
|
||||
initial = True |
|
||||
|
|
||||
dependencies = [ |
|
||||
] |
|
||||
|
|
||||
operations = [ |
|
||||
migrations.CreateModel( |
|
||||
name='IpPoolItem', |
|
||||
fields=[ |
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|
||||
('ip', mydefs.MyGenericIPAddressField(max_length=8, protocol='ipv4')), |
|
||||
], |
|
||||
), |
|
||||
] |
|
||||
@ -1,59 +0,0 @@ |
|||||
from django.db import models, connection |
|
||||
|
|
||||
from mydefs import ip2int, MyGenericIPAddressField |
|
||||
|
|
||||
|
|
||||
class IpPoolItemManager(models.Manager): |
|
||||
def get_pools(self): |
|
||||
ips = self.raw(r'SELECT id, ip FROM ip_pool_ippoolitem ORDER BY id') |
|
||||
ips_len = len(list(ips)) |
|
||||
if ips_len < 1: |
|
||||
return |
|
||||
last_dg = ip2int(ips[0].ip) |
|
||||
start_pool = last_dg |
|
||||
res = list() |
|
||||
cnt = 0 |
|
||||
for ip in ips: |
|
||||
ipnt = ip2int(ip.ip) |
|
||||
if ipnt > last_dg + 1 or ipnt < last_dg - 1: |
|
||||
res.append((start_pool, last_dg, cnt)) |
|
||||
start_pool = ipnt |
|
||||
cnt = 0 |
|
||||
last_dg = ipnt |
|
||||
cnt += 1 |
|
||||
res.append((start_pool, last_dg, cnt)) |
|
||||
return res |
|
||||
|
|
||||
def add_pool(self, start_ip, end_ip): |
|
||||
start_ip = ip2int(start_ip) |
|
||||
end_ip = ip2int(end_ip) |
|
||||
|
|
||||
if (end_ip - start_ip) > 5000: |
|
||||
raise Exception('Not add over 5000 ip\'s') |
|
||||
|
|
||||
sql_strs = [r"(%d)" % tip for tip in range(start_ip, end_ip + 1)] |
|
||||
sql = r'INSERT INTO ip_pool_ippoolitem (ip) VALUES %s' % r",".join(sql_strs) |
|
||||
|
|
||||
cursor = connection.cursor() |
|
||||
cursor.execute(sql) |
|
||||
|
|
||||
def get_free_ip(self): |
|
||||
sql = r'SELECT ip_pool_ippoolitem.id as id, ip_pool_ippoolitem.ip as ip FROM ip_pool_ippoolitem ' \ |
|
||||
r'LEFT JOIN abonent ON abonent.ip_address_id = ip_pool_ippoolitem.id WHERE ' \ |
|
||||
r'abonent.ip_address_id IS NULL LIMIT 1' |
|
||||
|
|
||||
rs = self.raw(sql) |
|
||||
rs_len = len(list(rs)) |
|
||||
return None if rs_len is 0 else rs[0] |
|
||||
|
|
||||
|
|
||||
class IpPoolItem(models.Model): |
|
||||
ip = MyGenericIPAddressField() |
|
||||
|
|
||||
objects = IpPoolItemManager() |
|
||||
|
|
||||
def int_ip(self): |
|
||||
return ip2int(self.ip) |
|
||||
|
|
||||
def __str__(self): |
|
||||
return self.ip |
|
||||
@ -1,48 +0,0 @@ |
|||||
{% extends 'base.html' %} |
|
||||
{% block main %} |
|
||||
|
|
||||
|
|
||||
<ol class="breadcrumb"> |
|
||||
<li><span class="glyphicon glyphicon-home"></span></li> |
|
||||
<li><a href="{% url 'ip_pool:home' %}">IP Пул</a></li> |
|
||||
<li class="active">Добавить</li> |
|
||||
</ol> |
|
||||
|
|
||||
{% include 'message_block.html' %} |
|
||||
|
|
||||
<div class="panel panel-default"> |
|
||||
<div class="panel-heading"> |
|
||||
<h3 class="panel-title">Добавить IP пул</h3> |
|
||||
</div> |
|
||||
<div class="panel-body"> |
|
||||
|
|
||||
<form role="form" action="{% url 'ip_pool:add' %}" method="post">{% csrf_token %} |
|
||||
<div class="form-group"> |
|
||||
<label for="start_ip">Начальный ip</label> |
|
||||
|
|
||||
<div class="input-group"> |
|
||||
<span class="input-group-addon"><span class="glyphicon glyphicon-cutlery"></span></span> |
|
||||
{{ form.start_ip }}{{ form.start_ip.errors }} |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="form-group"> |
|
||||
<label for="">Конечный ip</label> |
|
||||
|
|
||||
<div class="input-group"> |
|
||||
<span class="input-group-addon"><span class="glyphicon glyphicon-gbp"></span></span> |
|
||||
{{ form.end_ip }}{{ form.end_ip.errors }} |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="btn-group"> |
|
||||
<button type="submit" class="btn btn-sm btn-primary"> |
|
||||
<span class="glyphicon glyphicon-save"></span> Сохранить |
|
||||
</button> |
|
||||
<button type="reset" class="btn btn-sm btn-default"> |
|
||||
<span class="glyphicon glyphicon-remove-circle"></span> Сбросить |
|
||||
</button> |
|
||||
</div> |
|
||||
</form> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
{% endblock %} |
|
||||
@ -1,73 +0,0 @@ |
|||||
{% extends 'base.html' %} |
|
||||
{% block main %} |
|
||||
|
|
||||
|
|
||||
<ol class="breadcrumb"> |
|
||||
<li><span class="glyphicon glyphicon-home"></span></li> |
|
||||
<li class="active">IP Пул</li> |
|
||||
</ol> |
|
||||
|
|
||||
{% include 'message_block.html' %} |
|
||||
|
|
||||
<h3>Пулы ip адресов</h3> |
|
||||
<div class="table-responsive"> |
|
||||
<table class="table table-striped table-bordered"> |
|
||||
<thead> |
|
||||
<tr> |
|
||||
<th>Начальный IP</th> |
|
||||
<th>Конечный IP</th> |
|
||||
<th>Количество</th> |
|
||||
<th width="50">Ред.</th> |
|
||||
<th width="50">Уд.</th> |
|
||||
</tr> |
|
||||
</thead> |
|
||||
<tbody> |
|
||||
{% for pl in pools %} |
|
||||
<tr> |
|
||||
<td>{{ pl.0 }}</td> |
|
||||
<td>{{ pl.1 }}</td> |
|
||||
<td>{{ pl.2 }}</td> |
|
||||
<td colspan="2" class="btn-group btn-group-sm btn-group-justified"> |
|
||||
|
|
||||
<a href="{% url 'ip_pool:ips' %}?ips={{ pl.0 }}&ipe={{ pl.1 }}" |
|
||||
class="btn btn-primary"> |
|
||||
<span class="glyphicon glyphicon-edit"></span> |
|
||||
</a> |
|
||||
|
|
||||
{% if perms.ip_pool.delete_ippoolitem %} |
|
||||
<a href="{% url 'ip_pool:ips_del' %}?ips={{ pl.0 }}&ipe={{ pl.1 }}" class="btn btn-danger"> |
|
||||
<span class="glyphicon glyphicon-remove-circle"></span> |
|
||||
</a> |
|
||||
{% endif %} |
|
||||
|
|
||||
</td> |
|
||||
</tr> |
|
||||
{% empty %} |
|
||||
<tr> |
|
||||
<td colspan="5">Нет ни одного пула зарезервированных ip адресов. |
|
||||
{% if perms.ip_pool.add_ippoolitem %} |
|
||||
<a href="{% url 'ip_pool:add' %}">Создать</a> |
|
||||
{% endif %} |
|
||||
</td> |
|
||||
</tr> |
|
||||
{% endfor %} |
|
||||
</tbody> |
|
||||
|
|
||||
{% if perms.ip_pool.add_ippoolitem %} |
|
||||
<tfoot> |
|
||||
<tr> |
|
||||
<td colspan="5"> |
|
||||
<a href="{% url 'ip_pool:add' %}" class="btn btn-sm btn-success"> |
|
||||
<span class="glyphicon glyphicon-plus"></span> |
|
||||
</a> |
|
||||
</td> |
|
||||
</tr> |
|
||||
</tfoot> |
|
||||
{% endif %} |
|
||||
|
|
||||
</table> |
|
||||
</div> |
|
||||
|
|
||||
{% include 'toolbar_page.html' with pag=pools %} |
|
||||
|
|
||||
{% endblock %} |
|
||||
@ -1,59 +0,0 @@ |
|||||
{% extends 'base.html' %} |
|
||||
{% block main %} |
|
||||
|
|
||||
|
|
||||
<ol class="breadcrumb"> |
|
||||
<li><span class="glyphicon glyphicon-home"></span></li> |
|
||||
<li><a href="{% url 'ip_pool:home' %}">IP Пул</a></li> |
|
||||
<li class="active">Редактировать/Просмотреть</li> |
|
||||
</ol> |
|
||||
|
|
||||
|
|
||||
<h3>История абонента</h3> |
|
||||
<div class="table-responsive"> |
|
||||
<table class="table table-striped table-bordered"> |
|
||||
<thead> |
|
||||
<tr> |
|
||||
<th width="30">Id</th> |
|
||||
<th>Ip</th> |
|
||||
<th>Клиент</th> |
|
||||
<th width="50">Уд.</th> |
|
||||
</tr> |
|
||||
</thead> |
|
||||
<tbody> |
|
||||
{% for pi in pool_ips %} |
|
||||
<tr> |
|
||||
<td>{{ pi.id }}</td> |
|
||||
<td>{{ pi.ip }}</td> |
|
||||
<td>{% if pi.abon %} |
|
||||
<a href="{% url 'abonapp:abon_home' pi.abon.group.id pi.abon.id %}">{{ pi.abon.username }}</a> |
|
||||
{% else %}---{% endif %} |
|
||||
</td> |
|
||||
<td> |
|
||||
{% if pi.abon %} |
|
||||
<button class="btn btn-sm btn-danger disabled"> |
|
||||
<span class="glyphicon glyphicon-remove-circle"></span> |
|
||||
</button> |
|
||||
{% elif perms.ip_pool.delete_ippoolitem %} |
|
||||
<a href="{% url 'ip_pool:del_ip' %}?id={{ pi.id }}" class="btn btn-sm btn-danger"> |
|
||||
<span class="glyphicon glyphicon-remove-circle"></span> |
|
||||
</a> |
|
||||
{% endif %} |
|
||||
</td> |
|
||||
</tr> |
|
||||
{% empty %} |
|
||||
<tr> |
|
||||
<td colspan="4">Нет ни одного пула зарезервированных ip адресов. |
|
||||
{% if perms.ip_pool.add_ippoolitem %} |
|
||||
<a href="{% url 'ip_pool:add' %}">Создать</a> |
|
||||
{% endif %} |
|
||||
</td> |
|
||||
</tr> |
|
||||
{% endfor %} |
|
||||
</tbody> |
|
||||
</table> |
|
||||
</div> |
|
||||
|
|
||||
{% include 'toolbar_page.html' with pag=pool_ips %} |
|
||||
|
|
||||
{% endblock %} |
|
||||
@ -1,15 +0,0 @@ |
|||||
# -*- coding:utf-8 -*- |
|
||||
from django.conf.urls import url |
|
||||
|
|
||||
from . import views |
|
||||
|
|
||||
|
|
||||
urlpatterns = [ |
|
||||
|
|
||||
url(r'^$', views.home, name='home'), |
|
||||
url(r'^range$', views.ips, name='ips'), |
|
||||
url(r'^del$', views.del_pool, name='ips_del'), |
|
||||
url(r'^add$', views.add_pool, name='add'), |
|
||||
|
|
||||
url(r'^delip$', views.delip, name='del_ip') |
|
||||
] |
|
||||
@ -1,81 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
from django.contrib.auth.decorators import login_required, permission_required |
|
||||
from django.shortcuts import render, redirect, get_object_or_404 |
|
||||
from django.contrib import messages |
|
||||
|
|
||||
from .forms import PoolForm |
|
||||
from .models import IpPoolItem |
|
||||
import mydefs |
|
||||
|
|
||||
|
|
||||
@login_required |
|
||||
@mydefs.only_admins |
|
||||
def home(request): |
|
||||
pools = IpPoolItem.objects.get_pools() |
|
||||
|
|
||||
if pools: |
|
||||
pools = [(mydefs.int2ip(ip[0]), mydefs.int2ip(ip[1]), ip[2]) for ip in pools] |
|
||||
pools = mydefs.pag_mn(request, pools) |
|
||||
|
|
||||
return render(request, 'ip_pool/index.html', { |
|
||||
'pools': pools |
|
||||
}) |
|
||||
|
|
||||
|
|
||||
@login_required |
|
||||
@mydefs.only_admins |
|
||||
def ips(request): |
|
||||
ip_start = request.GET.get('ips') |
|
||||
ip_end = request.GET.get('ipe') |
|
||||
|
|
||||
pool_ips = IpPoolItem.objects.filter(ip__gte=ip_start) |
|
||||
pool_ips = pool_ips.filter(ip__lte=ip_end) |
|
||||
|
|
||||
pool_ips = mydefs.pag_mn(request, pool_ips) |
|
||||
|
|
||||
return render(request, 'ip_pool/ips.html', { |
|
||||
'pool_ips': pool_ips, |
|
||||
'ips': ip_start, |
|
||||
'ipe': ip_end |
|
||||
}) |
|
||||
|
|
||||
|
|
||||
@login_required |
|
||||
@permission_required('ip_pool.delete_ippoolitem') |
|
||||
def del_pool(request): |
|
||||
ip_start = request.GET.get('ips') |
|
||||
ip_end = request.GET.get('ipe') |
|
||||
|
|
||||
pool_ips = IpPoolItem.objects.filter(ip__gte=ip_start) |
|
||||
pool_ips = pool_ips.filter(ip__lte=ip_end) |
|
||||
pool_ips = pool_ips.filter() |
|
||||
|
|
||||
pool_ips.delete() |
|
||||
|
|
||||
return mydefs.res_success(request, 'ip_pool:home') |
|
||||
|
|
||||
|
|
||||
@login_required |
|
||||
@permission_required('ip_pool.add_ippoolitem') |
|
||||
def add_pool(request): |
|
||||
if request.method == 'POST': |
|
||||
frm = PoolForm(request.POST) |
|
||||
if frm.is_valid(): |
|
||||
cd = frm.cleaned_data |
|
||||
IpPoolItem.objects.add_pool(cd['start_ip'], cd['end_ip']) |
|
||||
return redirect('ip_pool:home') |
|
||||
else: |
|
||||
messages.error(request, 'Исправьте ошибки') |
|
||||
else: |
|
||||
frm = PoolForm() |
|
||||
return render(request, 'ip_pool/add_pool.html', { |
|
||||
'form': frm |
|
||||
}) |
|
||||
|
|
||||
|
|
||||
@login_required |
|
||||
@permission_required('ip_pool.delete_ippoolitem') |
|
||||
def delip(request): |
|
||||
ipid = request.GET.get('id') |
|
||||
get_object_or_404(IpPoolItem, id=ipid).delete() |
|
||||
return mydefs.res_success(request, 'ip_pool:home') |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue