abills-0.74 + mpd + mpd_filters

Ответить
eGuru
Сообщения: 36
Зарегистрирован: Вс апр 27, 2008 5:43 am
Откуда: Украина, Запорожье.
Контактная информация:

abills-0.74 + mpd + mpd_filters

Сообщение eGuru »

Я установил abills-0.74 на freebsd 10.3 по инструкции.

Настроил по инструкции сервер доступа mpd5 локально. Сервер доступа подключает абонента, нормально передает данные аккаунтинга, нормально работает отключение пользователя с линии по radius CoA.

Настроил периодический запуск /usr/abills/libexec/billd checkspeed NAS_IDS="1" . Скрипт отрабатывает без ошибок, может отключить пользователя с линии, но не меняет скорость. Беглый поиск по тексту скрипта показал, что состояние переменной mpd_filters нигде не проверяется.

Шейпер ng_car заработал, но не без допиливания.

billd.diff:

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

--- billd-orig  2016-08-01 09:48:12.000000000 +0300
+++ billd       2016-12-28 18:07:57.559651000 +0200
@@ -1208,13 +1208,14 @@
   }
   else{
     # Get global ips
-    if ( open( my $ph, '|-', "/sbin/ipfw table $users_table_number list" ) ){
-      while (<$ph>) {
+    #if ( open( my $ph, '|-', "/sbin/ipfw table $users_table_number list" ) ){
+    if ( open( PH, "/sbin/ipfw table $users_table_number list |" ) ){
+      while (<PH>) {
         if ( /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\/\d+\s?(\d+)/ ){
           $fw_ips{$1} = $2;
         }
       }
-      close( $ph );
+      close( PH );
     }
     else{
       print "Can't open file '/sbin/ipfw table $users_table_number list' $!\n";
@@ -1224,8 +1225,10 @@
     #Get ng_car speed
     if ( $conf{ng_car} ){
       #Get speed from server
-      open( my $ph, '|-', "/usr/sbin/ngctl list" ) || die "Can't open file '/usr/sbin/ngctl list' $!\n";
-      while (<$ph>) {
+      # AkhmetovAA 2016-12-28 replace open command
+      #open( my $ph, "|-", "/usr/sbin/ngctl list" ) || die "Can't open file '/usr/sbin/ngctl list' $!\n";
+      open(PROCS, "/usr/sbin/ngctl list |") || die "Can't open file '/usr/sbin/ngctl list' $!\n";
+      while (<PROCS>) {
         if ( /\s+Name: (class[\d+])_([a-zA-Z_0-9\-]+)/ ){
           my $class = $1;
           my $login = $2;
@@ -1239,8 +1242,9 @@

           $class =~ /(\d+)$/;
           my $class_id = $1;
-          open( my $SUB_NG, '|-', "/usr/sbin/ngctl msg $class" . "_$login: getconf" ) || die "Can't open $!\n";
-          while (<$SUB_NG>) {
+          #open( my $SUB_NG, '|-', "/usr/sbin/ngctl msg $class" . "_$login: getconf" ) || die "Can't open $!\n";
+          open( SUB_NG, "/usr/sbin/ngctl msg $class" . "_$login: getconf|" ) || die "Can't open $!\n";
+          while (<SUB_NG>) {
             if (
               /Args:\s*\{ upstream=\{ cbs=\d+ ebs=\d+ cir=(\d+) greenAction=\d yellowAction=\d redAction=\d mode=\d \} downstream=\{ cbs=\d+ ebs=\d+ cir=(\d+) greenAction=\d yellowAction=\d redAction=\d mode=\d \} \}/
             )
@@ -1249,10 +1253,10 @@
               $LOGINS_SPEEDS{$login}{$class_id}{OUT} = $2 / 1024;
             }
           }
-          close( $SUB_NG );
+          close( SUB_NG );
         }
       }
-      close( $ph );
+      close( PROCS );

       #show speed
       if ( $debug > 1 || $argv->{SHOW_SPEED} ){
@@ -1412,13 +1416,14 @@
   if ( $argv->{CHECK_GUEST} ){
     my %fw_guest_ips = ();
     my $fw_guest_table = 32;
-    if ( open( my $ph, '|-', "/sbin/ipfw table $fw_guest_table list" ) ){
-      while (<$ph>) {
+    #if ( open( my $ph, '|-', "/sbin/ipfw table $fw_guest_table list" ) ){
+    if ( open( PH, "/sbin/ipfw table $fw_guest_table list |" ) ){
+      while (<PH>) {
         if ( /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\/\d+\s?(\d+)/ ){
           $fw_guest_ips{$1} = $2 || '-';
         }
       }
-      close( $ph );
+      close( PH );
     }

     while(my ($ip, undef) = each %guest_ips) {
@@ -2084,7 +2089,10 @@
       . "/usr/sbin/ngctl msg $IFACE_ID:inet.1-0-mi setconf { upstream={ cbs=$cbs_in ebs=$ebs_in cir=$speed_in greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=$cbs_in ebs=$ebs_in cir=$speed_in greenAction=1 yellowAction=1 redAction=2 mode=2 } };";
   }
   elsif ( $NAS_TYPE =~ /mpd/ ){
-    $cmds = "$Bin/linkupdown mpd down ng$IFACE_ID proto 0.0.0.0 $USER_IP $USER_NAME $cmd_debug;" . "$Bin/linkupdown mpd up ng$IFACE_ID proto 0.0.0.0 $USER_IP $USER_NAME $cmd_debug;";
+    # (b) AkhmetovAA 2016-12-28 Take correct interface id from IP
+    my $t1 = `/sbin/route get $USER_IP | /usr/bin/awk \' /interface:/ { print \$2 } \'`;
+    (my $if_id) = $t1 =~ /(ng[0-9]*)/;
+    $cmds = "$Bin/linkupdown mpd down $if_id proto 0.0.0.0 $USER_IP $USER_NAME $cmd_debug;" . "$Bin/linkupdown mpd up $if_id proto 0.0.0.0 $USER_IP $USER_NAME $cmd_debug;";
   }
   elsif ( $NAS_TYPE =~ /pppd|accel_ppp/ ){
     $cmds = "$Bin/linkupdown pppd down ppp$IFACE_ID $USER_NAME $USER_IP;" . "$Bin/linkupdown  pppd up ppp$IFACE_ID $USER_NAME $USER_IP;";
@@ -2368,11 +2376,11 @@

     }
     else{
-      open( my $ph, '|-', "$IFCONFIG" ) || die "Can't open file '$IFCONFIG' $!\n";
-      while (my $l = <$ph>) {
+      open( PH, "$IFCONFIG |" ) || die "Can't open file '$IFCONFIG' $!\n";
+      while (my $l = <PH>) {
         $ifconfig .= $l;
       }
-      close( $ph );
+      close( PH );

       while ($ifconfig =~ /ng(\d+): .+\n\s+inet\s+[0-9\.]+\s+\-\->\s+([0-9\.]+).+\n/gi) {
         my $if = $1;
1. Не работает open в предложенном синтаксисе. Пришлось менять на старый. Не та версия perl ?
2. Вблизи комментария "# (b) AkhmetovAA 2016-12-28 Take correct interface id from IP" некорректно вызывается linkupdown. В типичной установке mpd атрибут NAS-Port не равен номеру интерфейса ng, Я вычисляю корректный интерфейс по IP.
3. linkupdown при выключении интерфейса удаляет ноды ng по числу классов в переменной SHAPER_CLASSES, а не числу классов используемого тарифа. Ошибки сыплются, но вроде работает. Оставил как есть.

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

Re: abills-0.74 + mpd + mpd_filters

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

мне кажеться труба не в ту сторону

eGuru
Сообщения: 36
Зарегистрирован: Вс апр 27, 2008 5:43 am
Откуда: Украина, Запорожье.
Контактная информация:

Re: abills-0.74 + mpd + mpd_filters

Сообщение eGuru »

~AsmodeuS~ писал(а):мне кажеться труба не в ту сторону
Вы по поводу п. 1. Не работает open в предложенном синтаксисе. Пришлось менять на старый. Не та версия perl ?

Я предполагаю, что у вас этот скрипт работает нормально.

Автоинтсталлятор абиллса поставил перл версии 5.20.3_15. Нужна другая? Или надо сделать какие-то настройки?

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

Re: abills-0.74 + mpd + mpd_filters

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

eGuru писал(а):
~AsmodeuS~ писал(а):мне кажеться труба не в ту сторону
Вы по поводу п. 1. Не работает open в предложенном синтаксисе. Пришлось менять на старый. Не та версия perl ?

Я предполагаю, что у вас этот скрипт работает нормально.

Автоинтсталлятор абиллса поставил перл версии 5.20.3_15. Нужна другая? Или надо сделать какие-то настройки?

труба настроена не в ту сторону нужно '-|'

eGuru
Сообщения: 36
Зарегистрирован: Вс апр 27, 2008 5:43 am
Откуда: Украина, Запорожье.
Контактная информация:

Re: abills-0.74 + mpd + mpd_filters

Сообщение eGuru »

Да, замена '|-' на '-|' помогла.

Там во всем скрипте стоит '|-', значит не заработает ни у кого. Наверное надо обновить дистрибутив бесплатной версии?


В linkupdown тоже попалась ошибка:

linkupdown.diff:

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

--- linkupdown-orig     2016-08-01 09:48:12.000000000 +0300
+++ linkupdown  2016-12-28 14:11:53.019649000 +0200
@@ -588,9 +588,11 @@
   msg %s_%s: setconf { upstream={ cbs=%d ebs=%d cir=%d greenAction=1 yellowAction=1 redAction=2 mode=2 }  downstream={ cbs=%d ebs=%d cir=%d greenAction=1 yellowAction=1 redAction=2 mode=2 } }"
       ,
       $tablearg_in,
-      $tablearg_in, $shape_type, $user,
-      $shape_type, $user, $tablearg_out,
-      $shape_type, $user,
+       # (b) AakhmetovAA 2016-12-28 correct error: $user -> $user_name
+      $tablearg_in, $shape_type, $user_name,
+      $shape_type, $user_name, $tablearg_out,
+      $shape_type, $user_name,
+       # (e) AakhmetovAA 2016-12-28 correct error: $user -> $user_name
       int( $cbs_in ), int( $ebs_in ), $speed_in,
       int( $cbs_out ), int( $ebs_out ), $speed_out
     );
При генерации имени узла netgraph берется не та переменная, из-за чего вместо имени вида class0_username получается class0_HASH(0x534034). Патч исправляет ошибку.

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

Re: abills-0.74 + mpd + mpd_filters

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

eGuru писал(а):Да, замена '|-' на '-|' помогла.

Там во всем скрипте стоит '|-', значит не заработает ни у кого. Наверное надо обновить дистрибутив бесплатной версии?


В linkupdown тоже попалась ошибка:

linkupdown.diff:

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

--- linkupdown-orig     2016-08-01 09:48:12.000000000 +0300
+++ linkupdown  2016-12-28 14:11:53.019649000 +0200
@@ -588,9 +588,11 @@
   msg %s_%s: setconf { upstream={ cbs=%d ebs=%d cir=%d greenAction=1 yellowAction=1 redAction=2 mode=2 }  downstream={ cbs=%d ebs=%d cir=%d greenAction=1 yellowAction=1 redAction=2 mode=2 } }"
       ,
       $tablearg_in,
-      $tablearg_in, $shape_type, $user,
-      $shape_type, $user, $tablearg_out,
-      $shape_type, $user,
+       # (b) AakhmetovAA 2016-12-28 correct error: $user -> $user_name
+      $tablearg_in, $shape_type, $user_name,
+      $shape_type, $user_name, $tablearg_out,
+      $shape_type, $user_name,
+       # (e) AakhmetovAA 2016-12-28 correct error: $user -> $user_name
       int( $cbs_in ), int( $ebs_in ), $speed_in,
       int( $cbs_out ), int( $ebs_out ), $speed_out
     );
При генерации имени узла netgraph берется не та переменная, из-за чего вместо имени вида class0_username получается class0_HASH(0x534034). Патч исправляет ошибку.

спасибо

но это все уже поправлено в поточной версии

Ответить