Передача ACCEPT вместо REJECT вместе с доп. аттрибутами

Материал из BiTel WiKi

(Различия между версиями)
Перейти к: навигация, поиск
(Отмена правки № 155 участника 127.0.0.1 (обсуждение))
(Правка выборки IP адреса. Если у клиента было назначено несколько адресов в разные периоды времени, то выбирался самый первый. Добавлено)
 
(5 промежуточных версий не показаны.)
Строка 4: Строка 4:
Про привязки скриптов поведения к договору читайте в документации к BGBilling.
Про привязки скриптов поведения к договору читайте в документации к BGBilling.
-
<pre>
+
<source lang="java">
import bitel.billing.server.call.bean.Login;
import bitel.billing.server.call.bean.Login;
import bitel.billing.server.radius.*;
import bitel.billing.server.radius.*;
Строка 10: Строка 10:
import bitel.billing.server.script.event.*;
import bitel.billing.server.script.event.*;
import java.util.*;
import java.util.*;
 +
import bitel.billing.common.*;
 +
 +
cid = event.getContractID();
 +
contract = new ContractManager(con).getContractByID(cid);
 +
BalanceMode = contract.getBalanceMode();
 +
if (BalanceMode == 0)
 +
{
 +
//Пропускаем тех кто работает по факту
 +
return;
 +
};
 +
DateNow = new GregorianCalendar();
 +
date_str=TimeUtils.format(DateNow, "yyyy-MM-dd");
 +
print (date_str);
// event.getRequest|getResponse|getLogin|getContract|getErrorCode
// event.getRequest|getResponse|getLogin|getContract|getErrorCode
login = event.getLogin();
login = event.getLogin();
-
 
+
// Ищем пользователя и IP, привязанный к нему в таблице
// Ищем пользователя и IP, привязанный к нему в таблице
// "radius_pair_ip_x", где "x" код модуля Dialup.
// "radius_pair_ip_x", где "x" код модуля Dialup.
-
ps = con.prepareStatement( "SELECT ip FROM radius_pair_ip_1 WHERE id=?" );
+
ps = con.prepareStatement( "SELECT ip FROM radius_pair_ip_1 WHERE id=? and date2 is NULL and date1<='"+date_str+"'" );
-
 
+
ps.setInt( 1, login.getId() );
ps.setInt( 1, login.getId() );
rs = ps.executeQuery();
rs = ps.executeQuery();
Строка 23: Строка 36:
login_ip = 0;
login_ip = 0;
while( rs.next() )
while( rs.next() )
-
   login_ip = rs.getInt( 1 );
+
   login_ip = rs.getLong( 1 );
 +
 
 +
errCode = event.getErrorCode();
 +
 
 +
// Если логину не присвоен IP-адрес, то даем AUTH_REJECT.
 +
if( login_ip == 0 )
 +
{
 +
  errCode = 2;
 +
  response = event.getResponse();
 +
  response.setPacketType( RadiusPacket.AUTHENTICATION_REJECT );
 +
}
// 0 - нет ошибки, 2 - ошибка ввода пароля.
// 0 - нет ошибки, 2 - ошибка ввода пароля.
-
if( event.getErrorCode() != 0 && event.getErrorCode() != 2 )
+
if( errCode != 0 && errCode != 2 )
{
{
Строка 44: Строка 67:
   // Framed-IP-Address
   // Framed-IP-Address
 +
  //(int)login_ip чтобы установить Long значение в SetIntValue
 +
  //иначе для адресов выше 2147483647 будет выдаваться неверный адрес
   raIp = new RadiusAttribute( 8 );
   raIp = new RadiusAttribute( 8 );
-
   raIp.setIntValue( login_ip );
+
   raIp.setIntValue((int) login_ip );
   // Session-Timeout = 900 (15 min)
   // Session-Timeout = 900 (15 min)
Строка 72: Строка 97:
}
}
-
// Пишем в специальную табличку текущий код ошибки для дальнейшего вывода
+
// Пишем в специальную табличку текущий код ошибки, кроме Password Error,
-
// на специальной информационной страничке.
+
// для дальнейшего вывода на специальной информационной страничке.
 +
if( errCode != 2 )
 +
{
 +
    ps = con.prepareStatement( "SELECT ip FROM dialup_conn_error WHERE ip=?" );
-
ps = con.prepareStatement( "SELECT ip FROM dialup_conn_error WHERE ip=?" );
+
    ps.setInt( 1, login_ip );
 +
    rs = ps.executeQuery();
-
ps.setInt( 1, login_ip );
+
    found = false;
-
rs = ps.executeQuery();
+
    while( rs.next() )
 +
      found = true;
-
found = false;
+
    if( found )
-
while( rs.next() )
+
      ps = con.prepareStatement( "UPDATE dialup_conn_error SET error_code=? WHERE ip=?" );
-
  found = true;
+
    else
 +
      ps = con.prepareStatement( "INSERT INTO dialup_conn_error(error_code,ip) VALUES(?,?)" );
-
if( found )
+
    ps.setInt( 1, errCode );
-
  ps = con.prepareStatement( "UPDATE dialup_conn_error SET error_code=? WHERE ip=?" );
+
    ps.setInt( 2, login_ip );
-
else
+
-
  ps = con.prepareStatement( "INSERT INTO dialup_conn_error(error_code,ip) VALUES(?,?)" );
+
-
ps.setInt( 1, event.getErrorCode() );
+
    ps.executeUpdate();
-
ps.setInt( 2, login_ip );
+
}
-
 
