Browse Source

Merge branch 'devel' of https://github.com/bashmak/djing into devel

devel
http 9 years ago
parent
commit
7ebfd1fef1
  1. 29
      abonapp/models.py
  2. 19
      agent/mod_mikrotik.py
  3. 8
      agent/structs.py
  4. 13
      cron.py

29
abonapp/models.py

@ -332,7 +332,7 @@ class Abon(UserProfile):
agent_trf = TariffStruct(inst_tariff.id, inst_tariff.speedIn, inst_tariff.speedOut)
else:
agent_trf = TariffStruct()
return AbonStruct(self.pk, user_ip, agent_trf)
return AbonStruct(self.pk, user_ip, agent_trf, bool(self.is_active))
class InvoiceForPayment(models.Model):
@ -403,21 +403,20 @@ def abon_post_save(sender, instance, **kwargs):
timeout = None
if hasattr(instance, 'opt82'):
timeout = 3600
tm = Transmitter()
agent_abon = instance.build_agent_struct()
if agent_abon is None:
return True
if kwargs['created']:
# создаём абонента
tm.add_user(agent_abon, ip_timeout=timeout)
else:
# обновляем абонента на NAS
tm.update_user(agent_abon, ip_timeout=timeout)
# если не активен то приостановим услугу
if instance.is_active:
tm.start_user(agent_abon)
try:
tm = Transmitter()
if kwargs['created']:
# создаём абонента
tm.add_user(agent_abon, ip_timeout=timeout)
else:
tm.pause_user(agent_abon)
# обновляем абонента на NAS
tm.update_user(agent_abon, ip_timeout=timeout)
except (NasFailedResult, NasNetworkError):
return True
def abon_del_signal(sender, instance, **kwargs):
@ -427,7 +426,7 @@ def abon_del_signal(sender, instance, **kwargs):
tm = Transmitter()
# нашли абонента, и удаляем его на NAS
tm.remove_user(ab)
except NasFailedResult:
except (NasFailedResult, NasNetworkError):
return True
@ -444,7 +443,7 @@ def abontariff_post_save(sender, instance, **kwargs):
return True
tm = Transmitter()
tm.update_user(agent_abon)
except NasFailedResult:
except (NasFailedResult, NasNetworkError):
return True
@ -459,7 +458,7 @@ def abontariff_del_signal(sender, instance, **kwargs):
agent_abon = instance.abon.build_agent_struct()
tm = Transmitter()
tm.pause_user(agent_abon)
except NasFailedResult:
except (NasFailedResult, NasNetworkError):
return True

19
agent/mod_mikrotik.py

@ -10,7 +10,7 @@ from . import settings
import re
DEBUG=False
DEBUG=True
LIST_USERS_ALLOWED = 'DjingUsersAllowed'
LIST_USERS_BLOCKED = 'DjingUsersBlocked'
@ -205,7 +205,8 @@ class TransmitterManager(BaseTransmitter):
uid=int(info['=name'][3:]),
#FIXME: тут в разных микротиках или =target-addresses или =target
ip=info['=target'][:-3],
tariff=t
tariff=t,
is_active=False if info['=disabled'] == 'false' else True
)
return ShapeItem(abon=a, sid=info['=.id'].replace('*', ''))
except KeyError:
@ -388,6 +389,14 @@ class MikrotikTransmitter(QueueManager, IpAddressListManager):
#ищем ip абонента в списке ip
find_res = IpAddressListManager.find(self, user.ip, LIST_USERS_ALLOWED)
if not user.is_active:
# если не активен - то и обновлять не надо
# но и выключить на всяк случай надо, а то вдруг был включён
if len(find_res) > 1:
# и если найден был - то удалим ip из разрешённых
IpAddressListManager.remove(self, find_res[0]['=.id'])
return
# если не найден (mikrotik возвращает пустой словарь в списке если ничего нет)
if len(find_res) < 2:
# добавим запись об абоненте
@ -408,13 +417,11 @@ class MikrotikTransmitter(QueueManager, IpAddressListManager):
# приостановливаем обслуживание абонента
def pause_user(self, user):
IpAddressListManager.disable(self, user)
QueueManager.disable(self, user)
pass
# продолжаем обслуживание абонента
def start_user(self, user):
QueueManager.enable(self, user)
IpAddressListManager.enable(self, user)
pass
# Тарифы хранить нам не надо, так что методы тарифов ниже не реализуем
def add_tariff_range(self, tariff_list):

8
agent/structs.py

@ -80,25 +80,27 @@ class TariffStruct(BaseStruct):
# Абонент из базы
class AbonStruct(BaseStruct):
def __init__(self, uid=None, ip=None, tariff=None):
def __init__(self, uid=None, ip=None, tariff=None, is_active=True):
self.uid = int(uid)
self.ip = IpStruct(ip)
assert isinstance(tariff, TariffStruct)
self.tariff = tariff
self.is_active = is_active
def serialize(self):
assert isinstance(self.tariff, TariffStruct)
assert isinstance(self.ip, IpStruct)
dt = pack("!LII", self.uid, self.ip.get_int(), self.tariff.tid)
dt = pack("!LII?", self.uid, self.ip.get_int(), self.tariff.tid, self.is_active)
return dt
def deserialize(self, data, tariff=None):
dt = unpack("!LII", data)
dt = unpack("!LII?", data)
self.uid = dt[0]
self.ip = IpStruct(dt[1])
if tariff is not None:
assert isinstance(tariff, TariffStruct)
self.tariff = tariff
self.is_active = dt['3']
return self
def __eq__(self, other):

13
cron.py

@ -1,4 +1,4 @@
#!/usr/bin/env python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import django
@ -34,11 +34,6 @@ def main():
# ищем абонента в списке инфы из nas
tm.update_user(ab)
# если не активен то приостановим услугу
if user.is_active:
tm.start_user(ab)
else:
tm.pause_user(ab)
except NasNetworkError as er:
print("Error:", er)
@ -51,7 +46,5 @@ def main():
if __name__ == "__main__":
try:
main()
except NasNetworkError as e:
print(e)
except NasFailedResult as e:
print(e)
except (NasNetworkError, NasFailedResult) as e:
print('NAS:', e)
Loading…
Cancel
Save