package jnetman.snmp;
import java.util.Arrays;
import org.apache.log4j.Logger;
import org.snmp4j.smi.AbstractVariable;
import org.snmp4j.smi.AssignableFromInteger;
import org.snmp4j.smi.AssignableFromLong;
import org.snmp4j.smi.AssignableFromString;
import org.snmp4j.smi.Counter32;
import org.snmp4j.smi.Counter64;
import org.snmp4j.smi.Gauge32;
import org.snmp4j.smi.Integer32;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.SMIConstants;
import org.snmp4j.smi.TimeTicks;
import org.snmp4j.smi.Variable;
import org.snmp4j.smi.VariableBinding;
public class SnmpHelper {
private SnmpClient snmpClient;
protected Logger logger;
public SnmpHelper(SnmpClient snmpClient) {
this.snmpClient = snmpClient;
logger = Logger.getLogger("snmp.snmpHelper."
+ snmpClient.getNetworkDevice().getName());
logger.debug("New Snmp helper created");
}
public SnmpClient getSnmpClient() {
return this.snmpClient;
}
public Variable[] getVariable(OID[] oids) throws TimeoutException,
SnmpErrorException, SnmpSyntaxException {
VariableBinding[] vbs = this.snmpClient.get(oids);
Variable[] vs = new Variable[vbs.length];
for (int i = 0; i < vbs.length; i++) {
SnmpSyntaxException.checkForExceptions(vbs[i]);
vs[i] = vbs[i].getVariable();
}
return vs;
}
public Variable getVariable(OID oid) throws TimeoutException,
SnmpErrorException, SnmpSyntaxException {
return getVariable(new OID[] { oid })[0];
}
public TimedValues getAsTimedValues(OID[] oids) throws TimeoutException,
SnmpErrorException, SnmpSyntaxException {
return new TimedValues(oids, this);
}
public int getInt(OID oid) throws TimeoutException, SnmpErrorException,
SnmpSyntaxException {
return this.getVariable(oid).toInt();
}
public int[] getInt(OID[] oids) throws TimeoutException,
SnmpErrorException, SnmpSyntaxException {
Variable[] vars = getVariable(oids);
int[] ints = new int[vars.length];
for (int i = 0; i < vars.length; i++)
ints[i] = vars[i].toInt();
return ints;
}
public long getLong(OID oid) throws TimeoutException, SnmpErrorException,
SnmpSyntaxException {
return this.getVariable(oid).toLong();
}
public long[] getLong(OID[] oids) throws TimeoutException,
SnmpErrorException, SnmpSyntaxException {
Variable[] vars = getVariable(oids);
long[] longs = new long[vars.length];
for (int i = 0; i < vars.length; i++)
longs[i] = vars[i].toLong();
return longs;
}
public String getString(OID oid) throws TimeoutException,
SnmpErrorException, SnmpSyntaxException {
return this.getVariable(oid).toString();
}
public String[] getString(OID[] oids) throws TimeoutException,
SnmpErrorException, SnmpSyntaxException {
Variable[] vars = getVariable(oids);
String[] strings = new String[vars.length];
for (int i = 0; i < vars.length; i++)
strings[i] = vars[i].toString();
return strings;
}
public boolean[] setVariableBinding(VariableBinding[] vbs)
throws TimeoutException, SnmpErrorException, SnmpSyntaxException {
VariableBinding[] resVbs = snmpClient.set(vbs);
SnmpSyntaxException.checkForExceptions(resVbs);
boolean[] res = new boolean[vbs.length];
for (int i = 0; i < vbs.length; i++) {
SnmpSyntaxException.checkForExceptions(resVbs[i]);
if (resVbs[i].getOid().equals(vbs[i].getOid())
&& resVbs[i].getVariable().equals(vbs[i].getVariable()))
res[i] = true;
else
res[i] = false;
}
return res;
}
public boolean setVariableBinding(VariableBinding vb)
throws TimeoutException, SnmpErrorException, SnmpSyntaxException {
return setVariableBinding(new VariableBinding[] { vb })[0];
}
public boolean[] setVariable(OID[] oids, Variable[] values)
throws TimeoutException, SnmpErrorException, SnmpSyntaxException {
if (oids.length != values.length)
throw new IllegalArgumentException(
"oids and values arrays must have same length");
VariableBinding[] vbs = new VariableBinding[oids.length];
for (int i = 0; i < vbs.length; i++) {
vbs[i] = new VariableBinding(oids[i], values[i]);
}
return setVariableBinding(vbs);
}
public boolean setVariable(OID oid, Variable value)
throws TimeoutException, SnmpErrorException, SnmpSyntaxException {
return setVariable(new OID[] { oid }, new Variable[] { value })[0];
}
public boolean[] setInt(OID[] oids, int[] values, int[] smiSyntaxs)
throws TimeoutException, SnmpErrorException, SnmpSyntaxException {
Variable[] vars = intToVariable(values, smiSyntaxs);
return setVariable(oids, vars);
}
public boolean setInt(OID oid, int value, int smiSyntax)
throws TimeoutException, SnmpErrorException, SnmpSyntaxException {
return setInt(new OID[] { oid }, new int[] { value },
new int[] { smiSyntax })[0];
}
public boolean[] setLong(OID[] oids, long[] values, int[] smiSyntaxs)
throws TimeoutException, SnmpErrorException, SnmpSyntaxException {
Variable[] vars = longToVariable(values, smiSyntaxs);
return setVariable(oids, vars);
}
public boolean setLong(OID oid, long value, int smiSyntax)
throws TimeoutException, SnmpErrorException, SnmpSyntaxException {
return setLong(new OID[] { oid }, new long[] { value },
new int[] { smiSyntax })[0];
}
public boolean[] setString(OID[] oids, String[] values, int[] smiSyntaxs)
throws TimeoutException, SnmpErrorException, SnmpSyntaxException {
Variable[] vars = stringToVariable(values, smiSyntaxs);
return setVariable(oids, vars);
}
public boolean setString(OID oid, String value, int smiSyntax)
throws TimeoutException, SnmpErrorException, SnmpSyntaxException {
return setString(new OID[] { oid }, new String[] { value },
new int[] { smiSyntax })[0];
}
public static Variable stringToVariable(String value, int smiSyntax) {
Variable var = AbstractVariable.createFromSyntax(smiSyntax);
if (var instanceof AssignableFromString)
((AssignableFromString) var).setValue(value);
else
throw new IllegalArgumentException(
"Unsupported conversion from String to "
+ var.getSyntaxString());
return var;
}
public static Variable[] stringToVariable(String[] values, int[] smiSyntaxs) {
if (values.length != smiSyntaxs.length)
throw new IllegalArgumentException(
"values and smiSyntaxs arrays must have smae length");
Variable[] vars = new Variable[values.length];
for (int i = 0; i < values.length; i++) {
vars[i] = stringToVariable(values[i], smiSyntaxs[i]);
}
return vars;
}
public static Variable intToVariable(int i, int smiSyntax) {
Variable var = AbstractVariable.createFromSyntax(smiSyntax);
if (var instanceof AssignableFromInteger)
((AssignableFromInteger) var).setValue(i);
else
throw new IllegalArgumentException(
"Unsupported conversion from int to "
+ var.getSyntaxString());
return var;
}
public static Variable[] intToVariable(int[] values, int[] smiSyntaxs) {
if (values.length != smiSyntaxs.length)
throw new IllegalArgumentException(
"values and smiSyntaxs arrays must have smae length");
Variable[] vars = new Variable[values.length];
for (int i = 0; i < values.length; i++) {
vars[i] = intToVariable(values[i], smiSyntaxs[i]);
}
return vars;
}
public static Variable longToVariable(long l, int smiSyntax) {
Variable var = AbstractVariable.createFromSyntax(smiSyntax);
if (var instanceof AssignableFromLong)
((AssignableFromLong) var).setValue(l);
else
throw new IllegalArgumentException(
"Unsupported conversion from long to "
+ var.getSyntaxString());
return var;
}
public static Variable[] longToVariable(long[] values, int[] smiSyntaxs) {
if (values.length != smiSyntaxs.length)
throw new IllegalArgumentException(
"values and smiSyntaxs arrays must have smae length");
Variable[] vars = new Variable[values.length];
for (int i = 0; i < values.length; i++) {
vars[i] = longToVariable(values[i], smiSyntaxs[i]);
}
return vars;
}
public Table getTable(OID tableOid) {
logger.trace("Table retrieval started");
VariableBinding[] vbs = snmpClient.walk(tableOid);
Table table = new Table();
int[] subIdxArr;
int[] colIdArr;
OID subIdxOid;
OID colIdOid;
for (VariableBinding vb : vbs) {
if (vb.getOid().leftMostCompare(tableOid.size(), tableOid) != 0) {
logger.warn("The following OID doesn't seems to belong to table "
+ vb);
continue;
}
// extract the last part of the OID, the index
subIdxArr = Arrays.copyOfRange(vb.getOid().toIntArray(),
tableOid.size() + 2, vb.getOid().size());
subIdxOid = new OID(subIdxArr);
// extract the first part of the OID, the column
colIdArr = Arrays.copyOfRange(vb.getOid().toIntArray(), 0,
tableOid.size() + 2);
colIdOid = new OID(colIdArr);
logger.trace("Index = " + subIdxOid + "; Column = " + colIdOid);
table.putVariable(subIdxOid, colIdOid, vb.getVariable());
}
return table;
}
public static int castToInt(Variable variable) {
switch (variable.getSyntax()) {
case SMIConstants.SYNTAX_INTEGER:
return ((Integer32) variable).toInt();
default:
throw new IllegalArgumentException("Unsupported cast from "
+ variable.getSyntaxString() + " to int");
}
}
public static int[] castToInt(Variable[] variables) {
int[] ints = new int[variables.length];
for (int i = 0; i < variables.length; i++)
ints[i] = SnmpHelper.castToInt(variables[i]);
return ints;
}
public static long castToLong(Variable variable) {
switch (variable.getSyntax()) {
case SMIConstants.SYNTAX_GAUGE32:
return ((Gauge32) variable).toLong();
case SMIConstants.SYNTAX_COUNTER32:
return ((Counter32) variable).toLong();
case SMIConstants.SYNTAX_COUNTER64:
return ((Counter64) variable).toLong();
case SMIConstants.SYNTAX_TIMETICKS:
return ((TimeTicks) variable).toLong();
default:
throw new IllegalArgumentException("Unsupported cast from "
+ variable.getSyntaxString() + " to long");
}
}
public static long[] castToLong(Variable[] variables) {
long[] longs = new long[variables.length];
for (int i = 0; i < variables.length; i++)
longs[i] = SnmpHelper.castToLong(variables[i]);
return longs;
}
public static String castToString(Variable variable) {
return variable.toString();
}
public static String[] castToString(Variable[] variables) {
String[] strings = new String[variables.length];
for (int i = 0; i < variables.length; i++)
strings[i] = SnmpHelper.castToString(variables[i]);
return strings;
}
public static OID[] stringsToOIDs(String[] stringOids) {
OID[] oids = new OID[stringOids.length];
for (int i = 0; i < stringOids.length; i++)
oids[i] = new OID(stringOids[i]);
return oids;
}
}