Реализовал вот такую логику:
Для договоров pfid=2 и fc=0 разрешено подключаться к VPN серверу только с определенных сетей.
Код:
import bitel.billing.server.call.bean.*;
import bitel.billing.server.radius.*;
import bitel.billing.server.dialup.bean.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.server.util.*;
import java.sql.*;
import java.util.*;
private getLogin_( req, resp )
{
result = null;
userName = req.getStringAttribute( RadiusStandartAttributes.User_Name );
if ( userName != null )
{
int pos = userName.indexOf( '\\' );
if( pos >= 0 )
{
userName = userName.substring( pos + 1 );
}
try
{
date_ = new java.util.Date();
result = new DialUpLoginManager( con, mid ).findLogin( userName,date_ );
}
catch ( Exception ex )
{
ex.printStackTrace();
}
finally
{
//setup.returnConToPool( con );
}
}
return result;
}
private WriteErrorLogin()
{
query = "SELECT max(id) FROM log_server_"+mid+"_"+TimeUtils.format(DateNow, "yyyyMM")+" WHERE requests LIKE '%User-Name="+User_Name+"\n%'";
ps = con.prepareStatement(query);
rs = ps.executeQuery();
if ( !rs.next() )
{
return;
}
log_rec_id = rs.getInt(1);
query = "SELECT id FROM nas_"+mid+" WHERE inet_ntoa(ipaddr)='"+nas_ip+"'";
ps = con.prepareStatement(query);
rs = ps.executeQuery();
if ( !rs.next() )
{
return;
}
nas_id = rs.getInt(1);
query = "SELECT * FROM log_error_"+mid+"_"+TimeUtils.format(DateNow, "yyyyMM")+" WHERE log_rec_id='"+log_rec_id+"'";
ps = con.prepareStatement(query);
rs = ps.executeQuery();
if ( rs.next() )
{
return;
}
query = "INSERT INTO log_error_"+mid+"_"+TimeUtils.format(DateNow, "yyyyMM")+" (dt,cid,lid,login,nas_id,error_code,log_rec_id) "+
"VALUES ('"+TimeUtils.format(DateNow, "yyyy-MM-dd HH:mm:ss")+"', '"+cid+"', '"+login_id+"', '"+User_Name+"', '"+nas_id+"', '27', '"+log_rec_id+"')";
psUpdate = con.prepareStatement( query );
psUpdate.executeUpdate();
}
mid = 1;
//Не проверять Calling_Station_Id
GROUP_NOT_Calling_Station_Id = 20;
request = event.getRequest();
response = event.getResponse();
con = setup.getDBConnectionFromPool();
User_Name = request.getStringAttribute(RadiusStandartAttributes.User_Name);
nas = request.getNAS();
nas_ip = nas.getNASIPAddress();
login = getLogin_(request,response);
login_ip = request.getStringAttribute(RadiusStandartAttributes.Calling_Station_Id);
login_id = login.getId();
cid = login.getCid();
contract = new ContractManager(con).getContractByID(cid);
contract_firma = contract.getFirmID();
contract_fc = contract.getFc();
contract_groups = contract.getGroups();
DateNow = new GregorianCalendar();
if (contract_firma == null)
{
setup.returnConToPool( con );
return;
};
if (nas_ip.indexOf("172.16.128.4") != -1)
{
setup.returnConToPool( con );
return;
};
if ((contract_groups & (1L<<GROUP_NOT_Calling_Station_Id )) > 0)
{
setup.returnConToPool( con );
return;
};
//ISPU физики
if (contract_firma == 2 && contract_fc == 0 && !login_ip.matches("^10\\.[1-4]\\.[0-9]{1,3}\\.[0-9]{1,3}$"))
{
response.setPacketType(RadiusPacket.AUTHENTICATION_REJECT);
print("Drop "+User_Name+" "+login_ip);
WriteErrorLogin();
setup.returnConToPool( con );
return;
}
//Обязательно закрыть соединение, иначе беда :)
setup.returnConToPool( con );
Все работает так как планировалось. Но мне не нравится функция WriteErrorLogin(), которая запивывае код ошибки в таблицу log_error_<mid>_<yyyymm>.
Возможно ли записать ошибку используя API?
Если можно, то подскажите как?
Спасибо.
вер. 4.5