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

SNMP编程

开发平台:

C/C++

  1. /* $Id: snmptrapforwarder.src,v 1.4.2.4 2009/01/28 13:24:24 tmanoj Exp $*/
  2. /*
  3.  * @(#)snmptrapforwarder.java
  4.  * Copyright (c) 1996-2009 AdventNet, Inc. All Rights Reserved.
  5.  * Please read the COPYRIGHTS file for more details.
  6.  */
  7. import com.adventnet.snmp.snmp2.*;
  8. import java.util.*;
  9. import java.net.InetAddress;
  10. public class snmptrapforwarder extends Thread implements SnmpClient
  11. {
  12.     SnmpAPI api;
  13.     SnmpSession v3_session;
  14.     Vector v;
  15.     UDPProtocolOptions remote_opt = new UDPProtocolOptions("localhost", 2001);
  16.     int local_port=162;
  17.     private static final int DEBUG_FLAG = 0;
  18.     snmptrapforwarder()
  19.     {
  20.         // Start SNMP API
  21.         api = new SnmpAPI();
  22.         // Open session and set remote host & port if needed,
  23.         v3_session = new SnmpSession(api);
  24.         v = new Vector();
  25.     }
  26.     public static void main(String args[])
  27.     {
  28.         if (args.length!= 3)
  29.         {
  30.             System.out.println("Usage : java snmptrapforwarder [LocalPort] [RemoteHost] [RemotePort]");
  31.             System.exit(1);
  32.         }
  33.         snmptrapforwarder eserv = new snmptrapforwarder();
  34.         // Take care of getting options
  35.         //String[] hostname={""};
  36.         //eserv.v3_session.setLocalAddresses(hostname);
  37.         eserv.local_port=Integer.parseInt(args[0]);
  38.         UDPProtocolOptions v3_opt = new UDPProtocolOptions();
  39.         v3_opt.setLocalPort(eserv.local_port);
  40.         eserv.remote_opt.setRemoteHost(args[1]);
  41.         eserv.remote_opt.setRemotePort(Integer.parseInt(args[2]));
  42.         eserv.v3_session.setProtocolOptions(v3_opt);
  43.         try
  44.         {
  45.             eserv.v3_session.open();
  46.         }
  47.         catch (SnmpException e)
  48.         {
  49.             System.out.println("Unable to start session: " + e);
  50.             System.exit(1);
  51.         }
  52.         eserv.v3_session.addSnmpClient(eserv);
  53.         eserv.start();
  54.     } // end main()
  55.     public boolean authenticate(SnmpPDU pdu, String community)
  56.     {
  57.         return true;
  58.     }
  59.     public boolean callback(SnmpSession sess, SnmpPDU pdu, int reqID)
  60.     {
  61.         if (pdu == null)
  62.         {
  63.             System.err.println("Null PDU received");
  64.             return false;
  65.         }
  66.         enQ(pdu);
  67.         return true;
  68.     }
  69.     public void debugPrint(String debugOutput)
  70.     {
  71.     }
  72.     /** Print octet data in a more readable form */
  73.     String printOctets(byte[] data, int length)
  74.     {
  75.         StringBuffer s = new StringBuffer();
  76.         int j = 0, line = 20; // we'll allow 20 bytes per line
  77.         if (data.length < length) length = data.length;
  78.         for (int i=0;i<length;i++)
  79.         {
  80.             if (j++ > 19)
  81.             {
  82.                 j=1;
  83.                 s.append("n");
  84.             }
  85.             String bs = Integer.toString(byteToInt(data[i]),16);
  86.             if (bs.length() < 2)
  87.             {
  88.                 bs = "0" + bs;
  89.             }
  90.             s.append(bs+ " ");
  91.         }
  92.         return s.toString();
  93.     }
  94.     public synchronized SnmpPDU deQ()
  95.     {
  96.         for (Enumeration e = v.elements() ; e.hasMoreElements() ;)
  97.         {
  98.             SnmpPDU pdu = (SnmpPDU) e.nextElement();
  99.             v.removeElement(pdu);
  100.             return pdu;
  101.         }
  102.         return null;
  103.     }
  104.     /** Place in specified queue */
  105.     public synchronized void enQ(SnmpPDU pdu)
  106.     {
  107.         v.addElement(pdu);
  108.         notifyAll();
  109.     }
  110.     public void run()
  111.     {
  112.         System.out.println("snmptrapforwarder: Ready to forward traps");
  113.         while (true)
  114.         {
  115.             SnmpPDU pdu = deQ();
  116.             if (pdu == null)
  117.             {
  118.                 wait_for_v3pdus();
  119.             }
  120.             if (pdu == null)
  121.             {
  122.                 pdu = deQ();
  123.             }
  124.             if (pdu == null)
  125.             {
  126.                 continue;
  127.             }
  128.             try
  129.             {
  130.                 if ((pdu.getCommand() == SnmpAPI.TRP_REQ_MSG) 
  131.                 ||(pdu.getCommand() == SnmpAPI.TRP2_REQ_MSG)
  132.                 )
  133.                 {
  134.                     pdu.setProtocolOptions(remote_opt);
  135.                     System.out.println("Trap is Forwarded to " + remote_opt.getSessionId());
  136.                     v3_session.send(pdu);
  137.                 }
  138.                 else
  139.                 {
  140.                     System.out.println("Not a Trap PDU -- dropping");
  141.                 }
  142.             }
  143.             catch (SnmpException e)
  144.             {
  145.                 System.err.println("Sending  PDU" + e.getMessage());
  146.                 continue;
  147.             }
  148.         }
  149.     }
  150.     public synchronized void wait_for_v3pdus()
  151.     {
  152.         try
  153.         {
  154.             if (v.size() > 0)
  155.             {
  156.                 return;
  157.             }
  158.             else
  159.             {
  160.                 wait();
  161.             }
  162.         }
  163.         catch (InterruptedException i)
  164.         {
  165.         }
  166.     }
  167.     static int byteToInt(byte b) 
  168.     {
  169.         return (int)b & 0xFF;
  170.     }
  171. }