Обработчик процессора протокола

Обработчик процессора протокола позволяет произвести пред/постобработку 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" );
}
}