Skip to content

Instantly share code, notes, and snippets.

@akirad
Last active June 11, 2019 08:57
Show Gist options
  • Save akirad/5597203 to your computer and use it in GitHub Desktop.
Save akirad/5597203 to your computer and use it in GitHub Desktop.
An example of snmpwalk by java. It needs snmp4j. [Compile] javac -cp <path to a snmp4j.jar> Snmpwalk.java [Execute] java -cp <path to a snmp4j.jar>;. Snmpwalk If there is not the current dir in the path of -cp, java can't find Snmpwalk class...
import java.io.IOException;
import java.util.List;
import org.snmp4j.CommunityTarget;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.DefaultPDUFactory;
import org.snmp4j.util.TreeUtils;
import org.snmp4j.util.TreeEvent;
public class Snmpwalk {
private String targetAddr;
private String oidStr;
private String commStr;
private int snmpVersion;
private String portNum;
private String usage;
Snmpwalk() throws IOException {
// Set default value.
targetAddr = null;
oidStr = null;
commStr = "public";
snmpVersion = SnmpConstants.version2c;
portNum = "161";
usage = "Usage: snmpwalk [-c communityName -p portNumber -v snmpVersion(1 or 2)] targetAddr oid";
}
private void execSnmpwalk() throws IOException {
Address targetAddress = GenericAddress.parse("udp:"+ targetAddr + "/" + portNum);
TransportMapping<? extends Address> transport = new DefaultUdpTransportMapping();
Snmp snmp = new Snmp(transport);
transport.listen();
// setting up target
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString(commStr));
target.setAddress(targetAddress);
target.setRetries(3);
target.setTimeout(1000 * 3);
target.setVersion(snmpVersion);
OID oid;
try {
oid = new OID(translateNameToOID(oidStr));
} catch (Exception e) {
System.err.println("Failed to understand the OID or object name.");
throw e;
}
// Get MIB data.
TreeUtils treeUtils = new TreeUtils(snmp, new DefaultPDUFactory());
List<TreeEvent> events = treeUtils.getSubtree(target, oid);
if(events == null || events.size() == 0) {
System.out.println("No result returned.");
System.exit(1);
}
// Handle the snmpwalk result.
for (TreeEvent event : events) {
if(event == null) {
continue;
}
if (event.isError()) {
System.err.println("oid [" + oid + "] " + event.getErrorMessage());
continue;
}
VariableBinding[] varBindings = event.getVariableBindings();
if(varBindings == null || varBindings.length == 0) {
continue;
}
for (VariableBinding varBinding : varBindings) {
if (varBinding == null) {
continue;
}
System.out.println(
varBinding.getOid() +
" : " +
varBinding.getVariable().getSyntaxString() +
" : " +
varBinding.getVariable());
}
}
snmp.close();
}
private String translateNameToOID(String oidStr) {
switch (oidStr) {
case "mib-2":
oidStr = ".1.3.6.1.2.1";
break;
case "mib2":
oidStr = ".1.3.6.1.2.1";
break;
case "system":
oidStr = ".1.3.6.1.2.1.1";
break;
case "interfaces":
oidStr = ".1.3.6.1.2.1.2";
break;
case "at":
oidStr = ".1.3.6.1.2.1.3";
break;
case "ip":
oidStr = ".1.3.6.1.2.1.4";
break;
case "icmp":
oidStr = ".1.3.6.1.2.1.5";
break;
case "tcp":
oidStr = ".1.3.6.1.2.1.6";
break;
case "udp":
oidStr = ".1.3.6.1.2.1.7";
break;
case "egp":
oidStr = ".1.3.6.1.2.1.8";
break;
case "transmission":
oidStr = ".1.3.6.1.2.1.10";
break;
case "snmp":
oidStr = ".1.3.6.1.2.1.11";
break;
}
return oidStr;
}
private void setArgs(String[] args) {
if(args.length < 2) {
System.err.println(usage);
System.exit(1);
}
for (int i=0; i<args.length; i++) {
if("-c".equals(args[i])) {
commStr = args[++i];
}
else if ("-v".equals(args[i])) {
if(Integer.parseInt(args[++i]) == 1) {
snmpVersion = SnmpConstants.version1;
}
else {
snmpVersion = SnmpConstants.version2c;
}
}
else if ("-p".equals(args[i])) {
portNum = args[++i];
}
else{
targetAddr = args[i++];
oidStr = args[i];
}
}
if(targetAddr == null || oidStr == null) {
System.err.println(usage);
System.exit(1);
}
}
// Delegate main function to Snmpwalk.
public static void main(String[] args) {
try{
Snmpwalk snmpwalk = new Snmpwalk();
snmpwalk.setArgs(args);
snmpwalk.execSnmpwalk();
}
catch(Exception e) {
System.err.println("----- An Exception happened as follows. Please confirm the usage etc. -----");
System.err.println(e.getMessage());
e.printStackTrace();
}
}
}
@akirad
Copy link
Author

akirad commented Sep 2, 2013

Hi Eswaramoorthy

Thank you for you comment, and sorry for my late answer.
If you are still looking for the answer, please check my answer.

I think if you change the following code, it should work.

[Before]
oidStr = "1.3.6.1.4.1.7950.2.10.31.3.0";
[After]
oidStr = "1.3.6.1.4.1.7950.2.10.31.3";

This code is for snmpwalk, so it doesn't need the instance number of MIB.
In the case of snmpget, you need it.

Best regards,
Akira

@HENG-SOPHAT
Copy link

hi

i following your code and i run command in terminal
java -cp .:snmp4j-2.2.5.jar -c y5entSnmp -p 161 -v 1 10.8.72.134 iso.3.6.1.2.1.2.2.1.10.5

get error message
OID is not specified correctly.

please help me.

Best Regards

phat

@sajinidesilva
Copy link

Hi,

In this code varBinding.getVariable()) gives the value without its units. Is there a way to get the value with its units?

Thank you.

@akirad
Copy link
Author

akirad commented Oct 28, 2014

Sorry that I didn't sign-in the git-hub for a while...

HENG-SOPHAT
I dont think snmp4j supports an input like "iso.3.6.1.2.1.2.2.1.10.5". It should be "1.3.6.1.2.1.2.2.1.10.5".

sajinidesilva
I cant catch the meaning of "units". Please check the javadoc for snmp4j...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment