Browse Source

FIXBUG

devel
bashmak 9 years ago
parent
commit
3cacdf682c
  1. 20
      abonapp/models.py
  2. 4
      agent/core.py
  3. 10
      agent/mod_mikrotik.py

20
abonapp/models.py

@ -247,7 +247,7 @@ class PassportInfo(models.Model):
date_of_acceptance = models.DateField()
abon = models.OneToOneField(Abon, on_delete=models.SET_NULL, blank=True, null=True)
def __unicode__(self):
def __str__(self):
return "%s %s" % (self.series, self.number)
@ -331,7 +331,7 @@ def abon_post_save(sender, instance, **kwargs):
# обновляем абонента на NAS
tm.update_user(agent_abon, ip_timeout=timeout)
except (NasFailedResult, NasNetworkError) as e:
except (NasFailedResult, NasNetworkError, ConnectionResetError) as e:
print('ERROR:', e)
return True
@ -357,6 +357,22 @@ def abon_tariff_post_init(sender, instance, **kwargs):
instance.deadline = calc_obj.calc_deadline()
def abontariff_pre_delete(sender, instance, **kwargs):
try:
abon = Abon.objects.get(current_tariff=instance)
ab = abon.build_agent_struct()
if ab is None:
return True
tm = Transmitter()
tm.remove_user(ab)
except Abon.DoesNotExist:
print('ERROR: Abon.DoesNotExist')
except (NasFailedResult, NasNetworkError, ConnectionResetError) as e:
print('NetErr:', e)
return True
models.signals.post_save.connect(abon_post_save, sender=Abon)
models.signals.post_delete.connect(abon_del_signal, sender=Abon)
models.signals.post_init.connect(abon_tariff_post_init, sender=AbonTariff)
models.signals.pre_delete.connect(abontariff_pre_delete, sender=AbonTariff)

4
agent/core.py

@ -19,8 +19,6 @@ class NasNetworkError(Exception):
def check_input_type(*types):
def real_check(fn):
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)))
@ -97,7 +95,7 @@ class BaseTransmitter(metaclass=ABCMeta):
"""
@abstractmethod
@check_input_type(str)
@check_input_type(str, int)
def ping(self, host, count=10):
"""
:param host: ip адрес в текстовом виде, например '192.168.0.1'

10
agent/mod_mikrotik.py

@ -6,7 +6,7 @@ from hashlib import md5
from .core import BaseTransmitter, NasFailedResult, NasNetworkError
from mydefs import ping
from .structs import TariffStruct, AbonStruct, IpStruct
from . import settings
from . import settings as local_settings
from django.conf import settings
import re
@ -144,15 +144,17 @@ class ApiRos:
class TransmitterManager(BaseTransmitter, metaclass=ABCMeta):
def __init__(self, login=None, password=None, ip=None, port=None):
ip = ip or settings.NAS_IP
ip = ip or getattr(local_settings, 'NAS_IP')
if ip is None:
raise NasNetworkError('Не передан ip адрес NAS')
if not ping(ip):
raise NasNetworkError('NAS %s не пингуется' % ip)
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port or settings.NAS_PORT))
s.connect((ip, port or getattr(local_settings, 'NAS_PORT', 8728)))
self.s = s
self.ar = ApiRos(s)
self.ar.login(login or settings.NAS_LOGIN, password or settings.NAS_PASSW)
self.ar.login(login or getattr(local_settings, 'NAS_LOGIN'), password or getattr(local_settings, 'NAS_PASSW'))
except ConnectionRefusedError:
raise NasNetworkError('Подключение к %s отклонено (Connection Refused)' % ip)

Loading…
Cancel
Save