package com.davfx.ninio.script.util;
import java.io.IOException;
import com.davfx.ninio.script.RegisteredFunctionsScriptRunner;
import com.davfx.ninio.script.ScriptFunction;
import com.davfx.ninio.snmp.Oid;
import com.davfx.ninio.snmp.Result;
import com.davfx.ninio.snmp.SnmpClientHandler;
import com.davfx.ninio.snmp.util.SnmpClientCache;
import com.davfx.util.ConfigUtils;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
public final class SnmpAvailable {
public static final String CALL_FUNCTION_NAME = ConfigUtils.load(SnmpAvailable.class).getString("script.functions.snmp");
private final SnmpClientCache client;
public SnmpAvailable(SnmpClientCache client) {
this.client = client;
}
public RegisteredFunctionsScriptRunner register(RegisteredFunctionsScriptRunner runner) {
runner.register(CALL_FUNCTION_NAME, new ScriptFunction<JsonElement>() {
private String getString(JsonObject r, String key, String defaultValue) {
JsonElement e = r.get(key);
if (e == null) {
return defaultValue;
}
return e.getAsString();
}
@Override
public void call(JsonElement request, ScriptFunction.Callback<JsonElement> userCallback) {
JsonObject r = request.getAsJsonObject();
String host = getString(r, "host", "localhost");
SnmpClientCache.Connectable c = client.get(host);
String oidAsString = getString(r, "oid", null);
if (oidAsString == null) {
JsonObject rr = new JsonObject();
rr.add("error", new JsonPrimitive(new IOException("OID cannot be null").getMessage()));
userCallback.handle(rr);
return;
}
Oid oid;
try {
oid = new Oid(oidAsString);
} catch (Exception e) {
JsonObject rr = new JsonObject();
rr.add("error", new JsonPrimitive(new IOException("Invalid OID", e).getMessage()));
userCallback.handle(rr);
return;
}
c.connect(new SnmpClientHandler() {
@Override
public void failed(IOException e) {
JsonObject r = new JsonObject();
r.add("error", new JsonPrimitive(e.getMessage()));
userCallback.handle(r);
}
@Override
public void close() {
}
@Override
public void launched(Callback callback) {
callback.get(oid, new SnmpClientHandler.Callback.GetCallback() {
@Override
public void failed(IOException e) {
JsonObject r = new JsonObject();
r.add("error", new JsonPrimitive(e.getMessage()));
userCallback.handle(r);
}
private void add(JsonArray a, Result result) {
JsonObject r = new JsonObject();
r.add("oid", new JsonPrimitive(result.getOid().toString()));
r.add("value", new JsonPrimitive(result.getValue().asString()));
a.add(r);
}
@Override
public void finished(Iterable<Result> results) {
JsonArray a = new JsonArray();
for (Result result : results) {
add(a, result);
}
userCallback.handle(a);
}
@Override
public void finished(Result result) {
JsonArray a = new JsonArray();
add(a, result);
userCallback.handle(a);
}
});
}
});
}
});
return runner;
}
}