001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.jmx.adaptor.snmp.agent;
023:
024: import java.net.InetAddress;
025:
026: import javax.management.MBeanServer;
027:
028: import org.jboss.logging.Logger;
029: import org.opennms.protocols.snmp.SnmpAgentSession;
030: import org.opennms.protocols.snmp.SnmpObjectId;
031: import org.opennms.protocols.snmp.SnmpOctetString;
032: import org.opennms.protocols.snmp.SnmpPduPacket;
033: import org.opennms.protocols.snmp.SnmpPduRequest;
034: import org.opennms.protocols.snmp.SnmpSyntax;
035: import org.opennms.protocols.snmp.SnmpVarBind;
036:
037: /**
038: * Implement RequestHandler with simple tracing of incoming requests.
039: *
040: * Derived classes are expected to implement actual behaviour.
041: *
042: * @author <a href="mailto:krishnaraj@ieee.org">Krishnaraj S</a>
043: * @author <a href="mailto:dimitris@jboss.org">Dimitris Andreadis</a>
044: * @version $Revision: 57210 $
045: */
046: public class RequestHandlerSupport implements RequestHandler {
047: // Protected Data ------------------------------------------------
048:
049: /** Logger object */
050: protected Logger log;
051:
052: /** the MBeanServer */
053: protected MBeanServer server;
054:
055: /** the file name to get mapping info from */
056: protected String resourceName;
057:
058: /** the agent clock */
059: protected Clock clock;
060:
061: // Constructors --------------------------------------------------
062:
063: /**
064: * Default CTOR
065: */
066: public RequestHandlerSupport() {
067: // empty
068: }
069:
070: // RequestHandler Implementation ---------------------------------
071:
072: /**
073: * Initialize
074: */
075: public void initialize(String resourceName, MBeanServer server,
076: Logger log, Clock uptime) throws Exception {
077: this .resourceName = resourceName;
078: this .server = server;
079: this .log = log;
080: this .clock = uptime;
081: }
082:
083: // SnmpAgentHandler Implementation -------------------------------
084:
085: /**
086: * <P>This method is defined to handle SNMP Get requests
087: * that are received by the session. The request has already
088: * been validated by the system. This routine will build a
089: * response and pass it back to the caller.</P>
090: *
091: * @param pdu The SNMP pdu
092: * @param getNext The agent is requesting the lexically NEXT item after each
093: * item in the pdu.
094: *
095: * @return SnmpPduRequest filled in with the proper response, or null if cannot process
096: * NOTE: this might be changed to throw an exception.
097: */
098: public SnmpPduRequest snmpReceivedGet(SnmpPduPacket pdu,
099: boolean getNext) {
100: SnmpPduRequest response = null;
101: int pduLength = pdu.getLength();
102:
103: log.debug("requestId=" + pdu.getRequestId() + ", pduLength="
104: + pduLength);
105:
106: SnmpVarBind[] vblist = new SnmpVarBind[pduLength];
107: int errorStatus = SnmpPduPacket.ErrNoError;
108: int errorIndex = 0;
109:
110: //Process for each varibind in the request
111: for (int i = 0; i < pduLength; i++) {
112: SnmpVarBind vb = pdu.getVarBindAt(i);
113: SnmpObjectId oid = vb.getName();
114: if (getNext) {
115: log
116: .debug("Should call getNextOid() to find out what is the next valid OID "
117: + "instance in the supported MIB tree. Assign that OID to the VB List "
118: + "and then proceed same as that of get request");
119: }
120: vblist[i] = new SnmpVarBind(oid);
121:
122: log.debug("oid=" + oid.toString());
123:
124: log
125: .debug("Should call the respective interface to retrieve current value for this OID");
126:
127: SnmpSyntax result = null;
128:
129: if (result == null) {
130: errorStatus = SnmpPduPacket.ErrNoSuchName;
131: errorIndex = i + 1;
132: //log.debug("Error Occured " + vb.getName().toString());
133: } else {
134: vblist[i].setValue(result);
135: log.debug("Varbind[" + i + "] := "
136: + vblist[i].getName().toString());
137: log.debug(" --> " + vblist[i].getValue().toString());
138: }
139: }
140: response = new SnmpPduRequest(SnmpPduPacket.RESPONSE, vblist);
141: response.setErrorStatus(errorStatus);
142: response.setErrorIndex(errorIndex);
143: return response;
144: }
145:
146: /**
147: * <P>This method is defined to handle SNMP Set requests
148: * that are received by the session. The request has already
149: * been validated by the system. This routine will build a
150: * response and pass it back to the caller.</P>
151: *
152: * @param pdu The SNMP pdu
153: *
154: * @return SnmpPduRequest filled in with the proper response, or null if cannot process
155: * NOTE: this might be changed to throw an exception.
156: */
157: public SnmpPduRequest snmpReceivedSet(SnmpPduPacket pdu) {
158: SnmpPduRequest response = null;
159: int errorStatus = SnmpPduPacket.ErrNoError;
160: int errorIndex = 0;
161: int k = pdu.getLength();
162: SnmpVarBind[] vblist = new SnmpVarBind[k];
163:
164: for (int i = 0; i < k; i++) {
165: SnmpVarBind vb = pdu.getVarBindAt(i);
166: vblist[i] = new SnmpVarBind(vb);
167: SnmpObjectId oid = vb.getName();
168:
169: SnmpSyntax result = null;
170: log
171: .debug("Should call the respective interface to assign a value for this OID");
172:
173: if (result != null) {
174: errorStatus = SnmpPduPacket.ErrReadOnly;
175: errorIndex = i + 1;
176: log.debug("Error occured " + vb.getName().toString());
177: }
178:
179: log.debug("Varbind[" + i + "] := "
180: + vb.getName().toString());
181: log.debug(" --> " + vb.getValue().toString());
182: }
183:
184: response = new SnmpPduRequest(SnmpPduPacket.RESPONSE, vblist);
185: response.setErrorStatus(errorStatus);
186: response.setErrorIndex(errorIndex);
187:
188: return response;
189: }
190:
191: /**
192: * <P>This method is defined to handle SNMP requests
193: * that are received by the session. The parameters
194: * allow the handler to determine the host, port, and
195: * community string of the received PDU</P>
196: *
197: * @param session The SNMP session
198: * @param manager The remote sender
199: * @param port The remote senders port
200: * @param community The community string
201: * @param pdu The SNMP pdu
202: *
203: */
204: public void snmpReceivedPdu(SnmpAgentSession session,
205: InetAddress manager, int port, SnmpOctetString community,
206: SnmpPduPacket pdu) {
207: log.error("Message from manager " + manager.toString()
208: + " on port " + port);
209: int cmd = pdu.getCommand();
210: log.error("Unsupported PDU command......... " + cmd);
211: }
212:
213: /**
214: * <P>This method is invoked if an error occurs in
215: * the session. The error code that represents
216: * the failure will be passed in the second parameter,
217: * 'error'. The error codes can be found in the class
218: * SnmpAgentSession class.</P>
219: *
220: * <P>If a particular PDU is part of the error condition
221: * it will be passed in the third parameter, 'pdu'. The
222: * pdu will be of the type SnmpPduRequest or SnmpPduTrap
223: * object. The handler should use the "instanceof" operator
224: * to determine which type the object is. Also, the object
225: * may be null if the error condition is not associated
226: * with a particular PDU.</P>
227: *
228: * @param session The SNMP Session
229: * @param error The error condition value.
230: * @param ref The PDU reference, or potentially null.
231: * It may also be an exception.
232: */
233: public void SnmpAgentSessionError(SnmpAgentSession session,
234: int error, Object ref) {
235: log.error("An error occured in the trap session");
236: log.error("Session error code = " + error);
237: if (ref != null) {
238: log.error("Session error reference: " + ref.toString());
239: }
240:
241: if (error == SnmpAgentSession.ERROR_EXCEPTION) {
242: synchronized (session) {
243: session.notify(); // close the session
244: }
245: }
246: }
247: }
|