Убираем лимит траффика на сессию при анлим пакетах - решение

Ответить
NiTr0
Сообщения: 767
Зарегистрирован: Пт фев 08, 2008 4:46 pm

Убираем лимит траффика на сессию при анлим пакетах - решение

Сообщение NiTr0 »

При отсутствии лимита по траффику (типовый домашний анлим с ограничением скорости канала) скрипт авторизации передает радиус-клиенту лимит сессии, равный максимальному размеру сессии (параметр 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 гига на сессию только людям, у которых помегабайтная оплата... Но пока и это решение удовлетворяет.

NiTr0
Сообщения: 767
Зарегистрирован: Пт фев 08, 2008 4:46 pm

Сообщение NiTr0 »

Нашел более изящное решение, которое не делает пользователей, у которых на счету денег в пересчете на траффик > 2 ГБ, обладателями безлимитной сессии.

В 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;
         }
Порог в 2 МБ выбран экспериментально, т.к. рассчет доступного траффика биллинг проводит почему-то не всегда корректно, завышая его кол-во (погрешность до нескольких сотен кб, если не ошибаюсь), + pppd не всегда вовремя разрывает связь.

ИМХО неплохо было бы этот параметр как-то интегрировать в вебку... Т.к. "несъемный минимум средств на счету" всего лишь отнимается от депозита при рассчетах, т.е. при снижении депозита ниже него доступа к анлим-покетам не будет :(

По непонятным причинам с апдейтом из CVS от сегодняшнего числа не работает.

ЗЫ возможно, проверка if($in_prices{0} > 0 || $out_prices{0} > 0) { избыточна... Но особо нет времени разбираться в коде, т.к. я perl начал ковырять только пару дней назад, и он пока очень непривычный для меня...

NiTr0
Сообщения: 767
Зарегистрирован: Пт фев 08, 2008 4:46 pm

Re: Убираем лимит траффика на сессию при анлим пакетах - решение

Сообщение NiTr0 »

Учитывая актуальность темы до сих пор для некоторых пользователей, вот собссно патч:

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

--- 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

ran
Сообщения: 2298
Зарегистрирован: Вс окт 21, 2007 2:29 pm

Re: Убираем лимит траффика на сессию при анлим пакетах - решение

Сообщение ran »

Dv + Ipn + Session-Octets-Limit=0
Любой тупик - это тщательно замаскированный выход.

kvirtu
Сообщения: 363
Зарегистрирован: Вс июн 04, 2006 11:10 am
Контактная информация:

Re: Убираем лимит траффика на сессию при анлим пакетах - решение

Сообщение kvirtu »

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 Гига не заносяться
http://www.ultranet.ks.ua - локальная сеть в Херсоне

~AsmodeuS~
Site Admin
Сообщения: 5746
Зарегистрирован: Пт янв 28, 2005 3:11 pm
Контактная информация:

Re: Убираем лимит траффика на сессию при анлим пакетах - решение

Сообщение ~AsmodeuS~ »

просьба сообщать к какому снепшоту этот патч

и желательно прикреплять ещё ссылку на файл патча

NiTr0
Сообщения: 767
Зарегистрирован: Пт фев 08, 2008 4:46 pm

Re: Убираем лимит траффика на сессию при анлим пакетах - решение

Сообщение NiTr0 »

Это - к последнему 0.42 из каррента, и этот кусок где-то год (если не более) без изменений.
Сам патч вот.
Побочный эффект - добавляет (намеренно) несъемный лимит в мегабайтах (2 мб). Сделано для полубезлимитных тарифов - где пользователь может днем насидеть -0.0001 (pppd замечен в том, что разрывает сессии не сразу по достижению лимита, а немного позже - +- пару сотен кб, до метра), компенсируется небольшим кредитом.

kvirtu
Сообщения: 363
Зарегистрирован: Вс июн 04, 2006 11:10 am
Контактная информация:

Re: Убираем лимит траффика на сессию при анлим пакетах - решение

Сообщение kvirtu »

Думаю, было не плохо если бы Разработчик "внедрил" этот патчик в ветку 0.42
http://www.ultranet.ks.ua - локальная сеть в Херсоне

kvirtu
Сообщения: 363
Зарегистрирован: Вс июн 04, 2006 11:10 am
Контактная информация:

Re: Убираем лимит траффика на сессию при анлим пакетах - решение

Сообщение 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 - локальная сеть в Херсоне

ran
Сообщения: 2298
Зарегистрирован: Вс окт 21, 2007 2:29 pm

Re: Убираем лимит траффика на сессию при анлим пакетах - решение

Сообщение ran »

kvirtu писал(а):при очеееееееень длительных сессиях стала появляться такая ошибка:
2009-09-08 07:52:01 LOG_WARNING: AUTH [ivleon] NAS: 1 Not Allow time CID: 0:1f:c6:27:d5:80
ничо не понял... чьих длительных сессиях? усера ivleon??? так он же только авторизуется судя по сообщению :shock:
Любой тупик - это тщательно замаскированный выход.

kvirtu
Сообщения: 363
Зарегистрирован: Вс июн 04, 2006 11:10 am
Контактная информация:

Re: Убираем лимит траффика на сессию при анлим пакетах - решение

Сообщение kvirtu »

ran писал(а):
kvirtu писал(а):при очеееееееень длительных сессиях стала появляться такая ошибка:
2009-09-08 07:52:01 LOG_WARNING: AUTH [ivleon] NAS: 1 Not Allow time CID: 0:1f:c6:27:d5:80
ничо не понял... чьих длительных сессиях? усера ivleon??? так он же только авторизуется судя по сообщению :shock:
Сорри, не досмотрел по часовым интервалам .....
http://www.ultranet.ks.ua - локальная сеть в Херсоне

NiTr0
Сообщения: 767
Зарегистрирован: Пт фев 08, 2008 4:46 pm

Re: Убираем лимит траффика на сессию при анлим пакетах - решение

Сообщение NiTr0 »

В ходе тестирования выяснилось, что патч не шибко дружит с журналированием в базу, не сохраняется ошибка:

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

        ::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{error_msg}, и ставил $EX_PARAMS{error} в 1, а после вызова ex_traffic_params - проверяется флаг error и, соответственно, если >0 - вываливаемся с ошибкой.

~AsmodeuS~
Site Admin
Сообщения: 5746
Зарегистрирован: Пт янв 28, 2005 3:11 pm
Контактная информация:

Re: Убираем лимит траффика на сессию при анлим пакетах - решение

Сообщение ~AsmodeuS~ »

Не проще в радиус параметрах тарифного плана

!Session-Timeout=0

Ответить