package com.intrbiz.bergamot.agent.handler;
import org.hyperic.sigar.Humidor;
import org.hyperic.sigar.NetConnection;
import org.hyperic.sigar.NetFlags;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.SigarProxy;
import com.intrbiz.bergamot.model.message.agent.AgentMessage;
import com.intrbiz.bergamot.model.message.agent.check.CheckNetCon;
import com.intrbiz.bergamot.model.message.agent.error.GeneralError;
import com.intrbiz.bergamot.model.message.agent.stat.NetConStat;
import com.intrbiz.bergamot.model.message.agent.stat.netcon.NetConInfo;
import com.intrbiz.bergamot.util.AgentUtil;
public class NetConInfoHandler extends AbstractAgentHandler
{
private SigarProxy sigar = Humidor.getInstance().getSigar();
public NetConInfoHandler()
{
super();
}
@Override
public Class<?>[] getMessages()
{
return new Class[] {
CheckNetCon.class
};
}
@Override
public AgentMessage handle(AgentMessage request)
{
CheckNetCon check = (CheckNetCon) request;
try
{
// flags
int flags = 0;
if (check.isClient()) flags |= NetFlags.CONN_CLIENT;
if (check.isServer()) flags |= NetFlags.CONN_SERVER;
if (check.isTcp()) flags |= NetFlags.CONN_TCP;
if (check.isUdp()) flags |= NetFlags.CONN_UDP;
if (check.isUnix()) flags |= NetFlags.CONN_UNIX;
if (check.isRaw()) flags |= NetFlags.CONN_RAW;
// get the stats
NetConStat stat = new NetConStat(request);
for (NetConnection con : this.sigar.getNetConnectionList(flags))
{
if (matchesFilter(check, con))
{
NetConInfo info = new NetConInfo();
info.setProtocol(con.getTypeString());
info.setState(con.getStateString());
info.setLocalAddress(con.getLocalAddress());
info.setLocalPort(con.getLocalPort());
info.setRemoteAddress(con.getRemoteAddress());
info.setRemotePort(con.getRemotePort());
stat.getConnections().add(info);
}
}
return stat;
}
catch (SigarException e)
{
return new GeneralError(e.getMessage());
}
}
private static boolean matchesFilter(CheckNetCon check, NetConnection con)
{
// local port
if (check.getLocalPort() > 0)
{
if (con.getLocalPort() != check.getLocalPort())
return false;
}
// remote port
if (check.getRemotePort() > 0)
{
if (con.getRemotePort() != check.getRemotePort())
return false;
}
// local address
if (! AgentUtil.isEmpty(check.getLocalAddress()))
{
if (! check.getLocalAddress().equalsIgnoreCase(con.getLocalAddress()))
return false;
}
// remote address
if (! AgentUtil.isEmpty(check.getRemoteAddress()))
{
if (! check.getRemoteAddress().equalsIgnoreCase(con.getRemoteAddress()))
return false;
}
return true;
}
}