Собственно скрипт
Код:
import bitel.billing.server.tariff.bean.*;
import bitel.billing.server.radius.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.script.bean.event.*;
import bitel.billing.server.util.*;
import java.mysql.*;
import bitel.billing.common.*;
import bitel.billing.server.util.telnet.TelnetSession;
import java.util.*;
speed = 0;
TarifType = 0;
cid = 0;
DateNow = new GregorianCalendar();
errCode = event.getErrorCode();
request = event.getRequest();
maclogin = request.getStringAttribute(RadiusStandartAttributes.Calling_Station_Id);
User_Name = request.getStringAttribute(RadiusStandartAttributes.User_Name);
login = event.getLogin();
loginid = login.getId();
ps = con.prepareStatement( "SELECT ip, mac_adr, mac_date FROM radius_pair_ip_1 WHERE id=?");
ps.setInt( 1, loginid );
rs = ps.executeQuery();
login_ip = 0;
if( rs.first() )
{
login_ip = rs.getLong( 1 );
ipadr = IPUtils.convertIpToString( login_ip );
macbase = rs.getString( 2 );
last_mac_change = rs.getDate ( 3 );
}
if( ((errCode != 0) && (errCode != 2)) || (errCode == 33))
{
ps = con.prepareStatement( "UPDATE user_login_1 SET connected=0 WHERE id=?" );
ps.setInt( 1, loginid );
ps.executeUpdate();
// разрешим логин с виртуальной сессией для перенаправления на странички ошибок
// кого и куда направить, знает микротик по errcode
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-Adress
raIp = new RadiusAttribute( 8 );
raIp.setIntValue((int) login_ip );
//Session-Timeout = 900 (15 min )
raStm = new RadiusAttribute( 27 );
raStm.setIntValue( 900 );
// Framed-Pool = suspensed
/*raFl = new RadiusAttribute( 88 );
raFl.setStringValue( "suspensed" );*/
response.addAttribute( raSt );
response.addAttribute( raFp );
response.addAttribute( raIp );
response.addAttribute( raStm );
//response.addAttribute( raFl );
}
if (macbase == null || last_mac_change == null)
{
DateNowSql = TimeUtils.convertCalendarToSqlDate ( DateNow );
psup = con.prepareStatement( "UPDATE radius_pair_ip_1 SET mac_adr=?, mac_date=? WHERE id=?" );
psup.setString ( 1, maclogin );
psup.setDate( 2, DateNowSql );
psup.setInt ( 3, loginid );
psup.executeUpdate();
macbase = maclogin;
}
if (last_mac_change != null && !maclogin.equals(macbase))
{
delta = TimeUtils.daysDelta (TimeUtils.convertSqlDateToCalendar ( last_mac_change ), DateNow );
if (!maclogin.equals(macbase) && delta > 30 )
{
DateNowSql = TimeUtils.convertCalendarToSqlDate ( DateNow );
psup = con.prepareStatement( "UPDATE radius_pair_ip_1 SET mac_adr=?, mac_date=? WHERE id=?");
psup.setString ( 1, maclogin );
psup.setDate( 2, DateNowSql );
psup.setInt ( 3, loginid );
psup.executeUpdate();
macbase = maclogin;
}
}
if (!maclogin.equals(macbase) )
{
errCode = 27;
print ( "AUTHENTICATION_REJECT but mac's non equals");
print ("login_ip: " + ipadr);
print ("mac from radius: " + maclogin);
print ("mac from base: " + macbase);
}
if ( errCode == 0 )
{
ps = con.prepareStatement( "UPDATE user_login_1 SET connected=1 WHERE id=?" );
ps.setInt( 1, loginid );
ps.executeUpdate();
// из текущего тарифа получаем нужную полосу
cid = event.getContractID();
ctm = new ContractTariffManager( con );
currentTariff = ctm.getContractTariff( cid, DateNow ).getTariffPlanID();
switch ( currentTariff )
{
case 2:
TarifType = 2;
break;
case 7:
speed = 256000;
TarifType = 3;
break;
case 8:
speed = 512000;
TarifType = 3;
break;
case 10:
speed = 768000;
TarifType = 3;
break;
case 11:
speed = 1024000;
TarifType = 3;
break;
case 12:
TarifType = 1;
break;
}
}
if( ((errCode == 0) || (errCode == 4)) || (errCode == 27) || (errCode == 33))
// Ошибки 0 - все ОК, 4 - нет денег, 27 - неверный МАК, 33 - договор приостановлен
{
//includeBGBS( "bgbs://ru.bitel.bgbilling.kernel.script.common.bean.ScriptLibrary/Telnet_Logon" );
//цепляемся к микротику
host = ( "192.168.8.1" );
port = (23);
login = ( "login+ct" );
pswd = ("password");
session = null;
try
{
session = new TelnetSession( host, port );
session.setLoginPromptSequence( ":" );
session.connect();
session.doCommand( login );
session.setLoginPromptSequence( ">" );
session.doCommand( pswd );
session.doCommand ( ":global ErrCode " + errCode);
session.doCommand ( ":global TarifType " + TarifType);
session.doCommand ( ":global UserIp " + ipadr);
session.doCommand ( ":global ContractId " + cid);
session.doCommand ( ":global UserName " + User_Name);
session.doCommand ( ":global UserSpeed " + speed);
session.doCommand ("/system script run [/system script find name=Logon_Script]");
session.doCommandAsync( "quit" );
}
catch( Exception e )
{
throw new RuntimeException( e );
print ( "connect error " );
}
finally
{
if ( session != null )
{
session.disconnect();
}
}
}
Только я чет как-то не нашёл, как использовать новый формат для этого события.
Кому интересен функционал этого скрипта, не копируйте без разбора, т.к. в нем используются самостоятельно добавленные столбцы и самописные скрипты в микротике. Описалово выложим в вики после доводки до ума.