/* * 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 } } } }