From d33112bacd099994a319b1a586568b4d59fe0098 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Tue, 4 Apr 2017 22:25:51 +0300 Subject: [PATCH] fixbug --- abonapp/models.py | 29 ++++++++++++++--------------- agent/mod_mikrotik.py | 19 +++++++++++++------ agent/structs.py | 8 +++++--- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/abonapp/models.py b/abonapp/models.py index 1f402b0..b271433 100644 --- a/abonapp/models.py +++ b/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 diff --git a/agent/mod_mikrotik.py b/agent/mod_mikrotik.py index 76dd74e..086f8f0 100644 --- a/agent/mod_mikrotik.py +++ b/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): diff --git a/agent/structs.py b/agent/structs.py index 9f444b0..7b84fc4 100644 --- a/agent/structs.py +++ b/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):