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

SNMP编程

开发平台:

C/C++

  1. /* $Id: snmpv3informreqd.src,v 1.5.2.7 2009/01/28 13:31:05 tmanoj Exp $ */
  2. /*
  3.  * @(#)snmpv3informreqd.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 for receiving SNMP Inform Requests using the
  9.  * 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 snmpv3informreqd [options]
  13.  *
  14.  * java snmpv3informreqd [-d] <-p port> <-u user> <-e engineId>
  15.  * [-a authProtocol] [-w auth_password] [-s priv_password] [-pp privProtocol(DES/AES-128/AES-192/AES-256/3DES)]
  16.  * e.g. 
  17.  * java snmpv3informreqd -p 2000 -u inform_test -e 1234  -pp DES
  18.  * 
  19.  * Mandatory Options:
  20.  * <-p port>        - remote port no.
  21.  * <-u user>                - user name
  22.  * <-e engineId>        - Engine Id
  23.  *
  24.  * Optional Options:
  25.  * [-d]                - Debug output. By default off.
  26.  * [-a authProtocol]     - Authentication protocol used.
  27.  * [-w auth_password]    - Authentication password used.
  28.  * [-s priv_password]    - Priv protocol used.
  29.  *
  30.  * Note: 
  31.  * 1. If neither of -a, -w, -s are used, then the security level is NO_AUTH, 
  32.  *      NO_PRIV,
  33.  * 2. If -a, -w are used, then the security level is AUTH, NO_PRIV,
  34.  * 3. If -a, -w and -s are used, then the security level is AUTH, PRIV,
  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 snmpv3informreqd implements SnmpClient {
  42.   private final static int PORT = 1;
  43.   private final static int COMMUNITY = 2;
  44.   private final static int USER_NAME = 3;
  45.   private final static int ENGID = 4;
  46.   private final static int AUTH_PROTOCOL = 5;
  47.   private final static int AUTH_PASSWORD = 6;
  48.   private final static int PRIV_PROTOCOL = 7;
  49.   private final static int PRIV_PASSWORD = 8;
  50.   static final int USM_SECURITY_MODEL = 3;
  51.     SnmpAPI api;
  52.     SnmpSession session; 
  53.     int localport;
  54.     byte[] engineId = null;
  55.     public snmpv3informreqd ()  {
  56.         // Start SNMP API
  57.         api = new SnmpAPI();
  58.         // Create session 
  59.         session = new SnmpSession(api);
  60.     }
  61.   public static void main(String args[]) {
  62.         
  63.     // Take care of getting options
  64.     String usage = "snmpv3informreqd [-d] [-p port] [-c community] [-u user] [-e engineId] [-a authProtocol] [-w auth_password] [-pp privProtocol(DES/AES-128/AES-192/AES-256/3DES)] [-s priv_password]" ;
  65.     String options[] = { "-d", "-p", "-c", "-u", "-e", "-a", "-w", "-pp", "-s"};
  66.     String values[] = { "None", null, null, null, null, null, null, null,null};
  67.     ParseOptions opt = new ParseOptions(args,options,values, usage);
  68.     String userName = null;
  69.     int authProtocol = USMUserEntry.NO_AUTH;
  70.     String authPassword = null;
  71.     String privPassword = null;
  72.     int privProtocol = 0;
  73.     byte secLevel = 0;
  74.     snmpv3informreqd    infReqObj = new snmpv3informreqd(); 
  75.         
  76.     if (values[0].equals("Set")) 
  77.     {
  78.         infReqObj.api.setDebug( true );
  79.     }
  80.         
  81.     if (opt.remArgs.length > 0) 
  82.     {
  83.         opt.usage_error();
  84.     }
  85.         
  86.       // Add client to the session 
  87.     infReqObj.session.addSnmpClient(infReqObj);
  88.     // Set local port
  89.     UDPProtocolOptions ses_opt = new UDPProtocolOptions();
  90.     try {
  91.         if (values[PORT] != null)
  92.         {
  93.             infReqObj.localport = Integer.parseInt(values[PORT]);
  94.             ses_opt.setLocalPort(infReqObj.localport);
  95.         }
  96.         else 
  97.         {
  98.             ses_opt.setLocalPort(162);
  99.         }
  100.         infReqObj.session.setProtocolOptions(ses_opt);
  101.         if (values[USER_NAME] != null) 
  102.         {
  103.             userName = values[USER_NAME];
  104.         }
  105.             
  106.         if (values[ENGID] != null)
  107.         {
  108.             infReqObj.engineId = values[ENGID].getBytes();
  109.         }
  110.         if (values[AUTH_PROTOCOL] != null) 
  111.         {
  112.             if(infReqObj.engineId == null)  {
  113.                 System.out.println("EngineID is missing");          
  114.                 opt.usage_error();
  115.             }       
  116.             if (values[AUTH_PROTOCOL].equals("SHA"))
  117.                 {
  118.                 authProtocol = USMUserEntry.SHA_AUTH;
  119.                 secLevel |= 0x01;
  120.                 }
  121.             else if (values[AUTH_PROTOCOL].equals("MD5"))
  122.                 {
  123.                 authProtocol = USMUserEntry.MD5_AUTH;
  124.                 secLevel |= 0x01;
  125.                 }
  126.             else
  127.                 {
  128.                 authProtocol = USMUserEntry.NO_AUTH;
  129.                 }
  130.         }
  131.             
  132.         if (values[AUTH_PASSWORD] != null) 
  133.         {
  134.             if(infReqObj.engineId == null)  {
  135.                 System.out.println("EngineID is missing");          
  136.                 opt.usage_error();
  137.             }       
  138.             if (secLevel == 0x01)
  139.                 {
  140.                 authPassword = values[AUTH_PASSWORD];
  141.                 }
  142.             else
  143.                 {
  144.                 opt.usage_error();
  145.             }
  146.         }
  147.             
  148.         if(values[PRIV_PASSWORD] != null) 
  149.         {
  150.             if(infReqObj.engineId == null)  {
  151.                 System.out.println("EngineID is missing");          
  152.                 opt.usage_error();
  153.             }       
  154.             if (secLevel == 0x01)
  155.             {
  156.                 privPassword = values[PRIV_PASSWORD];
  157. if(values[PRIV_PROTOCOL] != null)
  158. {
  159. if(values[PRIV_PROTOCOL].equals("AES-128"))
  160. {
  161. privProtocol= USMUserEntry.CFB_AES_128;
  162. }
  163. else if(values[PRIV_PROTOCOL].equals("AES-192"))
  164. {
  165. privProtocol= USMUserEntry.CFB_AES_192;
  166. }
  167. else if(values[PRIV_PROTOCOL].equals("AES-256"))
  168. {
  169. privProtocol= USMUserEntry.CFB_AES_256;
  170. }
  171. else if(values[PRIV_PROTOCOL].equals("3DES"))
  172. {
  173. privProtocol= USMUserEntry.CBC_3DES;
  174. }
  175. else
  176. {
  177.                  privProtocol = USMUserEntry.CBC_DES;
  178. }
  179. }
  180. else
  181. {
  182.                  privProtocol = USMUserEntry.CBC_DES;
  183. }
  184.                 secLevel |= 0x02;
  185.             }
  186.             else
  187.                 {
  188.                 opt.usage_error();
  189.             }
  190.         }
  191.       }
  192.         catch (NumberFormatException ex) {
  193.             System.err.println("Invalid Integer Arg");
  194.         }
  195.         if(userName != null) {
  196.         // Create the USM table entry.
  197.             infReqObj.createUSMTable(userName.getBytes(), authProtocol, 
  198.                                     authPassword, privPassword,privProtocol,infReqObj.api);
  199.         }
  200.         // set community in case of v1/v2c
  201.         if(values[COMMUNITY] != null)
  202.             infReqObj.session.setCommunity(values[COMMUNITY]);
  203.     // Open the session
  204.     try { 
  205.         infReqObj.session.open(); 
  206.             System.out.println ("Waiting to receive SNMP Inform requestsn");
  207.     }
  208.     catch (SnmpException e) {
  209.       System.err.println(e);
  210.       System.exit(1);
  211.     }
  212.   }    
  213.     
  214.   public boolean authenticate(SnmpPDU pdu, String community){
  215.     if(pdu.getVersion() == SnmpAPI.SNMP_VERSION_3)
  216.         return (true);
  217.     else
  218.         return (pdu.getCommunity().equals(community));
  219.   }
  220.  
  221.   /*
  222.    * Callback method that is invoked on receiving an SNMP Inform request message
  223.    */
  224.   public boolean callback(SnmpSession session,SnmpPDU pdu, int requestID)
  225.   {
  226.     // Check received SNMP PDU command type.
  227.     if (pdu.getCommand() == api.INFORM_REQ_MSG) 
  228.     {
  229.       System.out.println("INFORM REQUEST received from: " +
  230.       pdu.getProtocolOptions().getSessionId());
  231.       System.out.println("nVARBINDS:");
  232.   
  233.       // Print varbinds
  234.       for (Enumeration e=pdu.getVariableBindings().elements();
  235.                                                 e.hasMoreElements();)
  236.       {
  237.         System.out.println(((SnmpVarBind) e.nextElement()).toTagString());
  238.       }
  239.     }
  240.     else
  241.     {
  242.       System.err.println("Unexpected SNMP message recieved.");
  243.     }
  244.     System.out.println("");
  245.   
  246.     return true;
  247.   }
  248.     
  249.   public void debugPrint(String debugOutput)    {
  250.   
  251.     System.out.println(debugOutput);
  252.     return;    
  253.   }
  254.     /*
  255.      * Method to create the USM user entry in the USM table and the engine Id 
  256.      * entry in the engine table.
  257.      */
  258.   public void createUSMTable(byte[] name, int authProtocol, 
  259.                     String authPassword, String privPassword, int privProtocol, SnmpAPI api)
  260.   {
  261.     byte level = 0;
  262.     USMUserEntry entry = new USMUserEntry(name, engineId);
  263.     entry.setAuthProtocol(authProtocol);
  264.     if ((authProtocol != USMUserEntry.NO_AUTH) && (authPassword != null))
  265.     {
  266.       byte[] authKey = USMUtils.password_to_key(authProtocol, 
  267.                                             authPassword.getBytes(), 
  268.                                             authPassword.getBytes().length, 
  269.                                             engineId);
  270.       entry.setAuthKey(authKey);
  271.       level = 1;
  272.       if (privPassword != null)
  273.       {
  274.          byte[] tempKey = USMUtils.password_to_key(authProtocol, 
  275.                                             privPassword.getBytes(),
  276.                                             privPassword.getBytes().length,
  277.                                             engineId,privProtocol);
  278.          byte privKey[]=null;
  279. if(privProtocol==USMUserEntry.CFB_AES_192)
  280. {
  281. privKey=new byte[24];
  282. System.arraycopy(tempKey,0,privKey,0,24);
  283. }
  284. else if(privProtocol==USMUserEntry.CFB_AES_256)
  285. {
  286. privKey =new byte[32];
  287. System.arraycopy(tempKey,0,privKey,0,32);
  288. }
  289. else if(privProtocol==USMUserEntry.CBC_3DES)
  290. {
  291. privKey =new byte[32];
  292. System.arraycopy(tempKey,0,privKey,0,32);
  293. }
  294. else
  295. {
  296. privKey=new byte[16];
  297. System.arraycopy(tempKey,0,privKey,0,16);
  298. }
  299.          entry.setPrivKey(privKey);
  300.          level |= 2;
  301.       }
  302.     }
  303.     entry.setSecurityLevel(level);
  304.     entry.setPrivProtocol(privProtocol);
  305.         USMUserTable USMTable = (USMUserTable)api.getSecurityProvider().
  306.                                             getTable(USM_SECURITY_MODEL);
  307.         USMTable.addEntry(entry);
  308.     byte[] names=entry.getUserName();
  309.         byte[] id=entry.getEngineID();
  310.     SnmpEngineEntry e = new SnmpEngineEntry("localhost", localport);
  311.     e.setEngineID(engineId);
  312.     entry.setEngineEntry(e);
  313.     api.setSnmpEngineID(engineId);
  314.   }
  315. }