Работает у кого CoA? Умеет ли его ABillS вообще?
Как по мне, с mpd5 это самый правильный вариант.
Сейчас рассматриваю варианты:
- Демон, который помнит время смены интервалов и дергает СоА;
Проверять из обработки Alive-ов.
Код: Выделить всё
#!/usr/bin/perl
use DBI;
#First, we need some configuration for MySQL:
$mysqlAHost = 'localhost';
$mysqlADb = 'abills';
$mysqlAUser = 'coa';
$mysqlAPassword = 'olololololo!';
$mysqlAConnect = "dbi:mysql:$mysqlADb;$mysqlAHost";
$Adbh = DBI->connect($mysqlAConnect, $mysqlAUser, $mysqlAPassword);
$Aquery = "SELECT dvc.user_name AS user_name, s.in_speed AS in_speed, s.out_speed AS out_speed, n.ip AS nas_ip, DECODE( n.mng_password, 'ololololololo' ) AS nas_password
FROM `dv_calls` AS dvc, `trafic_tarifs` AS s, `intervals` AS i, `dv_main` AS dv, `users` AS u, `nas` AS n
WHERE dvc.nas_id = n.id
AND n.nas_type = 'mpd5'
AND dvc.uid = u.uid
AND dv.uid = u.uid
AND dv.tp_id = i.tp_id
AND s.interval_id = i.id
AND i.begin <= CURTIME( )
AND i.end > CURTIME( ) ;";
$Asth = $Adbh->prepare($Aquery);
$Aresults = $Adbh->selectall_hashref($Aquery, 'user_name');
foreach $user_name (keys %$Aresults) {
$speed_in = $Aresults->{$user_name}->{in_speed} * 1024;
$speed_out = $Aresults->{$user_name}->{out_speed} * 1024;
$nasip = $Aresults->{$user_name}->{nas_ip};
$naspw = $Aresults->{$user_name}->{nas_password};
$burst_in = $speed_in * 2 / 16;
$burst_out = $speed_out * 2 / 16;
system ("/bin/echo User-Name=$user_name,mpd-limit+=\\\"in\#1=all shape $speed_in $burst_in pass\\\",mpd-limit+=\\\"out\#1=all shape $speed_out $burst_out pass\\\"|/usr/local/bin/radclient -x $nasip:3799 coa $naspw");
}
$Adbh->disconnect();
Код: Выделить всё
--- Auth.pm_backup_before_mpd5_patch 2010-04-11 01:50:13.000000000 +0300
+++ Auth.pm 2010-04-12 11:59:56.000000000 +0300
@@ -578,6 +578,38 @@
$RAD_PAIRS->{'Session-Timeout'}=604800;
}
}
+ elsif ($NAS->{NAS_TYPE} eq 'mpd5') {
+
+ my $EX_PARAMS = $self->ex_traffic_params({
+ traf_limit => $traf_limit,
+ deposit => $self->{DEPOSIT},
+ MAX_SESSION_TRAFFIC => $MAX_SESSION_TRAFFIC
+ });
+ my $limit_in = "";
+ my $limit_out = "";
+ my $speed_in = 0;
+ my $speed_out = 0;
+ my $burst_in = 0;
+ my $burst_out = 0;
+
+ if ($self->{USER_SPEED} > 0)
+ {
+ $speed_in = int($self->{USER_SPEED}) * $CONF->{KBYTE_SIZE};
+ $speed_out = $speed_in;
+ }
+ else {
+ $speed_in = int($EX_PARAMS->{speed}->{0}->{IN}) * $CONF->{KBYTE_SIZE};
+ $speed_out = int($EX_PARAMS->{speed}->{0}->{OUT}) * $CONF->{KBYTE_SIZE};
+ }
+
+ $burst_in = $speed_in * 2 / 16;
+ $burst_out = $speed_out * 2 / 16;
+ $limit_in .= "\"in#1=all shape $speed_in $burst_in pass\"";
+ $limit_out .= "\"out#1=all shape $speed_out $burst_out pass\"";
+ push @{ $RAD_PAIRS->{'mpd-limit'} }, $limit_in;
+ push @{ $RAD_PAIRS->{'mpd-limit'} }, $limit_out;
+
+}
###########################################################
# pppd + RADIUS plugin (Linux) http://samba.org/ppp/
# lepppd - PPPD IPv4 zone counters
Код: Выделить всё
#*******************************************************************
# HANGUP MPD
# hangup_mpd5($SERVER, $PORT)
#*******************************************************************
sub hangup_mpd5 {
my ($NAS, $PORT, $attr) = @_;
log_print('LOG_DEBUG', " HANGUP: SESSION: $attr->{ACCT_SESSION_ID}; NAS_MNG: $NAS->{NAS_MNG_IP_PORT} '$NAS->{NAS_MNG_PASSWORD}'\n");
system ("echo Acct-Session-Id=$attr->{ACCT_SESSION_ID} | radclient -x $NAS->{NAS_MNG_IP_PORT} 40 $NAS->{NAS_MNG_PASSWORD}");
return 0;
}
В системе реализированноAbram писал(а):Всем доброго времени суток.
Работает у кого CoA? Умеет ли его ABillS вообще?
Как по мне, с mpd5 это самый правильный вариант.
Сейчас рассматриваю варианты:
- Демон, который помнит время смены интервалов и дергает СоА;
Проверять из обработки Alive-ов.