+
</source>
-
ps.executeUpdate();
+
-
 
+
-
</pre>
+
Структура таблицы dialup_conn_error:
Структура таблицы dialup_conn_error:
-
<pre>
+
<source lang="sql">
CREATE TABLE `dialup_conn_error` (
CREATE TABLE `dialup_conn_error` (
   `ip` int(11) NOT NULL default '0',
   `ip` int(11) NOT NULL default '0',
   `error_code` int(11) NOT NULL default '0'
   `error_code` int(11) NOT NULL default '0'
-
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;  
+
);  
-
</pre>
+
</source>

Текущая версия на 05:19, 5 октября 2009

Устанавливается в Автоматизация -> Функции скриптов поведения

Тип события: RADIUS-аутентификация.

Про привязки скриптов поведения к договору читайте в документации к BGBilling.

import bitel.billing.server.call.bean.Login;
import bitel.billing.server.radius.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.script.event.*;
import java.util.*;
import bitel.billing.common.*;
 
cid = event.getContractID();
contract = new ContractManager(con).getContractByID(cid);
BalanceMode = contract.getBalanceMode();
 
if (BalanceMode == 0)
{
	//Пропускаем тех кто работает по факту
	return;
};
DateNow = new GregorianCalendar();
date_str=TimeUtils.format(DateNow, "yyyy-MM-dd"); 
print (date_str);
// event.getRequest|getResponse|getLogin|getContract|getErrorCode
login = event.getLogin();
 
// Ищем пользователя и IP, привязанный к нему в таблице
// "radius_pair_ip_x", где "x" код модуля Dialup.
ps = con.prepareStatement( "SELECT ip FROM radius_pair_ip_1 WHERE id=? and date2 is NULL and date1<='"+date_str+"'" );
 
ps.setInt( 1, login.getId() );
rs = ps.executeQuery();
 
login_ip = 0;
while( rs.next() )
  login_ip = rs.getLong( 1 );
 
errCode = event.getErrorCode();
 
// Если логину не присвоен IP-адрес, то даем AUTH_REJECT.
if( login_ip == 0 )
{
  errCode = 2;
  response = event.getResponse();
  response.setPacketType( RadiusPacket.AUTHENTICATION_REJECT );
}
 
// 0 - нет ошибки, 2 - ошибка ввода пароля.
if( errCode != 0 && errCode != 2 )
{
 
  response = event.getResponse();
 
  response.setPacketType( RadiusPacket.AUTHENTICATION_ACCEPT );
 
  // Готовим аттрибуты на отдачу
 
  // Service-Type = 2 
  raSt = new RadiusAttribute( 6 ); 
  raSt.setIntValue( 2 );
 
  // Framed-Protocol = 1
  raFp = new RadiusAttribute( 7 ); 
  raFp.setIntValue( 1 );
 
  // Framed-IP-Address
  //(int)login_ip чтобы установить Long значение в SetIntValue
  //иначе для адресов выше 2147483647 будет выдаваться неверный адрес
  raIp = new RadiusAttribute( 8 );
  raIp.setIntValue((int) login_ip );
 
  // Session-Timeout = 900 (15 min)
  raStm = new RadiusAttribute( 27 ); 
  raStm.setIntValue( 900 );
 
  // Ascend-Client-Primary-DNS (192.168.0.3 или 3232235523 в DEC)
  rvaDNS = new RadiusVendorAttribute( 529, 135 );
  rvaDNS.setIntValue( 3232235523 );
 
  // Cisco-AV-Pair, устанавливаем WCCP-редирект на интерфейс
  rva = new RadiusVendorAttribute( 9, 1 );
  rva.setStringValue( "lcp:interface-config=ip wccp web-cache redirect in" );
 
  // Cisco-AV-Pair, Устанавливаем access-list 155 на интерфейс
  rvaAcc = new RadiusVendorAttribute( 9, 1 );
  rvaAcc.setStringValue( "ip:inacl=155" );
 
  response.addAttribute( raStm );
  response.addAttribute( raSt );
  response.addAttribute( raFp );
  response.addAttribute( raIp );
  response.addVendorAttribute( rvaDNS );
  response.addVendorAttribute( rva );
  response.addVendorAttribute( rvaAcc );
}
 
// Пишем в специальную табличку текущий код ошибки, кроме Password Error,
// для дальнейшего вывода на специальной информационной страничке.
if( errCode != 2 )
{
    ps = con.prepareStatement( "SELECT ip FROM dialup_conn_error WHERE ip=?" );
 
    ps.setInt( 1, login_ip );
    rs = ps.executeQuery();
 
    found = false;
    while( rs.next() )
      found = true;
 
    if( found )
      ps = con.prepareStatement( "UPDATE dialup_conn_error SET error_code=? WHERE ip=?" );
    else
      ps = con.prepareStatement( "INSERT INTO dialup_conn_error(error_code,ip) VALUES(?,?)" );
 
    ps.setInt( 1, errCode );
    ps.setInt( 2, login_ip );
 
    ps.executeUpdate();
}


Структура таблицы dialup_conn_error:

CREATE TABLE `dialup_conn_error` (
  `ip` int(11) NOT NULL DEFAULT '0',
  `error_code` int(11) NOT NULL DEFAULT '0'
);
Личные инструменты