package com.intrbiz.bergamot.worker.engine.snmp; import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.SimpleBindings; import com.intrbiz.Util; import com.intrbiz.bergamot.model.message.check.ExecuteCheck; import com.intrbiz.bergamot.model.message.result.ActiveResultMO; import com.intrbiz.scripting.RestrictedScriptEngineManager; import com.intrbiz.snmp.SNMPContext; /** * Execute Scripted SNMP checks */ public class ScriptedSNMPExecutor extends AbstractSNMPExecutor { private ScriptEngineManager factory = new RestrictedScriptEngineManager(); public ScriptedSNMPExecutor() { super(); } /** * Where executor == 'script' or is empty */ @Override public boolean accept(ExecuteCheck task) { return super.accept(task) && ("script".equalsIgnoreCase(task.getExecutor()) || Util.isEmpty(task.getExecutor())); } @Override protected void executeSNMP(ExecuteCheck executeCheck, SNMPContext<?> agent) throws Exception { // we need a script! if (Util.isEmpty(executeCheck.getScript())) throw new RuntimeException("The script must be defined!"); // setup wrapped context SNMPContext<?> wrapped = agent.with((error) -> this.publishActiveResult(executeCheck, new ActiveResultMO().error(error))); // setup the script engine ScriptEngine script = factory.getEngineByName("nashorn"); SimpleBindings bindings = new SimpleBindings(); bindings.put("check", executeCheck); bindings.put("agent", wrapped); bindings.put("bergamot", this.createScriptContext(executeCheck)); script.setBindings(bindings, ScriptContext.ENGINE_SCOPE); // execute script.eval(executeCheck.getScript()); } }