Browse Source

Fix management ip lease

devel
bashmak 8 years ago
parent
commit
0f569a6da4
  1. 7
      abonapp/models.py
  2. 2
      abonapp/templates/abonapp/peoples.html
  3. 26
      abonapp/views.py
  4. 18
      agent/core.py
  5. 25
      agent/mod_mikrotik.py
  6. 2
      ip_pool/models.py
  7. 10
      ip_pool/templates/ip_pool/network_list.html
  8. 6
      ip_pool/views.py

7
abonapp/models.py

@ -248,13 +248,6 @@ class Abon(BaseAccount):
print('ERROR:', e) print('ERROR:', e)
return e return e
# def disable_on_nas(self):
# agent_abon = self.build_agent_struct()
# if agent_abon is None:
# return
# tm = Transmitter()
# tm.remove_user(agent_abon)
def get_absolute_url(self): def get_absolute_url(self):
return resolve_url('abonapp:abon_home', self.group.id, self.username) return resolve_url('abonapp:abon_home', self.group.id, self.username)

2
abonapp/templates/abonapp/peoples.html

@ -32,7 +32,7 @@
</th> </th>
<th class="hidden-xs">{% trans 'Last traffic' %}</th> <th class="hidden-xs">{% trans 'Last traffic' %}</th>
<th class="col-xs-3"> <th class="col-xs-3">
<a href="{% url 'abonapp:people_list' group.pk %}?{% url_replace request order_by='fio' dir=dir|default:'down' %}">
<a href="{% url 'abonapp:people_list' group.pk %}?{% url_order_by request order_by='fio' %}">
{% trans 'fio' %} {% trans 'fio' %}
</a> </a>
{% if order_by == 'fio' %}<span class="glyphicon glyphicon-filter"></span>{% endif %} {% if order_by == 'fio' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}

26
abonapp/views.py

@ -15,6 +15,7 @@ from django.conf import settings
from jsonview.decorators import json_view from jsonview.decorators import json_view
from agent.commands.dhcp import dhcp_commit, dhcp_expiry, dhcp_release from agent.commands.dhcp import dhcp_commit, dhcp_expiry, dhcp_release
from agent.structs import IpStruct
from statistics.models import StatCache from statistics.models import StatCache
from tariff_app.models import Tariff from tariff_app.models import Tariff
from agent import NasFailedResult, Transmitter, NasNetworkError from agent import NasFailedResult, Transmitter, NasNetworkError
@ -30,11 +31,11 @@ from guardian.shortcuts import get_objects_for_user, assign_perm
from guardian.decorators import permission_required_or_403 as permission_required from guardian.decorators import permission_required_or_403 as permission_required
from djing import ping from djing import ping
from djing import lib from djing import lib
from djing.global_base_views import BaseOrderedFilteringList, SecureApiView
from djing.global_base_views import OrderedFilteredList, SecureApiView
@method_decorator((login_required, lib.decorators.only_admins), name='dispatch') @method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
class PeoplesListView(BaseOrderedFilteringList):
class PeoplesListView(OrderedFilteredList):
context_object_name = 'peoples' context_object_name = 'peoples'
template_name = 'abonapp/peoples.html' template_name = 'abonapp/peoples.html'
@ -81,7 +82,7 @@ class PeoplesListView(BaseOrderedFilteringList):
@method_decorator((login_required, lib.decorators.only_admins), name='dispatch') @method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
class GroupListView(BaseOrderedFilteringList):
class GroupListView(OrderedFilteredList):
context_object_name = 'groups' context_object_name = 'groups'
template_name = 'abonapp/group_list.html' template_name = 'abonapp/group_list.html'
queryset = Group.objects.annotate(usercount=Count('abon')) queryset = Group.objects.annotate(usercount=Count('abon'))
@ -209,7 +210,7 @@ def abonamount(request, gid, uname):
@method_decorator((login_required, lib.decorators.only_admins), name='dispatch') @method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
@method_decorator(permission_required('group_app.can_view_group', (Group, 'pk', 'gid')), name='dispatch') @method_decorator(permission_required('group_app.can_view_group', (Group, 'pk', 'gid')), name='dispatch')
class DebtsListView(BaseOrderedFilteringList):
class DebtsListView(OrderedFilteredList):
context_object_name = 'invoices' context_object_name = 'invoices'
template_name = 'abonapp/invoiceForPayment.html' template_name = 'abonapp/invoiceForPayment.html'
@ -227,7 +228,7 @@ class DebtsListView(BaseOrderedFilteringList):
@method_decorator((login_required, lib.decorators.only_admins), name='dispatch') @method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
@method_decorator(permission_required('group_app.can_view_group', (Group, 'pk', 'gid')), name='dispatch') @method_decorator(permission_required('group_app.can_view_group', (Group, 'pk', 'gid')), name='dispatch')
class PayHistoryListView(BaseOrderedFilteringList):
class PayHistoryListView(OrderedFilteredList):
context_object_name = 'pay_history' context_object_name = 'pay_history'
template_name = 'abonapp/payHistory.html' template_name = 'abonapp/payHistory.html'
@ -695,7 +696,7 @@ def abon_ping(request):
@method_decorator((login_required, lib.decorators.only_admins,), name='dispatch') @method_decorator((login_required, lib.decorators.only_admins,), name='dispatch')
class DialsListView(BaseOrderedFilteringList):
class DialsListView(OrderedFilteredList):
context_object_name = 'logs' context_object_name = 'logs'
template_name = 'abonapp/dial_log.html' template_name = 'abonapp/dial_log.html'
@ -1055,15 +1056,18 @@ class EditSibscriberMarkers(UpdateView):
def user_session_toggle(request, gid, uname, lease_id, action=None): def user_session_toggle(request, gid, uname, lease_id, action=None):
abon = get_object_or_404(models.Abon, username=uname) abon = get_object_or_404(models.Abon, username=uname)
lease = abon.ip_addresses.get(pk=lease_id) lease = abon.ip_addresses.get(pk=lease_id)
tm = Transmitter()
abon_nas_obj = abon.build_agent_struct()
res_text = '#Parameter needed#'
if action == 'free': if action == 'free':
lease.free() lease.free()
tm.lease_free(abon_nas_obj, IpStruct(lease.ip))
res_text = _('Ip lease has been freed')
elif action == 'start': elif action == 'start':
lease.start() lease.start()
err = abon.sync_with_nas(created=False)
if err is not None:
messages.error(request, err)
else:
messages.success(request, _('Ip lease has been freed'))
tm.lease_start(abon_nas_obj, IpStruct(lease.ip))
res_text = _('Ip lease has been started')
messages.success(request, res_text)
return redirect('abonapp:abon_home', gid, uname) return redirect('abonapp:abon_home', gid, uname)

