Страница 1 из 1

Сброс сессии в MPD5

Добавлено: Сб мар 14, 2009 7:59 am
eGuru
Я подкорректировал код функции сброса подключения для NAS MPD5.

Вариант функции, используемый в исходниках abills нормально работает только с конфигом, приведенным в документации здесь на сайте. Причина - есть жесткая привязка с способу именования динамических линков. Имя линка должно начинаться строго на "L-", номер линка должен однозначно соответствовать номеру порта NAS. Такой вариант именования линков неприемлем, если используется несколько независимых шаблонов линка. Например для конфигурации сервера pppoe на нескольких интерфейсах.

Я исправил функцию так, чтобы для выбора нужного соединения использовалось значение аттрибута ACCT_SESSION_ID. Это значение генерируется самим MPD, является уникальным и однозначно связано с сессией. Таким образом обеспечивается выбор нужного соединения независимо от конфигурации MPD.

Ниже приведен код исправленной функции.
Для внесения исправлений необходимо в файле abills/Abills/nas.pl удалить старую функцию и на ее место вписать приведенную ниже.

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

#*******************************************************************
# HANGUP MPD
# hangup_mpd5($SERVER, $PORT)
#*******************************************************************
sub hangup_mpd5 {
  my ($NAS, $PORT, $attr) = @_;

  my $ctl_port = $attr->{ACCT_SESSION_ID};

  log_print('LOG_DEBUG', " HANGUP: SESSION: $ctl_port NAS_MNG: $NAS->{NAS_MNG_IP_PORT} '$NAS->{NAS_MNG_PASSWORD}'\n");

  my @commands=("\t",
                "Username: \t$NAS->{NAS_MNG_USER}",
                "Password: \t$NAS->{NAS_MNG_PASSWORD}",
                "\] \tsession $ctl_port",
                "\] \tclose",
                "\] \texit");

  my $result = telnet_cmd("$NAS->{NAS_MNG_IP_PORT}", \@commands, { debug => 1 });

  return 0;
}
Надеюсь, что код будет принят в будущие релизы abills.

Добавлено: Чт апр 09, 2009 6:44 pm
eGuru
Важное дополнение для пользователей версии 0.37 и, возможно, ниже.

Для корректной работы функции отключения, в коде файла libexec/billd необходимо исправить строчку №265. Привожу здесь фрагмент diff файла.

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

@@ -261,7 +262,7 @@


         if ( ($Billing->{PAYMENT_TYPE}==0) && ($line->[14] + $line->[15] <= $self->{SUM}) ) {
-           my $ret = hangup(\%NAS, "$nas_port_id", "$line->[0]", { ACCT_SESSION_IS      => $acct_session_id,
+           my $ret = hangup(\%NAS, "$nas_port_id", "$line->[0]", { ACCT_SESSION_ID      => $acct_session_id,
                                                                       FRAMED_IP_ADDRESS    => int2ip($line->[3]),
                                                                       ACCT_TERMINATE_CAUSE => 15,
                                                                       debug                => $debug
Новая строчка начинается с плюса.


В версии 0.37 нет поддержки mp5, я добавлял ее самостоятельно, попутно исправив несколько ошибок в коде биллинга.
В версии 0.41 описанная ошибка исправлена.

Привожу это замечание для пользователей версий до 0.41, решивших использовать мою функцию.