1 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 ; 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 65 public class TestSubagent implements Runnable , 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 [] 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 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 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 ex) { 187 ex.printStackTrace(); 188 } 189 } 190 191 public void connectionStateChanged(final TransportStateEvent change) { 192 if (change.getNewState() == 193 TransportStateEvent.STATE_DISCONNECTED_REMOTELY) { 194 Thread t = new Thread (new Runnable () { 197 public void run() { 198 Address addr = change.getPeerAddress(); 199 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 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 ex) { 226 break; 227 } 228 } 229 } 230 }); 231 t.start(); 232 } 233 } 234 235 244 class AgentShutdown extends Thread { 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 |