Package org.jboss.jmx.adaptor.snmp.agent

Source Code of org.jboss.jmx.adaptor.snmp.agent.RequestHandlerSupport

/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.jmx.adaptor.snmp.agent;

import java.net.InetAddress;

import javax.management.MBeanServer;

import org.jboss.logging.Logger;
import org.opennms.protocols.snmp.SnmpAgentSession;
import org.opennms.protocols.snmp.SnmpObjectId;
import org.opennms.protocols.snmp.SnmpOctetString;
import org.opennms.protocols.snmp.SnmpPduPacket;
import org.opennms.protocols.snmp.SnmpPduRequest;
import org.opennms.protocols.snmp.SnmpSyntax;
import org.opennms.protocols.snmp.SnmpVarBind;

/**
* Implement RequestHandler with simple tracing of incoming requests.
*
* Derived classes are expected to implement actual behaviour.
*
* @author <a href="mailto:krishnaraj@ieee.org">Krishnaraj S</a>
* @author <a href="mailto:dimitris@jboss.org">Dimitris Andreadis</a>
* @version $Revision: 81038 $
*/
public class RequestHandlerSupport implements RequestHandler
{
   // Protected Data ------------------------------------------------
  
   /** Logger object */
   protected Logger log;
  
   /** the MBeanServer */
   protected MBeanServer server;
  
   /** the file name to get mapping info from */
   protected String resourceName;
  
   /** the agent clock */
   protected Clock clock;
  
   // Constructors --------------------------------------------------
  
   /**
    * Default CTOR
    */
   public RequestHandlerSupport()
   {
      // empty
   }
  
   // RequestHandler Implementation ---------------------------------
  
   /**
    * Initialize
    */
   public void initialize(String resourceName, MBeanServer server, Logger log, Clock uptime)
      throws Exception
   {
      this.resourceName = resourceName;
      this.server = server;
      this.log = log;
      this.clock = uptime;
   }
  
   // SnmpAgentHandler Implementation -------------------------------
  
   /**
    * <P>This method is defined to handle SNMP Get requests
    * that are received by the session. The request has already
    * been validated by the system.  This routine will build a
    * response and pass it back to the caller.</P>
    *
    * @param pdu     The SNMP pdu
    * @param getNext The agent is requesting the lexically NEXT item after each
    *                    item in the pdu.
    *
    * @return SnmpPduRequest filled in with the proper response, or null if cannot process
    * NOTE: this might be changed to throw an exception.
    */  
   public SnmpPduRequest snmpReceivedGet(SnmpPduPacket pdu, boolean getNext)
   {
      SnmpPduRequest response = null;
      int pduLength = pdu.getLength();
     
      log.debug("requestId=" + pdu.getRequestId() + ", pduLength="  + pduLength);
  
      SnmpVarBind[] vblist  = new SnmpVarBind[pduLength];
      int errorStatus = SnmpPduPacket.ErrNoError;
      int errorIndex = 0;

      //Process for each varibind in the request
      for (int i = 0; i < pduLength ; i++ )
      {
         SnmpVarBind vb = pdu.getVarBindAt(i);
         SnmpObjectId oid = vb.getName();
         if (getNext)
         {
            log.debug(
               "Should call getNextOid() to find out what is the next valid OID " +
               "instance in the supported MIB tree. Assign that OID to the VB List " +
               "and then proceed same as that of get request" );
         }
         vblist[i] = new SnmpVarBind(oid);
        
         log.debug("oid=" + oid.toString());
   
         log.debug("Should call the respective interface to retrieve current value for this OID" );

         SnmpSyntax result = null;
        
         if (result == null)
         {
            errorStatus = SnmpPduPacket.ErrNoSuchName;
            errorIndex = i + 1;
            //log.debug("Error Occured " + vb.getName().toString());
         }
         else
         {
            vblist[i].setValue(result);
            log.debug("Varbind[" + i + "] := " + vblist[i].getName().toString());
            log.debug(" --> " + vblist[i].getValue().toString());      
         }
      }
      response = new SnmpPduRequest(SnmpPduPacket.RESPONSE, vblist);
      response.setErrorStatus(errorStatus);
      response.setErrorIndex(errorIndex);
      return response;
   }

