snmpwalk.java
上传用户:aonuowh
上传日期:2021-05-23
资源大小:35390k
文件大小:10k
源码类别:

SNMP编程

开发平台:

C/C++

  1. /* $Id: snmpwalk.src,v 1.4.2.7 2009/01/28 13:01:35 prathika Exp $ */
  2. /*
  3.  * @(#)snmpwalk.java
  4.  * Copyright (c) 1996-2009 AdventNet, Inc. All Rights Reserved.
  5.  * Please read the associated COPYRIGHTS file for more details.
  6.  */
  7.  
  8. /**
  9.  * This is an example program to explain how to write an application to do
  10.  * the basic SNMP operation WALK using com.adventnet.snmp.snmp2 and
  11.  * com.adventnet.snmp.mibs packages of AdventNetSNMP2 api.
  12.  * The user could run this application by giving any one of the following usage.
  13.  * 
  14.  * java snmpwalk [options] hostname oid
  15.  *
  16.  * v1 request: 
  17.  * java snmpwalk [-d] [-m MIB_files] [-c community] [-p port] [-t timeout] [-r retries] host OID
  18.  * e.g. 
  19.  * java snmpwalk -p 161 -c public -m ../../../RFC1213-MIB adventnet .1.3.6.1 
  20.  *
  21.  * v2c request:
  22.  * java snmpwalk [-d] [-v version(v1,v2)] [-m MIB_files] [-c community] [-p port] [-t timeout] [-r retries] host OID
  23.  * e.g. For v1 request give -v v1 or drop the option -v .
  24.  * java snmpwalk -p 161 -v v2 -c public -m ../../../RFC1213-MIB adventnet .iso.org
  25.  * 
  26.  * v3 request:
  27.  * java snmpwalk [-d] [-v version(v1,v2,v3)] [-c community] [-p port] [-r retries] [-t timeout] [-u user] [-a auth_protocol] [-w auth_password] [-s priv_password][-pp privProtocol(DES/AES-128/AES-192/AES-256/3DES)] [-n contextName] [-i contextID] host OID
  28.  * e.g.
  29.  * java snmpwalk -v v3 -u initial2 -w initial2Pass -a MD5 10.3.2.120 .1.3
  30.  *  
  31.  * If the oid is not starting with a dot (.) it will be prefixed by .1.3.6.1.2.1 .
  32.  * So the entire OID of 1.1.0 will become .1.3.6.1.2.1.1.1.0 . You can also
  33.  * give the entire OID .
  34.  * 
  35.  * If the mib is loaded you can also give string oids in the following formats
  36.  * .iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0 or system.sysDescr.0 or
  37.  * sysDescr.0 .
  38.  *
  39.  * Options:
  40.  * [-d]                - Debug output. By default off.
  41.  * [-c] <community>    - community String. By default "public".
  42.  * [-p] <port>         - remote port no. By default 161.
  43.  * [-t] <Timeout>      - Timeout. By default 5000ms.
  44.  * [-r] <Retries>      - Retries. By default 0. 
  45.  * [-m] <MIBfile>      - MIB files.To load multiple mibs give within double quotes files seperated by a blank space.       
  46.  * [-v] <version>      - version(v1 / v2 / v3). By default v1.
  47.  * [-u] <username>     - The v3 principal/userName
  48.  * [-a] <autProtocol>  - The authProtocol(MD5/SHA). Mandatory if authPassword is specified
  49.  * [-w] <authPassword> - The authentication password.
  50.  * [-s] <privPassword> - The privacy protocol password. Must be accompanied with auth password and authProtocol fields.
  51.  * [-pp]<privProtocol> - The privacy Protocol(DES/AES-128/AES-192/AES-256/3DES)
  52.  * [-n] <contextName>  - The contextName to be used for the v3 pdu.
  53.  * [-i] <contextID>    - The contextID to be used for the v3 pdu.
  54.  * <host> Mandatory    - The RemoteHost (agent).Format (string without double qoutes/IpAddress).
  55.  * <OID>  Mandatory    - Give only one Object Identifier.
  56.  */
  57. import java.lang.*;
  58. import java.util.*;
  59. import java.net.*;
  60. import com.adventnet.snmp.snmp2.*;
  61. import com.adventnet.snmp.mibs.*;
  62. import com.adventnet.snmp.snmp2.usm.*;
  63. public class snmpwalk 
  64. {
  65.     private static final int DEBUG = 0;
  66.     private static final int MIBS = 6;
  67.     public static void main(String args[]) 
  68.     {
  69.     
  70.         // Take care of getting options
  71.         String usage = 
  72.             "nsnmpwalk [-d] [-v version(v1,v2,v3)] [-m MIB_files]n"+
  73.             "[-c community] [-p port] [-r retries] [-t timeout]n"+
  74.             "[-u user] [-a auth_protocol] [-w auth_password]n"+
  75.             "[-s priv_password]  [-n contextName] [-i contextID] [-pp privProtocol(DES/AES-128/AES-192/AES-256/3DES)] host OID ";
  76.         String options[] = 
  77.             {
  78.                 "-d", "-c",  "-wc", "-p", "-r", "-t", "-m", "-v", "-u", "-a", "-w", "-s", "-n", "-i", "-pp"
  79.             };
  80.         
  81.         String values[] = 
  82.             {
  83.                 "None", null, null, null, null, null, null, null, null, null, null, null, null, null, null 
  84.             };
  85.         ParseOptions opt = new ParseOptions(args,options,values, usage);
  86.         if (opt.remArgs.length!=2)
  87.         {
  88.             opt.usage_error();
  89.         }   
  90.         // Start SNMP API
  91.         SnmpAPI api;
  92.         api = new SnmpAPI();
  93.         if (values[DEBUG].equals("Set"))
  94.         {
  95.             api.setDebug( true );
  96.         }   
  97.         // Open SnmpSession 
  98.         SnmpSession session = new SnmpSession(api);
  99.        int PORT = 3;
  100. SnmpPDU pdu = new SnmpPDU();
  101. UDPProtocolOptions udpOpt = new UDPProtocolOptions();
  102. udpOpt.setRemoteHost(opt.remArgs[0]);
  103. if(values[PORT] != null)
  104. {
  105. try
  106. {
  107. udpOpt.setRemotePort(Integer.parseInt(values[PORT]));
  108. }
  109. catch(Exception exp)
  110. {
  111. System.out.println("Invalid port: " + values[PORT]);
  112. System.exit(1);
  113. }
  114. }
  115. pdu.setProtocolOptions(udpOpt);
  116.         //set the values
  117.         SetValues setVal = new SetValues(session, values);
  118.         if(setVal.usage_error)
  119.         {
  120.             opt.usage_error(); 
  121.         }   
  122.         // Loading MIBS .
  123.         MibOperations mibOps = new MibOperations();
  124.         // To load MIBs from compiled file
  125.          mibOps.setLoadFromCompiledMibs(true);
  126.     
  127.         if (values[MIBS] != null)
  128.         {
  129.             try 
  130.             {
  131.                 System.err.println("Loading MIBs: "+values[MIBS]);
  132.                 mibOps.loadMibModules(values[MIBS]);
  133.             }
  134.             catch (Exception ex) 
  135.             {
  136.                 System.err.println("Error loading MIBs: "+ex);
  137.             }
  138.         }
  139.         
  140.         // Build GetNext request PDU
  141.            pdu.setCommand( api.GETNEXT_REQ_MSG );
  142.         // need to save the root OID to walk sub-tree
  143.         SnmpOID oid = mibOps.getSnmpOID(opt.remArgs[1]);
  144.         if( oid == null)
  145.         {
  146.             System.exit(1);
  147.         }   
  148.         int rootoid[] = (int[]) oid.toValue();  
  149.         if (rootoid == null)    //if don't have a valid OID for first, exit
  150.         {
  151.             System.err.println("Invalid OID argument: " + opt.remArgs[1]);
  152.             System.exit(1);
  153.         }
  154.         else
  155.         {
  156.             pdu.addNull(oid);
  157.         }   
  158.     
  159.         try
  160.         {
  161.             // open sesssion
  162.             session.open();
  163.         }
  164.         catch (SnmpException e) 
  165.         {
  166.             System.err.println("Error in open session : "+e.getMessage());
  167.         }
  168.         if(session.getVersion()==SnmpAPI.SNMP_VERSION_3) 
  169.         {
  170.             pdu.setUserName(setVal.userName.getBytes());
  171.             try
  172.             {
  173.                  USMUtils.init_v3_parameters(
  174. setVal.userName,
  175. null,
  176. setVal.authProtocol,
  177. setVal.authPassword,
  178. setVal.privPassword,
  179. udpOpt,
  180. session,
  181. false,
  182. setVal.privProtocol);
  183.             }   
  184.             catch(Exception e)
  185.             {
  186.                 
  187.             }
  188.             pdu.setContextName(setVal.contextName.getBytes());
  189.             pdu.setContextID(setVal.contextID.getBytes());
  190.         }
  191.         // loop for each PDU in the walk
  192.         while (true)  // until received OID isn't in sub-tree
  193.         {
  194.             try 
  195.             {
  196.                 // Send PDU and receive response PDU
  197.                 pdu = session.syncSend(pdu);
  198.             } 
  199.             catch (SnmpException e) 
  200.             {
  201.                 System.err.println("Sending PDU : " + e.getMessage());
  202.                 System.exit(1);
  203.             }
  204.             if (pdu == null) 
  205.             {
  206.                 // timeout
  207.                 System.out.println("Request timed out to: " + opt.remArgs[0] );
  208.                 System.exit(1);
  209.             }
  210.             // stop if outside of sub-tree
  211.             if (!isInSubTree(rootoid,pdu)) 
  212.             {
  213.                 break;
  214.             }
  215.             // print response PDU
  216.             if(pdu.getVersion() == SnmpAPI.SNMP_VERSION_1) {
  217.             // check for error
  218.             if (pdu.getErrstat() != 0) 
  219.             {
  220.                 System.out.println("Error Indication in response: " +
  221.                        SnmpException.exceptionString((byte)pdu.getErrstat()) + 
  222.                        "nErrindex: " + pdu.getErrindex()); 
  223.                 System.exit(1);
  224.             }
  225.         
  226.             // print response pdu variable-bindings
  227.             System.out.println(mibOps.varBindsToString(pdu));
  228.             } else if((pdu.getVersion() == SnmpAPI.SNMP_VERSION_2C) || (pdu.getVersion() == SnmpAPI.SNMP_VERSION_3)) {
  229.             for(Enumeration e = pdu.getVariableBindings().elements();
  230.                 e.hasMoreElements() ;) 
  231.             {
  232.                 int error = 0;
  233.                 SnmpVarBind varbind = (SnmpVarBind)e.nextElement();
  234.             
  235.                 // check for error
  236.                 if ( (error = varbind.getErrindex()) != 0) 
  237.                 {
  238.                     System.out.println("Error Indication in response: " +
  239.                        SnmpException.exceptionString((byte)error));
  240.                     System.exit(1);
  241.                 }
  242.                 // print response pdu variable-bindings        
  243.                 System.out.println(mibOps.varBindsToString(pdu));
  244.             }
  245.         }
  246.         else
  247.         {
  248.             System.out.println("Invalid Version Number");      
  249.         }   
  250.             // set GETNEXT_REQ_MSG to do walk
  251.             pdu.setCommand( api.GETNEXT_REQ_MSG );
  252.             // Don't forget to set request id to 0 otherwise next request will fail
  253.             pdu.setReqid(0);
  254.         } // end of while true
  255.         
  256.         // close session
  257.         session.close();
  258.         // stop api thread
  259.         api.close();
  260.     
  261.         System.exit(0);
  262.     }
  263.     /** check if first varbind oid has rootoid as an ancestor in MIB tree */
  264.     static boolean isInSubTree(int[] rootoid, SnmpPDU pdu) 
  265.     {
  266.         SnmpOID objID = (SnmpOID) pdu.getObjectID(0);
  267.         if (objID == null)
  268.         {
  269.             return false;
  270.         }   
  271.         int oid[] = (int[]) objID.toValue();
  272.         if (oid == null)
  273.         {
  274.             return false;
  275.         }   
  276.         if (oid.length < rootoid.length) 
  277.         {
  278.             return false;
  279.         }   
  280.         for (int i=0;i<rootoid.length;i++)
  281.         {
  282.             if (oid[i] != rootoid[i])
  283.             {
  284.                 return false;
  285.             }   
  286.         }   
  287.         return true;
  288.     }
  289. }