Skip to content

Instantly share code, notes, and snippets.

@akirad
Last active June 11, 2019 08:57
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • 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();
}
}
}
@Eswaramoorthy
Copy link

HI I am following this code and stuck at some point.Any help will be highly appreciated.

Here is my code below:

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 = "66.162.110.25";
oidStr = "1.3.6.1.4.1.7950.2.10.31.3.0";
commStr = "BPMDemo";
snmpVersion = SnmpConstants.version2c;
portNum = "161";
usage = "Usage: snmpwalk -c BPMDemo -v 2c targetAddr oid";
}

private void doSnmpwalk() throws IOException {
Address targetAddress = GenericAddress.parse("udp:"+ targetAddr + "/" + portNum);
TransportMapping 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 = null;
try{
  oid = new OID(oidStr);
}
catch(RuntimeException ex){
  System.out.println("OID is not specified correctly.");
  System.exit(1);
}

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);
}

// Get snmpwalk result.
for (TreeEvent event : events) {
  if(event != null){
    if (event.isError()) {
        System.err.println("oid [" + oid + "] " + event.getErrorMessage());
      }

    VariableBinding[] varBindings = event.getVariableBindings();
    if(varBindings == null || varBindings.length == 0){
      System.out.println("No result returned.");
    }
    for (VariableBinding varBinding : varBindings) {
      System.out.println(
          varBinding.getOid() + 
          " : " + 
          varBinding.getVariable().getSyntaxString() +
          " : " +
          varBinding.getVariable());
    }
  }
}
snmp.close();

}

private void checkAndSetArgs(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.checkAndSetArgs(args);
snmpwalk.doSnmpwalk();
}
catch(Exception e){
System.err.println("----- An Exception happend as follows. Please confirm the usage. -----");
e.printStackTrace();
System.err.println("--------------------");
}
}
}

and from the terminal I am running the command

java -cp .:snmp4j-2.2.2.jar Snmpwalk -c BPMDemo -p 161 -v 2

The result output i always get as No result found !.

with the same config I could get proper response from MIB Browser.(http://oi44.tinypic.com/25s279x.jpg)
Please help me to find where i am going wrong.
Thanks.

@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