abills-0.74 + mpd + mpd_filters
Добавлено: Ср дек 28, 2016 6:33 pm
Я установил abills-0.74 на freebsd 10.3 по инструкции.
Настроил по инструкции сервер доступа mpd5 локально. Сервер доступа подключает абонента, нормально передает данные аккаунтинга, нормально работает отключение пользователя с линии по radius CoA.
Настроил периодический запуск /usr/abills/libexec/billd checkspeed NAS_IDS="1" . Скрипт отрабатывает без ошибок, может отключить пользователя с линии, но не меняет скорость. Беглый поиск по тексту скрипта показал, что состояние переменной mpd_filters нигде не проверяется.
Шейпер ng_car заработал, но не без допиливания.
billd.diff:
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, а не числу классов используемого тарифа. Ошибки сыплются, но вроде работает. Оставил как есть.
Настроил по инструкции сервер доступа 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;
2. Вблизи комментария "# (b) AkhmetovAA 2016-12-28 Take correct interface id from IP" некорректно вызывается linkupdown. В типичной установке mpd атрибут NAS-Port не равен номеру интерфейса ng, Я вычисляю корректный интерфейс по IP.
3. linkupdown при выключении интерфейса удаляет ноды ng по числу классов в переменной SHAPER_CLASSES, а не числу классов используемого тарифа. Ошибки сыплются, но вроде работает. Оставил как есть.