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)
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):
return resolve_url('abonapp:abon_home', self.group.id, self.username)

2
abonapp/templates/abonapp/peoples.html

@ -32,7 +32,7 @@
</th>
<th class="hidden-xs">{% trans 'Last traffic' %}</th>
<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' %}
</a>
{% 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 agent.commands.dhcp import dhcp_commit, dhcp_expiry, dhcp_release
from agent.structs import IpStruct
from statistics.models import StatCache
from tariff_app.models import Tariff
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 djing import ping
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')
class PeoplesListView(BaseOrderedFilteringList):
class PeoplesListView(OrderedFilteredList):
context_object_name = 'peoples'
template_name = 'abonapp/peoples.html'
@ -81,7 +82,7 @@ class PeoplesListView(BaseOrderedFilteringList):
@method_decorator((login_required, lib.decorators.only_admins), name='dispatch')
class GroupListView(BaseOrderedFilteringList):
class GroupListView(OrderedFilteredList):
context_object_name = 'groups'
template_name = 'abonapp/group_list.html'
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(permission_required('group_app.can_view_group', (Group, 'pk', 'gid')), name='dispatch')
class DebtsListView(BaseOrderedFilteringList):
class DebtsListView(OrderedFilteredList):
context_object_name = 'invoices'
template_name = 'abonapp/invoiceForPayment.html'
@ -227,7 +228,7 @@ class DebtsListView(BaseOrderedFilteringList):
@method_decorator((login_required, lib.decorators.only_admins), 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'
template_name = 'abonapp/payHistory.html'
@ -695,7 +696,7 @@ def abon_ping(request):
@method_decorator((login_required, lib.decorators.only_admins,), name='dispatch')
class DialsListView(BaseOrderedFilteringList):
class DialsListView(OrderedFilteredList):
context_object_name = 'logs'
template_name = 'abonapp/dial_log.html'
@ -1055,15 +1056,18 @@ class EditSibscriberMarkers(UpdateView):
def user_session_toggle(request, gid, uname, lease_id, action=None):
abon = get_object_or_404(models.Abon, username=uname)
lease = abon.ip_addresses.get(pk=lease_id)
tm = Transmitter()
abon_nas_obj = abon.build_agent_struct()
res_text = '#Parameter needed#'
if action == 'free':
lease.free()
tm.lease_free(abon_nas_obj, IpStruct(lease.ip))
res_text = _('Ip lease has been freed')
elif action == '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)

18
agent/core.py

@ -1,7 +1,7 @@
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
@ -77,6 +77,20 @@ class BaseTransmitter(metaclass=ABCMeta):
def read_users(self) -> VectorAbon:
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]:
"""
: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]):
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):
raise TypeError
if user.tariff is None:
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:
return self.add_queue(user)
else:
@ -338,7 +339,7 @@ class MikrotikTransmitter(BaseTransmitter, ApiRos):
def remove_ip(self, mk_id):
return self._exec_cmd((
'/ip/firewall/address-list/remove',
'=.id=*' + str(mk_id).replace('*', '')
'=.id=%s' % mk_id
))
def remove_ip_range(self, ip_firewall_ids: Iterable[str]):
@ -479,3 +480,21 @@ class MikrotikTransmitter(BaseTransmitter, ApiRos):
#if len(diff) > 0:
# self.remove_ip_range(diff)
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.translation import gettext_lazy as _
from djing.fields import MACAddressField
#from djing.fields import MACAddressField
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">
<thead>
<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>
</tr>
</thead>
@ -28,8 +28,8 @@
{% for netw in networks_list %}
<tr>
<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">
{% if can_ch_net %}
<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 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
@method_decorator(login_required, name='dispatch')
class NetworksListView(BaseOrderedFilteringList):
class NetworksListView(OrderedFilteredList):
device_kind_code = None
template_name = 'ip_pool/network_list.html'
context_object_name = 'networks_list'
@ -39,7 +39,7 @@ class NetworkUpdateView(UpdateView):
@method_decorator(login_required, name='dispatch')
class IpLeasesListView(BaseOrderedFilteringList):
class IpLeasesListView(OrderedFilteredList):
template_name = 'ip_pool/ip_leases_list.html'
model = models.IpLeaseModel

Loading…
Cancel
Save