18
agent/core.py

@ -1,7 +1,7 @@
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
from typing import Iterator, Any, Tuple, Optional, Iterable
from typing import Iterator, Any, Tuple, Optional
from .structs import AbonStruct, TariffStruct, VectorAbon, VectorTariff
from .structs import AbonStruct, TariffStruct, VectorAbon, VectorTariff, IpStruct
# Raised if NAS has returned failed result # Raised if NAS has returned failed result
@ -77,6 +77,20 @@ class BaseTransmitter(metaclass=ABCMeta):
def read_users(self) -> VectorAbon: def read_users(self) -> VectorAbon:
pass pass
@abstractmethod
def lease_free(self, user: AbonStruct, lease: IpStruct):
"""
Remove ip lease from allowed to network
:return:
"""
@abstractmethod
def lease_start(self, user: AbonStruct, lease: IpStruct):
"""
Starts ip lease to allowed to network
:return:
"""
def _diff_users(self, users_from_db: Iterator[Any]) -> Tuple[set, set]: def _diff_users(self, users_from_db: Iterator[Any]) -> Tuple[set, set]:
""" """
:param users_from_db: QuerySet of all subscribers that can have service :param users_from_db: QuerySet of all subscribers that can have service

25
agent/mod_mikrotik.py

@ -291,12 +291,13 @@ class MikrotikTransmitter(BaseTransmitter, ApiRos):
def remove_queue_range(self, q_ids: Iterable[str]): def remove_queue_range(self, q_ids: Iterable[str]):
self._exec_cmd(('/queue/simple/remove', '=numbers=' + ','.join(q_ids))) self._exec_cmd(('/queue/simple/remove', '=numbers=' + ','.join(q_ids)))
def update_queue(self, user: AbonStruct):
def update_queue(self, user: AbonStruct, queue=None):
if not isinstance(user, AbonStruct): if not isinstance(user, AbonStruct):
raise TypeError raise TypeError
if user.tariff is None: if user.tariff is None:
return return
queue = self.find_queue('uid%d' % user.uid)
if queue is None:
queue = self.find_queue('uid%d' % user.uid)
if queue is None: if queue is None:
return self.add_queue(user) return self.add_queue(user)
else: else:
@ -338,7 +339,7 @@ class MikrotikTransmitter(BaseTransmitter, ApiRos):
def remove_ip(self, mk_id): def remove_ip(self, mk_id):
return self._exec_cmd(( return self._exec_cmd((
'/ip/firewall/address-list/remove', '/ip/firewall/address-list/remove',
'=.id=*' + str(mk_id).replace('*', '')
'=.id=%s' % mk_id
)) ))
def remove_ip_range(self, ip_firewall_ids: Iterable[str]): def remove_ip_range(self, ip_firewall_ids: Iterable[str]):
@ -479,3 +480,21 @@ class MikrotikTransmitter(BaseTransmitter, ApiRos):
#if len(diff) > 0: #if len(diff) > 0:
# self.remove_ip_range(diff) # self.remove_ip_range(diff)
return queues return queues
def lease_free(self, user: AbonStruct, lease: IpStruct):
ip = self.find_ip(lease, LIST_USERS_ALLOWED)
if ip is not None:
self.remove_ip(ip.get('=.id'))
queue = self.find_queue('uid%d' % user.uid)
if queue is not None:
user.ips = tuple(i for i in user.ips if i != lease)
self.update_queue(user, queue)
def lease_start(self, user: AbonStruct, lease: IpStruct):
ip = self.find_ip(lease, LIST_USERS_ALLOWED)
if ip is None:
self.add_ip(LIST_USERS_ALLOWED, lease)
queue = self.find_queue('uid%d' % user.uid)
if queue is not None:
user.ips += lease,
self.update_queue(user, queue)

