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