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

SNMP编程

开发平台:

C/C++

  1. /* $Id: snmpv3trap.src,v 1.4.2.11 2009/01/28 13:32:12 tmanoj Exp $ */
  2. /*
  3.  * @(#)snmpv3trap.java
  4.  * Copyright (c) 1996-2009 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 context_id] userName[-pp privProtocol(DES/AES-128/AES-192/AES-256/3DES)] host TimeTicksvalue OIDvalue [OID {INTEGER | STRING | GAUGE | TIMETICKS | OPAQUE | IPADDRESS | COUNTER | COUNTER64 | UNSIGNED32} value] ...
  13.  * e.g.
  14.  * java snmpv3trap -e 0x000012141516171819202121 -a MD5 -w initial2Pass -i initial initial2 10.3.2.120 16352 .1.3.6.1.4.1.2162.1000.2 .1.3.6.1.4.1.2162.1001.21.0 STRING TrapTest
  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.  * Options:
  21.  * [-d]                  - Debug output. By default off.
  22.  * [-p] <port>           - remote port no. By default 162.
  23.  * [-e] <engineID>       - Engine ID.
  24.  * [-a] <autProtocol>    - The authProtocol(MD5/SHA). Mandatory if authPassword is specified
  25.  * [-w] <authPassword>   - The authentication password.
  26.  * [-s] <privPassword>   - The privacy protocol password. Must be accompanied with auth password and authProtocol fields.
  27.  * [-n] <contextName>    - The contextName to be used for the v3 pdu.
  28.  * [-i] <contextID>      - The contextID to be used for the v3 pdu.
  29.  * <username>            - The v3 principal/userName. Mandatory.
  30.  * <timeticks> Mandatory - the value of object sysUpTime when the event occurred
  31.  * <OID-value> Mandatory - Object Identifier  
  32.  * <host>      Mandatory - The RemoteHost (agent).Format (string without double qoutes/IpAddress).
  33.  * <OID>       Mandatory - Object Identifier.
  34.  * <value>     Mandatory - The object instance value to be set .
  35.  */ 
  36. import java.lang.*;
  37. import java.util.*;
  38. import java.net.*;
  39. import com.adventnet.snmp.snmp2.*;
  40. import com.adventnet.snmp.snmp2.usm.*;
  41. public class snmpv3trap {
  42.   private static final int DEBUG = 0;
  43.   private static final int PORT = 1;
  44.   private static final int AUTH_PROTOCOL = 2;
  45.   private static final int AUTH_PASSWORD = 3;
  46.   private static final int PRIV_PASSWORD = 4;
  47.   private static final int CONTEXT_NAME = 5;
  48.   private static final int CONTEXT_ID = 6;
  49.   private static final int ENGINEID = 7;
  50.   static final int USM_SECURITY_MODEL = 3;
  51.   private static final int PRIV_PROTOCOL=9;
  52.   public static void main(String args[]) {
  53.      // Take care of getting options
  54.     String usage = "snmpv3trap [-d] [-p port][-g agent-address][-e engineID(0x....)] [-a auth_protocol] [-w auth_password] [-s priv_password] [-n contextName] [-i contextID]n[-pp privProtocol(DES/AES-128/AES-192/AES-256/3DES)] userName host TimeTicksvalue OIDvalue [OID {INTEGER | STRING | GAUGE | TIMETICKS | OPAQUE | IPADDRESS | COUNTER | COUNTER64 | UNSIGNED32} value] ...";
  55.     String options[] = { "-d", "-p", "-a", "-w", "-s", "-n", "-i", "-e" ,"-g", "-pp"};
  56.     String values[] = { "None", null, null, null, null, null, null, null,null, null };
  57.    
  58.     String id = new String(""); 
  59.     String userName = new String("");
  60.     int authProtocol = USMUserEntry.NO_AUTH;
  61.     int privProtocol=USMUserEntry.NO_PRIV;
  62.     String authPassword = new String ("");
  63.     String privPassword = new String ("");
  64.     String contextName = new String ("");
  65.     String contextID = new String ("");
  66.     ParseOptions opt = new ParseOptions(args,options,values, usage);
  67.     if (opt.remArgs.length<4) opt.usage_error();
  68.     
  69.     // Start SNMP API
  70.     SnmpAPI api;
  71.     api = new SnmpAPI();
  72.     if (values[0].equals("Set")) api.setDebug( true );
  73.     
  74.     SnmpPDU pdu = new SnmpPDU(); 
  75.     Snmp3Message msg = (Snmp3Message)(pdu.getMsg());
  76.     pdu.setCommand( api.TRP2_REQ_MSG );
  77.                        
  78.     // Open session
  79.     SnmpSession session = new SnmpSession(api);
  80.     // set remoteHost
  81.     UDPProtocolOptions ses_opt = new UDPProtocolOptions(opt.remArgs[1]);
  82.     // set version
  83.     session.setVersion( SnmpAPI.SNMP_VERSION_3 ) ;
  84.     
  85.     try {        
  86.         if(values[PORT] != null)
  87.             ses_opt.setRemotePort( Integer.parseInt(values[PORT]) );
  88.         else
  89.             ses_opt.setRemotePort(162);
  90.         if (values[ENGINEID]!=null) {
  91.             id =  values[ENGINEID];
  92.             if(id.startsWith("0x") || id.startsWith("0X"))
  93.                 id = new String(gethexValue(values[ENGINEID]));
  94.         }
  95.     }
  96.     catch (NumberFormatException ex) {
  97.         System.err.println("Invalid Integer Arg");
  98.     }
  99.     catch (StringIndexOutOfBoundsException sie){
  100.         System.err.println("Invalid engineID. Please specify proper" +
  101.                                         " hex value. Exception = " + sie);
  102.         opt.usage_error();
  103.     }
  104.     session.setProtocolOptions(ses_opt);
  105.     userName = opt.remArgs[0];
  106.                 
  107.     if ((values[AUTH_PROTOCOL] != null) && (values[AUTH_PASSWORD] != null)) {
  108.         if(values[AUTH_PROTOCOL].equals("SHA"))
  109.             authProtocol = USMUserEntry.SHA_AUTH;
  110.         else 
  111.             authProtocol = USMUserEntry.MD5_AUTH;                   
  112.         if(authProtocol==USMUserEntry.NO_AUTH){
  113.             System.err.println("Enter authentication protocol");
  114.             opt.usage_error();
  115.         }
  116.                     
  117.         authPassword = values[AUTH_PASSWORD];
  118.           if (values[PRIV_PASSWORD] != null) 
  119. {
  120.               privPassword = values[PRIV_PASSWORD];
  121.     if(values[PRIV_PROTOCOL] !=null)
  122.     {
  123.   if(values[PRIV_PROTOCOL].equals("DES"))
  124.   {  
  125.     
  126.      privProtocol=USMUserEntry.CBC_DES;
  127.   }
  128.   else if(values[PRIV_PROTOCOL].equals("AES-128"))
  129.   {  
  130.     
  131.      privProtocol=USMUserEntry.CFB_AES_128;
  132.   }
  133.   else if(values[PRIV_PROTOCOL].equals("AES-192"))
  134.   {  
  135.     
  136.      privProtocol=USMUserEntry.CFB_AES_192 ;
  137.   }
  138.   else if(values[PRIV_PROTOCOL].equals("AES-256"))
  139.   {  
  140.     
  141.      privProtocol=USMUserEntry.CFB_AES_256;
  142.   }
  143.   else if(values[PRIV_PROTOCOL].equals("3DES"))
  144.   {  
  145.     
  146.      privProtocol=USMUserEntry.CBC_3DES;
  147.   }
  148.   else
  149.   {
  150.   System.out.println(" Invalid privProtocol ");
  151.    opt.usage_error();
  152.   }
  153.     }
  154.     else
  155.     {
  156.     System.out.println(" Please specify the privProtocol value ");
  157.                      opt.usage_error();
  158.     
  159.     }     
  160. }               
  161.     }
  162.     else if ((values[AUTH_PROTOCOL] != null) 
  163.                 || (values[AUTH_PASSWORD] != null) 
  164.                 || (values[PRIV_PASSWORD] != null)) {
  165.         opt.usage_error();
  166.     }
  167.     if (values[CONTEXT_NAME] != null)
  168.         contextName = values[CONTEXT_NAME];
  169.     if (values[CONTEXT_ID] != null) 
  170.         contextID = values[CONTEXT_ID];
  171.     createUSMTable(userName.getBytes(), id.getBytes(), authProtocol,
  172.                                     authPassword, privPassword, api,privProtocol);
  173.     pdu.setUserName(userName.getBytes());
  174.     // Build trap request PDU    
  175.     // Adding the sysUpTime variable binding 
  176.     SnmpOID oid = new SnmpOID(".1.3.6.1.2.1.1.3.0");
  177.     if (oid.toValue() == null) 
  178.         System.err.println("Invalid OID argument: .1.3.6.1.2.1.1.3.0");
  179.     else {
  180.         SnmpVar var = null ; 
  181.         try {
  182.             var = SnmpVar.createVariable(opt.remArgs[2], SnmpAPI.TIMETICKS);
  183.         }
  184.         catch (SnmpException e) {
  185.             System.err.println("Cannot create variable: " + oid 
  186.                                 +" with value: "+opt.remArgs[1]);
  187.         }
  188.         SnmpVarBind varbind = new SnmpVarBind(oid, var);
  189.         pdu.addVariableBinding(varbind);
  190.         
  191.     }        
  192.     // Adding the snmpTrapOID variable binding
  193.      oid = new SnmpOID(".1.3.6.1.6.3.1.1.4.1.0");
  194.     if (oid.toValue() == null) System.err.println("Invalid OID argument: "
  195.                                                 + ".1.3.6.1.6.3.1.1.4.1.0");
  196.     else {
  197.         SnmpVar var = null ;
  198.         try {
  199.             var = SnmpVar.createVariable(opt.remArgs[3], SnmpAPI.OBJID);
  200.         }
  201.         catch (SnmpException e) {
  202.             System.err.println("Cannot create variable: " + oid 
  203.                                 +" with value: "+opt.remArgs[2]);
  204.         }
  205.         SnmpVarBind varbind = new SnmpVarBind(oid, var);
  206.         pdu.addVariableBinding(varbind);
  207.         
  208.     }    
  209.     String agentAddress="";
  210.     int otherVarBinds=0;
  211.     for (int i=4;i<opt.remArgs.length;) { // add Variable Bindings
  212.       if (opt.remArgs.length < i+3) opt.usage_error(); //need "{OID type value}"
  213.      
  214.         oid = new SnmpOID(opt.remArgs[i++]);
  215.       if (oid.toValue() == null) 
  216.         System.err.println("Invalid OID argument: " + opt.remArgs[i]);
  217.       else 
  218.         addVarBind(pdu, oid, opt.remArgs[i++], opt.remArgs[i++]);
  219.     } // end of add variable bindings
  220.    
  221.     if(values[8]!=null)
  222.     {
  223.         oid = new SnmpOID(".1.3.6.1.6.3.18.1.4");
  224.         addVarBind(pdu, oid,"STRING", values[8]);
  225.     }
  226.     try {
  227.         // Opening session
  228.         session.open();
  229.         // Send PDU
  230.          session.send(pdu);
  231.     
  232.     } 
  233.     catch (SnmpException e) {
  234.       System.err.println("Sending PDU"+e.getMessage());
  235.     }
  236.     // close session    
  237.     session.close();
  238.     // stop api thread
  239.     api.close();
  240.     System.exit(0);
  241.   }
  242. /** adds the varbind  with specified oid, type and value to the pdu */
  243.     static void addVarBind(SnmpPDU pdu, SnmpOID oid, String type, String value)
  244.     {        
  245.         byte dataType ;
  246.         if (type.equals("INTEGER")) {
  247.         dataType = SnmpAPI.INTEGER;
  248.         } else if (type.equals("STRING")) {
  249.         dataType = SnmpAPI.STRING;
  250.         } else if (type.equals("GAUGE")) {
  251.         dataType = SnmpAPI.GAUGE;
  252.         } else if (type.equals("TIMETICKS")) {
  253.         dataType = SnmpAPI.TIMETICKS;
  254.         } else if (type.equals("OPAQUE")) {
  255.         dataType = SnmpAPI.OPAQUE;
  256.         } else if (type.equals("IPADDRESS")) {
  257.         dataType = SnmpAPI.IPADDRESS;
  258.         } else if (type.equals("COUNTER")) {
  259.         dataType = SnmpAPI.COUNTER;
  260.         } else if (type.equals("OID")) { 
  261.         dataType = SnmpAPI.OBJID;
  262.         }else if (type.equals("COUNTER64")) {
  263.         dataType = SnmpAPI.COUNTER64;
  264.         }
  265.          
  266.         else { // unknown type
  267.         System.err.println("Invalid variable type: " + type);
  268.         return;
  269.         }
  270.         
  271.         SnmpVar var = null;
  272.         try {
  273.         var = SnmpVar.createVariable( value, dataType );
  274.         }
  275.         catch(SnmpException e){
  276.         System.err.println("Cannot create variable: " + oid 
  277.                             + " with value: " + value);
  278.         return;
  279.         }
  280.         SnmpVarBind varbind = new SnmpVarBind(oid, var);
  281.         pdu.addVariableBinding(varbind);
  282.         
  283.     }
  284.   
  285.   
  286.     private static byte[] gethexValue(String value)
  287.     {
  288.         byte temp;
  289.         byte[] Key=new byte[value.length()/2 - 1];
  290.         String ss,str;
  291.         ss = value.substring(2);
  292.         for(int i = 0; i < ss.length(); i+=2)
  293.         {
  294.             str = ss.substring(i,i+2);
  295.             temp = (byte)Integer.parseInt(str,16);
  296.             Key[i/2] = temp;
  297.         }
  298.         return Key;    
  299.     }
  300.     public static void createUSMTable(byte[] name, byte[] engineID, 
  301.                                     int authProtocol, String authPassword,
  302.                                     String privPassword, SnmpAPI api, int privProtocol)
  303.     {
  304.     byte level = 0;
  305.     
  306.     USMUserTable uut = (USMUserTable)api.getSecurityProvider().
  307.                                             getTable(USM_SECURITY_MODEL);
  308.     USMUserEntry entry = new USMUserEntry(name, engineID);
  309.     entry.setAuthProtocol(authProtocol);
  310.     if ((authProtocol != USMUserEntry.NO_AUTH) && (authPassword != null))
  311.     {
  312.         byte[] authKey = USMUtils.password_to_key(authProtocol, 
  313.                                             authPassword.getBytes(), 
  314.                                             authPassword.getBytes().length,
  315.                                             engineID);
  316.             entry.setAuthKey(authKey);
  317.             level = 1;
  318.             
  319.             if ((privPassword != null)&&(privPassword.length()>0))
  320.             {
  321.                 byte[] tempKey = USMUtils.password_to_key(authProtocol, 
  322.                                             privPassword.getBytes(),
  323.                                             privPassword.getBytes().length,
  324.                                             engineID,privProtocol);
  325.                 entry.setPrivProtocol(privProtocol);
  326.                 byte privKey[]=null;
  327. if(privProtocol==USMUserEntry.CFB_AES_192)
  328. {
  329. privKey=new byte[24];
  330. System.arraycopy(tempKey,0,privKey,0,24);
  331. }
  332. else if(privProtocol==USMUserEntry.CFB_AES_256)
  333. {
  334. privKey =new byte[32];
  335. System.arraycopy(tempKey,0,privKey,0,32);
  336. }
  337. else if(privProtocol==USMUserEntry.CBC_3DES)
  338. {
  339. privKey =new byte[32];
  340. System.arraycopy(tempKey,0,privKey,0,32);
  341. }
  342. else
  343. {
  344. privKey=new byte[16];
  345. System.arraycopy(tempKey,0,privKey,0,16);
  346. }
  347. entry.setPrivKey(privKey);
  348.                 level |= 2;
  349.             }
  350.     }
  351.     
  352.     entry.setSecurityLevel(level);
  353.     uut.addEntry(entry);
  354.     api.setSnmpEngineID(engineID);
  355.     }
  356.     
  357. }