KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > snmp4j > agent > agentx > subagent > test > TestSubagent


1 /*_############################################################################
2   _##
3   _## SNMP4J-AgentX - TestSubagent.java
4   _##
5   _## Copyright (C) 2005-2007 Frank Fock (SNMP4J.org)
6   _##
7   _## This program is free software; you can redistribute it and/or modify
8   _## it under the terms of the GNU General Public License version 2 as
9   _## published by the Free Software Foundation.
10   _##
11   _## This program is distributed in the hope that it will be useful,
12   _## but WITHOUT ANY WARRANTY; without even the implied warranty of
13   _## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14   _## GNU General Public License for more details.
15   _##
16   _## You should have received a copy of the GNU General Public License
17   _## along with this program; if not, write to the Free Software
18   _## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19   _## MA 02110-1301 USA
20   _##
21   _##########################################################################*/

22
23 package org.snmp4j.agent.agentx.subagent.test;
24
25 import org.snmp4j.agent.agentx.subagent.AgentXSubagent;
26 import org.snmp4j.smi.OID;
27 import org.snmp4j.agent.agentx.AgentX;
28 import org.snmp4j.smi.OctetString;
29 import org.snmp4j.agent.agentx.AgentXMessageDispatcherImpl;
30 import org.snmp4j.agent.agentx.AgentXMessageDispatcher;
31 import org.snmp4j.smi.Address;
32 import org.snmp4j.smi.TcpAddress;
33 import org.snmp4j.agent.agentx.AgentXSession;
34 import org.snmp4j.agent.DefaultMOServer;
35 import org.snmp4j.agent.MOServer;
36 import org.snmp4j.agent.DuplicateRegistrationException;
37 import org.apache.log4j.BasicConfigurator;
38 import org.snmp4j.log.LogFactory;
39 import org.snmp4j.log.Log4jLogFactory;
40 import org.snmp4j.agent.agentx.AgentXProtocol;
41 import java.io.*;
42 import org.snmp4j.mp.SnmpConstants;
43 import org.snmp4j.smi.VariableBinding;
44 import org.snmp4j.transport.ConnectionOrientedTransportMapping;
45 import org.snmp4j.transport.TransportStateListener;
46 import org.snmp4j.transport.TransportStateEvent;
47 import java.util.List JavaDoc;
48 import org.snmp4j.log.LogAdapter;
49 import org.snmp4j.agent.mo.MOFactory;
50 import org.snmp4j.agent.mo.DefaultMOFactory;
51 import org.snmp4j.util.ThreadPool;
52 import org.snmp4j.agent.mo.snmp4j.Snmp4jConfigMib;
53 import org.snmp4j.agent.mo.snmp4j.Snmp4jLogMib;
54 import org.snmp4j.agent.mo.snmp.SNMPv2MIB.SysUpTimeImpl;
55 import org.snmp4j.agent.mo.snmp.SysUpTime;
56 import org.snmp4j.smi.TimeTicks;
57
58 /**
59  * The <code>TestSubagent</code> is an example implementation of a simple
60  * AgentX subagent with shared tables and multi context registration.
61  *
62  * @author Frank Fock
63  * @version 1.0
64  */