   /**
    * <P>This method is defined to handle SNMP Set requests
    * that are received by the session. The request has already
    * been validated by the system.  This routine will build a
    * response and pass it back to the caller.</P>
    *
    * @param pdu     The SNMP pdu
    *
    * @return SnmpPduRequest filled in with the proper response, or null if cannot process
    * NOTE: this might be changed to throw an exception.
    */
   public SnmpPduRequest snmpReceivedSet(SnmpPduPacket pdu)
   {
      SnmpPduRequest response = null;
      int errorStatus = SnmpPduPacket.ErrNoError;
      int errorIndex = 0;
      int k = pdu.getLength();
      SnmpVarBind[] vblist  = new SnmpVarBind[k];
    
      for (int i = 0; i < k ; i++ )
      {
         SnmpVarBind vb = pdu.getVarBindAt(i);
         vblist[i] = new SnmpVarBind(vb);
         SnmpObjectId oid = vb.getName();
        
         SnmpSyntax result = null;
         log.debug("Should call the respective interface to assign a value for this OID" );
         
         if (result != null)
         {
            errorStatus = SnmpPduPacket.ErrReadOnly;
            errorIndex = i + 1;
            log.debug("Error occured " + vb.getName().toString());
         }
        
         log.debug("Varbind[" + i + "] := " + vb.getName().toString());
         log.debug(" --> " + vb.getValue().toString());    
      }
    
      response = new SnmpPduRequest(SnmpPduPacket.RESPONSE, vblist);
      response.setErrorStatus(errorStatus);
      response.setErrorIndex(errorIndex);

      return response;
   }
   /**
    * <P>This method is defined to handle SNMP requests
    * that are received by the session. The parameters
    * allow the handler to determine the host, port, and
    * community string of the received PDU</P>
    *
    * @param session The SNMP session
    * @param manager The remote sender
    * @param port    The remote senders port
    * @param community  The community string
    * @param pdu     The SNMP pdu
    *
    */
   public void snmpReceivedPdu(SnmpAgentSession session, InetAddress manager, int port,
                               SnmpOctetString community, SnmpPduPacket pdu)
   {
      log.error("Message from manager " + manager.toString() + " on port " + port);
      int cmd = pdu.getCommand();
      log.error("Unsupported PDU command......... " + cmd);
   }
   /**
    * <P>This method is invoked if an error occurs in
    * the session. The error code that represents
    * the failure will be passed in the second parameter,
    * 'error'. The error codes can be found in the class
    * SnmpAgentSession class.</P>
    *
    * <P>If a particular PDU is part of the error condition
    * it will be passed in the third parameter, 'pdu'. The
    * pdu will be of the type SnmpPduRequest or SnmpPduTrap
    * object. The handler should use the "instanceof" operator
    * to determine which type the object is. Also, the object
    * may be null if the error condition is not associated
    * with a particular PDU.</P>
    *
    * @param session The SNMP Session
    * @param error   The error condition value.
    * @param ref     The PDU reference, or potentially null.
    *                It may also be an exception.
    */
   public void SnmpAgentSessionError(SnmpAgentSession session, int error, Object ref)
   {
      log.error("An error occured in the trap session");
      log.error("Session error code = " + error);
      if(ref != null)
      {
         log.error("Session error reference: " + ref.toString());
      }
    
      if(error == SnmpAgentSession.ERROR_EXCEPTION)
      {
         synchronized(session)
         {
            session.notify(); // close the session
         }
      }
   }
}
TOP

Related Classes of org.jboss.jmx.adaptor.snmp.agent.RequestHandlerSupport

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.