package com.intrbiz.bergamot.worker.engine.agent;
import java.util.UUID;
import org.apache.log4j.Logger;
import com.intrbiz.Util;
import com.intrbiz.bergamot.agent.server.BergamotAgentServerHandler;
import com.intrbiz.bergamot.model.message.agent.check.ExecCheck;
import com.intrbiz.bergamot.model.message.agent.stat.ExecStat;
import com.intrbiz.bergamot.model.message.agent.util.Parameter;
import com.intrbiz.bergamot.model.message.check.ExecuteCheck;
import com.intrbiz.bergamot.model.message.reading.ReadingParcelMO;
import com.intrbiz.bergamot.model.message.result.ActiveResultMO;
import com.intrbiz.bergamot.worker.engine.AbstractExecutor;
/**
* Execute a Nagios plugin via the Bergamot Agent
*/
public class NagiosExecutor extends AbstractExecutor<AgentEngine>
{
public static final String NAME = "nagios";
private Logger logger = Logger.getLogger(NagiosExecutor.class);
public NagiosExecutor()
{
super();
}
/**
* Only execute Checks where the engine == "agent"
*/
@Override
public boolean accept(ExecuteCheck task)
{
return AgentEngine.NAME.equals(task.getEngine()) && NAME.equals(task.getExecutor());
}
@Override
public void execute(ExecuteCheck executeCheck)
{
if (logger.isTraceEnabled()) logger.trace("Executing Nagios plugin via Bergamot Agent");
try
{
// check the host presence
UUID agentId = executeCheck.getAgentId();
if (agentId == null) throw new RuntimeException("No agent id was given");
// command line
String commandLine = executeCheck.getParameter("command_line");
if (Util.isEmpty(commandLine)) throw new RuntimeException("The command_line must be defined!");
// lookup the agent
BergamotAgentServerHandler agent = this.getEngine().getAgentServer().getRegisteredAgent(agentId);
if (agent != null)
{
ExecCheck check = new ExecCheck();
check.setName(executeCheck.getName());
check.setEngine("nagios");
check.getParameters().add(new Parameter("command_line", commandLine));
// exec the check
long sent = System.nanoTime();
agent.sendMessageToAgent(check, (response) -> {
double runtime = ((double)(System.nanoTime() - sent)) / 1000_000D;
ExecStat stat = (ExecStat) response;
if (logger.isTraceEnabled()) logger.trace("Executed check " + runtime + "ms: " + stat);
// submit the result
ActiveResultMO result = new ActiveResultMO().fromCheck(executeCheck);
result.setOk(stat.isOk());
result.setStatus(stat.getStatus());
result.setOutput(stat.getOutput());
result.runtime(runtime);
this.publishActiveResult(executeCheck, result);
// readings
if (stat.getReadings().size() > 0)
{
ReadingParcelMO readings = new ReadingParcelMO().fromCheck(executeCheck.getCheckId());
readings.setCaptured(System.currentTimeMillis());
readings.getReadings().addAll(stat.getReadings());
this.publishReading(executeCheck, readings);
}
});
}
else
{
// raise an error
this.publishActiveResult(executeCheck, new ActiveResultMO().fromCheck(executeCheck).disconnected("Bergamot Agent disconnected"));
}
}
catch (Exception e)
{
this.publishActiveResult(executeCheck, new ActiveResultMO().fromCheck(executeCheck).error(e));
}
}
}