Freeradius+utm5 как сделать только 1 активную сессию

Технические вопросы по UTM 5.0
Закрыто
pavlovmc
Сообщения: 5
Зарегистрирован: Ср июн 17, 2009 16:18

Freeradius+utm5 как сделать только 1 активную сессию

Сообщение pavlovmc »

Добрый день!

Имеется биллинг УТМ5 и 3 сервера доступа cisco серии 7200. И в связи с этим встала проблема, что не добросовестные абоненты делятся логином с друзьями и сидят одновременно на 3х разных серверах.

Попытки что-то выжать из радиуса в комплекте с утм ни к чему не привели и было принято решение попробовать freeradius.

Полазив по нетаповскому форуму были найдены конфиги и произведен тестовый запуск, но радиус продолжает пускать уже подключенных клиентов.
Вот конфиг sql.conf:

Код: Выделить всё

sql {
driver = "rlm_sql_mysql"
server = "127.0.0.1"
login = "root"
password = "pass"
radius_db = "UTM"
port = "3306"

sqltracefile = "/usr/local/etc/raddb/log/sqltrace.sql"
sqltrace = yes
num_sql_socks = 5
connect_failure_retry_delay = 60
sql_user_name = "%{User-Name}"

#nas_query = ""
#authorize_check_query="SELECT ip_groups.ip_group_id, ip_groups.uname, 'Password', ip_groups.upass, ':=' FROM UTM.ip_groups, UTM.iptraffic_service_links, UTM.service_links, UTM.accounts WHERE ip_groups.uname = '%{SQL-User-Name}' AND ip_groups.is_deleted='0' AND iptraffic_service_links.is_deleted='0' AND service_links.is_deleted='0' AND accounts.is_deleted='0' AND accounts.is_blocked='0' AND ip_groups.ip_group_id=iptraffic_service_links.ip_group_id AND iptraffic_service_links.id=service_links.id AND service_links.account_id=accounts.id AND (ip_groups.allowed_cid='%{Calling-Station-Id}' OR ip_groups.allowed_cid='')"

#authorize_reply_query = "SELECT id,uname,'Framed-IP-Address',INET_NTOA((ip+0x100000000) % 0x100000000) AS ip,'=' FROM UTM.ip_groups WHERE uname = '%{SQL-User-Name}' AND is_deleted = '0' ORDER BY id DESC"

#accounting_stop_query="INSERT INTO dhs_sessions_log (account_id, recv_date, last_update_date, Framed_IP_Address, NAS_Port, Acct_Delay_Time, Acct_Session_Id, NAS_Port_Type, User_Name, Service_Type, Framed_Protocol, NAS_IP_Address, NAS_Id, Acct_Status_Type, Acct_Input_Packets, Acct_Input_Octets, Acct_Output_Packets, Acct_Output_Octets, Acct_Session_Time, Called_Station_Id, Calling_Station_Id) SELECT basic_account, (%l-%{Acct-Session-Time}), '%l', ((inet_aton('%{Framed-IP-Address}') &0xFFFFFFFF)-4294967296), '%{NAS-Port}', '%{Acct-Delay-Time}', '%{Acct-Session-Id}', '%{NAS-Port-Type}', '%{SQL-User-Name}', '%{Service-Type}', '%{Framed-Protocol}', ((inet_aton('%{NAS-IP-Address}')&0xFFFFFFFF)-4294967296), '%{NAS-IP-Address}', '2', '%{Acct-Output-Packets}', '%{Acct-Output-Octets}', '%{Acct-Input-Packets}', '%{Acct-Input-Octets}', '%{Acct-Session-Time}', '%{Tunnel-Server-Endpoint}', '%{Calling-Station-Id}%{Tunnel-Client-Endpoint}' FROM users WHERE login='%{SQL-User-Name}';"

authorize_check_query="SELECT ip_groups.ip_group_id, ip_groups.uname,'User-Password',ip_groups.upass,':=', max(recv_date) FROM UTM.ip_groups, UTM.iptraffic_service_links, UTM.service_links, UTM.accounts, UTM.dhs_sessions_log WHERE ip_groups.uname = '%{SQL-User-Name}' AND ip_groups.is_deleted='0' AND iptraffic_service_links.is_deleted='0' AND service_links.is_deleted='0' AND accounts.is_deleted='0' AND accounts.is_blocked='0' AND ip_groups.ip_group_id=iptraffic_service_links.ip_group_id AND iptraffic_service_links.id=service_links.id AND service_links.account_id=accounts.id AND dhs_sessions_log.Acct_Status_Type=2 AND dhs_sessions_log.User_Name='%{SQL-User-Name}' UNION SELECT ip_groups.ip_group_id, ip_groups.uname,'Simultaneous-Use','1',':=', max(recv_date) FROM UTM.ip_groups, UTM.iptraffic_service_links, UTM.service_links, UTM.accounts, UTM.dhs_sessions_log WHERE ip_groups.uname = '%{SQL-User-Name}' AND ip_groups.is_deleted='0' AND iptraffic_service_links.is_deleted='0' AND service_links.is_deleted='0' AND accounts.is_deleted='0' AND accounts.is_blocked='0' AND ip_groups.ip_group_id=iptraffic_service_links.ip_group_id AND iptraffic_service_links.id=service_links.id AND service_links.account_id=accounts.id AND dhs_sessions_log.Acct_Status_Type=2 AND dhs_sessions_log.User_Name='%{SQL-User-Name}'"

authorize_reply_query="SELECT ip_group_id, uname, 'Framed-IP-Address', inet_ntoa(ip_groups.ip & 0xFFFFFFFF) AS a, '=' FROM UTM.ip_groups WHERE uname = '%{SQL-User-Name}' AND is_deleted='0' UNION SELECT ip_group_id, uname, 'Acct-Interim-Interval', '60' as a, '=' FROM ip_groups WHERE uname = '%{SQL-User-Name}' AND is_deleted='0'"

accounting_start_query = "INSERT INTO dhs_sessions_log &#40;account_id, slink_id, recv_date,last_update_date,Framed_IP_Address, NAS_Port, Acct_Delay_Time, Acct_Session_Id, NAS_Port_Type, User_Name, Service_Type, Framed_Protocol, NAS_IP_Address, NAS_Id, Acct_Status_Type, Acct_Input_Packets, Acct_Input_Octets, Acct_Input_Gigawords, Acct_Output_Packets,Acct_Output_Octets, Acct_Output_Gigawords, Acct_Session_Time, Acct_Terminate_Cause, Called_Station_Id, Calling_Station_Id &#41; VALUES &#40; &#40;select account_id from service_links where id = &#40; select id from iptraffic_service_links where ip_group_id = &#40; select ip_group_id from ip_groups where uname = '%&#123;SQL-User-Name&#125;' and is_deleted <> '1' &#41;&#41;&#41;, &#40; select id from iptraffic_service_links where ip_group_id = &#40; select ip_group_id from ip_groups where uname = '%&#123;SQL-User-Name&#125;' and is_deleted <> '1' &#41;&#41;, '%l','0', &#40;INET_ATON&#40;CONCAT_WS&#40;'.',SUBSTRING_INDEX&#40;'%&#123;Framed-IP-Address&#125;','.',-1&#41;,SUBSTRING_INDEX&#40;SUBSTRING_INDEX&#40;'%&#123;Framed-IP-Address&#125;','.',-2&#41;,'.',1&#41;,SUBSTRING_INDEX&#40;SUBSTRING_INDEX&#40;'%&#123;Framed-IP-Address&#125;','.',2&#41;,'.',-1&#41;,SUBSTRING_INDEX&#40;'%&#123;Framed-IP-Address&#125;','.',1&#41;&#41;&#41;&#41;, '%&#123;NAS-Port&#125;', '%&#123;Acct-Delay-Time&#125;', '%&#123;Acct-Session-Id&#125;', '%&#123;NAS-Port-Type&#125;', '%&#123;SQL-User-name&#125;', '%&#123;Service-Type&#125;', '%&#123;Framed-Protocol&#125;', &#40;INET_ATON&#40;CONCAT_WS&#40;'.',SUBSTRING_INDEX&#40;'%&#123;NAS-IP-Address&#125;','.',-1&#41;,SUBSTRING_INDEX&#40;SUBSTRING_INDEX&#40;'%&#123;NAS-IP-Address&#125;','.',-2&#41;,'.',1&#41;,SUBSTRING_INDEX&#40;SUBSTRING_INDEX&#40;'%&#123;NAS-IP-Address&#125;','.',2&#41;,'.',-1&#41;,SUBSTRING_INDEX&#40;'%&#123;NAS-IP-Address&#125;','.',1&#41;&#41;&#41;&#41;, '%&#123;NAS-IP-Address&#125;', '1', '%&#123;Acct-Input-Packets&#58;-0&#125;', '%&#123;Acct-Input-Octets&#58;-0&#125;', '%&#123;Acct-Input-Gigawords&#58;-0&#125;', '%&#123;Acct-Output-Packets&#58;-0&#125;', '%&#123;Acct-Output-Octets&#58;-0&#125;', '%&#123;Acct-Output-Gigawords&#58;-0&#125;', '%&#123;Acct-Session-Time&#58;-0&#125;', '%&#123;Acct-Terminate-Cause&#58;-0&#125;', '%&#123;Tunnel-Server-Endpoint&#125;', '%&#123;Calling-Station-Id&#125;%&#123;Tunnel-Client-Endpoint&#125;' &#41;;"

accounting_update_query = "UPDATE dhs_sessions_log SET last_update_date=UNIX_TIMESTAMP&#40;'%S'&#41;, Acct_Status_Type='3', Acct_Input_Packets ='%&#123;Acct-Input-Packets&#125;', Acct_Input_Octets ='%&#123;Acct-Input-Octets&#125;', Acct_Input_Gigawords ='%&#123;Acct-Input-Gigawords&#125;', Acct_Output_Packets ='%&#123;Acct-Output-Packets&#125;', Acct_Output_Octets ='%&#123;Acct-Output-Octets&#125;', Acct_Output_Gigawords ='%&#123;Acct-Output-Gigawords&#125;', Acct_Terminate_Cause='%&#123;Acct-Terminate-Cause&#125;', Acct_Session_Time ='%&#123;Acct-Session-Time&#125;' WHERE Acct_Session_Id = '%&#123;Acct-Session-Id&#125;'"

accounting_stop_query = "UPDATE dhs_sessions_log SET last_update_date=UNIX_TIMESTAMP&#40;'%S'&#41;, Acct_Status_Type='2', Acct_Input_Packets ='%&#123;Acct-Input-Packets&#125;', Acct_Input_Octets ='%&#123;Acct-Input-Octets&#125;', Acct_Input_Gigawords ='%&#123;Acct-Input-Gigawords&#125;', Acct_Output_Packets ='%&#123;Acct-Output-Packets&#125;', Acct_Output_Octets ='%&#123;Acct-Output-Octets&#125;', Acct_Output_Gigawords ='%&#123;Acct-Output-Gigawords&#125;', Acct_Terminate_Cause='%&#123;Acct-Terminate-Cause&#125;', Acct_Session_Time ='%&#123;Acct-Session-Time&#125;' WHERE Acct_Session_Id = '%&#123;Acct-Session-Id&#125;'"

simul_count_query = "SELECT COUNT&#40;*&#41; FROM dhs_sessions_log WHERE User_Name='%&#123;SQL-User-Name&#125;' AND &#40;Acct_Status_Type = '3' OR Acct_Status_Type = '1'&#41; "

simul_verify_query = "SELECT COUNT&#40;*&#41; FROM dhs_sessions_log WHERE User_Name='%&#123;SQL-User-Name&#125;' AND &#40;Acct_Status_Type = '3' OR Acct_Status_Type = '1'&#41; "
&#125;
В принципе устроить и вариант настройки на нетаповском радиусе.

Аватара пользователя
ds
Сообщения: 380
Зарегистрирован: Пн сен 18, 2006 14:06

Сообщение ds »

Добавить Simultaneous-Use := 1 в вывод authorize_check_query, тогда радиус начнет отпинывать.

Например:

Код: Выделить всё

authorize_check_query="\
SELECT i.ip_group_id,i.uname,'Password',i.upass,'&#58;=' \
FROM ip_groups i \
WHERE i.uname='%&#123;SQL-User-Name&#125;' \
AND i.is_deleted='0' AND &#40;i.av IS NULL OR i.av!='2'&#41; AND '%&#123;SQL-User-Name&#125;'!='' \
UNION SELECT '1000','%&#123;SQL-User-Name&#125;','Simultaneous-Use','1','&#58;=' FROM ip_groups WHERE '%&#123;SQL-User-Name&#125;'!='' AND uname='%&#123;SQL-User-Name&#125;'"

pavlovmc
Сообщения: 5
Зарегистрирован: Ср июн 17, 2009 16:18

Сообщение pavlovmc »

В коде авторизации данный параметр есть. Но при повторной попытке входа в логах радиуса нет вызова simul_count_check (точно не помню название), и соответсвенно он пускает вторго пользователя с этими же учетными данными.

authorize_check_query="SELECT ip_groups.ip_group_id, ip_groups.uname,'User-Password',ip_groups.upass,':=', max(recv_date) FROM UTM.ip_groups, UTM.iptraffic_service_links, UTM.service_links, UTM.accounts, UTM.dhs_sessions_log WHERE ip_groups.uname = '%{SQL-User-Name}' AND ip_groups.is_deleted='0' AND iptraffic_service_links.is_deleted='0' AND service_links.is_deleted='0' AND accounts.is_deleted='0' AND accounts.is_blocked='0' AND ip_groups.ip_group_id=iptraffic_service_links.ip_group_id AND iptraffic_service_links.id=service_links.id AND service_links.account_id=accounts.id AND dhs_sessions_log.Acct_Status_Type=2 AND dhs_sessions_log.User_Name='%{SQL-User-Name}' UNION SELECT ip_groups.ip_group_id, ip_groups.uname,'Simultaneous-Use','1',':=', max(recv_date) FROM UTM.ip_groups, UTM.iptraffic_service_links, UTM.service_links, UTM.accounts, UTM.dhs_sessions_log WHERE ip_groups.uname = '%{SQL-User-Name}' AND ip_groups.is_deleted='0' AND iptraffic_service_links.is_deleted='0' AND service_links.is_deleted='0' AND accounts.is_deleted='0' AND accounts.is_blocked='0' AND ip_groups.ip_group_id=iptraffic_service_links.ip_group_id AND iptraffic_service_links.id=service_links.id AND service_links.account_id=accounts.id AND dhs_sessions_log.Acct_Status_Type=2 AND dhs_sessions_log.User_Name='%{SQL-User-Name}'"

Аватара пользователя
ds
Сообщения: 380
Зарегистрирован: Пн сен 18, 2006 14:06

Сообщение ds »

Сорри, не увидел :D

pavlovmc
Сообщения: 5
Зарегистрирован: Ср июн 17, 2009 16:18

Сообщение pavlovmc »

В итоге разобрался сам.
Оказывается для работы лимита сессий необходимо добавить в radiusd.conf:

Код: Выделить всё

session &#123;
  sql
&#125;
И все сразу заработало.

Arti
Сообщения: 266
Зарегистрирован: Пн окт 01, 2007 02:44

Сообщение Arti »

я вот что подумал...

По большому счету самая дешёвая операция должна операция обновления сессии - т.к. нужно выполнять большое количество раз в единицу времени.

если скажем сделать так как предлагалось выше

Код: Выделить всё

accounting_update_query = "\
  UPDATE dhs_sessions_log\
  SET\
    last_update_date=UNIX_TIMESTAMP&#40;'%S'&#41;, Acct_Status_Type='3',\
    Acct_Input_Packets ='%&#123;Acct-Input-Packets&#125;', Acct_Input_Octets ='%&#123;Acct-Input-Octets&#125;',\
    Acct_Input_Gigawords ='%&#123;Acct-Input-Gigawords&#125;', Acct_Output_Packets ='%&#123;Acct-Output-Packets&#125;',\
    Acct_Output_Octets ='%&#123;Acct-Output-Octets&#125;', Acct_Output_Gigawords ='%&#123;Acct-Output-Gigawords&#125;',\
    Acct_Terminate_Cause='%&#123;Acct-Terminate-Cause&#125;', Acct_Session_Time ='%&#123;Acct-Session-Time&#125;'\
 WHERE Acct_Session_Id = '%&#123;Acct-Session-Id&#125;'"
собственно здесь важен даже не сам запрос, сколько WHERE Acct_Session_Id = '%{Acct-Session-Id}'.

Понятно что с "дифолной"
CREATE INDEX index_64791de5ab4ea85459319893269706ea ON dhs_sessions_log(last_update_date,Acct_Status_Type);
и PRIMARY KEY (id)

запрос будет выполнятся вечность.

Можно придумать что-то более эффективное чем скажем CREATE INDEX acnt_ses ON dhs_sessions_log(Acct_Session_Id); ?

JAO
Сообщения: 1153
Зарегистрирован: Вт дек 11, 2007 08:17

Сообщение JAO »

Отдельную таблицу для активных сессий, по стопу перемещение данных в основную (тогда активных сессий правда не увидишь) либо архивацию dhs_sessions_log почаще. Ну и само собой предложенный выше индекс.

Arti
Сообщения: 266
Зарегистрирован: Пн окт 01, 2007 02:44

Сообщение Arti »

JAO писал(а):Отдельную таблицу для активных сессий, по стопу перемещение данных в основную (тогда активных сессий правда не увидишь) либо архивацию dhs_sessions_log почаще. Ну и само собой предложенный выше индекс.
Ну я тоже об этом думал. Правда тогда из таблицы активных сессий постоянно будут удалятся данные.

В принципе действительно 007 с архивацией dhs_sessions_log должно улучшить ситуацию.

drag0mir
Сообщения: 64
Зарегистрирован: Сб ноя 24, 2007 13:46
Откуда: Нижний Новгород

Сообщение drag0mir »

Здравствуйте!
Тоже прикрутил freeradius к UTM5
Большое спасибо за запросы.
Но столкнулся вот с какой проблемой.
freeradius стоит у меня на отдельной машине вместе с базой mysql и биллингом, а радиусклиент и pppoe-server на другой машине.
Ну так вот, каждое подключение соответственно благодаря настроенному аккаунтингу записывается в базу, а при каждом отключении оно там меняет статус (Acct_Status_Type='2') ну и в принципе вроде бы всё хорошо. Проверка на единственное подключение работает хорошо, и двойные подключения скидывает.
Но вот тут произошла аварийная ситуация, отрубили свет на долгое время и машина с радиусклиентом и всеми подключениями клиентскими ушла в даун, после этого в базе остались висеть записи подключений со статусом 3 или 1, так и не сменившиеся на 2-ку.
Соответственно когда машинка заработала и клиенты решили подключиться у всех посыпались двойные авторизации и никого не пускало.
Пришлось подтирать записи самому, чтоб клиенты начали авторизовываться. Подскажите что можно сделать в такой ситуации? Чтоб у сессии менялся статус на 2-ку по таймауту, если определенное количество времени нет трафика никакого?
Ниже привожу запросы в базу:

Код: Выделить всё

authorize_check_query="SELECT ip_groups.ip_group_id, ip_groups.uname,'User-Password',ip_groups.upass,'&#58;=' FROM UTM5.ip
_groups, UTM5.iptraffic_service_links, UTM5.service_links, UTM5.accounts WHERE ip_groups.uname = '%&#123;SQL-User-Name&#125;' AN
D ip_groups.is_deleted='0' AND iptraffic_service_links.is_deleted='0' AND service_links.is_deleted='0' AND accounts.is
_deleted='0' AND accounts.is_blocked='0' AND ip_groups.ip_group_id=iptraffic_service_links.ip_group_id AND iptraffic_s
ervice_links.id=service_links.id AND service_links.account_id=accounts.id \
UNION SELECT ip_groups.ip_group_id, ip_groups.uname,'Simultaneous-Use','1','&#58;=' FROM UTM5.ip_groups, UTM5.iptraffic_se
rvice_links, UTM5.service_links, UTM5.accounts WHERE ip_groups.uname = '%&#123;SQL-User-Name&#125;' AND ip_groups.is_deleted='0'
 AND iptraffic_service_links.is_deleted='0' AND service_links.is_deleted='0' AND accounts.is_deleted='0' AND accounts.
is_blocked='0' AND ip_groups.ip_group_id=iptraffic_service_links.ip_group_id AND iptraffic_service_links.id=service_li
nks.id AND service_links.account_id=accounts.id" 

authorize_reply_query="SELECT ip_group_id, uname, 'Framed-IP-Address', \
inet_ntoa&#40;ip_groups.ip & 0xFFFFFFFF&#41; AS a, '&#58;=' FROM UTM5.ip_groups \
WHERE uname='%&#123;SQL-User-Name&#125;' AND is_deleted='0' \
UNION SELECT ip_group_id, uname, 'Auth-Type', 'Reject' as a, '&#58;=' \
FROM ip_groups WHERE uname='%&#123;SQL-User-Name&#125;' AND is_deleted='0'"

accounting_start_query = "INSERT INTO dhs_sessions_log &#40;account_id, slink_id, recv_date,last_update_date,Framed_IP_Add
ress, NAS_Port, Acct_Delay_Time, Acct_Session_Id, NAS_Port_Type, User_Name, Service_Type, Framed_Protocol, NAS_IP_Addr
ess, NAS_Id, Acct_Status_Type, Acct_Input_Packets, Acct_Input_Octets, Acct_Input_Gigawords, Acct_Output_Packets, Acct_
Output_Octets, Acct_Output_Gigawords, Acct_Session_Time, Acct_Terminate_Cause, Called_Station_Id, Calling_Station_Id &#41;
 \
VALUES &#40; &#40;select account_id from service_links where id in &#40; select id from iptraffic_service_links where is_deleted <
> '1' and ip_group_id in \
&#40; select ip_group_id from ip_groups where uname = '%&#123;SQL-User-Name&#125;' and is_deleted <> '1' &#41;&#41;&#41;, \
&#40; select id from iptraffic_service_links where is_deleted <> '1' and ip_group_id in &#40; select ip_group_id from ip_group
s where uname = '%&#123;SQL-User-Name&#125;' and is_deleted <> '1' &#41;&#41;, '%l','0', \
&#40;INET_ATON&#40;CONCAT_WS&#40;'.',SUBSTRING_INDEX&#40;'%&#123;Framed-IP-Address&#125;','.',-1&#41;,SUBSTRING_INDEX&#40;SUBSTRING_INDEX&#40;'%&#123;Framed-IP-A
ddress&#125;','.',-2&#41;,'.',1&#41;,SUBSTRING_INDEX&#40;SUBSTRING_INDEX&#40;'%&#123;Framed-IP-Address&#125;','.',2&#41;,'.',-1&#41;, SUBSTRING_INDEX&#40;'%&#123;Fram
ed-IP-Address&#125;','.',1&#41;&#41;&#41;&#41;, '%&#123;NAS-Port&#125;', '%&#123;Acct-Delay-Time&#125;', \
'%&#123;Acct-Session-Id&#125;', '%&#123;NAS-Port-Type&#125;', '%&#123;SQL-User-name&#125;', '%&#123;Service-Type&#125;', '%&#123;Framed-Protocol&#125;', &#40;INET_ATON&#40;CONC
AT_WS&#40;'.',SUBSTRING_INDEX&#40;'%&#123;NAS-IP-Address&#125;','.',-1&#41;, SUBSTRING_INDEX&#40;SUBSTRING_INDEX&#40;'%&#123;NAS-IP-Address&#125;','.',-2&#41;,'.'
,1&#41;,SUBSTRING_INDEX&#40;SUBSTRING_INDEX&#40;'%&#123;NAS-IP-Address&#125;','.',2&#41;,'.',-1&#41;,SUBSTRING_INDEX&#40;'%&#123;NAS-IP-Address&#125;','.#',1&#41;&#41;&#41;&#41;,
 '%&#123;NAS-IP-Address&#125;', '1', '%&#123;Acct-Input-Packets&#58;-0&#125;', '%&#123;Acct-Input-Octets&#58;-0&#125;', '%&#123;Acct-Input-Gigawords&#58;-0&#125;', '%&#123;Acc
t-Output-Packets&#58;-0&#125;', '%&#123;Acct-Output-Octets&#58;-0&#125;', '%&#123;Acct-Output-Gigawords&#58;-0&#125;', '%&#123;Acct-Session-Time&#58;-0&#125;', '%&#123;Acct-T
erminate-Cause&#58;-0&#125;', '%&#123;Called-Station-Id&#125;','%i' &#41;;"

accounting_update_query = "UPDATE dhs_sessions_log SET last_update_date=UNIX_TIMESTAMP&#40;'%S'&#41;, Acct_Status_Type='3', Ac
ct_Input_Packets ='%&#123;Acct-Input-Packets&#125;', Acct_Input_Octets ='%&#123;Acct-Input-Octets&#125;', Acct_Input_Gigawords ='%&#123;Acct-In
put-Gigawords&#125;', Acct_Output_Packets ='%&#123;Acct-Output-Packets&#125;', Acct_Output_Octets ='%&#123;Acct-Output-Octets&#125;', Acct_Outp
ut_Gigawords ='%&#123;Acct-Output-Gigawords&#125;', Acct_Terminate_Cause='%&#123;Acct-Terminate-Cause&#125;', Acct_Session_Time ='%&#123;Acct-S
ession-Time&#125;' WHERE Acct_Session_Id = '%&#123;Acct-Session-Id&#125;'"

accounting_stop_query = "UPDATE dhs_sessions_log SET last_update_date=UNIX_TIMESTAMP&#40;'%S'&#41;, Acct_Status_Type='2', Acct
_Input_Packets ='%&#123;Acct-Input-Packets&#125;', Acct_Input_Octets ='%&#123;Acct-Input-Octets&#125;', Acct_Input_Gigawords ='%&#123;Acct-Inpu
t-Gigawords&#125;', Acct_Output_Packets ='%&#123;Acct-Output-Packets&#125;', Acct_Output_Octets ='%&#123;Acct-Output-Octets&#125;', Acct_Output
_Gigawords ='%&#123;Acct-Output-Gigawords&#125;', Acct_Terminate_Cause='%&#123;Acct-Terminate-Cause&#125;', Acct_Session_Time ='%&#123;Acct-Ses
sion-Time&#125;' WHERE Acct_Session_Id = '%&#123;Acct-Session-Id&#125;'" 

simul_count_query = "SELECT COUNT&#40;*&#41; FROM dhs_sessions_log WHERE User_Name='%&#123;SQL-User-Name&#125;' AND &#40;Acct_Status_Type = 
'3' OR Acct_Status_Type = '1'&#41; "


Заранее спасибо.

Arti
Сообщения: 266
Зарегистрирован: Пн окт 01, 2007 02:44

Сообщение Arti »

Я об этом тоже задумывался.

Ничего не придумал лучше как проходить и закрывать сессии вручную по которым не было обновления больше чем XXX минут.

Вобще конешно это нужно убрать во внутрь authorize_check_query или simul_count_query/simul_verify_query.

P.S.

На мой взгляд authorize_check_query нужно сделать проще - т.к. наиболее частые запросы - это accounting_update_query и authorize_check_query. Общая идея "собезьянничана" c поста Magnum72.

На стенде сделал так:

Код: Выделить всё

authorize_check_query = "SELECT ip_gr.ip_group_id, ip_gr.uname, 'User-Password', ip_gr.upass, '&#58;='\
 FROM ip_groups AS ip_gr, iptraffic_service_links AS ip_ln, service_links AS s, account_tariff_link AS a, tariffs AS t, accounts AS aa\
  WHERE &#40; ip_gr.uname = '%&#123;SQL-User-Name&#125;' AND ip_gr.is_deleted = '0'\
   AND ip_ln.ip_group_id = ip_gr.ip_group_id AND ip_ln.is_deleted = '0'\
   AND s.id = ip_ln.id AND s.is_deleted = '0'\
   AND a.id = s.tariff_link_id\
   AND a.is_deleted = '0' AND t.id = a.tariff_id\
   AND aa.id = s.account_id AND aa.is_deleted = '0' AND aa.is_blocked = '0'&#41;"
Кстати говоря следующий запрос у меня аналогичный:

Код: Выделить всё

authorize_reply_query = "SELECT '', '%&#123;SQL-User-Name&#125;', fr_aaa.attr, fr_aaa.value, fr_aaa.op\
  FROM ip_groups AS ip_gr, iptraffic_service_links AS ip_ln, service_links AS svr_ln, account_tariff_link AS acn_t_lnk, free_radius_data AS fr_aaa\
    WHERE &#40; ip_gr.uname = '%&#123;SQL-User-Name&#125;' AND ip_gr.is_deleted = '0'\
      AND ip_ln.ip_group_id = ip_gr.ip_group_id AND ip_ln.is_deleted = '0'\
      AND svr_ln.id = ip_ln.id AND svr_ln.is_deleted = '0'\
      AND acn_t_lnk.id = svr_ln.tariff_link_id AND acn_t_lnk.is_deleted = '0'\
      AND fr_aaa.owner_id = acn_t_lnk.tariff_id&#41;\
UNION SELECT ip_group_id, uname, 'Framed-IP-Address', inet_ntoa&#40;ip_groups.ip & 0xFFFFFFFF&#41;, '&#58;='\
    FROM ip_groups\
    WHERE uname = '%&#123;SQL-User-Name&#125;' AND is_deleted='0'"
Что характерно в обоих запросах выбираются в сущности одни и теже данные. Неплохо бы это оптимизировать - мысли вслух приветсвуются

drag0mir
Сообщения: 64
Зарегистрирован: Сб ноя 24, 2007 13:46
Откуда: Нижний Новгород

Сообщение drag0mir »

Ничего не придумал лучше как проходить и закрывать сессии вручную по которым не было обновления больше чем XXX минут.
а каким образом? можно наглядно посмотреть решение?
скрипт с запросом в базу сколько по времени не обновлялась сессия, если если не обновлялась больше, чем XXX секунд, тогда меняем у нее статус, и пустить этот скрипт по крону?

или как лучше?

LMik
Сообщения: 39
Зарегистрирован: Вт фев 14, 2006 19:55

Сообщение LMik »

Аналогичная проблема. Есть идея при старте фрирадиуса просто дергать запрос, ставящий все сессии в "2".

Arti
Сообщения: 266
Зарегистрирован: Пн окт 01, 2007 02:44

Сообщение Arti »

Как-то так....

Код: Выделить всё

SELECT COUNT&#40;User_Name&#41; FROM dhs_sessions_log WHERE User_Name='%&#123;SQL-User-Name&#125;' AND &#40;Acct_Status_Type = '3' OR Acct_Status_Type = '1'&#41; AND last_update_date > &#40;UNIX_TIMESTAMP&#40;&#41; - 900&#41; ;
Кстати говоря... Для этой таблицы "штатные" индексы для Acct_Status_Type и last_update_date. Так что запрос с last_update_date > (UNIX_TIMESTAMP() - 900) будет выполняться значительно быстрее.

Да... там в старт сесси надо добавить last_update_date = UNIX_TIMESTAMP().

UPDATE - аналогичный его по крону.

Закрыто