Страница 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 бит. ПОЧЕМУ!? Где идёт срез? Пока обошёлся заменой строки
на
Добавлено: Ср янв 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
ладно. Уговорил. Пока искал причину нашёл интересную вещь. А зачем скидывать с линии пр переходе с одного временного интервала на другой? Какой смысл заложен в это?