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

SNMP编程

开发平台:

C/C++

  1. /* $Id: snmpgw.src,v 1.4 2002/09/09 05:36:52 parasuraman Exp $ */
  2. /*
  3.  * @(#)snmpgw.java
  4.  * Copyright (c) 1996-2003 AdventNet, Inc. All Rights Reserved.
  5.  * Please read the COPYRIGHTS file for more details.
  6.  */
  7. /**
  8.  *  snmpgw acts as a gateway between a SNMPv3 management application and a
  9.  *  SNMP v1/v2c agent system.When you start the snmpgw application, you can
  10.  *  specify the remote v1 agent address and port number to which requests
  11.  *  from the SNMPv3 management applications need to be forwarded. You can
  12.  *  also specify the community string to be used while forwarding requests
  13.  *  and other session parameters that are appropriate.
  14.  *  The snmpgw applicaiton also requires the port number on which to listen
  15.  *  for SNMPv3 requests, the USM security parameters like the user name on
  16.  *  whose behalf the requests will be accepted, the authentication and privacy
  17.  *  parameters for the specified user etc. need to be specified. 
  18.  *  Usage:
  19.  *     snmpgw [-d] [-v agent_version(v1,v2)] [-c agent_community] [-wc agent_writeCommunity] [-h agent_host] [-p agent_port] [-t timeout] [-r retries] [-a auth_protocol] [-w auth_password] [-s priv_password] ] port engineID user;
  20.  *     Options:
  21.  *         -d To get detailed debug output. Currently not a very usefule option
  22.  *            Default : DEBUG is disabled
  23.  *         -v version. Used to specify the version of remote host (v1 or v2)
  24.  *            Default : remote agent version is SNMPv1
  25.  *         -c community. Specify the community string used in communication with the v1/v2c remote agent
  26.  *            Default : public
  27.  *         -wc writeCommunity. Specify the wite community string used in communication with the v1/v2c remote agent
  28.  *            Default : null
  29.  *         -h agent_host. The remote agent host on which the SNMPv1/SNMPv2c agent is running.
  30.  *            Default : localhost
  31.  *         -p agent_port. Specify the remote agent port on which the agent listens for SNMPv1/v2c requests
  32.  *            Default : 161
  33.  *         -t timeout. Specify the timeout that is applicable both to the v1/v2c session and the v3 session
  34.  *         -r retries. Specify the number of retries. Applicable both to the v1/v2c session and the v3 session
  35.  *         -a authProtocol. The authentication protocol used in communication between the SNMPv3 management
  36.  *              application and the snmpgw. Default: No Authentication
  37.  *         -w auth_password. The authentication password used between the SNMPv3 managemnet application and
  38.  *              the snmpgw application.
  39.  *         -s priv_password. The privacy password used between the SNMPv3 managemnet application and the
  40.  *              snmpgw application.
  41.  *         port. The local UDP port on which the gateway application listens for SNMPv3 requests
  42.  *         engineID. Specify the engineID of the snmpgw.
  43.  *         user. Specify the user for whom the security parameters are defined. Currently this is the only user
  44.  *              for whom the snmpgw will accept requests and forward it to the v1/v2c remote agent.
  45.  */
  46. import com.adventnet.snmp.snmp2.*;
  47. import com.adventnet.snmp.snmp2.usm.*;
  48. import java.util.*;
  49. import ParseOptions;
  50. public class snmpgw extends Thread implements SnmpClient {
  51.     SnmpAPI api;
  52.     SnmpSession v3_session;
  53.     SnmpSession v1_session;
  54.     Vector v;
  55.     int remoteVersion = 0;
  56.     String remoteHost = "localhost";
  57.     int remotePort = 161;
  58.     int local_port;
  59.         byte[] engineID; 
  60.     private static final int DEBUG_FLAG = 0;
  61.     private static final int VERSION_FLAG = 1;
  62.     private static final int COMMUNITY_FLAG = 2;
  63.     private static final int WRITE_COMMUNITY_FLAG = 3;
  64.     private static final int AGENTHOST_FLAG = 4;
  65.     private static final int AGENTPORT_FLAG = 5;
  66.     private static final int TIMEOUT_FLAG = 6;
  67.     private static final int RETRY_FLAG = 7;
  68.     private static final int AUTHPROTOCOL_FLAG = 8;
  69.     private static final int AUTHPASSWORD_FLAG = 9;
  70.     private static final int PRIVPASSWORD_FLAG = 10;
  71.     snmpgw()
  72.     {
  73.         // Start SNMP API
  74.         api = new SnmpAPI();
  75.         try {
  76.             Thread.sleep(500);
  77.         } catch (Exception x) {} 
  78.         // Open session and set remote host & port if needed,
  79.         v3_session = new SnmpSession(api);
  80.         v1_session = new SnmpSession(api);
  81.         v = new Vector();
  82.     }
  83.     public static void main(String args[]) {
  84.     snmpgw eserv = new snmpgw();
  85.     // Take care of getting options
  86.     String usage = "snmpgw [-d] [-v agent_version(v1,v2)] [-c agent_community] [-wc agent_writeCommunity] [-h agent_host] [-p agent_port] [-t timeout] [-r retries] [-a auth_protocol] [-w auth_password] [-s priv_password] ] port engineID user";
  87.     String options[] = { "-d", "-v","-c", "-wc", "-h", "-p", "-t", "-r", "-a", "-w", "-s" };
  88.     String values[] = { "None", null, null, null, null, null, null, null, null, null, null };
  89.     String userName = null;
  90.     int authProtocol = 0;
  91.     String authPassword = null;
  92.     String privPassword = null;
  93.     int options_flag = 0;
  94.     ParseOptions opt = new ParseOptions(args,options,values, usage);
  95.     if (opt.remArgs.length<3) opt.usage_error();
  96.     eserv.local_port = Integer.parseInt(opt.remArgs[0]);
  97.     eserv.v3_session.setLocalPort(eserv.local_port);
  98.     eserv.engineID = (opt.remArgs[1]).getBytes();
  99.     userName = opt.remArgs[2];
  100.     if (values[DEBUG_FLAG].equals("Set")) {
  101.         System.out.println("Debug is TRUE");
  102.         eserv.api.setDebug( true );
  103.     }
  104.     if(values[VERSION_FLAG] != null)
  105.         {
  106.         if(values[VERSION_FLAG].equals("v2"))
  107.             eserv.remoteVersion = (SnmpAPI.SNMP_VERSION_2C);
  108.         else if(values[VERSION_FLAG].equals("v1"))
  109.             eserv.remoteVersion = (SnmpAPI.SNMP_VERSION_1);
  110.         else {
  111.             System.err.println("Invalid Version Number. Please use v1 or v2");
  112.             System.exit(1);
  113.         }
  114.         }
  115.     if (values[COMMUNITY_FLAG] != null) eserv.v1_session.setCommunity( values[COMMUNITY_FLAG] );
  116.     if (values[WRITE_COMMUNITY_FLAG] != null) eserv.v1_session.setWriteCommunity( values[WRITE_COMMUNITY_FLAG] );
  117.     try {
  118.         if (values[AGENTHOST_FLAG] != null) 
  119.         {
  120.             eserv.v1_session.setPeername( values[AGENTHOST_FLAG] );
  121.         eserv.remoteHost = values[AGENTHOST_FLAG];
  122.         }
  123.         if (values[AGENTPORT_FLAG] != null) 
  124.         {
  125.         eserv.remotePort = Integer.parseInt(values[AGENTPORT_FLAG]);
  126.             eserv.v1_session.setRemotePort(eserv.remotePort);
  127.         }
  128.         if (values[TIMEOUT_FLAG] != null) 
  129.         {
  130.         eserv.v1_session.setTimeout(Integer.parseInt(values[TIMEOUT_FLAG]));
  131.         eserv.v3_session.setTimeout(Integer.parseInt(values[TIMEOUT_FLAG]));
  132.         }
  133.         if (values[RETRY_FLAG] != null) 
  134.         {
  135.         eserv.v1_session.setRetries(Integer.parseInt(values[RETRY_FLAG]));
  136.         eserv.v3_session.setRetries(Integer.parseInt(values[RETRY_FLAG]));
  137.         }
  138.         if (values[AUTHPROTOCOL_FLAG] != null) 
  139.         {
  140.         if (values[AUTHPROTOCOL_FLAG].compareTo("MD5") == 0)
  141.             authProtocol = USMUserEntry.MD5_AUTH;
  142.         else if (values[AUTHPROTOCOL_FLAG].compareTo("SHA") == 0)
  143.             authProtocol = USMUserEntry.SHA_AUTH;
  144.         else
  145.             authProtocol = USMUserEntry.NO_AUTH;
  146.         }
  147.         if (values[AUTHPASSWORD_FLAG] != null) 
  148.         authPassword = values[AUTHPASSWORD_FLAG];
  149.         if (values[PRIVPASSWORD_FLAG] != null) 
  150.         {
  151.         privPassword = values[PRIVPASSWORD_FLAG];
  152.         }
  153.     }
  154.     catch (NumberFormatException ex) {
  155.         System.err.println("Invalid Integer Arg");
  156.         System.exit(2);
  157.     }
  158.     try {
  159.         eserv.v3_session.open();
  160.         eserv.v1_session.open();
  161.     } catch (SnmpException e) {}
  162.     eserv.createUSMTable(userName.getBytes(), authProtocol, authPassword, privPassword);
  163.     eserv.v3_session.addSnmpClient(eserv);
  164.     eserv.start();
  165.      } // end main()
  166.     public boolean authenticate(SnmpPDU pdu, String community)
  167.     {
  168. if(pdu != null){
  169. if(((Snmp3Message)pdu.getMsg()).isAuthenticationFailed()){
  170. System.out.println("In snmpgw : authenticate "+
  171. "failed. Dropping PDU.");
  172. return false;
  173. }
  174.          return true;
  175. }
  176. else
  177. return false;
  178.     }
  179.     public boolean callback(SnmpSession sess, SnmpPDU pdu, int reqID)
  180.     {
  181.         if (pdu == null)
  182.         {
  183.             System.err.println("Null PDU received");
  184.         }
  185.         enQ(pdu);
  186.         return true;
  187.     }
  188.         public void debugPrint(String debugOutput)
  189.     {
  190.         return;
  191.     }
  192.     public void createUSMTable(byte[] name, int authProtocol, String authPassword, String privPassword)
  193.     {
  194.         byte level = 0;
  195.         USMUserEntry entry = new USMUserEntry(name, engineID);
  196.         entry.setAuthProtocol(authProtocol);
  197.         if ((authProtocol != USMUserEntry.NO_AUTH) && (authPassword != null))
  198.         {
  199.             byte[] authKey = USMUtils.password_to_key(authProtocol, authPassword.getBytes(), authPassword.getBytes().length, engineID);
  200.             entry.setAuthKey(authKey);
  201.             level = 1;
  202.             if (privPassword != null)
  203.             {
  204.                 byte[] tempKey = USMUtils.password_to_key(authProtocol, privPassword.getBytes(), privPassword.getBytes().length, engineID);
  205.                 byte privKey[]=new byte[16];
  206.                 System.arraycopy(tempKey,0,privKey,0,16);
  207.                 entry.setPrivKey(privKey);
  208.                 level |= 2;
  209.             }
  210.         }
  211.         entry.setSecurityLevel(level);
  212. USMUserTable USMTable = (USMUserTable)api.getSecurityProvider().
  213. getTable(3);
  214. USMTable.addEntry(entry);
  215.         //USMUserTable.addEntry(entry);
  216.         byte[] names=entry.getUserName();byte[] id=entry.getEngineID();
  217.         SnmpEngineEntry e = new SnmpEngineEntry("localhost", local_port);
  218.         e.setEngineID(engineID);
  219.         entry.setEngineEntry(e);
  220.         api.setSnmpEngineID(engineID);
  221.     }
  222.  /** <img SRC="images/v3only.jpg" ALT="v3 only"> Print octet data in a more readable form */
  223.     String printOctets(byte[] data, int length) {
  224.     StringBuffer s = new StringBuffer();
  225.     int j = 0, line = 20; // we'll allow 20 bytes per line
  226.     if (data.length < length) length = data.length;
  227.     for (int i=0;i<length;i++) {
  228.         if (j++ > 19) { j=1; s.append("n"); }
  229.         String bs = Integer.toString(byteToInt(data[i]),16);
  230.         if (bs.length() < 2) bs = "0" + bs;
  231.         s.append(bs+ " ");
  232.     }
  233.     return s.toString();
  234.     }
  235.     public synchronized SnmpPDU deQ()
  236.     {
  237.         for (Enumeration e = v.elements() ; e.hasMoreElements() ;)
  238.         {
  239.                 SnmpPDU pdu = (SnmpPDU) e.nextElement();
  240.             v.removeElement(pdu);
  241.             return pdu;
  242.         }
  243.         return null;
  244.     }
  245.     
  246.     /** Place in specified queue */
  247.     public synchronized void enQ(SnmpPDU pdu)
  248.     {
  249.         v.addElement(pdu);
  250.         notifyAll();
  251.     }
  252.     public void run()
  253.     {
  254.         System.out.println("snmpgw: Ready to process requests from SNMPv3 Manager");
  255.         while (true)
  256.         {
  257.             SnmpPDU pdu = deQ();
  258.             if (pdu == null)
  259.                 wait_for_v3pdus();
  260.             if (pdu == null)
  261.                 pdu = deQ();
  262.             if (pdu == null)
  263.                 continue;
  264.             SnmpPDU ref_pdu = pdu;
  265.             int version = ref_pdu.getVersion();
  266.             String host = ref_pdu.getRemoteHost();
  267.             int port = ref_pdu.getRemotePort();
  268.             
  269.             ref_pdu.setVersion(remoteVersion);
  270.             //ref_pdu.setCommunity("public");
  271.             ref_pdu.setRemoteHost(remoteHost);
  272.             ref_pdu.setRemotePort(remotePort);
  273.             ref_pdu.setAddress(null);
  274.             SnmpPDU rpdu = null;
  275.             try {
  276.                        // Send PDU
  277.                 SnmpVarBind varb = ref_pdu.getVariableBinding(0);
  278.                 if(varb!=null)
  279.                     System.out.println("sent V" + (remoteVersion + 1) + " request: OID sent = " + varb.getObjectID());
  280.                 rpdu = v1_session.syncSend(ref_pdu);
  281.             } catch (SnmpException e) {
  282.                     System.err.println("Sending V1 PDU" + e.getMessage());
  283.                 continue;
  284.             }
  285.             if (rpdu == null) {  // timeout
  286.                     System.err.println("V1 Request timed out to: " + pdu.getRemoteHost() );
  287.                 continue;
  288.             }
  289.             SnmpVarBind varb = null;
  290.             int size = pdu.getVariableBindings().size();
  291.             for (int i = 0; (i < size); i++)
  292.                 pdu.removeVariableBinding(0);
  293.             size = rpdu.getVariableBindings().size();
  294.             for (int i = 0; i < size; i++)
  295.                 pdu.addVariableBinding(rpdu.getVariableBinding(i));
  296.             SnmpVarBind varbr = pdu.getVariableBinding(0);
  297.             if(varbr!=null)
  298.                 System.out.println("Received V" + (remoteVersion + 1) + " response: OID received = " + varbr.getObjectID());
  299.             pdu.setVersion(version);
  300.             pdu.setCommand(rpdu.getCommand());
  301.             pdu.setErrstat(rpdu.getErrstat());
  302.             pdu.setErrindex(rpdu.getErrindex());
  303.             pdu.setRemoteHost(host);
  304.             pdu.setRemotePort(port);
  305.             pdu.setAddress(null);
  306.             try {
  307.                 v3_session.send(pdu);
  308.             } catch (SnmpException e) {
  309.                     System.err.println("Session Open "+e.getMessage());
  310.                 continue;
  311.             }
  312.         }
  313.     }
  314.     public synchronized void wait_for_v3pdus()
  315.     {
  316.         try {
  317.             if (v.size() > 0)
  318.                 return;
  319.             else
  320.                 wait();
  321.         } catch (InterruptedException i) {}
  322.     }
  323.     
  324.     static int byteToInt(byte b) 
  325.         {
  326.           return (int)b & 0xFF;
  327.         }
  328.     
  329. }