Убираем лимит траффика на сессию при анлим пакетах - решение
Убираем лимит траффика на сессию при анлим пакетах - решение
При отсутствии лимита по траффику (типовый домашний анлим с ограничением скорости канала) скрипт авторизации передает радиус-клиенту лимит сессии, равный максимальному размеру сессии (параметр MAX_SESSION_TRAFFIC). Который = всего лишь 2 ГБ - для 512к пакета даже не так и много, и создает дополнительные неудобства пользователям.
Это решается изменением Auth.pm:
заменяем везде
if ($EX_PARAMS->{traf_limit} > 0) {
на
if (($EX_PARAMS->{traf_limit} > 0) && ($EX_PARAMS->{traf_limit} < $MAX_SESSION_TRAFFIC)) {
Минус решения - если у пользователя на счету на момент подключения средств достаточно на оплату >2 ГБ траффика, ему лимит на траффик не устанавливается.
Возможно, есть и более изящное решение - к примеру, дополнительная проверка на предмет анлимности, и установка лимита в 2 гига на сессию только людям, у которых помегабайтная оплата... Но пока и это решение удовлетворяет.
Это решается изменением Auth.pm:
заменяем везде
if ($EX_PARAMS->{traf_limit} > 0) {
на
if (($EX_PARAMS->{traf_limit} > 0) && ($EX_PARAMS->{traf_limit} < $MAX_SESSION_TRAFFIC)) {
Минус решения - если у пользователя на счету на момент подключения средств достаточно на оплату >2 ГБ траффика, ему лимит на траффик не устанавливается.
Возможно, есть и более изящное решение - к примеру, дополнительная проверка на предмет анлимности, и установка лимита в 2 гига на сессию только людям, у которых помегабайтная оплата... Но пока и это решение удовлетворяет.
Нашел более изящное решение, которое не делает пользователей, у которых на счету денег в пересчете на траффик > 2 ГБ, обладателями безлимитной сессии.
В Auth.pm в районе 1117 строки правим блок:
После правки выглядит так:
Если нужно сделать минимум средств на счету клиента, при которых невозможно получить доступ к помегабайтному пакету, но можно пользоваться анлимом/локалкой - то после строки
добавляем
Порог в 2 МБ выбран экспериментально, т.к. рассчет доступного траффика биллинг проводит почему-то не всегда корректно, завышая его кол-во (погрешность до нескольких сотен кб, если не ошибаюсь), + pppd не всегда вовремя разрывает связь.
ИМХО неплохо было бы этот параметр как-то интегрировать в вебку... Т.к. "несъемный минимум средств на счету" всего лишь отнимается от депозита при рассчетах, т.е. при снижении депозита ниже него доступа к анлим-покетам не будет
По непонятным причинам с апдейтом из CVS от сегодняшнего числа не работает.
ЗЫ возможно, проверка if($in_prices{0} > 0 || $out_prices{0} > 0) { избыточна... Но особо нет времени разбираться в коде, т.к. я perl начал ковырять только пару дней назад, и он пока очень непривычный для меня...
В Auth.pm в районе 1117 строки правим блок:
Код: Выделить всё
my $trafic_limit = 0;
#2Gb - (2048 * 1024 * 1024 ) - global traffic session limit
if (defined($trafic_limits{0}) && $trafic_limits{0} > 0 && $trafic_limits{0} < $EX_PARAMS{traf_limit}) {
if ($CONF->{MAX_SESSION_TRAFFIC}) {
$trafic_limit = ($trafic_limits{0} > $CONF->{MAX_SESSION_TRAFFIC}) ? $CONF->{MAX_SESSION_TRAFFIC} : $trafic_limits{0};
}
$EX_PARAMS{traf_limit} = ($trafic_limit < 1 && $trafic_limit > 0) ? 1 : int($trafic_limit);
}
Код: Выделить всё
my $trafic_limit = 0;
#2Gb - (2048 * 1024 * 1024 ) - global traffic session limit
if (defined($trafic_limits{0}) && $trafic_limits{0} > 0 && $trafic_limits{0} < $EX_PARAMS{traf_limit}) {
if ($CONF->{MAX_SESSION_TRAFFIC}) {
if($in_prices{0} > 0 || $out_prices{0} > 0) {
$trafic_limit = ($trafic_limits{0} > $CONF->{MAX_SESSION_TRAFFIC}) ? $CONF->{MAX_SESSION_TRAFFIC} - 1 : $trafic_limits{0};
}
}
$EX_PARAMS{traf_limit} = ($trafic_limit < 1 && $trafic_limit > 0) ? 1 : int($trafic_limit);
}
if (($CONF->{MAX_SESSION_TRAFFIC})&&($EX_PARAMS{traf_limit} >= $CONF->{MAX_SESSION_TRAFFIC})) {
$EX_PARAMS{traf_limit} = 0;
}
Код: Выделить всё
$trafic_limit = ($trafic_limits{0} > $CONF->{MAX_SESSION_TRAFFIC}) ? $CONF->{MAX_SESSION_TRAFFIC} - 1 : $trafic_limits{0};
Код: Выделить всё
$trafic_limit -= 2;
if($trafic_limit <= 0) {
print "Reply-Message = \"Rejected! You have money for less than 2 MB!\"";
exit 1;
}
ИМХО неплохо было бы этот параметр как-то интегрировать в вебку... Т.к. "несъемный минимум средств на счету" всего лишь отнимается от депозита при рассчетах, т.е. при снижении депозита ниже него доступа к анлим-покетам не будет
По непонятным причинам с апдейтом из CVS от сегодняшнего числа не работает.
ЗЫ возможно, проверка if($in_prices{0} > 0 || $out_prices{0} > 0) { избыточна... Но особо нет времени разбираться в коде, т.к. я perl начал ковырять только пару дней назад, и он пока очень непривычный для меня...
Re: Убираем лимит траффика на сессию при анлим пакетах - решение
Учитывая актуальность темы до сих пор для некоторых пользователей, вот собссно патч:
Код: Выделить всё
--- abills/Abills/mysql/Auth.pm 2009-05-04 12:25:57.000000000 +0300
+++ abills-mod/Abills/mysql/Auth.pm 2009-08-26 01:10:04.000000000 +0300
@@ -1166,7 +1287,7 @@
if ($used_traffic->{TRAFFIC_COUNTER} < $prepaids{0}) {
- $trafic_limits{0}=$prepaids{0} - $used_traffic->{TRAFFIC_COUNTER};
+ $trafic_limits{0}=$prepaids{0} - $used_traffic->{TRAFFIC_COUNTER} + 3;
}
elsif($in_prices{0} > 0 && $out_prices{0} > 0) {
$trafic_limits{0} = ($deposit / (($in_prices{0} + $out_prices{0}) / 2));
@@ -1238,11 +1359,25 @@
#2Gb - (2048 * 1024 * 1024 ) - global traffic session limit
if (defined($trafic_limits{0}) && $trafic_limits{0} > 0 && $trafic_limits{0} < $EX_PARAMS{traf_limit}) {
if ($CONF->{MAX_SESSION_TRAFFIC}) {
- $trafic_limit = ($trafic_limits{0} > $CONF->{MAX_SESSION_TRAFFIC}) ? $CONF->{MAX_SESSION_TRAFFIC} : $trafic_limits{0};
+ if($in_prices{0} > 0 || $out_prices{0} > 0) {
+
+ $trafic_limit = ($trafic_limits{0} > $CONF->{MAX_SESSION_TRAFFIC}) ? $CONF->{MAX_SESSION_TRAFFIC} : $trafic_limits{0};
+ $trafic_limit -= 2;
+
+ if($trafic_limit <= 0) {
+ ::log_print('LOG_WARNING',"AUTH [$self->{LOGIN}] User has money for less than 2 MB ($self->{DEPOSIT} - for $trafic_limits{0} MB), rejected.");
+ print "Reply-Message = \"Rejected! You have money for less than 2 MB!\"";
+ exit 1;
+ }
+ }
}
$EX_PARAMS{traf_limit} = ($trafic_limit < 1 && $trafic_limit > 0) ? 1 : int($trafic_limit);
}
+if ($EX_PARAMS{traf_limit} >= $CONF->{MAX_SESSION_TRAFFIC}) {
+ $EX_PARAMS{traf_limit} = 0;
+ }
+
#Local Traffic limit
if (defined($trafic_limits{1}) && $trafic_limits{1} > 0) {
#10Gb - (10240 * 1024 * 1024) - local traffic session limit
Re: Убираем лимит траффика на сессию при анлим пакетах - решение
Dv + Ipn + Session-Octets-Limit=0
Любой тупик - это тщательно замаскированный выход.
Re: Убираем лимит траффика на сессию при анлим пакетах - решение
Cпасибо, проблема решилась !
добавил в abills/Abills/mysql/Auth.pm :
эти строки:
1. if($in_prices{0} > 0 || $out_prices{0} > 0) {
2. эту изменил:
$trafic_limit = ($trafic_limits{0} > $CONF->{MAX_SESSION_TRAFFIC}) ? $CONF->{MAX_SESSION_TRAFFIC} - 1 : $trafic_limits{0};
3. if ($EX_PARAMS{traf_limit} >= $CONF->{MAX_SESSION_TRAFFIC}) {
4. $EX_PARAMS{traf_limit} = 0;
5. }
Получаеться что при достижении 4 Гиг счетчик обнуляеться, Но сессия не рветься,
и в статистику пользователя эти 4 Гига не заносяться
добавил в abills/Abills/mysql/Auth.pm :
эти строки:
1. if($in_prices{0} > 0 || $out_prices{0} > 0) {
2. эту изменил:
$trafic_limit = ($trafic_limits{0} > $CONF->{MAX_SESSION_TRAFFIC}) ? $CONF->{MAX_SESSION_TRAFFIC} - 1 : $trafic_limits{0};
3. if ($EX_PARAMS{traf_limit} >= $CONF->{MAX_SESSION_TRAFFIC}) {
4. $EX_PARAMS{traf_limit} = 0;
5. }
Получаеться что при достижении 4 Гиг счетчик обнуляеться, Но сессия не рветься,
и в статистику пользователя эти 4 Гига не заносяться
http://www.ultranet.ks.ua - локальная сеть в Херсоне
-
- Site Admin
- Сообщения: 5746
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация:
Re: Убираем лимит траффика на сессию при анлим пакетах - решение
просьба сообщать к какому снепшоту этот патч
и желательно прикреплять ещё ссылку на файл патча
и желательно прикреплять ещё ссылку на файл патча
Re: Убираем лимит траффика на сессию при анлим пакетах - решение
Это - к последнему 0.42 из каррента, и этот кусок где-то год (если не более) без изменений.
Сам патч вот.
Побочный эффект - добавляет (намеренно) несъемный лимит в мегабайтах (2 мб). Сделано для полубезлимитных тарифов - где пользователь может днем насидеть -0.0001 (pppd замечен в том, что разрывает сессии не сразу по достижению лимита, а немного позже - +- пару сотен кб, до метра), компенсируется небольшим кредитом.
Сам патч вот.
Побочный эффект - добавляет (намеренно) несъемный лимит в мегабайтах (2 мб). Сделано для полубезлимитных тарифов - где пользователь может днем насидеть -0.0001 (pppd замечен в том, что разрывает сессии не сразу по достижению лимита, а немного позже - +- пару сотен кб, до метра), компенсируется небольшим кредитом.
Re: Убираем лимит траффика на сессию при анлим пакетах - решение
Думаю, было не плохо если бы Разработчик "внедрил" этот патчик в ветку 0.42
http://www.ultranet.ks.ua - локальная сеть в Херсоне
Re: Убираем лимит траффика на сессию при анлим пакетах - решение
при очеееееееень длительных сессиях стала появляться такая ошибка:
2009-09-08 07:52:01 LOG_WARNING: AUTH [ivleon] NAS: 1 Not Allow time CID: 0:1f:c6:27:d5:80
2009-09-08 07:52:01 LOG_WARNING: AUTH [ivleon] NAS: 1 Not Allow time CID: 0:1f:c6:27:d5:80
http://www.ultranet.ks.ua - локальная сеть в Херсоне
Re: Убираем лимит траффика на сессию при анлим пакетах - решение
ничо не понял... чьих длительных сессиях? усера ivleon??? так он же только авторизуется судя по сообщениюkvirtu писал(а):при очеееееееень длительных сессиях стала появляться такая ошибка:
2009-09-08 07:52:01 LOG_WARNING: AUTH [ivleon] NAS: 1 Not Allow time CID: 0:1f:c6:27:d5:80
Любой тупик - это тщательно замаскированный выход.
Re: Убираем лимит траффика на сессию при анлим пакетах - решение
Сорри, не досмотрел по часовым интервалам .....ran писал(а):ничо не понял... чьих длительных сессиях? усера ivleon??? так он же только авторизуется судя по сообщениюkvirtu писал(а):при очеееееееень длительных сессиях стала появляться такая ошибка:
2009-09-08 07:52:01 LOG_WARNING: AUTH [ivleon] NAS: 1 Not Allow time CID: 0:1f:c6:27:d5:80
http://www.ultranet.ks.ua - локальная сеть в Херсоне
Re: Убираем лимит траффика на сессию при анлим пакетах - решение
В ходе тестирования выяснилось, что патч не шибко дружит с журналированием в базу, не сохраняется ошибка:
Обошел просто - сообщение об ошибке писал в $EX_PARAMS{error_msg}, и ставил $EX_PARAMS{error} в 1, а после вызова ex_traffic_params - проверяется флаг error и, соответственно, если >0 - вываливаемся с ошибкой.
Код: Выделить всё
::log_print('LOG_WARNING',"AUTH [$self->{LOGIN}] User has money for less than 2 MB ($self->{DEPOSIT} - for $trafic_limits{0} MB), rejected.");
print "Reply-Message = \"Rejected! You have money for less than 2 MB!\"";
exit 1;
-
- Site Admin
- Сообщения: 5746
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация:
Re: Убираем лимит траффика на сессию при анлим пакетах - решение
Не проще в радиус параметрах тарифного плана
!Session-Timeout=0
!Session-Timeout=0