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

SNMP编程

开发平台:

C/C++

  1. /* $Id: snmpv3trapd.src,v 1.4 2002/09/09 05:36:52 parasuraman Exp $ */
  2. /*
  3.  * @(#)snmpv3trapd.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 for receiving traps 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 snmpv3trapd [options]
  13.  *
  14.  * java snmpv3trapd [-d] [-p port][-c community] [-u user] [-e engineID] [-a authProtocol] [-w auth_password] [-s priv_password]
  15.  * e.g. 
  16.  * java snmpv3trapd -p 162 -c public 
  17.  * 
  18.  * Options:
  19.  * [-d]                - Debug output. By default off.
  20.  * [-p] <port>         - remote port no. By default 162.
  21.  * [-c] <community>    - community String. By default "public".               
  22.  */
  23. import java.lang.*;
  24. import java.util.*;
  25. import java.net.*;
  26. import com.adventnet.snmp.snmp2.*;
  27. import com.adventnet.snmp.snmp2.usm.*;
  28. public class snmpv3trapd implements SnmpClient {
  29.     private final static int PORT = 1;
  30.     private final static int COMMUNITY = 2;
  31.     private final static int USER_NAME = 3;
  32.     private final static int ENGID = 4;
  33.     private final static int AUTH_PROTOCOL = 5;
  34.     private final static int AUTH_PASSWORD = 6;
  35.     private final static int PRIV_PASSWORD = 7;
  36.    static final int USM_SECURITY_MODEL = 3;
  37.     static SnmpAPI api;
  38.     public static void main(String args[]) {
  39.         
  40. System.out.println("Please wait till the snmpv3trapd initializes ...");
  41.         // Take care of getting options
  42.         String usage = "snmpv3trapd [-d] [-p port] [-c community] [-u user] [-e engineID(0x...)] [-a authProtocol] [-w auth_password] [-s priv_password]";
  43.         String options[] = { "-d", "-p", "-c", "-u", "-e", "-a", "-w", "-s"};
  44.         String values[] = { "None", null, null, null, null, null, null, null};
  45.         ParseOptions opt = new ParseOptions(args,options,values, usage);
  46.         String userName = null;
  47.         int authProtocol = USMUserEntry.NO_AUTH;
  48.         String authPassword = new String ("");
  49.         String privPassword = new String ("");
  50.         String engineID = null;
  51.         int privProtocol = 0;
  52.         byte secLevel = 0;
  53. int portNo=162; // Default port number at which receiver listens.
  54.         // Start SNMP API
  55.         api = new SnmpAPI();
  56.         if (values[0].equals("Set")) api.setDebug( true );
  57.         
  58.         if (opt.remArgs.length>0) opt.usage_error();
  59.         // Open session 
  60.         SnmpSession session = new SnmpSession(api);
  61.         session.addSnmpClient(new snmpv3trapd());
  62.         // set local port
  63.         try {
  64.             if (values[PORT] != null) 
  65. {
  66. portNo = Integer.parseInt(values[PORT]);
  67. }
  68.             session.setLocalPort(portNo);        
  69.             if (values[USER_NAME] != null) {
  70.                 userName = values[USER_NAME];
  71.             }
  72.             
  73.             if (values[ENGID] != null) {
  74.                 engineID = values[ENGID];
  75. if(engineID.startsWith("0x") || engineID.startsWith("0X"))
  76. engineID = new String(gethexValue(values[ENGID]));
  77.             }
  78.             
  79.             if (values[AUTH_PROTOCOL] != null) {
  80.                 if ( values[AUTH_PROTOCOL].equals("SHA")){
  81.                     authProtocol = USMUserEntry.SHA_AUTH;
  82.                  secLevel |= 0x01;
  83. }
  84.                 else if ( values[AUTH_PROTOCOL].equals("MD5")){
  85.                     authProtocol = USMUserEntry.MD5_AUTH;
  86.                  secLevel |= 0x01;
  87. }
  88.                 else
  89.                     authProtocol = USMUserEntry.NO_AUTH;
  90.             }
  91.             
  92.             if (values[AUTH_PASSWORD] != null) {
  93.                 if (secLevel == 0x01)
  94.                  authPassword = values[AUTH_PASSWORD];
  95.                 else
  96.                  opt.usage_error();
  97.             }
  98.             
  99.             if(values[PRIV_PASSWORD] != null) {
  100.                 if (secLevel == 0x01)
  101.                 {
  102.                     privPassword = values[PRIV_PASSWORD];
  103.                     privProtocol = USMUserEntry.CBC_DES;
  104.                     secLevel |= 0x02;
  105.                 }
  106.                 else
  107.                  opt.usage_error();
  108.             }
  109.         }
  110.         catch (NumberFormatException ex) {
  111.             System.err.println("Invalid Integer Arg: " + ex.getMessage());
  112.             System.exit(1);
  113.         }
  114. catch (StringIndexOutOfBoundsException sie){
  115. System.err.println("Invalid engineID. Please specify proper" +
  116. " hex value. Exception = " + sie);
  117. opt.usage_error();
  118. }
  119.         if(userName != null) {
  120. // Create a new USMUserEntry for the userName and engineID pair.
  121.             USMUserEntry user = new USMUserEntry(userName.getBytes(),
  122. engineID.getBytes());
  123.             if ((secLevel & 0x01)== 0x01)
  124.             {
  125.                 user.setAuthProtocol(authProtocol);
  126.                 user.setAuthPassword(authPassword.getBytes());
  127. // Convert the auth password to key.
  128. byte[] authKey = 
  129. USMUtils.password_to_key(authProtocol, 
  130. authPassword.getBytes(),
  131. authPassword.getBytes().length,
  132. engineID.getBytes());
  133. user.setAuthKey(authKey);
  134.                 if (secLevel == 0x03)
  135.                 {
  136.                     user.setPrivProtocol(privProtocol);
  137.                     user.setPrivPassword(privPassword.getBytes());
  138. // Convert the priv password to key.
  139. byte[] privKey = USMUtils.password_to_key(authProtocol,
  140. privPassword.getBytes(),
  141. privPassword.getBytes().length,
  142. engineID.getBytes());
  143. user.setPrivKey(privKey);
  144.                 }
  145.             }
  146.             user.setSecurityLevel(secLevel);
  147. USMUserTable uut = (USMUserTable)api.getSecurityProvider().
  148. getTable(USM_SECURITY_MODEL);
  149.             uut.addEntry(user);
  150. // create a SnmpEngineEntry for the localhost,port pair
  151. SnmpEngineEntry e = new SnmpEngineEntry("localhost", portNo);
  152. e.setEngineID(engineID.getBytes());
  153. // Add the SnmpEngineEntry reference to USMUserEntry.
  154. user.setEngineEntry(e);
  155.         }
  156.         // set community in case of v1/v2c
  157.         if(values[COMMUNITY] != null)
  158.             session.setCommunity(values[COMMUNITY]);
  159.         
  160.         // Open the session
  161.         try { 
  162. session.open(); 
  163. }
  164.         catch (SnmpException e) {
  165.             System.err.println(e);
  166.             System.exit(1);
  167.         }
  168. System.out.println("snmpv3trapd ready to receive v1/v2c/v3 traps");
  169.     }
  170.     
  171.     public boolean authenticate(SnmpPDU pdu, String community){
  172. if(pdu.getVersion() == SnmpAPI.SNMP_VERSION_3)
  173. return true;
  174. else
  175.          return (pdu.getCommunity().equals(community));
  176.     }
  177.   
  178.     public boolean callback(SnmpSession session,SnmpPDU pdu, int requestID){
  179.         // check trap version
  180.         if (pdu.getCommand() == api.TRP_REQ_MSG) {
  181.             System.out.println("Trap received from: "
  182.                 +(pdu.getAddress()).getHostAddress() 
  183. +", community: " + pdu.getCommunity());
  184.             System.out.println("Enterprise: " + pdu.getEnterprise());
  185.             System.out.println("Agent: " 
  186. + (pdu.getAgentAddress()).getHostAddress());
  187.             System.out.println("TRAP_TYPE: " + pdu.getTrapType());
  188.             System.out.println("SPECIFIC NUMBER: " + pdu.getSpecificType());
  189.             System.out.println("Time: " + pdu.getUpTime()+"nVARBINDS:");
  190.             // print varbinds
  191.             for (Enumeration e = pdu.getVariableBindings().elements();
  192. e.hasMoreElements();)
  193.                 System.out.println(((SnmpVarBind) e.nextElement()).
  194. toTagString());
  195.         }
  196.         else if(pdu.getCommand() == api.TRP2_REQ_MSG)
  197.         {
  198.             System.out.println("Trap received from: "
  199.                 + (pdu.getAddress()).getHostAddress() 
  200. + ", community: " + pdu.getCommunity());
  201.             for (Enumeration e = pdu.getVariableBindings().elements();
  202. e.hasMoreElements();)
  203.                 System.out.println(((SnmpVarBind) e.nextElement()).
  204. toTagString());
  205.         }
  206.         else
  207.             System.err.println("Non trap PDU received.");
  208.         System.out.println(""); // a blank line between traps
  209.         return true;
  210.   
  211.     }
  212.   
  213.     public void debugPrint(String debugOutput){
  214.         System.out.println(debugOutput);
  215.         return;    
  216.     }
  217.     
  218. private static byte[] gethexValue(String value)
  219. {
  220. byte temp;
  221. byte[] Key=new byte[value.length()/2 - 1];
  222. String ss,str;
  223. ss = value.substring(2);
  224. for(int i = 0; i < ss.length(); i+=2)
  225. {
  226. str = ss.substring(i,i+2);
  227. temp = (byte)Integer.parseInt(str,16);
  228. Key[i/2] = temp;
  229. }
  230. return Key;
  231. }
  232. }