You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

139 lines
5.1 KiB

# -*- coding:utf-8 -*-
from sys import stdout
from time import sleep
from db import load_from_db
from firewall import FirewallManager
from sslTransmitter import TransmitServer
from agent.models import Abonent, Tariff
def filter_user_by_id(users, uid):
# users = filter(lambda usr: isinstance(usr, Abonent), users)
users = filter(lambda usr: usr.uid == uid, users)
if len(users) > 0:
return users[0]
def filter_tariff_by_id(tariffs, tid):
# tariffs = filter(lambda trf: isinstance(trf, Tariff), tariffs)
tariffs = filter(lambda trf: trf.tid == tid, tariffs)
if len(tariffs) > 0:
return tariffs[0]
def create_abon(tariffs, users, event, frw):
print('SIGNAL: Create abon')
trf = filter_tariff_by_id(tariffs, int(event.dt['tarif_id']))
abon = Abonent(
int(event.id),
int(event.dt['ip']),
trf
)
users.append(abon)
if abon.is_access():
frw.open_inet_door(abon)
def main(debug=False):
users, tariffs = load_from_db()
frw = FirewallManager()
frw.reset()
# Инициализация абонентов
if debug:
print("Инициализация...")
# Открываем доступ в инет тем кто активен и у кого подключён тариф
for usr in filter(lambda usr: usr.is_active, users):
# даём услуги если можно
if usr.is_access():
# Открываем доступ в инет
frw.open_inet_door(usr)
if debug: print "Разрешён доступ в инет для:", usr.ip_str()
# Слушем в отдельном процессе сеть на предмет событий
ts = TransmitServer('127.0.0.1', 2134)
ts.start()
if debug: print("Загружено %d абонентов" % len(users))
while True:
# Загружаем события для абонентов из сети (список объектов EventNAS из models)
events = ts.get_data()
# Проходим по появившимся событиям
for event in events:
# event.toa, event.id, event.dt
# Смотрим тип события
toa = int(event.toa)
if toa == 0:
continue
# создаём абонента
elif toa == 1:
create_abon(tariffs, users, event, frw)
# Сигнал о том что инфа об абоненте изменилась, надо перечитать
elif toa == 2:
print('SIGNAL: Change abon')
usr = filter_user_by_id(users, event.id)
# если есть то меняем инфу о клиенте
if usr:
usr.deserialize(event.dt, tariffs)
# в любом случае сначала очистить всю инфу о клиенте из таблицы фаера
frw.close_inet_door(usr)
# если у абонента есть доступ то можно и в инет
if usr.is_access():
frw.open_inet_door(usr)
# Иначе создаём клиента
else:
create_abon(tariffs, users, event, frw)
# Удаляем абонента
elif toa == 3:
print('SIGNAL: Delete abon')
usr = filter_user_by_id(users, event.id)
frw.close_inet_door(usr)
users.remove(usr)
# Создаём тариф
elif toa == 4:
print('SIGNAL: Create tariff')
trf = Tariff(
int(event.dt['tid']),
float(event.dt['speedIn']),
float(event.dt['speedOut'])
)
tariffs.append(trf)
frw.make_tariff(trf)
# Обновить тарифф
elif toa == 5:
print('SIGNAL: Change tariff')
trf = filter_tariff_by_id(tariffs, int(event.dt['tarif_id']))
trf.deserialize(event.dt)
frw.destroy_tariff(trf)
frw.make_tariff(trf)
# Удалить тарифф
elif toa == 6:
print('SIGNAL: Delete tariff')
ban_users = filter(lambda usr: usr.tariff.tid == usr.tariff.tid, users)
for usr in ban_users:
frw.close_inet_door(usr)
trf = filter_tariff_by_id(tariffs, int(event.dt['tarif_id']))
tariffs.remove(trf)
elif toa == 7:
# Сигнал на перезагрузку
# Выходим из main, выше она в цикле запустится ещё раз
return
# Очищаем очередь событий
ts.clear()
# ждём время между итерациями проверки 10 сек...
sleep(10)
stdout.write('.')
stdout.flush()