diff --git a/agent/core.py b/agent/core.py index 756d68e..4478149 100644 --- a/agent/core.py +++ b/agent/core.py @@ -13,18 +13,18 @@ class NasNetworkError(Exception): pass -# Проверяет входной тип на принадлежность классу. -# Можно передать объект или коллекцию объектов +# Проверяет входной объект на принадлежность типу. +# Можно передать несколько типов в соответствии количеству параметров # В общем желание организовать строгую типизацию :) -def check_input_type(class_or_type): +def check_input_type(*types): def real_check(fn): - def wrapped(self, user): - try: - for usr in user: - assert isinstance(usr, class_or_type) - except TypeError: - assert isinstance(user, class_or_type) - return fn(self, user) + def wrapped(self, *args): + if len(types) != len(args): + raise AttributeError("length of @types must be equivalent for length of @args") + for param_type, param in zip(types, args): + if not isinstance(param, param_type): + raise TypeError("%s must be %s, but is %s" % (str(param), str(param_type), type(param))) + return fn(self, *args) return wrapped return real_check @@ -56,40 +56,45 @@ class BaseTransmitter(metaclass=ABCMeta): def update_user(self, user, *args): """чтоб обновить абонента можно изменить всё кроме его uid, по uid абонент будет найден""" - @abstractmethod - @check_input_type(AbonStruct) - def pause_user(self, user): - """Приостановить обслуживание абонента""" - - @abstractmethod - @check_input_type(AbonStruct) - def start_user(self, user): - """Продолжить обслуживание абонента""" - @abstractmethod @check_input_type(TariffStruct) def add_tariff_range(self, tariff_list): - """добавляем список тарифов в NAS""" + """ + Пока не используется, зарезервировано. + Добавляет список тарифов в NAS + """ @abstractmethod @check_input_type(TariffStruct) def remove_tariff_range(self, tariff_list): - """удаляем список тарифов по уникальным идентификаторам""" + """ + Пока не используется, зарезервировано. + Удаляем список тарифов по уникальным идентификаторам + """ @abstractmethod @check_input_type(TariffStruct) def add_tariff(self, tariff): - """добавляем тариф""" + """ + Пока не используется, зарезервировано. + Добавляет тариф + """ @abstractmethod @check_input_type(TariffStruct) def update_tariff(self, tariff): - """чтоб обновить тариф надо изменить всё кроме его tid, по tid тариф будет найден""" + """ + Пока не используется, зарезервировано. + Чтоб обновить тариф надо изменить всё кроме его tid, по tid тариф будет найден + """ @abstractmethod @check_input_type(TariffStruct) def remove_tariff(self, tid): - """удаляем тариф""" + """ + :param tid: id тарифа в среде NAS сервера чтоб удалить по этому номеру + Пока не используется, зарезервировано. + """ @abstractmethod @check_input_type(TariffStruct) @@ -129,4 +134,3 @@ class BaseTransmitter(metaclass=ABCMeta): print(la) self.remove_user_range( list_for_del ) self.add_user_range( list_for_add ) - diff --git a/agent/mod_mikrotik.py b/agent/mod_mikrotik.py index e1345b3..440a5b4 100644 --- a/agent/mod_mikrotik.py +++ b/agent/mod_mikrotik.py @@ -162,7 +162,7 @@ class TransmitterManager(BaseTransmitter, metaclass=ABCMeta): def _exec_cmd(self, cmd): assert isinstance(cmd, list) - result_iter = self.ar.talk_iter(cmd) + result_iter = ''#self.ar.talk_iter(cmd) res = [] for rt in result_iter: if rt[0] == '!trap': @@ -172,7 +172,7 @@ class TransmitterManager(BaseTransmitter, metaclass=ABCMeta): def _exec_cmd_iter(self, cmd): assert isinstance(cmd, list) - result_iter = self.ar.talk_iter(cmd) + result_iter = ''#self.ar.talk_iter(cmd) for rt in result_iter: if len(rt) < 2: continue @@ -377,10 +377,12 @@ class IpAddressListManager(TransmitterManager, metaclass=ABCMeta): class MikrotikTransmitter(QueueManager, IpAddressListManager): def add_user_range(self, user_list): + super(MikrotikTransmitter, self).add_user_range(user_list) for usr in user_list: self.add_user(usr) def remove_user_range(self, users): + super(MikrotikTransmitter, self).remove_user_range(users) queue_ids = [usr.queue_id for usr in users if usr is not None] QueueManager.remove_range(self, queue_ids) ips = [user.ip for user in users if isinstance(user, AbonStruct)] @@ -390,6 +392,7 @@ class MikrotikTransmitter(QueueManager, IpAddressListManager): IpAddressListManager.remove(self, ip_list_entity[0]['=.id']) def add_user(self, user, ip_timeout=None): + super(MikrotikTransmitter, self).add_user(user) assert isinstance(user.ip, IpStruct) if user.tariff is None or not isinstance(user.tariff, TariffStruct): return @@ -401,6 +404,7 @@ class MikrotikTransmitter(QueueManager, IpAddressListManager): IpAddressListManager.remove(self, firewall_ip_list_obj[0]['=.id']) def remove_user(self, user): + super(MikrotikTransmitter, self).remove_user(user) QueueManager.remove(self, user) firewall_ip_list_obj = IpAddressListManager.find(self, user.ip, LIST_USERS_ALLOWED) if firewall_ip_list_obj is not None and len(firewall_ip_list_obj) > 1: @@ -408,6 +412,7 @@ class MikrotikTransmitter(QueueManager, IpAddressListManager): # обновляем основную инфу абонента def update_user(self, user, ip_timeout=None): + super(MikrotikTransmitter, self).update_user(user) assert isinstance(user.ip, IpStruct) # ищем ip абонента в списке ip @@ -446,6 +451,7 @@ class MikrotikTransmitter(QueueManager, IpAddressListManager): QueueManager.update(self, user) def ping(self, host, count=10): + super(MikrotikTransmitter, self).ping(host) r = self._exec_cmd([ '/ip/arp/print', '?address=%s' % host @@ -460,14 +466,6 @@ class MikrotikTransmitter(QueueManager, IpAddressListManager): received, sent = int(r[-2:][0]['=received']), int(r[-2:][0]['=sent']) return received, sent - # приостановливаем обслуживание абонента - def pause_user(self, user): - self.remove_user(user) - - # продолжаем обслуживание абонента - def start_user(self, user): - pass - # Тарифы хранить нам не надо, так что методы тарифов ниже не реализуем def add_tariff_range(self, tariff_list): pass diff --git a/devapp/dev_types.py b/devapp/dev_types.py index d9798cc..cf40a88 100644 --- a/devapp/dev_types.py +++ b/devapp/dev_types.py @@ -179,9 +179,9 @@ class OnuDevice(DevBase, SNMPBaseWorker): class EltexPort(BasePort): - def __init__(self, num, name, status, mac, speed, snmpWorker): - BasePort.__init__(self, num, name, status, mac, speed) - assert issubclass(snmpWorker.__class__ , SNMPBaseWorker) + def __init__(self, snmpWorker, *args, **kwargs): + BasePort.__init__(self, *args, **kwargs) + assert issubclass(snmpWorker.__class__, SNMPBaseWorker) self.snmp_worker = snmpWorker # выключаем этот порт @@ -213,13 +213,13 @@ class EltexSwitch(DLinkDevice): speeds = self.get_list('.1.3.6.1.2.1.31.1.1.1.15') res = [] for n in range(28): - res.append(EltexPort( + res.append(EltexPort(self, n+1, '',#nams[n] if len(nams) > 0 else _('does not fetch the name'), True if int(stats[n]) == 1 else False, '',#macs[n] if len(macs) > 0 else _('does not fetch the mac'), int(speeds[n]) if len(speeds) > 0 and int(oper_stats[n]) == 1 else 0, - self)) + )) return res def get_device_name(self):