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.
 
 
 
 
 

121 lines
4.7 KiB

# -*- coding:utf-8 -*-
from sys import stdout
from db import load_from_db
from firewall import FirewallManager
from time import sleep
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]
else:
return
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.tariff:
# Открываем доступ в инет
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:
usr = filter_user_by_id(users, event.id)
# Открываем доступ в инет
frw.open_inet_door(usr)
# Выключаем абонента
elif toa == 2:
usr = filter_user_by_id(users, event.id)
# Выключаем интернет
frw.close_inet_door(usr)
# Сообщение на заглушку
elif toa == 3:
usr = filter_user_by_id(users, event.id)
# Ставим заглушку
frw.set_cap(usr)
# Выключаем интернет
frw.close_inet_door(usr)
# Открываем доступ в инет
elif toa == 4:
usr = filter_user_by_id(users, event.id)
frw.close_inet_door(usr)
frw.open_inet_door(usr)
# Закрываем доступ в инет
elif toa == 5:
usr = filter_user_by_id(users, event.id)
frw.close_inet_door(usr)
elif toa == 6:
# Сигнал на перезагрузку
# Выходим из main, выше она в цикле запустится ещё раз
return
elif toa == 7:
# Сигнал о том что инфа об абоненте изменилась, надо перечитать
usr = filter_user_by_id(users, event.id)
usr.deserialize(event.dt, tariffs)
# если абонент активен, и куплен и активирован тариф то можно и в инет
if usr.is_active and usr.tariff is not None:
frw.close_inet_door(usr)
frw.open_inet_door(usr)
elif toa == 8:
# Сигнал об изменении данных в тарифе
tariff = filter(lambda trf: trf.tid == event.id, tariffs)
if len(tariff) > 0:
tariff = tariff[0]
tariff.deserialize(event.dt)
# Пересоздаём тариф
frw.destroy_tariff(tariff)
frw.make_tariff(tariff)
else:
print('WARNING: не найден тариф для которого возбуждён сигнал на изменение данных, пробуем перезагрузиться')
return
# Очищаем очередь событий
ts.clear()
# ждём время между итерациями проверки 10 сек...
sleep(10)
stdout.write('.')
stdout.flush()