2
ip_pool/models.py

@ -8,7 +8,7 @@ from django.db import models
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from djing.fields import MACAddressField
#from djing.fields import MACAddressField
from ip_pool.fields import GenericIpAddressWithPrefix from ip_pool.fields import GenericIpAddressWithPrefix

10
ip_pool/templates/ip_pool/network_list.html

@ -17,9 +17,9 @@
<table class="table table-striped table-bordered"> <table class="table table-striped table-bordered">
<thead> <thead>
<tr> <tr>
<th class="col-sm-5">{% trans 'Network' %}</th>
<th class="col-sm-3">{% trans 'Work range start ip' %}</th>
<th class="col-sm-3">{% trans 'Work range end ip' %}</th>
<th class="col-sm-3">{% trans 'Network' %}</th>
<th class="col-sm-3">{% trans 'Kind' %}</th>
<th class="col-sm-5">{% trans 'Description' %}</th>
<th class="col-sm-1"></th> <th class="col-sm-1"></th>
</tr> </tr>
</thead> </thead>
@ -28,8 +28,8 @@
{% for netw in networks_list %} {% for netw in networks_list %}
<tr> <tr>
<td><a href="{% url 'ip_pool:ip_leases_list' netw.id %}">{{ netw }}</a></td> <td><a href="{% url 'ip_pool:ip_leases_list' netw.id %}">{{ netw }}</a></td>
<td>{{ netw.work_range_start_ip }}</td>
<td>{{ netw.work_range_end_ip }}</td>
<td>{{ netw.get_kind_display }}</td>
<td>{{ netw.description }}</td>
<td class="btn-group btn-group-sm btn-group-justified"> <td class="btn-group btn-group-sm btn-group-justified">
{% if can_ch_net %} {% if can_ch_net %}
<a href="{% url 'ip_pool:net_edit' netw.pk %}" class="btn btn-primary"> <a href="{% url 'ip_pool:net_edit' netw.pk %}" class="btn btn-primary">

6
ip_pool/views.py

@ -6,12 +6,12 @@ from django.utils.translation import gettext_lazy as _
from django.views.generic import UpdateView, CreateView from django.views.generic import UpdateView, CreateView
from guardian.decorators import permission_required_or_403 as permission_required from guardian.decorators import permission_required_or_403 as permission_required
from djing.global_base_views import BaseOrderedFilteringList
from djing.global_base_views import OrderedFilteredList
from ip_pool import models, forms from ip_pool import models, forms
@method_decorator(login_required, name='dispatch') @method_decorator(login_required, name='dispatch')
class NetworksListView(BaseOrderedFilteringList):
class NetworksListView(OrderedFilteredList):
device_kind_code = None device_kind_code = None
template_name = 'ip_pool/network_list.html' template_name = 'ip_pool/network_list.html'
context_object_name = 'networks_list' context_object_name = 'networks_list'
@ -39,7 +39,7 @@ class NetworkUpdateView(UpdateView):
@method_decorator(login_required, name='dispatch') @method_decorator(login_required, name='dispatch')
class IpLeasesListView(BaseOrderedFilteringList):
class IpLeasesListView(OrderedFilteredList):
template_name = 'ip_pool/ip_leases_list.html' template_name = 'ip_pool/ip_leases_list.html'
model = models.IpLeaseModel model = models.IpLeaseModel

Loading…
Cancel
Save