65 public class TestSubagent implements Runnable JavaDoc, TransportStateListener {
66
67   static {
68     LogFactory.setLogFactory(new Log4jLogFactory());
69   }
70
71   private static final LogAdapter LOGGER =
72       LogFactory.getLogger(TestSubagent.class);
73
74   public static final OID SUBAGENT_ID = new OID();
75
76   private AgentXSubagent subagent;
77   private AgentX agentX;
78   private AgentXMessageDispatcher dispatcher;
79   private Address masterAddress;
80   private Address localAddress;
81   private AgentXSession session;
82   private int sessionID = 0;
83
84   private MOServer server;
85   private AgentppTestMib agentppTestMib;
86   private Snmp4jConfigMib snmp4jConfigMib;
87   private Snmp4jLogMib snmp4jLogMib;
88
89   private SysUpTimeImpl sessionContextUpTime = new SysUpTimeImpl();
90
91   public TestSubagent(Address masterAddress, Address localAddress) {
92     this.masterAddress = masterAddress;
93     this.localAddress = localAddress;
94     this.dispatcher = new AgentXMessageDispatcherImpl();
95     this.agentX = new AgentX(dispatcher);
96     server = new DefaultMOServer();
97     server.addContext(new OctetString());
98     this.subagent =
99         new AgentXSubagent(agentX, SUBAGENT_ID,
100                            new OctetString("AgentX4J Test agent"));
101     this.subagent.setThreadPool(ThreadPool.create("AgentXSubAgent", 3));
102     this.subagent.addMOServer(server);
103   }
104
105   public static void main(String JavaDoc[] args) {
106     BasicConfigurator.configure();
107     Address masterAddress = new TcpAddress(args[0]);
108     TestSubagent testsubagent =
109         new TestSubagent(masterAddress, new TcpAddress());
110     testsubagent.run();
111     try {
112       Thread.sleep(100000000);
113     }
114     catch (InterruptedException JavaDoc iex) {
115       iex.printStackTrace();
116     }
117   }
118
119
120   protected void register() throws DuplicateRegistrationException {
121     MOFactory factory = AgentppTestMib.getSharedTableFactory();
122     DefaultMOFactory.addSNMPv2TCs(factory);
123     agentppTestMib = new AgentppTestMib(factory);
124     agentppTestMib.registerMOs(server, null);
125   }
126
127   protected void unregisterSessionDependent() {
128     if (session != null) {
129       OctetString sessionContext = getSessionContext(session.getSessionID());
130       server.removeContext(sessionContext);
131       if (snmp4jConfigMib != null) {
132         snmp4jConfigMib.unregisterMOs(server, sessionContext);
133       }
134       if (snmp4jLogMib != null) {
135         snmp4jLogMib.unregisterMOs(server, sessionContext);
136       }
137     }
138   }
139
140   protected void registerSessionDependent()
141       throws DuplicateRegistrationException
142   {
143     OctetString sessionContext = getSessionContext(session.getSessionID());
144     server.addContext(sessionContext);
145     snmp4jConfigMib = new Snmp4jConfigMib(sessionContextUpTime);
146     snmp4jConfigMib.registerMOs(server, sessionContext);
147     snmp4jLogMib = new Snmp4jLogMib();
148     snmp4jLogMib.registerMOs(server, sessionContext);
149   }
150
151   private static OctetString getSessionContext(int sessionID) {
152     return new OctetString("session="+sessionID);
153   }
154
155   public void run() {
156     try {
157       Runtime.getRuntime().addShutdownHook(new AgentShutdown());
158       register();
159       unregisterSessionDependent();
160       session = new AgentXSession(++sessionID);
161       int status = subagent.connect(masterAddress, localAddress, session);
162       if (status == AgentXProtocol.AGENTX_SUCCESS) {
163         subagent.addAgentCaps(session, new OctetString(),
164                               new OID("1.3.6.1.4.1.4976.10.1.1.100.4.1"),
165                               new OctetString("AgentX-Test-Subagent"));
166         registerSessionDependent();
167         List JavaDoc failed = subagent.registerRegions(session, new OctetString());
168         if (failed.size() > 0) {
169           LOGGER.warn("Failed to register to following objects at master:"+
170                       failed);
171         }
172         TimeTicks upTime = new TimeTicks();
173         subagent.registerRegions(session,
174                                  getSessionContext(session.getSessionID()),
175                                  upTime);
176         sessionContextUpTime.setValue(upTime);
177         subagent.setPingDelay(30);
178         subagent.notify(null, SnmpConstants.warmStart,
179                         new VariableBinding[] {
180                         new VariableBinding(SnmpConstants.sysDescr,
181                                             new OctetString("SNMP4J-AgentX Test-Subagent")) });
182         ((ConnectionOrientedTransportMapping)session.getPeer().getTransport()).
183             addTransportStateListener(this);
184       }
185     }
186     catch (Exception JavaDoc ex) {
187       ex.printStackTrace();
188     }
189   }
190
191   public void connectionStateChanged(final TransportStateEvent change) {
192     if (change.getNewState() ==
193         TransportStateEvent.STATE_DISCONNECTED_REMOTELY) {
194       // remove session dependent registrations
195
// try to reconnect
196
Thread JavaDoc t = new Thread JavaDoc(new Runnable JavaDoc() {
197         public void run() {
198           Address addr = change.getPeerAddress();
199           // try to reconnect ten times if we have been disconnected remotely
200
for (int i=0; i<10; i++) {
201             try {
202               Thread.sleep(5000);
203               if (subagent.connect(addr, localAddress, session) ==
204                   AgentXProtocol.AGENTX_SUCCESS) {
205                 // if connected register our MIB objects
206
try {
207                   registerSessionDependent();
208                 }
209                 catch (DuplicateRegistrationException ex1) {
210                   ex1.printStackTrace();
211                 }
212                 subagent.registerRegions(session, new OctetString());
213                 server.addContext(getSessionContext(session.getSessionID()));
214                 TimeTicks upTime = new TimeTicks();
215                 subagent.registerRegions(session,
216                                          getSessionContext(session.getSessionID()),
217                                          upTime);
218                 sessionContextUpTime.setValue(upTime);
219                 break;
220               }
221             }
222             catch (IOException ex) {
223               ex.printStackTrace();
224             }
225             catch (InterruptedException JavaDoc ex) {
226               break;
227             }
228           }
229         }
230       });
231       t.start();
232     }
233   }
234
235   /**
236    * The <code>AgentShutdown</code> is being executed when the agent is about
237    * to be shut down (e.g. terminated by SIGTERM/Ctrl-C). Its purpose is to
238    * send an AgentX Close PDU to the master agent to gracefully unregister
239    * the current session.
240    *
241    * @author Frank Fock
242    * @version 1.0
243    */

244   class AgentShutdown extends Thread JavaDoc {
245     public void run() {
246       try {
247         subagent.close(session, AgentXProtocol.REASON_SHUTDOWN);
248       }
249       catch (IOException ex) {
250         ex.printStackTrace();
251       }
252     }
253   }
254 }
255
Popular Tags