These examples show you how to register local and remote MIBs within the master agent SNMP adaptor. It shows you how to instantiate and use the SnmpProxy and SnmpUsmProxy classes to register the remote MIBs.
In these examples, we demonstrate two different types of SNMP master agent that delegate handling of SNMP requests to subagents:
A master agent, which hides a single subagent and contains a single remote MIB implemented by that subagent
An overlap master agent, which locally implements part of a MIB whose OID space overlaps with the MIB implemented by its subagent
These examples also contain a manager which is used to send requests to the master agent. This manager operates in synchronous mode. Manager requests are sent both in SNMPv2 and SNMPv3.
Before going through this example, you must be familiar with the agent and manager examples described in Chapter 18, Creating an SNMP Agent and Chapter 19, Developing an SNMP Manager.
The following applications are used in these examples:
A manager used to query the master agent. This class is in the examplesDir/Snmp/MasterAgent/manager directory. The SimpleManager application makes SNMP requests both in SNMPv3 and in SNMPv2 on a Java DMK 5.0 master agent, and listens to forwarded traps.
A Java DMK 5.0 SNMPv1/v2 standalone subagent. This class is in the examplesDir/Snmp/MasterAgent/standalone directory. The StandAloneAgent application is a multi-protocol SNMP agent implementing a simple MIB containing four OIDs:
sysDescr1 value "error1"
sysDescr2 value "error2"
sysDescr3 value "sysDescr3"
sysDescr4 value "sysDescr4"
This simple MIB contains a single fake system group registered in the OID space of MIB-II.
A simple SNMPv1/v2 master agent, configured with a single remote MIB implemented by a single subagent This class is in the examplesDir/Snmp/MasterAgent/master directory. The MasterAgent application registers an SnmpProxy to forward requests to the remote MIB implemented by the StandAloneAgent, and forwards SNMPv1 and v2 traps to SNMPv1 and v2 managers.
A simple SNMPv3 master agent, configured with a single remote MIB implemented by a single subagent. This class is in the examplesDir/Snmp/MasterAgent/master directory. The MasterAgentV3 application registers an SnmpUsmProxy to forward requests to the remote MIB implemented by the StandAloneAgent and forwards SNMPv1 and SNMPv2 traps to SNMPv3 managers.
A simple master agent that deals with MIBs whose OID spaces overlap. This class is in the examplesDir/Snmp/MasterAgent/overlap directory. The MasterAgent application registers an SnmpProxy to forward requests to the remote MIB implemented by the StandAloneAgent subagent. It also locally implements a MIB whose variables sysDescr1 and sysDescr2 with values "sysDescr1", "sysDescr2" overlap with the variables defined in the subagent's MIB.
The SimpleManager is identical to a standard Java DMK SNMP manager. The StandAloneAgent is also identical to a standard Java DMK SNMP standalone agent. It is unaware of the existence of the master agent, unless it is configured to send traps.
There are, however, differences in the way each of the SNMPv1/v2 master agent and the SNMPv3 master agent creates a proxy, as shown in Example 21–2 and Example 21–3. Example 21–4 shows how the MIB overlapping is programmed.
In the SNMPv1/v2 master agent example, proxy registration is identical to standard MIB registration. The proxies are created as shown in the following example.
[...] // First we need to create a peer to the distant sub agent. // final SnmpPeer peer = new SnmpPeer(host, Integer.parseInt(port)); final SnmpParameters p = new SnmpParameters(); // The sub agent is seen as a SNMPv2. // p.setProtocolVersion(SnmpDefinitions.snmpVersionTwo); //Set the parameters to the peer. // peer.setParams(p); // SnmpProxy creation. // final SnmpProxy proxy = new SnmpProxy(snmpAdaptor.getEngine(), peer,"1.3.6.1.2.1"); // A SnmpProxy is also an MBean. Register it in the // MBeanServer. // proxyObjName= new ObjectName("snmp:class=SnmpProxy"); server.registerMBean(proxy, proxyObjName); proxy.setSnmpAdaptorName(snmpObjName); [...]
To instantiate and register the proxy, the MasterAgent example first of all creates a peer to the subagent using new SnmpPeer(), and creates security parameters p using the SnmpParameters() method. It then sets the subagent as an SMNPv2 agent using setProtocolVersion.
The MasterAgent passes the parameters p to the new peer using peer.setParams. Finally, MasterAgent creates the proxy, passing it the following information:
The adaptor's engine ID, via snmpAdaptor.getEngine()
The peer
The distant MIB's OID, 1.3.6.1.2.1
In the SNMPv3 master agent example, proxy registration is identical to standard MIB registration. The proxies are created as shown in the following example.
[...] // First we need to create a peer to the distant SNMPv3 sub // agent final SnmpUsmPeer peer = new SnmpUsmPeer(snmpAdaptor.getEngine(), host, Integer.parseInt(port)); // Forward the requests. // final SnmpUsmParameters p = new SnmpUsmParameters(snmpAdaptor.getEngine(), "defaultUser"); p.setContextEngineId(peer.getEngineId().getBytes()); p.setSecurityLevel(SnmpDefinitions.authNoPriv); peer.setParams(p); peer.processUsmTimelinessDiscovery(); final SnmpUsmProxy proxy = new SnmpUsmProxy(snmpAdaptor.getEngine(), peer, "1.3.6.1.2.1"); // A SnmpUsmProxy is also an MBean. Register it in the // MBeanServer. // proxyObjName= new ObjectName("snmp:class=SnmpUsmProxy"); server.registerMBean(proxy, proxyObjName); proxy.setSnmpAdaptorName(snmpObjName); [...]
To instantiate and register the proxy, the MasterAgentV3 example first of all creates a peer to the subagent using new SnmpUsmPeer(), and creates SNMPv3 security parameters p using the SnmpUsmParameters() method. These new security parameters are then passed to the peer using peer.setParams, thus translating all requests that come through the peer into SNMPv3 requests.
Finally, MasterAgent creates the proxy, passing it the following information:
The adaptor's engine ID, via snmpAdaptor.getEngine()
The peer
The distant MIB's OID, 1.3.6.1.2.1
In the overlapping MIB master agent example, proxy registration is identical to standard MIB registration and the proxies are created in the same way as for SNMPv1 and v2 master agents.
// Instantiate a Mib // final MIB1_MIB mib1 = new MIB1_MIB(); // Register the local MIB1 implementation for sysDescr1 // and sysDescr2. // final SnmpOid oid1 = new SnmpOid("1.3.6.1.2.1.1.1"); final SnmpOid oid2 = new SnmpOid("1.3.6.1.2.1.1.2"); // Make an array of these OIDs. // final SnmpOid[] local_oids = {oid1, oid2}; // Add the local MIB1 implementation for each redefined oid // snmpAdaptor.addMib(mib1, local_oids); // Initialize the mib // mib1.init();
The overlapping MIB MasterAgent example for of all creates a new MIB using new MIB1_MIB. It then registers the local MIB1 implementation for sysDescr1 and sysDescr2, which are configured into the StandAloneAgent example as error1 and error2, respectively. The local MIB thus shadows the implementation of sysDescr1 and sysDescr2 instrumented in the remote MIB, because it is registered with deeper OIDs than the remote MIB.
The MIBs are then added to the SNMP adaptor server using snmpAdaptor.addMib and inititialized using init().
Before running the example applications, compile all the Java classes in each of the four subdirectories inside examplesDir/Snmp/MasterAgent, by typing the following command in each directory.
$ javac -classpath classpath -d . *.java |
The following procedures give instructions to run five different SNMP master agent scenarios:
The manager sends requests to the master agent with an SNMPv2 subagent
The manager sends requests to the master agent with an SNMPv3 subagent
The manager sends requests to the master agent, with overlapping
The manager receives forwarded SNMPv1 and SNMPv2 traps
The manager receives forwarded SNMPv3 traps
Ensure that no agents are already running before you start the examples.
Because there are no MIBs overlapping in this first example, all the variables implemented by the subagent MIB can be seen from the manager. Thus, you can see that some of the OIDs queried return a DisplayString value of error#.
Start the StandAloneAgent subagent.
In examplesDir/Snmp/MasterAgent/standalone, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security StandAloneAgent 8085 |
This binds StandAloneAgent to port 8085. Do not send traps when prompted.
Start the SNMPv2 MasterAgent application.
You need to provide MasterAgent with the following information:
The location of its security configuration file, jdmk.security
The port on which it should listen for incoming requests, in this case we choose 8087
The subagent's host, in this case the local host
The subagent's port number, in this case 8085
In examplesDir/Snmp/MasterAgent/master, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security MasterAgent 8087 localhost 8085 |
The following output is displayed:
NOTE: HTML adaptor is bound on TCP port 8082 NOTE: SNMP Adaptor is bound on UDP port 8087 The master agent forward traps on port : 8088 >> Press Enter if you want to stop. |
Start the SimpleManager application.
You need to provide SimpleManager with the following information:
The location of its security configuration file, jdmk.security
The master agent's host, in this case the local host
The port on which the master agent is listening for request, in this case 8087
In examplesDir/Snmp/MasterAgent/manager, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security SimpleManager localhost 8087 >> Press Enter if you want to send a SNMP V3 request. |
Press Enter to send an SNMPv3 request
The following output is displayed:
SimpleManager::main: Send SNMP V3 get request to SNMP V3 agent on localhost at port 8087 Result: [Object ID : 1.3.6.1.2.1.1.1.0 (Syntax : String) Value : error1, Object ID : 1.3.6.1.2.1.1.2.0 (Syntax : String) Value : error2, Object ID : 1.3.6.1.2.1.1.3.0 (Syntax : String) Value : sysDescr3, Object ID : 1.3.6.1.2.1.1.4.0 (Syntax : String) Value : sysDescr4] >> Press Enter if you want to send a SNMP V2 request. |
Press Enter to send an SNMPv2 request
The following output is displayed:
SimpleManager::main: Send SNMP V2 get request to SNMP agent on localhost at port 8087 Result: [Object ID : 1.3.6.1.2.1.1.1.0 (Syntax : String) Value : error1, Object ID : 1.3.6.1.2.1.1.2.0 (Syntax : String) Value : error2, Object ID : 1.3.6.1.2.1.1.3.0 (Syntax : String) Value : sysDescr3, Object ID : 1.3.6.1.2.1.1.4.0 (Syntax : String) Value : sysDescr4] $ |
The manager has successfully sent the two requests to the subagent, via the master agent.
Because there is no MIB overlapping in this second example, all the variables implemented by the subagent MIB can be seen from the manager. Thus, you see that some of the OIDs queried return a DisplayString value of error#.
Start the StandAloneAgent subagent.
In examplesDir/Snmp/MasterAgent/standalone, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security StandAloneAgent 8085 |
This binds StandAloneAgent to port 8085. Do not send traps when prompted.
Start the SNMPv3 MasterAgentV3 application.
You need to provide MasterAgentV3 with the following information:
The location of its security configuration file, jdmk.security
The port on which it should listen for incoming requests, in this case we choose 8087
The subagent's host, in this case the local host
The subagent's port number, in this case 8085
The manager's host, in this case the local host
In examplesDir/Snmp/MasterAgent/master, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security MasterAgentV3 8087 localhost 8085 localhost |
The following output is displayed:
NOTE: HTML adaptor is bound on TCP port 8082 NOTE: SNMP Adaptor is bound on UDP port 8087 >> Press Enter if you want to stop. |
Start the SimpleManager application.
You need to provide SimpleManager with the following information:
The location of its security configuration file, jdmk.security
The master agent's host, in this case the local host
The port on which the master agent is listening for request, in this case 8087
In examplesDir/Snmp/MasterAgent/manager, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security SimpleManager localhost 8087 >> Press Enter if you want to send a SNMP V3 request. |
Press Enter to send an SNMPv3 request
The following output is displayed:
SimpleManager::main: Send SNMP V3 get request to SNMP V3 agent on localhost at port 8087 Result: [Object ID : 1.3.6.1.2.1.1.1.0 (Syntax : String) Value : error1, Object ID : 1.3.6.1.2.1.1.2.0 (Syntax : String) Value : error2, Object ID : 1.3.6.1.2.1.1.3.0 (Syntax : String) Value : sysDescr3, Object ID : 1.3.6.1.2.1.1.4.0 (Syntax : String) Value : sysDescr4] >> Press Enter if you want to send a SNMP V2 request. |
Press Enter to send an SNMPv2 request
The following output is displayed:
SimpleManager::main: Send SNMP V2 get request to SNMP agent on localhost at port 8087 Result: [Object ID : 1.3.6.1.2.1.1.1.0 (Syntax : String) Value : error1, Object ID : 1.3.6.1.2.1.1.2.0 (Syntax : String) Value : error2, Object ID : 1.3.6.1.2.1.1.3.0 (Syntax : String) Value : sysDescr3, Object ID : 1.3.6.1.2.1.1.4.0 (Syntax : String) Value : sysDescr4] $ |
The manager has successfully sent the two requests to the subagent, via the SNMPv3 master agent.
This example is very similar to To Send Requests From a Manager to the SNMPv2 Master Agent, except that the master agent now implements a local MIB which partly shadows the MIB implemented remotely by the agent.
Because the local MIB now shadows the variables for which the value was error#, these pseudo error messages no longer appear in the result displayed.
Start the StandAloneAgent subagent.
In examplesDir/Snmp/MasterAgent/standalone, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security StandAloneAgent 8085 |
This binds StandAloneAgent to port 8085. Do not send traps when prompted.
Start the overlap MasterAgent application.
You need to provide MasterAgent with the following information:
The location of its security configuration file, jdmk.security
The port on which it should listen for incoming requests, in this case we choose 8087
The subagent's host, in this case the local host
The subagent's port number, in this case 8085
In examplesDir/Snmp/MasterAgent/overlap, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security MasterAgent 8087 localhost 8085 |
The following output is displayed:
NOTE: HTML adaptor is bound on TCP port 8082 NOTE: SNMP Adaptor is bound on UDP port 8087 >> Press Enter if you want to stop. |
Start the SimpleManager application.
You need to provide SimpleManager with the following information:
The location of its security configuration file, jdmk.security
The master agent's host, in this case the local host
The port on which the master agent is listening for request, in this case 8087
In examplesDir/Snmp/MasterAgent/manager, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security SimpleManager localhost 8087 >> Press Enter if you want to send a SNMP V3 request. |
Press Enter to send an SNMPv3 request
The following output is displayed:
SimpleManager::main: Send SNMP V3 get request to SNMP V3 agent on localhost at port 8087 Result: [Object ID : 1.3.6.1.2.1.1.1.0 (Syntax : String) Value : sysDescr1, Object ID : 1.3.6.1.2.1.1.2.0 (Syntax : String) Value : sysDescr2, Object ID : 1.3.6.1.2.1.1.3.0 (Syntax : String) Value : sysDescr3, Object ID : 1.3.6.1.2.1.1.4.0 (Syntax : String) Value : sysDescr4] >> Press Enter if you want to send a SNMP V2 request. |
Press Enter to send an SNMPv2 request
The following output is displayed:
SimpleManager::main: Send SNMP V2 get request to SNMP agent on localhost at port 8087 Result: [Object ID : 1.3.6.1.2.1.1.1.0 (Syntax : String) Value : sysDescr1, Object ID : 1.3.6.1.2.1.1.2.0 (Syntax : String) Value : sysDescr2, Object ID : 1.3.6.1.2.1.1.3.0 (Syntax : String) Value : sysDescr3, Object ID : 1.3.6.1.2.1.1.4.0 (Syntax : String) Value : sysDescr4] $ |
The manager has successfully sent the two requests to the subagent, via the overlap master agent. As you can see, the error# values have been replaced by the variables sysDescr1 and sysDescr2, which were configured in the master agent to overlap with the variables in the subagent's MIB.
Start the StandAloneAgent subagent.
In examplesDir/Snmp/MasterAgent/standalone, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security StandAloneAgent 8085 |
The following output is displayed:
NOTE: SNMP Adaptor is bound on UDP port 8085 Press Return if you want to send trap |
Press Return to activate stand alone traps
The following output is displayed:
Press crtl-c in order to kill the agent Type 1 in order to launch snmp V1 traps, 2 for snmp V2. |
Do not send any traps yet, but leave the StandAloneAgent active.
Start the SNMPv2 MasterAgent application.
You need to provide MasterAgent with the following information:
The location of its security configuration file, jdmk.security
The port on which it should listen for incoming requests, in this case we choose 8087
The subagent's host, in this case the local host
The subagent's port number, in this case 8085
In examplesDir/Snmp/MasterAgent/master, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security MasterAgent 8087 localhost 8085 |
The following output is displayed:
NOTE: HTML adaptor is bound on TCP port 8082 NOTE: SNMP Adaptor is bound on UDP port 8087 The master agent forward traps on port : 8088 >> Press Enter if you want to stop. |
Start the SimpleManager application.
You need to provide SimpleManager with the following information:
The location of its security configuration file, jdmk.security
The master agent's host, in this case the local host
The port on which the master agent is listening for request, in this case 8087
In examplesDir/Snmp/MasterAgent/manager, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security SimpleManager localhost 8087 >> Press Enter if you want to send a SNMP V3 request. |
Do not send a request this time.
Go back to examplesDir/Snmp/MasterAgent/standalone
The StandAloneAgent should still be waiting to send traps.
Type either 1 or 2 to send SNMPv1 or SNMPv2 traps
The following output is displayed:
1 V1 TRAP to send Trap V1 sent! Type 1 in order to launch snmp V1 traps, 2 for snmp V2. 2 V2 TRAP to send Trap V2 sent! Type 1 in order to launch snmp V1 traps, 2 for snmp V2. |
Go back to examplesDir/Snmp/MasterAgent/manager
Notice that the SimpleManager application has received SNMPv1 and v2 traps from the StandAloneAgent. The following output from SimpleManager is displayed:
NOTE: TrapListenerImpl received SNMP V1 trap : Generic 0 Specific 0 TimeStamp 104549 Agent adress 129.157.203.98 NOTE: TrapListenerImpl received SNMP V2 trap: CommunityString : VarBind list : oid : 1.3.6.1.2.1.1.3.0 val : 0:17:25 oid : 1.3.6.1.6.3.1.1.4.1.0 val : 1.3.6.1.6.3.1.1.5.1 oid : 1.2.3.4.5.6.0.0 val : Test values oid : 1.2.3.4.5.6.1.0 val : NULL oid : 1.2.3.4.5.6.2.0 val : 43 oid : 1.2.3.4.5.6.3.0 val : Test values oid : 1.3.6.1.6.3.18.1.3.0 val : 129.157.203.98 oid : 1.3.6.1.6.3.18.1.3.0 val : 129.157.203.98 oid : 1.3.6.1.6.3.18.1.4.0 val : oid : 1.3.6.1.6.3.1.1.4.3.0 val : 1.3.6.1.4.1.42 |
Stop the StandAloneAgent and the SimpleManager by pressing Control-C, and stop the MasterAgent by pressing Enter.
Start the StandAloneAgent subagent.
In examplesDir/Snmp/MasterAgent/standalone, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security StandAloneAgent 8085 |
The following output is displayed:
NOTE: SNMP Adaptor is bound on UDP port 8085 Press Return if you want to send trap |
Press Return to activate stand alone traps
The following output is displayed:
Press crtl-c in order to kill the agent Type 1 in order to launch snmp V1 traps, 2 for snmp V2. |
Do not send any traps yet, but leave the StandAloneAgent active.
Start the SNMPv3 MasterAgentV3 application.
You need to provide MasterAgentV3 with the following information:
The location of its security configuration file, jdmk.security
The port on which it should listen for incoming requests, in this case we choose 8087
The subagent's host, in this case the local host
The subagent's port number, in this case 8085
The manager's host, in this case the local host
In examplesDir/Snmp/MasterAgent/master, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security MasterAgentV3 8087 localhost 8085 localhost |
The following output is displayed:
NOTE: HTML adaptor is bound on TCP port 8082 NOTE: SNMP Adaptor is bound on UDP port 8087 The master agent forward traps on port : 8088 >> Press Enter if you want to stop. |
Start the SimpleManager application.
You need to provide SimpleManager with the following information:
The location of its security configuration file, jdmk.security
The master agent's host, in this case the local host
The port on which the master agent is listening for request, in this case 8087
In examplesDir/Snmp/MasterAgent/manager, type the following command:
$ java -classpath classpath -Djdmk.security.file=./jdmk.security SimpleManager localhost 8087 >> Press Enter if you want to send a SNMP V3 request. |
Do not send a request this time.
Go back to examplesDir/Snmp/MasterAgent/standalone
The StandAloneAgent should still be waiting to send traps.
Type either 1 or 2 to send SNMPv1 or SNMPv2 traps
The following output is displayed:
1 V1 TRAP to send Trap V1 sent! Type 1 in order to launch snmp V1 traps, 2 for snmp V2. 2 V2 TRAP to send Trap V2 sent! Type 1 in order to launch snmp V1 traps, 2 for snmp V2. |
Go back to examplesDir/Snmp/MasterAgent/manager
Notice that the SimpleManager application has received SNMPv3 traps from the StandAloneAgent, via MasterAgentV3. The following output from SimpleManager is displayed:
NOTE: TrapListenerImpl received trap V3: ContextEngineId : 0x8000002a05819dcb6e00001f95 ContextName : TEST-CONTEXT VarBind list : oid : 1.3.6.1.2.1.1.3.0 val : 0:5:24 oid : 1.3.6.1.6.3.1.1.4.1.0 val : 1.3.6.1.6.3.1.1.5.1 oid : 1.2.3.4.5.6.0.0 val : Test values oid : 1.2.3.4.5.6.1.0 val : NULL oid : 1.2.3.4.5.6.2.0 val : 43 oid : 1.2.3.4.5.6.3.0 val : Test values oid : 1.3.6.1.6.3.18.1.3.0 val : 129.157.203.98 oid : 1.3.6.1.6.3.18.1.3.0 val : 129.157.203.98 oid : 1.3.6.1.6.3.18.1.4.0 val : oid : 1.3.6.1.6.3.1.1.4.3.0 val : 1.3.6.1.4.1.42 |
Stop the StandAloneAgent and the SimpleManager by pressing Control-C, and stop the MasterAgentV3 by pressing Enter