Страница 1 из 2

Рвётся связь

Добавлено: Вт янв 02, 2007 4:07 am
Spider84
pppd + radius

рвётся связь. Потом её можно воставить и работать дальше. Но ведь она рвётся! Временной интервал разный от 3х минут до 12 часов. Было подозрение на Idle, но ведь у меня работает аська, да и рвётся бывает в процессе сёрфига.

Добавлено: Ср янв 03, 2007 6:42 am
Spider84
отвечаю сам себе, авось кому пригодится.
Разбирался я с этим глюком на шёл причину. Связь рвётся с отмазкой на истёкший лимит времени. Лимит устанавливается в Session-Timeout радиусом. Эту перемнную заполняет скрипт Auth.pm на основании данных из таблиц мускул.
Если нет ограничений на день, месяц или год, как в моём случае, то скрипт ограничивает (пытается) время соединения месяцем, точнее до первого числа следющего месяца.

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

UNIX_TIMESTAMP(DATE_FORMAT(DATE_ADD(curdate(), INTERVAL 1 MONTH), '%Y-%m-01')) - UNIX_TIMESTAMP() 
этой строкой. К примеру у меня получается 2453695 (из логов мускула), а скрипт выставляет в соединение 28863. А зависимость такая: 28863 = 0х70BF, 2453695 = 0х2570BF. Видно, что используется только младшие 16 бит. ПОЧЕМУ!? Где идёт срез? Пока обошёлся заменой строки

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

my $time_limit  = $self->{TIME_LIMIT};
на

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

my $time_limit  = 0;

Добавлено: Ср янв 03, 2007 6:49 am
~AsmodeuS~
Возможно это таже проблема что и в мпд счётчик на лимит сесии слишком мал в NAS сервера и поэтому нужно высталять саксимальную длительность сесии.

Добавлено: Ср янв 03, 2007 6:58 am
Spider84
Так ведь обрезаное число выходит уже из Перл скрипта. А на счёт короткого счётчика это ты зря. Она там вот какой:

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

int      maxconnect;     /* Maximum connect time (seconds) */
а это аж 32 бита

Добавлено: Ср янв 03, 2007 7:25 am
~AsmodeuS~
покажите результат

radtest.sh

будем щас разбираться

Добавлено: Ср янв 03, 2007 9:49 am
Spider84

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

# ./radtest.sh auth
auth
/opt/abills/libexec
Acct-Interim-Interval = 60,
Session-Timeout = 22240,
PPPD-Upstream-Speed-Limit = 0,
Octets-Direction = 1,
Framed-IP-Address = 10.7.0.2,
Session-Octets-Limit = 2147483648,
Framed-IP-Netmask = 255.255.255.255,
PPPD-Downstream-Speed-Limit = 0,

Auth test end
А должно быть 2447072

Добавлено: Ср янв 03, 2007 10:09 am
~AsmodeuS~
Опишите тарифный план

Добавлено: Ср янв 03, 2007 10:15 am
Spider84
а он то тут при чём?

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

SELECT IF (
dv.logins =0, tp.logins, dv.logins
) AS logins, 
IF (
dv.filter_id != '', dv.filter_id, tp.filter_id
), 
IF (
dv.ip >0, INET_NTOA( dv.ip ) , 0
), INET_NTOA( dv.netmask ) , dv.tp_id, dv.speed, dv.cid, tp.day_time_limit, tp.week_time_limit, tp.month_time_limit, UNIX_TIMESTAMP( DATE_FORMAT( DATE_ADD( curdate( ) , INTERVAL 1 
MONTH ) , '%Y-%m-01' ) ) - UNIX_TIMESTAMP( ) , tp.day_traf_limit, tp.week_traf_limit, tp.month_traf_limit, tp.octets_direction, 
IF (
count( un.uid ) + count( tp_nas.tp_id ) =0, 0, 
IF (
count( un.uid ) >0, 1, 2
)
), UNIX_TIMESTAMP( ) , UNIX_TIMESTAMP( DATE_FORMAT( FROM_UNIXTIME( UNIX_TIMESTAMP( ) ) , '%Y-%m-%d' ) ) , DAYOFWEEK( FROM_UNIXTIME( UNIX_TIMESTAMP( ) ) ) , DAYOFYEAR( FROM_UNIXTIME( UNIX_TIMESTAMP( ) ) ) , dv.disable, tp.max_session_duration, tp.payment_type, tp.credit_tresshold, tp.rad_pairs, count( i.id ) , tp.age, dv.callback
FROM (
dv_main dv, tarif_plans tp
)
LEFT JOIN users_nas un ON ( un.uid = dv.uid ) 
LEFT JOIN tp_nas ON ( tp_nas.tp_id = tp.id ) 
LEFT JOIN intervals i ON ( tp.id = i.tp_id ) 
WHERE dv.tp_id = tp.id
AND dv.uid = '1'
GROUP BY dv.uid
LIMIT 0 , 30 
даёт скрипту понять, что day_time_limit week_time_limit month_time_limit max_session_duration равны 0, от сюда скрипт делает вывод о использовании $self->{TIME_LIMIT}, которая в этом скрипте есть UNIX_TIMESTAMP( DATE_FORMAT( DATE_ADD( curdate( ) , INTERVAL 1
MONTH ) , '%Y-%m-01' ) ) - UNIX_TIMESTAMP( ). Так вот это самое значение и обрезается. Я в пере не сильно силён (мне си роднее), и вижу что переменные не типизируются. Так каким образом может сокращаться разрядность?

Добавлено: Ср янв 03, 2007 10:42 am
~AsmodeuS~
Просто если тарифный план с интервалами по трафику то рвёт на границе интервалов

Добавлено: Ср янв 03, 2007 11:17 am
~AsmodeuS~
Да а потом идут ещё вычисления нет ли подщёта трафика и т д

Добавлено: Ср янв 03, 2007 1:33 pm
Spider84
Да идут, но на эту цифру они уже не влияют. Ты или нет писал эти скрипты? Я за сутки уже разобрался в алгоритме. Знал бы точно как перл формирует переменные уже бы всё вылечилось.
В любом случае тарифный план я свой описал. Просто пустой тариф. Без всяких. ХАЛЯВА :)

Добавлено: Ср янв 03, 2007 2:09 pm
~AsmodeuS~
Не не я, я просто отвечаю на вопросы, єтио не мой биллинг, я сюда случайно попал :-))

проверить очень просто нужно поставить принт переменной

$self->{TIME_LIMIT}

нескольких местах

и увидить где точно она меняется или перенаправляется

и запустить radtest.sh


у меня кстати пробовал такого нету все нормально пашет.

Добавлено: Ср янв 03, 2007 4:49 pm
Spider84
Вот! Нашёл! В оригинале Auth.pm так:

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

 for(my $i=0; $i<=$#time_limits; $i++) {
   if ($time_limit > $time_limits[$i]) {
     $time_limit = $time_limits[$i];
    }
  }
Но почему "<=" ? Надо же просто меньше. Вот всё и наладилось.

Добавлено: Чт янв 04, 2007 8:34 am
~AsmodeuS~
количество елементов масива в перле

$#time_limits + 1

Тоесть при Вашем решении ситуации Вы пропускаете какойто лимит установленый биллингом

Добавлено: Чт янв 04, 2007 4:54 pm
Spider84
ладно. Уговорил. Пока искал причину нашёл интересную вещь. А зачем скидывать с линии пр переходе с одного временного интервала на другой? Какой смысл заложен в это?