Here we describe the process for making MIBs manageable through the SNMP protocol adaptor of the Java Dynamic Management Kit. In our example, we demonstrate this process on a subset of the MIB-II defined by RFC 1213.
Once you have defined the MIB you want to manage in your SNMP agent you need to generate its MBean representation using the mibgen tool. This command-line tool and its output are fully described in the Java Dynamic Management Kit 4.0 Tools Reference guide. This tool generates MBeans that represent the whole MIB, each of its groups and each of its table entries.
To run the mibgen tool for our example, go to the examplesDir/Snmp/Agentdirectory and enter the following command:
$ mibgen -d . mib_II_subset.txt |
This will generate the following files in the current directory:
The MBean (by inheritance) for the whole MIB: RFC1213_MIB.java
The MBean and its metadata class for the Snmp group: Snmp.java, SnmpMBean.java, SnmpMeta.java
The MBean and its metadata class for the System group: System.java, SystemMBean.java, SystemMeta.java
The MBean and its metadata class for the Interfaces group: Interfaces.java, InterfacesMBean.java, InterfacesMeta.java
The class representing an interface table, and the MBean representing entries in the table: TableIfTable.java, IfEntry.java, IfEntryMBean.java, IfEntryMeta.java
Classes representing enumerated types used in these groups and entries: EnumSnmpEnableAuthenTraps.java, EnumIfOperStatus.java, EnumIfAdminStatus.java, EnumIfType.java
The OID table for representing the name definition of all MIB variables: RFC1213_MIBOidTable.java
The MBean with the name of the MIB is just a central administrative class for managing the other MBeans which implement the MIB. All of the other MBeans contain the SNMP variables as attributes of their management interface. The mibgen tool generates standard MBeans for the MIB, so attributes are implemented with individual getter and setter methods.
These MBeans are just skeletons, meaning that the attributes do not do anything. You must implement the getters and setters of the attributes to read and write data with the correct semantic meaning of the SNMP variable.
Since SNMP does not support actions in MIBs, the only operations in these MBeans are checkers for implementing the SNMP set request in writeable variable. You may add operations and expose them in the MBean interface, but the SNMP manager will not be able to access them. However, other managers will be able to call these operations if they are connected through another protocol.
Our example only implements a fraction of the attributes, those that are used in this tutorial. The others are just initialized with some plausible value. These implementations are contained in the classes with the Impl suffix. These implementation classes extend those that are generated by mibgen so that we can regenerate them without overwriting our customizations.
Here is a summary of the implementation shown in the agent example:
InterfaceImpl.java - adds a new entry notification listener to the IfTable object, then creates two table entries with plausible values and adds them to the table; associated with:
TableEntryListenerImpl.java - the listener for table entry creation and deletion notifications: prints out the new table entry's values
IfEntryImpl.java - implements a table entry and provides an internal method for switching the OperStatus variable that triggers a trap (see Example 7-2); this method is not exposed in the MBean interface, so it is only available to the code of this agent application
SnmpImpl.java - initializes and implement variables of the Snmp group; many of these are state variables of the SNMP agent, so we call the getter methods of the SNMP adaptor object to return the information
SystemImpl.java - initializes the System group variables with some realistic values
The SnmpImpl.java and SystemImpl.java files provide code that you may reuse when you need to implement these common SNMP groups.
The only class that we need to replace is RFC1213_MIB. Our implementation is located in patchfiles/RFC1213_MIB.java so that we can overwrite the one generated by mibgen. The main function of this MBean is to register the other MBeans of the MIB during its pre-registration phase. Our customization consists of specifying our *Impl classes when instantiating the group and table entry MBeans.
We replace the generated file with our implementation before compiling all of the classes in the examplesDir/Snmp/Agent directory. The classpath must contain the current directory (.):
$ cp -i patchfiles/RFC1213_MIB.java . cp: overwrite ./RFC1213_MIB.java (yes/no)? y $ javac -classpath classpath -d . *.java |
We are now ready to look at the implementation of an SNMP agent and run the example applications.