Передача ACCEPT вместо REJECT вместе с доп. аттрибутами
Материал из BiTel WiKi
Версия от 19:42, 20 апреля 2008; Amir (Обсуждение | вклад)
Устанавливается в Автоматизация -> Функции скриптов поведения
Тип события: 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.*;
// 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=?" );
ps.setInt( 1, login.getId() );
rs = ps.executeQuery();
login_ip = 0;
while( rs.next() )
login_ip = rs.getInt( 1 );
// 0 - нет ошибки, 2 - ошибка ввода пароля.
if( event.getErrorCode() != 0 && event.getErrorCode() != 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
raIp = new RadiusAttribute( 8 );
raIp.setIntValue( 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 );
}
// Пишем в специальную табличку текущий код ошибки для дальнейшего вывода
// на специальной информационной страничке.
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, event.getErrorCode() );
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' ) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
