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

SNMP编程

开发平台:

C/C++

  1. /* $Id: snmpv3trap.src,v 1.4 2002/09/09 05:43:43 pushpar Exp $ */
  2. /*
  3.  * @(#)snmpv3trap.java
  4.  * Copyright (c) 1996-2003 AdventNet, Inc. All Rights Reserved.
  5.  * Please read the associated COPYRIGHTS file for more details.
  6.  */
  7. /**
  8.  * This is an example program to explain how to write an application to send a
  9.  * v3 Trap message using com.adventnet.snmp.snmp2 package of AdventNetSNMP2 api.
  10.  * The user could run this application by giving any one of the following usage.
  11.  *  
  12.  * java snmpv3trap [-d] [-p port][-e engineID(0x....)] [-a auth_protocol] [-w auth_password] [-s priv_password] [-i contextName] -m MIB_files userName host TimeTicksvalue OIDvalue [OID value] ...
  13.  * e.g.
  14.  * java snmpv3trap -m "../../../mibs/RFC1213-MIB ../../../mibs/SNMPv2-MIB" -e 0x000012141516171819202121 -a MD5 -w initial2Pass -i initial initial2 10.3.2.120 16352 coldStartTrap ifIndex.2 2
  15.  * 
  16.  * If the oid is not starting with a dot (.) it will be prefixed by .1.3.6.1.2.1 .
  17.  * So the entire OID of 1.1.0 will become .1.3.6.1.2.1.1.1.0 . You can also
  18.  * give the entire OID .
  19.  * 
  20.  * If the mib is loaded you can also give string oids in the following formats
  21.  * .iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0 or system.sysDescr.0 or
  22.  * sysDescr.0 .
  23.  *
  24.  * Options:
  25.  * [-d]                  - Debug output. By default off.
  26.  * [-p] <port>           - remote port no. By default 162.
  27.  * [-e] <engineID>       - Engine ID.
  28.  * [-a] <autProtocol>    - The authProtocol(MD5/SHA). Mandatory if authPassword is specified
  29.  * [-w] <authPassword>   - The authentication password.
  30.  * [-s] <privPassword>   - The privacy protocol password. Must be accompanied with auth password and authProtocol fields.
  31.  * [-n] <contextName>    - The context to be used for the v3 pdu.
  32.  * [-i] <contextID>      - The contextID to be used for the v3 pdu.
  33.  * -m <MIBfile>          - MIB files.Mandatory.To load multiple mibs give within double quotes files seperated by a blank space.       
  34.  * <timeticks> Mandatory - the value of object sysUpTime when the event occurred
  35.  * <OID-value> Mandatory - Object Identifier  
  36.  * <username>  Mandatory - The v3 principal/userName.
  37.  * <host>      Mandatory - The RemoteHost (agent).Format (string without double qoutes/IpAddress).
  38.  * <OID>       Mandatory - Object Identifier.
  39.  * <value>     Mandatory - The object instance value to be set .
  40.  */ 
  41.     
  42. import java.lang.*;
  43. import java.util.*;
  44. import java.net.*;
  45. import com.adventnet.snmp.snmp2.*;
  46. import com.adventnet.snmp.mibs.*;
  47. import com.adventnet.snmp.snmp2.usm.*;
  48. public class snmpv3trap {
  49.   private static final int DEBUG = 0;
  50.   private static final int PORT = 1;
  51.   private static final int MIBS = 2;
  52.   private static final int AUTH_PROTOCOL = 3;
  53.   private static final int AUTH_PASSWORD = 4;
  54.   private static final int PRIV_PASSWORD = 5;
  55.   private static final int CONTEXT_NAME = 6;
  56.   private static final int CONTEXT_ID = 7;
  57.   private static final int ENGINEID = 8;
  58.   static final int USM_SECURITY_MODEL = 3;
  59.   
  60.   public static void main(String args[]) {
  61.       
  62.     // Take care of getting options
  63.     String usage = "snmpv3trap [-d] [-p port][-e engineID(0x....)] [-a auth_protocol] [-w auth_password] [-s priv_password] [-n contextName] [-i contextID] -m MIB_files userName host TimeTicksvalue OIDvalue [OID value] ...";
  64.     String options[] = { "-d", "-p", "-m", "-a", "-w", "-s", "-n", "-i", "-e"};
  65.     String values[] = { "None", null, null, null, null, null, null, null, null };
  66.    
  67.     String id = new String(""); 
  68. String userName = new String("");
  69. int authProtocol = USMUserEntry.NO_AUTH;
  70. String authPassword = new String ("");
  71. String privPassword = new String ("");
  72. String contextName = new String ("");
  73. String contextID = new String ("");
  74.     
  75.     ParseOptions opt = new ParseOptions(args,options,values, usage);
  76.     if (opt.remArgs.length<4) opt.usage_error();
  77.                      
  78.     // Start SNMP API
  79.     SnmpAPI api;
  80.     api = new SnmpAPI();
  81.     if (values[DEBUG].equals("Set")) api.setDebug( true );
  82.         
  83.     SnmpPDU pdu = new SnmpPDU();
  84.     Snmp3Message msg = (Snmp3Message)(pdu.getMsg());
  85.     pdu.setCommand( api.TRP2_REQ_MSG );
  86.     // Open session 
  87.     SnmpSession session = new SnmpSession(api);
  88.     // set remoteHost
  89.     session.setPeername( opt.remArgs[1] );
  90.     
  91.     // set version
  92.     session.setVersion( SnmpAPI.SNMP_VERSION_3 ) ;
  93.     
  94.     // set EngineID
  95.     try {        
  96. if(values[PORT] != null)
  97. session.setRemotePort( Integer.parseInt(values[PORT]) );
  98. else
  99. session.setRemotePort(162);
  100.         if (values[ENGINEID]!=null) {
  101.         id = values[ENGINEID];
  102.         if(id.startsWith("0x") || id.startsWith("0X"))
  103.             id = new String(gethexValue(values[ENGINEID]));
  104.         }
  105.     }
  106.     catch (NumberFormatException ex) {
  107.         System.err.println("Invalid Integer Arg");
  108.     }
  109. catch (StringIndexOutOfBoundsException sie){
  110.         System.err.println("Invalid engineID. Please specify proper" +
  111. " hex value. Exception = " + sie);
  112. opt.usage_error();
  113. }
  114. userName = opt.remArgs[0];
  115. if ((values[AUTH_PROTOCOL] != null) && (values[AUTH_PASSWORD] != null)) {
  116. if(values[AUTH_PROTOCOL].equals("SHA"))
  117. authProtocol = USMUserEntry.SHA_AUTH;
  118. else 
  119. authProtocol = USMUserEntry.MD5_AUTH;
  120. if(authProtocol==USMUserEntry.NO_AUTH){
  121. System.err.println("Enter authentication protocol");
  122. opt.usage_error();
  123. }
  124. authPassword = values[AUTH_PASSWORD];
  125. if (values[PRIV_PASSWORD] != null) 
  126. privPassword = values[PRIV_PASSWORD];
  127. }
  128. else if ((values[AUTH_PROTOCOL] != null) 
  129. || (values[AUTH_PASSWORD] != null) 
  130. || (values[PRIV_PASSWORD] != null)) {
  131. opt.usage_error();
  132. }
  133. if (values[CONTEXT_NAME] != null)
  134. contextName = values[CONTEXT_NAME];
  135. if (values[CONTEXT_ID] != null) 
  136. contextID = values[CONTEXT_ID];
  137.     createUSMTable(userName.getBytes(), id.getBytes(), authProtocol,
  138.            authPassword, privPassword, api);
  139. pdu.setUserName(userName.getBytes());
  140.     
  141.     // Loading MIBS 
  142.     MibOperations mibOps = new MibOperations();
  143.  
  144.     // To load MIBs from compiled file
  145.  mibOps.setLoadFromCompiledMibs(true);
  146.     if (values[MIBS] != null) try {
  147.         System.err.println("Loading MIBs: "+values[MIBS]);
  148.         mibOps.loadMibModules(values[MIBS]);
  149.     } catch (Exception ex) {
  150.         System.err.println("Error loading MIBs: "+ex.getMessage());
  151.     }
  152.     
  153.     // Adding the sysUpTime variable binding 
  154.     SnmpOID oid = mibOps.getSnmpOID(".1.3.6.1.2.1.1.3.0");
  155.     if (oid == null) 
  156.         System.exit(1);
  157.     else     
  158.         addVarBind(mibOps, pdu, oid, opt.remArgs[2]);
  159.     // Adding the snmpTrapOID variable binding
  160.      oid = mibOps.getSnmpOID(".1.3.6.1.6.3.1.1.4.1.0");
  161.     if (oid == null) {
  162. System.exit(1);
  163. }
  164.     else 
  165.         addVarBind(mibOps, pdu, oid, opt.remArgs[3]);
  166.     
  167.      // add Variable Bindings
  168.     for (int i=4;i<opt.remArgs.length;) { 
  169.       if (opt.remArgs.length < i+2) opt.usage_error(); //need "{OID value}"
  170.       oid = mibOps.getSnmpOID(opt.remArgs[i++]);       
  171.       if (oid == null){ 
  172.         System.exit(1);
  173.   }
  174.       else {
  175.         addVarBind(mibOps, pdu, oid, opt.remArgs[i++]);
  176.       }
  177.     } // end of add variable bindings
  178.     try {
  179.         // Opening session
  180.         session.open();
  181.         // Send PDU
  182.          session.send(pdu);    
  183.     } 
  184.     catch (SnmpException e) {
  185.       System.err.println("Sending PDU"+e.getMessage());
  186.     }
  187.     // close session    
  188.     session.close();
  189.     // stop api thread
  190.     api.close();
  191.     System.exit(0);
  192.   }
  193.  /** <img SRC="images/v3only.jpg" ALT="v3 only"> adds the varbind with specified oid and value */
  194.   static void addVarBind( MibOperations mibOps, SnmpPDU pdu, SnmpOID oid, String value)
  195.   {        
  196.       // Get the MibNode for this SnmpOID instance if found 
  197.       MibNode node = mibOps.getMibNode(oid);
  198.       if (node == null) 
  199.           System.err.println("Failed. MIB node unavailable for OID:"+oid);
  200.       else
  201.       {
  202.           // Get the syntax associated with this node
  203.           if (node.getSyntax() == null) 
  204.               System.err.println("Failed. OID not a leaf node.");
  205.           else
  206.           {
  207.               SnmpVarBind varbind = null;
  208.               try {
  209.    LeafSyntax syntx = node.getSyntax();
  210.    if(syntx.getType() == SnmpAPI.OBJID){
  211.    SnmpOID snmpoid = mibOps.getSnmpOID(value);
  212. value = snmpoid.toString();
  213.    }
  214.                   // Get the SnmpVar instance for the value
  215.                   SnmpVar var = syntx.createVariable(value);
  216.                   // Create SnmpVarBind instance 
  217.                   varbind = new SnmpVarBind(oid,var);
  218.                   
  219.               } catch (SnmpException ex) { 
  220.                   System.err.println("Error creating variable."); 
  221.               }
  222.               // Add the variable-bindings to the PDU
  223.               pdu.addVariableBinding(varbind);      
  224.           }
  225.       }  
  226.   }
  227.     private static byte[] gethexValue(String value)
  228.     {
  229.         byte temp;
  230.         byte[] Key=new byte[value.length()/2 - 1];
  231.         String ss,str;
  232.         ss = value.substring(2);
  233.         for(int i = 0; i < ss.length(); i+=2)
  234.         {
  235.             str = ss.substring(i,i+2);
  236.             temp = (byte)Integer.parseInt(str,16);
  237.             Key[i/2] = temp;
  238.         }
  239.         return Key;    
  240.     }
  241.     
  242.     public static void createUSMTable(byte[] name, byte[] engineID, 
  243. int authProtocol, String authPassword,
  244. String privPassword, SnmpAPI api)
  245.     {
  246.     byte level = 0;
  247.     
  248.     USMUserEntry entry = new USMUserEntry(name, engineID);
  249.     entry.setAuthProtocol(authProtocol);
  250.     if ((authProtocol != USMUserEntry.NO_AUTH) && (authPassword != null))
  251.     {
  252.         byte[] authKey = USMUtils.password_to_key(authProtocol, 
  253. authPassword.getBytes(), 
  254. authPassword.getBytes().length,
  255. engineID);
  256.             entry.setAuthKey(authKey);
  257.             level = 1;
  258.             
  259.             if ((privPassword != null)&&(privPassword.length()>0))
  260.             {
  261.                 byte[] tempKey = USMUtils.password_to_key(authProtocol,
  262. privPassword.getBytes(), 
  263. privPassword.getBytes().length,
  264. engineID);
  265.                 byte privKey[]=new byte[16];
  266.                         System.arraycopy(tempKey,0,privKey,0,16);
  267.                 entry.setPrivKey(privKey);
  268.                 level |= 2;
  269.             }
  270.     }
  271.     
  272.     entry.setSecurityLevel(level);
  273. USMUserTable uut = (USMUserTable)api.getSecurityProvider().
  274. getTable(USM_SECURITY_MODEL);
  275.     uut.addEntry(entry);
  276.     api.setSnmpEngineID(engineID);
  277.     }   
  278.   
  279. }