Workaround - пробегаем раз в 4 секунды по всем сессиям на всех насах и мэппим ip->session , если отсутствует:
Код:
package ru.dsi.bgbilling.radius;
import org.apache.log4j.Logger;
import bitel.billing.common.IPUtils;
import bitel.billing.server.processor.dialup.DialUpSessionRealtime;
import ru.bitel.bgbilling.kernel.network.radius.nas.Nas;
import ru.bitel.bgbilling.kernel.network.radius.nas.NasList;
import ru.bitel.bgbilling.modules.dialup.radius.DialUpNas;
import ru.bitel.bgbilling.modules.dialup.radius.DialUpNasConnection;
import ru.bitel.bgbilling.modules.dialup.radius.TrafficInspector;
import ru.bitel.common.StopableThread;
public class SessionIpMapper extends StopableThread {
private static final Logger log = Logger.getLogger(SessionIpMapper.class.getName());
private static SessionIpMapper instance = null;
public SessionIpMapper(){
if (instance != null)
{
throw new IllegalStateException("Current implementation doesn't support more than one SessionIpMapper instance. Use getInstance().");
}
instance = this;
start();
}
public static SessionIpMapper getInstance(){
return instance;
}
public void run()
{
log.info("Starting SessionIpMapper");
while (this.working)
{
try{
for(Nas<?,?,?> nas : NasList.getInstance().nases()){
for(DialUpNasConnection nasCon : ((DialUpNas)nas).connections()){
DialUpSessionRealtime session = nasCon.getSession();
if(session!=null){
if(!session.isFakeSession()){
TrafficInspector ti = ((DialUpNas)nas).getTrafficInspector();
if(ti!=null){
if(ti.getSession(session.getIpAddress())==null){
ti.startSession(session, true);
session.addLogInfo("IP address register on collector by SessionIpMapper");
if(log.isDebugEnabled()){
log.debug("put "+IPUtils.convertLongIpToString(session.getIpAddress()));
}
}
}
}
}
}
}
}catch (Exception e){
log.error(e.getMessage(), e);
}
try{
sleep(4000L);
}catch (Exception e){
log.error(e.getMessage(), e);
}
}
log.info("Stopping SessionIpMapper");
}
}
Запускаем наш тред в любом евенте в контексте радиуса:
Код:
import bitel.billing.server.util.*;
import ru.dsi.bgbilling.radius.SessionIpMapper;
public void onEvent( event, setup, con, conSlave )
{
if(SessionIpMapper.getInstance()==null){
SessionIpMapper mapper = new SessionIpMapper();
}
}