[SNMP4J] How to use ProxyForwarder
Frank Fock
fock at agentpp.com
Tue Mar 20 20:24:41 CET 2007
Hi Kanda,
This is indeed a bug which can be fixed
by the following patch on ProxyForwarderImpl.java:
@@ -199,6 +199,7 @@
}
PDU reqPDU = request.getCommandEvent().getPDU();
PDU pdu = DefaultPDUFactory.createPDU(target, reqPDU.getType());
+ setScope(request, pdu);
try {
proxyForwardTranslation(request, reqPDU, pdu);
ResponseEvent response = null;
@@ -402,6 +403,7 @@
try {
PDU reqPDU = request.getCommandEvent().getPDU();
PDU pdu = DefaultPDUFactory.createPDU(target,
reqPDU.getType());
+ setScope(request, pdu);
proxyForwardTranslation(request, reqPDU, pdu);
ResponseEvent resp = session.send(pdu, target);
if (logger.isInfoEnabled()) {
@@ -436,6 +438,14 @@
return allOK;
}
+ private void setScope(ProxyForwardRequest request, PDU pdu) {
+ if (pdu instanceof ScopedPDU) {
+ ScopedPDU scopedPDU = (ScopedPDU)pdu;
+ scopedPDU.setContextEngineID(request.getContextEngineID());
+ scopedPDU.setContextName(request.getContext());
+ }
+ }
+
Please let me know if this fixes the issue!
Best regards,
Frank
Kanda Norimichi wrote:
> Dear Mr. Fock:
>
> I am Kanda and I work at Fujisoft.
>
> I hope to use ProxyForwarder.
> But SNMPv1-Trap forward doesn't operate correctly.
>
> I'll show below specifically.
> I'm designing the following system structure.
>
> MA - TestProxy - NMS
>
> "MA" is Managed-Agent, it is SNMP agent that support SNMPv1.
> I hope that message from MA will be forwarded to NMS with
> the addition of contextEngineID that generated from
> MA's IP address in TestProxy and fixed contextName.
>
> But in TestProxy made by our system, contextEngineID configured actually is
> replaced by snmpEngineID of TestProxy.
> ContextEngineID and contextName that should be configured forwarded Trap are
> already added to snmpCommunityTable.
>
> I guess, maybe I failed in making TestProxy.
> But I couldn't find sample program and I have no idea what should I do.
> Would you give me any advice?
>
> I'll attach TestProxy made by arranging org.snmp4j.agent.test.TestAgent.
>
> Sincerely.
>
> Norimichi Kanda
> ----
> /*_############################################################################
> _##
> _## SNMP4J-Agent - TestAgent.java
> _##
> _## Copyright 2005-2006 Frank Fock (SNMP4J.org)
> _##
> _## Licensed under the Apache License, Version 2.0 (the "License");
> _## you may not use this file except in compliance with the License.
> _## You may obtain a copy of the License at
> _##
> _## http://www.apache.org/licenses/LICENSE-2.0
> _##
> _## Unless required by applicable law or agreed to in writing, software
> _## distributed under the License is distributed on an "AS IS" BASIS,
> _## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> _## See the License for the specific language governing permissions and
> _## limitations under the License.
> _##
> _##########################################################################*/
>
>
> package test;
>
> import java.io.*;
>
> import org.apache.log4j.*;
> import org.snmp4j.*;
> import org.snmp4j.agent.*;
> import org.snmp4j.agent.mo.*;
> import org.snmp4j.agent.mo.snmp.*;
> import org.snmp4j.mp.*;
> import org.snmp4j.security.*;
> import org.snmp4j.smi.*;
> import org.snmp4j.transport.*;
> import org.snmp4j.agent.io.ImportModes;
> import org.snmp4j.util.ThreadPool;
> import org.snmp4j.log.Log4jLogFactory;
> import org.snmp4j.log.LogFactory;
> import org.snmp4j.agent.mo.snmp4j.example.Snmp4jHeartbeatMib;
> import org.snmp4j.agent.security.MutableVACM;
> import org.snmp4j.agent.test.IfMib;
> import org.snmp4j.agent.mo.ext.AgentppSimulationMib;
>
> /**
> * The <code>TestAgent</code> is a sample SNMP agent implementation of all
> * features (MIB implementations) provided by the SNMP4J-Agent framework.
> * The <code>TestAgent</code> extends the <code>BaseAgent</code> which provides
> * a framework for custom agent implementations through hook methods. Those
> * abstract hook methods need to be implemented by extending the
> * <code>BaseAgent</code>.
> * <p>
> * This IF-MIB implementation part of this test agent, is instrumentation as
> * a simulation MIB. Thus, by changing the agentppSimMode
> * (1.3.6.1.4.1.4976.2.1.1.0) from 'oper(1)' to 'config(2)' any object of the
> * IF-MIB is writable and even creatable (columnar objects) via SNMP. Check it
> * out!
> *
> * @author Frank Fock
> * @version 1.0
> */
> public class TestProxy extends BaseAgent {
>
> // initialize Log4J logging
> static {
> LogFactory.setLogFactory(new Log4jLogFactory());
> ma = new UdpAddress("172.19.0.1/161");
> // ma = new UdpAddress("10.30.34.17/161");
> // ma = new UdpAddress("127.0.0.1/0"); // localhost
>
> // nms = new UdpAddress("172.19.0.1/162");
> nms = new UdpAddress("10.30.34.17/162");
> // nms = new UdpAddress("127.0.0.1/1162"); // localhost
> }
>
> static final UdpAddress ma; // Managed Agent
> static final UdpAddress nms; // Network Management System
> protected String address;
> private Snmp4jHeartbeatMib heartbeatMIB;
> private IfMib ifMIB;
> private AgentppSimulationMib agentppSimulationMIB;
>
> /**
> * Creates the test agent with a file to read and store the boot counter and
> * a file to read and store its configuration.
> *
> * @param bootCounterFile
> * a file containing the boot counter in serialized form (as expected by
> * BaseAgent).
> * @param configFile
> * a configuration file with serialized management information.
> * @throws IOException
> * if the boot counter or config file cannot be read properly.
> */
> public TestProxy(File bootCounterFile, File configFile) throws IOException {
> super(bootCounterFile, configFile,
> new CommandProcessor(new OctetString(MPv3.createLocalEngineID())));
> // Alternatively: OctetString.fromHexString("00:00:00:00:00:00:02", ':');
> agent.setThreadPool(ThreadPool.create("RequestPool", 4));
> }
>
> /* (non-Javadoc)
> * @see org.snmp4j.agent.BaseAgent#init()
> */
> public void init() throws IOException {
> super.init();
>
> // // NOTE: 1st trial and error
> // session.addNotificationListener(new UdpAddress(162), new CommandResponder() {
> // public void processPdu(CommandResponderEvent event) {
> // processTrap(event);
> // }
> // });
>
> // NOTE: 2nd trial and error
> session.addNotificationListener(new UdpAddress(162), agent);
> }
>
> void processTrap(CommandResponderEvent event) {
> OctetString contextEngineID;
> OctetString contextName;
> if (event.getPDU() instanceof ScopedPDU) {
> ScopedPDU pdu = (ScopedPDU)event.getPDU();
> contextEngineID = pdu.getContextEngineID();
> contextName = pdu.getContextName();
> }
> else {
> contextEngineID = new OctetString(getInternalEngineID(event.getPeerAddress()));
> contextName = new OctetString();
> }
> ProxyForwardRequest request =
> new ProxyForwardRequest(event, contextEngineID, contextName);
> defaultProxyForwarder.forward(request);
> }
>
> protected void registerManagedObjects() {
> try {
> // server.register(createStaticIfTable(), null);
> agentppSimulationMIB.registerMOs(server, null);
> ifMIB.registerMOs(server, new OctetString("public"));
> heartbeatMIB.registerMOs(server, null);
> }
> catch (DuplicateRegistrationException ex) {
> ex.printStackTrace();
> }
> }
>
> protected void addNotificationTargets(SnmpTargetMIB targetMIB,
> SnmpNotificationMIB notificationMIB) {
> targetMIB.addDefaultTDomains();
>
> TDomainAddressFactoryImpl factory = new TDomainAddressFactoryImpl();
> targetMIB.addTargetAddress(new OctetString("notification"),
> // TransportDomains.transportDomainUdpIpv4,
> factory.getTransportDomain(nms),
> // new OctetString(new UdpAddress("127.0.0.1/162").getValue()),
> factory.getAddress(nms),
> 200, 1,
> new OctetString("notify"),
> new OctetString("v2c"),
> StorageType.permanent);
> targetMIB.addTargetParams(new OctetString("v2c"),
> MessageProcessingModel.MPv2c,
> SecurityModel.SECURITY_MODEL_SNMPv2c,
> new OctetString("public"),
> SecurityLevel.NOAUTH_NOPRIV,
> StorageType.permanent);
> notificationMIB.addNotifyEntry(new OctetString("default"),
> new OctetString("notify"),
> SnmpNotificationMIB.SnmpNotifyTypeEnum.trap,
> StorageType.permanent);
>
> // NOTE: add SNMPv3 user
> OctetString sha = new OctetString("SHA");
> OctetString secName = new OctetString("SHA");
> OctetString tag = new OctetString("Nms");
> targetMIB.addTargetAddress(
> sha,
> factory.getTransportDomain(nms),
> factory.getAddress(nms),
> 1500,
> 1,
> tag,
> sha,
> StorageType.volatile_);
> targetMIB.addTargetParams(
> sha,
> MessageProcessingModel.MPv3,
> SecurityModel.SECURITY_MODEL_USM,
> secName,
> SecurityLevel.AUTH_NOPRIV,
> StorageType.volatile_);
> notificationMIB.addNotifyEntry(
> sha,
> tag,
> SnmpNotificationMIB.SnmpNotifyTypeEnum.trap,
> StorageType.volatile_);
> }
>
> protected void addViews(VacmMIB vacm) {
> vacm.addGroup(SecurityModel.SECURITY_MODEL_SNMPv1,
> new OctetString("cpublic"),
> new OctetString("v1v2group"),
> StorageType.nonVolatile);
> vacm.addGroup(SecurityModel.SECURITY_MODEL_SNMPv2c,
> new OctetString("cpublic"),
> new OctetString("v1v2group"),
> StorageType.nonVolatile);
> vacm.addGroup(SecurityModel.SECURITY_MODEL_USM,
> new OctetString("SHADES"),
> new OctetString("v3group"),
> StorageType.nonVolatile);
> vacm.addGroup(SecurityModel.SECURITY_MODEL_USM,
> new OctetString("TEST"),
> new OctetString("v3test"),
> StorageType.nonVolatile);
> vacm.addGroup(SecurityModel.SECURITY_MODEL_USM,
> new OctetString("SHA"),
> new OctetString("v3restricted"),
> StorageType.nonVolatile);
>
> vacm.addAccess(new OctetString("v1v2group"), new OctetString("public"),
> SecurityModel.SECURITY_MODEL_ANY,
> SecurityLevel.NOAUTH_NOPRIV,
> MutableVACM.VACM_MATCH_EXACT,
> new OctetString("fullReadView"),
> new OctetString("fullWriteView"),
> new OctetString("fullNotifyView"),
> StorageType.nonVolatile);
> vacm.addAccess(new OctetString("v3group"), new OctetString(),
> SecurityModel.SECURITY_MODEL_USM,
> SecurityLevel.AUTH_PRIV,
> MutableVACM.VACM_MATCH_EXACT,
> new OctetString("fullReadView"),
> new OctetString("fullWriteView"),
> new OctetString("fullNotifyView"),
> StorageType.nonVolatile);
> vacm.addAccess(new OctetString("v3restricted"), new OctetString(),
> SecurityModel.SECURITY_MODEL_USM,
> SecurityLevel.AUTH_NOPRIV,
> MutableVACM.VACM_MATCH_EXACT,
> new OctetString("restrictedReadView"),
> new OctetString("restrictedWriteView"),
> new OctetString("restrictedNotifyView"),
> StorageType.nonVolatile);
> vacm.addAccess(new OctetString("v3test"), new OctetString(),
> SecurityModel.SECURITY_MODEL_USM,
> SecurityLevel.AUTH_PRIV,
> MutableVACM.VACM_MATCH_EXACT,
> new OctetString("testReadView"),
> new OctetString("testWriteView"),
> new OctetString("testNotifyView"),
> StorageType.nonVolatile);
>
> vacm.addViewTreeFamily(new OctetString("fullReadView"), new OID("1.3"),
> new OctetString(), VacmMIB.vacmViewIncluded,
> StorageType.nonVolatile);
> vacm.addViewTreeFamily(new OctetString("fullWriteView"), new OID("1.3"),
> new OctetString(), VacmMIB.vacmViewIncluded,
> StorageType.nonVolatile);
> vacm.addViewTreeFamily(new OctetString("fullNotifyView"), new OID("1.3"),
> new OctetString(), VacmMIB.vacmViewIncluded,
> StorageType.nonVolatile);
>
> vacm.addViewTreeFamily(new OctetString("restrictedReadView"),
> new OID("1.3.6.1.2"),
> new OctetString(), VacmMIB.vacmViewIncluded,
> StorageType.nonVolatile);
> vacm.addViewTreeFamily(new OctetString("restrictedWriteView"),
> new OID("1.3.6.1.2.1"),
> new OctetString(),
> VacmMIB.vacmViewIncluded,
> StorageType.nonVolatile);
> vacm.addViewTreeFamily(new OctetString("restrictedNotifyView"),
> new OID("1.3.6.1.2"),
> new OctetString(), VacmMIB.vacmViewIncluded,
> StorageType.nonVolatile);
>
> vacm.addViewTreeFamily(new OctetString("testReadView"),
> new OID("1.3.6.1.2"),
> new OctetString(), VacmMIB.vacmViewIncluded,
> StorageType.nonVolatile);
> vacm.addViewTreeFamily(new OctetString("testReadView"),
> new OID("1.3.6.1.2.1.1"),
> new OctetString(), VacmMIB.vacmViewExcluded,
> StorageType.nonVolatile);
> vacm.addViewTreeFamily(new OctetString("testWriteView"),
> new OID("1.3.6.1.2.1"),
> new OctetString(),
> VacmMIB.vacmViewIncluded,
> StorageType.nonVolatile);
> vacm.addViewTreeFamily(new OctetString("testNotifyView"),
> new OID("1.3.6.1.2"),
> new OctetString(), VacmMIB.vacmViewIncluded,
> StorageType.nonVolatile);
>
> }
>
> protected void addUsmUser(USM usm) {
> UsmUser user = new UsmUser(new OctetString("SHADES"),
> AuthSHA.ID,
> new OctetString("SHADESAuthPassword"),
> PrivDES.ID,
> new OctetString("SHADESPrivPassword"));
> usm.addUser(user.getSecurityName(), usm.getLocalEngineID(), user);
> user = new UsmUser(new OctetString("TEST"),
> AuthSHA.ID,
> new OctetString("maplesyrup"),
> PrivDES.ID,
> new OctetString("maplesyrup"));
> usm.addUser(user.getSecurityName(), usm.getLocalEngineID(), user);
> user = new UsmUser(new OctetString("SHA"),
> AuthSHA.ID,
> new OctetString("SHAAuthPassword"),
> null,
> null);
> usm.addUser(user.getSecurityName(), usm.getLocalEngineID(), user);
> }
>
> /**
> * add Community-based agent for proxy-forwarding.
> * @param communityName
> * @param address
> */
> public void addCommunityAgent(OctetString communityName, Address address) {
> TDomainAddressFactoryImpl factory = new TDomainAddressFactoryImpl();
>
> // add community-table
> OctetString snmpCommunityIndex = new OctetString("uniqueCommunityIndex");
> OctetString secName = new OctetString("uniqueSecName");
> OctetString snmpCommunityTransportTag = new OctetString("uniqueTransportTag");
> OctetString contextEngineID = new OctetString(getInternalEngineID(address));
> System.out.println(contextEngineID);
>
> Variable[] vars = new Variable[] {
> communityName, // community name
> secName, // security name
> contextEngineID, // context engine id
> new OctetString(), // context name
> snmpCommunityTransportTag, // transport tag
> new Integer32(StorageType.volatile_), // storage type
> new Integer32(RowStatus.active) // row status
> };
> MOTableRow row =
> getSnmpCommunityMIB().getSnmpCommunityEntry().createRow(
> snmpCommunityIndex.toSubIndex(true), vars);
> getSnmpCommunityMIB().getSnmpCommunityEntry().addRow(row);
>
> // add target-parameters-table
> OctetString snmpTargetParamsName = new OctetString("uniqueTargetParamsName");
>
> getSnmpTargetMIB().addTargetParams(
> snmpTargetParamsName,
> MessageProcessingModel.MPv1,
> SecurityModel.SECURITY_MODEL_SNMPv1,
> communityName,
> SecurityLevel.NOAUTH_NOPRIV,
> StorageType.volatile_);
>
> // add target-address-table
> OctetString snmpTargetAddrName = new OctetString("uniqueTargetAddrName");
>
> getSnmpTargetMIB().addTargetAddress(
> snmpTargetAddrName,
> factory.getTransportDomain(address),
> factory.getAddress(address),
> 1500,
> 1,
> snmpCommunityTransportTag,
> snmpTargetParamsName,
> StorageType.volatile_);
>
> // add proxy-table(trap)
> OctetString snmpProxyName1 = new OctetString("uniqueProxyName1");
> getSnmpProxyMIB().addProxyEntry(
> snmpProxyName1,
> ProxyForwarder.PROXY_TYPE_NOTIFY,
> contextEngineID,
> new OctetString(),
> snmpTargetParamsName,
> null,
> new OctetString("Nms"),
> StorageType.volatile_);
>
> // add proxy-table(get)
> OctetString snmpProxyName2 = new OctetString("uniqueProxyName2");
> getSnmpProxyMIB().addProxyEntry(
> snmpProxyName2,
> ProxyForwarder.PROXY_TYPE_READ,
> contextEngineID,
> new OctetString(),
> new OctetString("SHA"),
> snmpTargetAddrName,
> null,
> StorageType.volatile_);
>
> }
>
> byte[] getInternalEngineID(Address address) {
> // NOTE: generate EngineID without PortNumber for return-value (ID) be same
> // at request/response and notify.
>
> OctetString id;
> if (address instanceof IpAddress) {
> id = new OctetString(((IpAddress)address).getInetAddress().getAddress());
> } else {
> id = new OctetString();
> }
> return MPv3.createLocalEngineID(id);
> }
>
> /* This code illustrates how a table can be created and filled with static
> data:
>
> private static DefaultMOTable createStaticIfTable() {
> MOTableSubIndex[] subIndexes =
> new MOTableSubIndex[] { new MOTableSubIndex(SMIConstants.SYNTAX_INTEGER) };
> MOTableIndex indexDef = new MOTableIndex(subIndexes, false);
> MOColumn[] columns = new MOColumn[8];
> int c = 0;
> columns[c++] =
> new MOColumn(c, SMIConstants.SYNTAX_INTEGER,
> MOAccessImpl.ACCESS_READ_ONLY); // ifIndex
> columns[c++] =
> new MOColumn(c, SMIConstants.SYNTAX_OCTET_STRING,
> MOAccessImpl.ACCESS_READ_ONLY);// ifDescr
> columns[c++] =
> new MOColumn(c, SMIConstants.SYNTAX_INTEGER,
> MOAccessImpl.ACCESS_READ_ONLY); // ifType
> columns[c++] =
> new MOColumn(c, SMIConstants.SYNTAX_INTEGER,
> MOAccessImpl.ACCESS_READ_ONLY); // ifMtu
> columns[c++] =
> new MOColumn(c, SMIConstants.SYNTAX_GAUGE32,
> MOAccessImpl.ACCESS_READ_ONLY); // ifSpeed
> columns[c++] =
> new MOColumn(c, SMIConstants.SYNTAX_OCTET_STRING,
> MOAccessImpl.ACCESS_READ_ONLY);// ifPhysAddress
> columns[c++] =
> new MOMutableColumn(c, SMIConstants.SYNTAX_INTEGER, // ifAdminStatus
> MOAccessImpl.ACCESS_READ_WRITE, null);
> columns[c++] =
> new MOColumn(c, SMIConstants.SYNTAX_INTEGER,
> MOAccessImpl.ACCESS_READ_ONLY); // ifOperStatus
>
> DefaultMOTable ifTable =
> new DefaultMOTable(new OID("1.3.6.1.2.1.2.2.1"), indexDef, columns);
> MOMutableTableModel model = (MOMutableTableModel) ifTable.getModel();
> Variable[] rowValues1 = new Variable[] {
> new Integer32(1),
> new OctetString("eth0"),
> new Integer32(6),
> new Integer32(1500),
> new Gauge32(100000000),
> new OctetString("00:00:00:00:01"),
> new Integer32(1),
> new Integer32(1)
> };
> Variable[] rowValues2 = new Variable[] {
> new Integer32(2),
> new OctetString("loopback"),
> new Integer32(24),
> new Integer32(1500),
> new Gauge32(10000000),
> new OctetString("00:00:00:00:02"),
> new Integer32(1),
> new Integer32(1)
> };
> model.addRow(new DefaultMOMutableRow2PC(new OID("1"), rowValues1));
> model.addRow(new DefaultMOMutableRow2PC(new OID("2"), rowValues2));
> ifTable.setVolatile(true);
> return ifTable;
> }
> */
> protected void initTransportMappings() throws IOException {
> transportMappings = new TransportMapping[1];
> Address addr = GenericAddress.parse(address);
> TransportMapping tm =
> TransportMappings.getInstance().createTransportMapping(addr);
> transportMappings[0] = tm;
> }
>
> public static void main(String[] args) {
> String address;
> if (args.length > 0) {
> address = args[0];
> }
> else {
> address = "0.0.0.0/161";
> }
> BasicConfigurator.configure();
> try {
> final TestProxy testAgent1 = new TestProxy(new File("SNMP4JTestAgentBC.cfg"),
> new File("SNMP4JTestAgentConfig.cfg"));
> testAgent1.address = address;
> testAgent1.init();
> testAgent1.loadConfig(ImportModes.UPDATE_CREATE);
> testAgent1.addShutdownHook();
> testAgent1.getServer().addContext(new OctetString("public"));
> testAgent1.finishInit();
>
> // NOTE: add SNMPv1-Trap (community-name: private) from Managed-Agent 'ma'
> // as ProxyForward target.
> testAgent1.addCommunityAgent(new OctetString("private"), ma);
>
> testAgent1.run();
> while (true) {
> try {
> Thread.sleep(1000);
> }
> catch (InterruptedException ex1) {
> break;
> }
> }
> }
> catch (IOException ex) {
> ex.printStackTrace();
> }
>
> }
>
> protected void unregisterManagedObjects() {
> // here we should unregister those objects previously registered...
> }
>
> protected void addCommunities(SnmpCommunityMIB communityMIB) {
> Variable[] com2sec = new Variable[] {
> new OctetString("public"), // community name
> new OctetString("cpublic"), // security name
> getAgent().getContextEngineID(), // local engine ID
> new OctetString("public"), // default context name
> new OctetString(), // transport tag
> new Integer32(StorageType.nonVolatile), // storage type
> new Integer32(RowStatus.active) // row status
> };
> MOTableRow row =
> communityMIB.getSnmpCommunityEntry().createRow(
> new OctetString("public2public").toSubIndex(true), com2sec);
> communityMIB.getSnmpCommunityEntry().addRow(row);
> // snmpCommunityMIB.setSourceAddressFiltering(true);
> }
>
> protected void registerSnmpMIBs() {
> heartbeatMIB = new Snmp4jHeartbeatMib(super.getNotificationOriginator(),
> new OctetString(),
> super.snmpv2MIB.getSysUpTime());
> ifMIB = new IfMib();
> agentppSimulationMIB = new AgentppSimulationMib();
> super.registerSnmpMIBs();
> }
> }
> ----
>
> _______________________________________________
> SNMP4J mailing list
> SNMP4J at agentpp.org
> http://lists.agentpp.org/mailman/listinfo/snmp4j
--
AGENT++
http://www.agentpp.com
http://www.mibexplorer.com
http://www.mibdesigner.com
More information about the SNMP4J
mailing list