выложил бы свой линкапдаун или как там у тебя, а мы б уж как-нить раазобраалися - на то он и оуненсрцchtito2 писал(а):Сама linkupdown НЕ используется, а, как я написал, части linkupdown отвечающие за выставление нужной скорости ipfw (со всеми экспрессиями) были перенесены в racct.pl где обрабатывается радиус старт пакет. Т.е. слегка доработанная версия абиллса т.к. не делала что мне нужно.
Непонятки с описанием оплат
Вот патч к libexec/racct.pl для последней Abills current. Большие части пришли прямиком из linkupdown без изменений, свой код добавил только где правила непосредственно добавляются (мое выделено жирным). Изменения затронули только функцию acct(). Добавление правил происходит в ответ на радиус события старт/стоп. Не пойму какое это может иметь отношение к подсчету трафика Ipn из неправильной сетки через Netflow, т.к. подсчет к фаерволу отношения не имеет, но все же пусть взглянет кто-то более опытный.ran писал(а):выложил бы свой линкапдаун или как там у тебя, а мы б уж как-нить раазобраалися
Форматирование нарушает форум, но разобраться можно.
--- /root/abills-current/libexec/racct.pl 2008-04-28 20:29:38.000000000 +0500
+++ /root/abills-my/libexec/racct.pl 2008-05-15 14:12:58.000000000 +0500
@@ -295,6 +295,216 @@
#}
+ # chtito
+
+my $debug=0;
+ require Billing; Billing->import();
+ my $Billing = Billing->new($db, \%conf);
+ require Admins; Admins->import();
+ require Dv; Dv->import();
+ my $admin = Admins->new($db, \%conf);
+ $admin->info($conf{SYSTEM_ADMIN_ID}, { IP => '127.0.0.1' });
+ my $Dv = Dv->new($db, $admin, \%conf);
+ my %speeds = ();
+ my %nets = ();
+ my %expr = ();
+ my $user = $Dv->info(0, { LOGIN => $RAD_REQUEST{USER_NAME} });
+
+ if(defined($Dv->{errno})) {
+ print "[$Dv->{errno}] $Dv->{errstr}\n";
+ exit 1;
+ }
+ if ($user->{SPEED} > 0) {
+ $speeds{0}{IN}=int($user->{SPEED});
+ $speeds{0}{OUT}=int($user->{SPEED});
+ } else {
+ ($user->{TIME_INTERVALS},
+ $user->{INTERVAL_TIME_TARIF},
+ $user->{INTERVAL_TRAF_TARIF}) = $Billing->time_intervals($user->{TP_ID});
+
+ my ($remaining_time, $ret_attr) = $Billing->remaining_time($user->{DEPOSIT}, {
+ TIME_INTERVALS => $user->{TIME_INTERVALS},
+ INTERVAL_TIME_TARIF => $user->{INTERVAL_TIME_TARIF},
+ INTERVAL_TRAF_TARIF => $user->{INTERVAL_TRAF_TARIF},
+ SESSION_START => $user->{SESSION_START},
+ DAY_BEGIN => $user->{DAY_BEGIN},
+ DAY_OF_WEEK => $user->{DAY_OF_WEEK},
+ DAY_OF_YEAR => $user->{DAY_OF_YEAR},
+ REDUCTION => $user->{REDUCTION},
+ POSTPAID => 1,
+ GET_INTERVAL => 1,
+ debug => ($debug > 0) ? 1 : undef });
+
+# print "RT: $remaining_time\n" if ($debug == 1);
+ my %TT_IDS = %$ret_attr;
+
+
+ if (keys %TT_IDS > 0) {
+ require Tariffs;
+ Tariffs->import();
+ my $tariffs = Tariffs->new($db, \%conf, $admin);
+
+ #Get intervals
+ while(my($k, $v)=each( %TT_IDS)) {
+ print "$k, $v\n" if ($debug > 0);
+ $user->{TI_ID}=$v;
+ my $list = $tariffs->tt_list({ TI_ID => $v });
+ foreach my $line (@$list) {
+ $speeds{$line->[0]}{IN}="$line->[4]";
+ $speeds{$line->[0]}{OUT}="$line->[5]";
+ $nets{$line->[0]}="$line->[7]";
+ $expr{$line->[0]}="$line->[8]" if (length($line->[8]) > 5);
+ #print "$line->[0] $line->[4]\n";
+ }
+ }
+ }
+ }
+
+
+ # speed apply
+ my $fw_num_in =0;
+ my $fw_num_out =0;
+ my $pipe_num_in =0;
+ my $pipe_num_out =0;
+
+ print "Expresion:================================\n" if ($debug > 0);
+ my $RESULT = $Billing->expression($Dv->{UID}, \%expr, { START_PERIOD => $Dv->{ACCOUNT_ACTIVATE},
+ debug => $debug } );
+ print "\nEND: =====================================\n" if ($debug > 0);
+
+ if (! $RESULT->{SPEED}) {
+ $speeds{0}{IN}=$RESULT->{SPEED_IN} if($RESULT->{SPEED_IN});
+ $speeds{0}{OUT}=$RESULT->{SPEED_OUT} if($RESULT->{SPEED_OUT});
+ } else {
+ $speeds{0}{IN}=$RESULT->{SPEED};
+ $speeds{0}{OUT}=$RESULT->{SPEED};
+ }
+
+ while (my ($k, $v) = each %speeds) {
+ system("/usr/bin/logger ipfw $RAD->{ACCT_STATUS_TYPE} $RAD->{USER_NAME} \@$RAD->{FRAMED_IP_ADDRESS} speeds[$k] '=>' $v->{IN}/$v->{OUT}");
+ }
+
+ my $CLIENT_IP = $RAD->{FRAMED_IP_ADDRESS};
+ #my $CLIENT_NETMASK = $RAD->{FRAMED_IP_NETMASK};
+ #Make speed
+ foreach my $traf_type (sort keys %speeds) {
+ my $speed = $speeds{$traf_type};
+ my $table_in_id = $traf_type * 2;
+ my $table_out_id = $table_in_id + 1;
+
+ if ($acct_status_type == 1) {
+ my $speed_in_id = $speed->{IN};
+ my $speed_out_id = 30000 + $speed->{OUT};
+ system("/usr/bin/logger 'ipfw table $table_in_id add $CLIENT_IP $speed_in_id'");
+ system("/usr/bin/logger 'ipfw table $table_out_id add $CLIENT_IP $speed_out_id'");
+ system("/usr/local/bin/sudo /sbin/ipfw table $table_in_id add $CLIENT_IP $speed_in_id");
+ system("/usr/local/bin/sudo /sbin/ipfw table $table_out_id add $CLIENT_IP $speed_out_id");
+ print "start ip: table_id: $table_in_id/$table_out_id $CLIENT_IP speed_id: $speed_in_id/$speed_out_id\n";
+ } elsif ($acct_status_type == 2) {
+ system("/usr/bin/logger 'ipfw table $table_in_id delete $CLIENT_IP'");
+ system("/usr/bin/logger 'ipfw table $table_out_id delete $CLIENT_IP'");
+ system("/usr/local/bin/sudo /sbin/ipfw table $table_in_id delete $CLIENT_IP");
+ system("/usr/local/bin/sudo /sbin/ipfw table $table_out_id delete $CLIENT_IP");
+ print "stop ip: table_id: $table_in_id/$table_out_id $CLIENT_IP\n";
+ }
+ }
+
+
+ #/chtito
+
Опять же: все что в этом коде задумано происходит на ура (шейпинг). Но интересно как это могло затронуть то, что трафик в неправильную сеть засчитывается Абиллсом при подсчете flow-tools?
-
- Site Admin
- Сообщения: 5749
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация:
-
- Site Admin
- Сообщения: 5749
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация:
-
- Site Admin
- Сообщения: 5749
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация:
-
- Site Admin
- Сообщения: 5749
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация:
Да все понятно, только при смене тарифа у пользователя меняется дата активации - соответственно и абонплата снимается как с начала месяца. А если абонент сменит тариф скажем 6 раз в день, то и абоплата за месяц с него снимется 6 раз. Вот это и не устраиваетВ моей системе абон плата снимается всегда в начале учётного периода месячная в начале месяца дневная в начале дня

-
- Site Admin
- Сообщения: 5749
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация:
Хорошо... За деньги, специально для нас, можно чтолибо доработать, чтобы при переключении тарифа у пользователя на менялась дата активации, а оставалась прежней и соответственно не снималась абонплата? Просто в данном случае бесполезна функция неограниченого количества смен ТП, а заставляет менять ТП или по расписанию или раз в месяц, что совсем не айс....
-
- Site Admin
- Сообщения: 5749
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация: