/* * Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package com.sun.jmx.snmp.agent; // java imports // import java.io.Serializable; import java.util.Vector; import java.util.Enumeration; import java.util.Set; // jmx imports // import javax.management.MBeanServer; import javax.management.MBeanRegistration; import javax.management.ObjectName; import javax.management.MalformedObjectNameException; import javax.management.InstanceNotFoundException; import javax.management.ServiceNotFoundException; import javax.management.ReflectionException; import javax.management.MBeanException; import com.sun.jmx.snmp.SnmpVarBind; import com.sun.jmx.snmp.SnmpDefinitions; import com.sun.jmx.snmp.SnmpStatusException; import com.sun.jmx.snmp.SnmpPdu; import com.sun.jmx.snmp.SnmpOid; import com.sun.jmx.snmp.SnmpEngine; /** * Abstract class for representing an SNMP agent. * * The class is used by the SNMP protocol adaptor as the entry point in * the SNMP agent to query. * *
This API is a Sun Microsystems internal API and is subject * to change without notice.
*/ public abstract class SnmpMibAgent implements SnmpMibAgentMBean, MBeanRegistration, Serializable { /** * Default constructor. */ public SnmpMibAgent() { } // --------------------------------------------------------------------- // PUBLIC METHODS //---------------------------------------------------------------------- /** * Initializes the MIB (with no registration of the MBeans into the * MBean server). * * @exception IllegalAccessException The MIB can not be initialized. */ public abstract void init() throws IllegalAccessException; /** * Initializes the MIB but each single MBean representing the MIB * is inserted into the MBean server. * * @param server The MBean server to register the service with. * @param name The object name. * * @return The name of the SNMP MIB registered. * * @exception java.lang.Exception */ public abstract ObjectName preRegister(MBeanServer server, ObjectName name) throws java.lang.Exception; /** * Not used in this context. */ public void postRegister (Boolean registrationDone) { } /** * Not used in this context. */ public void preDeregister() throws java.lang.Exception { } /** * Not used in this context. */ public void postDeregister() { } /** * Processes aget
operation.
* This method must update the SnmpVarBinds contained in the
* {@link SnmpMibRequest} req parameter.
*
* @param req The SnmpMibRequest object holding the list of variable to
* be retrieved. This list is composed of
* SnmpVarBind
objects.
*
* @exception SnmpStatusException An error occured during the operation.
*/
public abstract void get(SnmpMibRequest req)
throws SnmpStatusException;
/**
* Processes a getNext
operation.
* This method must update the SnmpVarBinds contained in the
* {@link SnmpMibRequest} req parameter.
*
* @param req The SnmpMibRequest object holding the list of
* OIDs from which the next variables should be retrieved.
* This list is composed of SnmpVarBind
objects.
*
* @exception SnmpStatusException An error occured during the operation.
*/
public abstract void getNext(SnmpMibRequest req)
throws SnmpStatusException;
/**
* Processes a getBulk
operation.
* This method must update the SnmpVarBinds contained in the
* {@link SnmpMibRequest} req parameter.
*
* @param req The SnmpMibRequest object holding the list of variable to
* be retrieved. This list is composed of
* SnmpVarBind
objects.
*
* @param nonRepeat The number of variables, starting with the first
* variable in the variable-bindings, for which a single
* lexicographic successor is requested.
*
* @param maxRepeat The number of lexicographic successors requested
* for each of the last R variables. R is the number of variables
* following the first nonRepeat
variables for which
* multiple lexicographic successors are requested.
*
* @exception SnmpStatusException An error occured during the operation.
*/
public abstract void getBulk(SnmpMibRequest req, int nonRepeat,
int maxRepeat)
throws SnmpStatusException;
/**
* Processes a set
operation.
* This method must update the SnmpVarBinds contained in the
* {@link SnmpMibRequest} req parameter.
* This method is called during the second phase of the SET two-phase
* commit.
*
* @param req The SnmpMibRequest object holding the list of variable to
* be set. This list is composed of
* SnmpVarBind
objects.
*
* @exception SnmpStatusException An error occured during the operation.
* Throwing an exception in this method will break the
* atomicity of the SET operation. Care must be taken so that
* the exception is thrown in the {@link #check(SnmpMibRequest)}
* method instead.
*/
public abstract void set(SnmpMibRequest req)
throws SnmpStatusException;
/**
* Checks if a set
operation can be performed.
* If the operation can not be performed, the method should throw an
* SnmpStatusException
.
* This method is called during the first phase of the SET two-phase
* commit.
*
* @param req The SnmpMibRequest object holding the list of variable to
* be set. This list is composed of
* SnmpVarBind
objects.
*
* @exception SnmpStatusException The set
operation
* cannot be performed.
*/
public abstract void check(SnmpMibRequest req)
throws SnmpStatusException;
/**
* Gets the root object identifier of the MIB.
* The root object identifier is the object identifier uniquely
* identifying the MIB.
*
* @return The root object identifier.
*/
public abstract long[] getRootOid();
// ---------------------------------------------------------------------
// GETTERS AND SETTERS
// ---------------------------------------------------------------------
/**
* Gets the reference to the MBean server in which the SNMP MIB is
* registered.
*
* @return The MBean server or null if the MIB is not registered in any
* MBean server.
*/
public MBeanServer getMBeanServer() {
return server;
}
/**
* Gets the reference to the SNMP protocol adaptor to which the MIB is
* bound.
*
* @return The SNMP MIB handler.
*/
public SnmpMibHandler getSnmpAdaptor() {
return adaptor;
}
/**
* Sets the reference to the SNMP protocol adaptor through which the MIB
* will be SNMP accessible and add this new MIB in the SNMP MIB handler.
*
* @param stack The SNMP MIB handler.
*/
public void setSnmpAdaptor(SnmpMibHandler stack) {
if (adaptor != null) {
adaptor.removeMib(this);
}
adaptor = stack;
if (adaptor != null) {
adaptor.addMib(this);
}
}
/**
* Sets the reference to the SNMP protocol adaptor through which the MIB
* will be SNMP accessible and add this new MIB in the SNMP MIB handler.
* This method is to be called to set a specific agent to a specific OID. This can be useful when dealing with MIB overlapping.
* Some OID can be implemented in more than one MIB. In this case, the OID nearest the agent will be used on SNMP operations.
* @param stack The SNMP MIB handler.
* @param oids The set of OIDs this agent implements.
*
* @since 1.5
*/
public void setSnmpAdaptor(SnmpMibHandler stack, SnmpOid[] oids) {
if (adaptor != null) {
adaptor.removeMib(this);
}
adaptor = stack;
if (adaptor != null) {
adaptor.addMib(this, oids);
}
}
/**
* Sets the reference to the SNMP protocol adaptor through which the MIB
* will be SNMP accessible and adds this new MIB in the SNMP MIB handler.
* Adds a new contextualized MIB in the SNMP MIB handler.
*
* @param stack The SNMP MIB handler.
* @param contextName The MIB context name. If null is passed, will be registered in the default context.
*
* @exception IllegalArgumentException If the parameter is null.
*
* @since 1.5
*/
public void setSnmpAdaptor(SnmpMibHandler stack, String contextName) {
if (adaptor != null) {
adaptor.removeMib(this, contextName);
}
adaptor = stack;
if (adaptor != null) {
adaptor.addMib(this, contextName);
}
}
/**
* Sets the reference to the SNMP protocol adaptor through which the MIB
* will be SNMP accessible and adds this new MIB in the SNMP MIB handler.
* Adds a new contextualized MIB in the SNMP MIB handler.
*
* @param stack The SNMP MIB handler.
* @param contextName The MIB context name. If null is passed, will be registered in the default context.
* @param oids The set of OIDs this agent implements.
* @exception IllegalArgumentException If the parameter is null.
*
* @since 1.5
*/
public void setSnmpAdaptor(SnmpMibHandler stack,
String contextName,
SnmpOid[] oids) {
if (adaptor != null) {
adaptor.removeMib(this, contextName);
}
adaptor = stack;
if (adaptor != null) {
adaptor.addMib(this, contextName, oids);
}
}
/**
* Gets the object name of the SNMP protocol adaptor to which the MIB
* is bound.
*
* @return The name of the SNMP protocol adaptor.
*/
public ObjectName getSnmpAdaptorName() {
return adaptorName;
}
/**
* Sets the reference to the SNMP protocol adaptor through which the MIB
* will be SNMP accessible and add this new MIB in the SNMP MIB handler
* associated to the specified name
.
*
* @param name The name of the SNMP protocol adaptor.
*
* @exception InstanceNotFoundException The SNMP protocol adaptor does
* not exist in the MBean server.
*
* @exception ServiceNotFoundException This SNMP MIB is not registered
* in the MBean server or the requested service is not supported.
*/
public void setSnmpAdaptorName(ObjectName name)
throws InstanceNotFoundException, ServiceNotFoundException {
if (server == null) {
throw new ServiceNotFoundException(mibName + " is not registered in the MBean server");
}
// First remove the reference on the old adaptor server.
//
if (adaptor != null) {
adaptor.removeMib(this);
}
// Then update the reference to the new adaptor server.
//
Object[] params = {this};
String[] signature = {"com.sun.jmx.snmp.agent.SnmpMibAgent"};
try {
adaptor = (SnmpMibHandler)(server.invoke(name, "addMib", params,
signature));
} catch (InstanceNotFoundException e) {
throw new InstanceNotFoundException(name.toString());
} catch (ReflectionException e) {
throw new ServiceNotFoundException(name.toString());
} catch (MBeanException e) {
// Should never occur...
}
adaptorName = name;
}
/**
* Sets the reference to the SNMP protocol adaptor through which the MIB
* will be SNMP accessible and add this new MIB in the SNMP MIB handler
* associated to the specified name
.
* This method is to be called to set a specific agent to a specific OID. This can be useful when dealing with MIB overlapping.
* Some OID can be implemented in more than one MIB. In this case, the OID nearer agent will be used on SNMP operations.
* @param name The name of the SNMP protocol adaptor.
* @param oids The set of OIDs this agent implements.
* @exception InstanceNotFoundException The SNMP protocol adaptor does
* not exist in the MBean server.
*
* @exception ServiceNotFoundException This SNMP MIB is not registered
* in the MBean server or the requested service is not supported.
*
* @since 1.5
*/
public void setSnmpAdaptorName(ObjectName name, SnmpOid[] oids)
throws InstanceNotFoundException, ServiceNotFoundException {
if (server == null) {
throw new ServiceNotFoundException(mibName + " is not registered in the MBean server");
}
// First remove the reference on the old adaptor server.
//
if (adaptor != null) {
adaptor.removeMib(this);
}
// Then update the reference to the new adaptor server.
//
Object[] params = {this, oids};
String[] signature = {"com.sun.jmx.snmp.agent.SnmpMibAgent",
oids.getClass().getName()};
try {
adaptor = (SnmpMibHandler)(server.invoke(name, "addMib", params,
signature));
} catch (InstanceNotFoundException e) {
throw new InstanceNotFoundException(name.toString());
} catch (ReflectionException e) {
throw new ServiceNotFoundException(name.toString());
} catch (MBeanException e) {
// Should never occur...
}
adaptorName = name;
}
/**
* Sets the reference to the SNMP protocol adaptor through which the MIB
* will be SNMP accessible and add this new MIB in the SNMP MIB handler
* associated to the specified name
.
*
* @param name The name of the SNMP protocol adaptor.
* @param contextName The MIB context name. If null is passed, will be registered in the default context.
* @exception InstanceNotFoundException The SNMP protocol adaptor does
* not exist in the MBean server.
*
* @exception ServiceNotFoundException This SNMP MIB is not registered
* in the MBean server or the requested service is not supported.
*
* @since 1.5
*/
public void setSnmpAdaptorName(ObjectName name, String contextName)
throws InstanceNotFoundException, ServiceNotFoundException {
if (server == null) {
throw new ServiceNotFoundException(mibName + " is not registered in the MBean server");
}
// First remove the reference on the old adaptor server.
//
if (adaptor != null) {
adaptor.removeMib(this, contextName);
}
// Then update the reference to the new adaptor server.
//
Object[] params = {this, contextName};
String[] signature = {"com.sun.jmx.snmp.agent.SnmpMibAgent", "java.lang.String"};
try {
adaptor = (SnmpMibHandler)(server.invoke(name, "addMib", params,
signature));
} catch (InstanceNotFoundException e) {
throw new InstanceNotFoundException(name.toString());
} catch (ReflectionException e) {
throw new ServiceNotFoundException(name.toString());
} catch (MBeanException e) {
// Should never occur...
}
adaptorName = name;
}
/**
* Sets the reference to the SNMP protocol adaptor through which the MIB
* will be SNMP accessible and add this new MIB in the SNMP MIB handler
* associated to the specified name
.
*
* @param name The name of the SNMP protocol adaptor.
* @param contextName The MIB context name. If null is passed, will be registered in the default context.
* @param oids The set of OIDs this agent implements.
* @exception InstanceNotFoundException The SNMP protocol adaptor does
* not exist in the MBean server.
*
* @exception ServiceNotFoundException This SNMP MIB is not registered
* in the MBean server or the requested service is not supported.
*
* @since 1.5
*/
public void setSnmpAdaptorName(ObjectName name,
String contextName, SnmpOid[] oids)
throws InstanceNotFoundException, ServiceNotFoundException {
if (server == null) {
throw new ServiceNotFoundException(mibName + " is not registered in the MBean server");
}
// First remove the reference on the old adaptor server.
//
if (adaptor != null) {
adaptor.removeMib(this, contextName);
}
// Then update the reference to the new adaptor server.
//
Object[] params = {this, contextName, oids};
String[] signature = {"com.sun.jmx.snmp.agent.SnmpMibAgent", "java.lang.String", oids.getClass().getName()};
try {
adaptor = (SnmpMibHandler)(server.invoke(name, "addMib", params,
signature));
} catch (InstanceNotFoundException e) {
throw new InstanceNotFoundException(name.toString());
} catch (ReflectionException e) {
throw new ServiceNotFoundException(name.toString());
} catch (MBeanException e) {
// Should never occur...
}
adaptorName = name;
}
/**
* Indicates whether or not the MIB module is bound to a SNMP protocol
* adaptor.
* As a reminder, only bound MIBs can be accessed through SNMP protocol
* adaptor.
*
* @return true
if the MIB module is bound,
* false
otherwise.
*/
public boolean getBindingState() {
if (adaptor == null)
return false;
else
return true;
}
/**
* Gets the MIB name.
*
* @return The MIB name.
*/
public String getMibName() {
return mibName;
}
/**
* This is a factory method for creating new SnmpMibRequest objects.
* @param reqPdu The received PDU.
* @param vblist The vector of SnmpVarBind objects in which the
* MIB concerned by this request is involved.
* @param version The protocol version of the SNMP request.
* @param userData User allocated contextual data.
*
* @return A new SnmpMibRequest object.
*
* @since 1.5
**/
public static SnmpMibRequest newMibRequest(SnmpPdu reqPdu,
VectorgetBulk
operation using call to
* getNext
.
* The method implements the getBulk
operation by calling
* appropriately the getNext
method.
*
* @param req The SnmpMibRequest containing the variable list to be
* retrieved.
*
* @param nonRepeat The number of variables, starting with the first
* variable in the variable-bindings, for which a single lexicographic
* successor is requested.
*
* @param maxRepeat The number of lexicographic successors
* requested for each of the last R variables. R is the number of
* variables following the first nonRepeat variables for which
* multiple lexicographic successors are requested.
*
* @return The variable list containing returned values.
*
* @exception SnmpStatusException An error occured during the operation.
*/
void getBulkWithGetNext(SnmpMibRequest req, int nonRepeat, int maxRepeat)
throws SnmpStatusException {
final Vector