Обработчик процессора протокола
Обработчик процессора протокола позволяет произвести пред/постобработку RADIUS или DHCP-запросов - например, изменить RADIUS-запрос перед его обработкой системой или установить дополнительные опции, которые поменяют логику обработки запроса.
Обработчик привязывается к типу устройства, т.е. обработчик будет работать с запросами с устройств данного типа. При этом поочередно вызываются все обработчики в цепочке дерева, начиная от корня дерева до устройства, с которого пришел запрос.
В поставку модуля Inet входят стандартные обработчики для Cisco, Redback, MPD и т.п., позволяющие расширить интеграцию и функционал простым изменением конфигурации. Исходные коды находятся в Управлении динамическим кодом, в пакете ru.bitel.bgbilling.modules.inet.dyn. Данные классы перетираются при обновлении, поэтому для изменения логики класса необходимо расширить его или создать копию, но не изменять его напрямую.
Обработчик процессора протокола состоит из двух интерфейсов, которые он расширяет:
/**
* Обработчик RADIUS-запросов
*/
public
interface
RadiusProtocolHandler
{
/**
* Предобработка RADIUS-запроса Access-Request
* @param request
* @param response
* @param connectionSet
* @throws Exception
*/
public
void
preprocessAccessRequest( RadiusPacket request, RadiusPacket response, ConnectionSet connectionSet )
throws
Exception;
/**
* Постобработка RADIUS-запроса Access-Request
* @param request
* @param response
* @param connectionSet
* @throws Exception
*/
public
void
postprocessAccessRequest( RadiusPacket request, RadiusPacket response, ConnectionSet connectionSet )
throws
Exception;
/**
* Предобработка RADIUS-запроса Accounting-Request
* @param request
* @param response
* @param connectionSet
* @throws Exception
*/
public
void
preprocessAccountingRequest( RadiusPacket request, RadiusPacket response, ConnectionSet connectionSet )
throws
Exception;
/**
* Постобработка RADIUS-запроса Accounting-Request
* @param request
* @param response
* @param connectionSet
* @throws Exception
*/
public
void
postprocessAccountingRequest( RadiusPacket request, RadiusPacket response, ConnectionSet connectionSet )
throws
Exception;
}
/**
* Обработчик DHCP-запросов
*/
public
interface
DhcpProtocolHandler
{
/**
* Предобработка DHCP-запроса
* @param request
* @param response
* @throws Exception
*/
public
void
preprocessDhcpRequest( DhcpPacket request, DhcpPacket response )
throws
Exception;
/**
* Постобработка DHCP-запроса
* @param request
* @param response
* @throws Exception
*/
public
void
postprocessDhcpRequest( DhcpPacket request, DhcpPacket response )
throws
Exception;
}
/**
* Обработчик процессора протокола.
* @see RadiusProtocolHandler
* @author amir
*
*/
public
interface
ProtocolHandler
extends
RadiusProtocolHandler, DhcpProtocolHandler
{
public
void
init( Setup setup,
int
moduleId, InetDevice inetDevice, InetDeviceType inetDeviceType, ParameterMap config )
throws
Exception;
}
Например, такой обработчик будет подменять значение атрибута User-Name на значение идентификатора устройства + значение атрибута Nas-Port-Id, а значение пароля на "Password":
import
ru.bitel.bgbilling.kernel.network.radius.RadiusDictionary;
import
ru.bitel.bgbilling.kernel.network.radius.RadiusPacket;
import
ru.bitel.bgbilling.modules.inet.access.sa.ProtocolHandler;
import
ru.bitel.bgbilling.modules.inet.access.sa.ProtocolHandlerAdapter;
import
ru.bitel.bgbilling.modules.inet.api.common.bean.InetDevice;
import
ru.bitel.bgbilling.modules.inet.api.common.bean.InetDeviceType;
import
ru.bitel.bgbilling.server.util.Setup;
import
ru.bitel.common.ParameterMap;
import
ru.bitel.common.sql.ConnectionSet;
public
class
SomeProtocolHandler
extends
ProtocolHandlerAdapter
implements
ProtocolHandler
{
private
String deviceIdentifier;
@Override
public
void
init( Setup setup,
int
moduleId, InetDevice inetDevice, InetDeviceType inetDeviceType, ParameterMap deviceConfig )
throws
Exception
{
this
.deviceIdentifier = inetDevice.getIdentifier();
}
@Override
public
void
preprocessAccessRequest( RadiusPacket request, RadiusPacket response, ConnectionSet connectionSet )
throws
Exception
{
String nasPortId = request.getStringAttribute( -
1
, RadiusDictionary.NAS_Port_Id,
null
);
request.setStringAttribute( -
1
, RadiusDictionary.User_Name,
this
.deviceIdentifier +
":"
+ nasPortId );
request.setStringAttribute( -
1
, RadiusDictionary.User_Password,
"Password"
);
}
}