diff --git a/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/SnmpStrategy.java b/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/SnmpStrategy.java index 625c4de..def8bd2 100644 --- a/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/SnmpStrategy.java +++ b/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/SnmpStrategy.java @@ -30,6 +30,7 @@ package org.opennms.netmgt.snmp; import java.io.IOException; import java.net.InetAddress; +import java.util.List; public interface SnmpStrategy { @@ -48,6 +49,8 @@ public interface SnmpStrategy { SnmpValue[] getBulk(SnmpAgentConfig agentConfig, SnmpObjId[] oids); + void registerForTraps(TrapNotificationListener listener, TrapProcessorFactory processorFactory, InetAddress address, int snmpTrapPort, List snmpv3Users) throws IOException; + void registerForTraps(TrapNotificationListener listener, TrapProcessorFactory processorFactory, InetAddress address, int snmpTrapPort) throws IOException; void registerForTraps(TrapNotificationListener listener, TrapProcessorFactory processorFactory, int snmpTrapPort) throws IOException; diff --git a/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/SnmpUtils.java b/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/SnmpUtils.java index d17c999..aced96e 100644 --- a/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/SnmpUtils.java +++ b/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/SnmpUtils.java @@ -160,7 +160,11 @@ public class SnmpUtils { return getConfig().getProperty("org.opennms.snmp.strategyClass", "org.opennms.netmgt.snmp.snmp4j.Snmp4JStrategy"); // return getConfig().getProperty("org.opennms.snmp.strategyClass", "org.opennms.netmgt.snmp.joesnmp.JoeSnmpStrategy"); } - + + public static void registerForTraps(final TrapNotificationListener listener, final TrapProcessorFactory processorFactory, final InetAddress address, final int snmpTrapPort, final List snmpUsers) throws IOException { + getStrategy().registerForTraps(listener, processorFactory, address, snmpTrapPort, snmpUsers); + } + public static void registerForTraps(final TrapNotificationListener listener, final TrapProcessorFactory processorFactory, final InetAddress address, final int snmpTrapPort) throws IOException { getStrategy().registerForTraps(listener, processorFactory, address, snmpTrapPort); } diff --git a/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/SnmpV3User.java b/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/SnmpV3User.java new file mode 100644 index 0000000..7043cb2 --- /dev/null +++ b/core/snmp/api/src/main/java/org/opennms/netmgt/snmp/SnmpV3User.java @@ -0,0 +1,103 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2011 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ + +package org.opennms.netmgt.snmp; + +public class SnmpV3User { + + private String securityName; + private String authPassPhrase; + private String privPassPhrase; + private String authProtocol; + private String privProtocol; + private String localizationEngineID; + + public SnmpV3User() { + super(); + } + + public SnmpV3User(String securityName, String authenticationProtocol, + String authenticationPassphrase, String privacyProtocol, + String privacyPassphrase) { + super(); + this.securityName = securityName; + this.authProtocol = authenticationProtocol; + this.authPassPhrase = authenticationPassphrase; + this.privProtocol = privacyProtocol; + this.privPassPhrase = privacyPassphrase; + } + + public String getSecurityName() { + return securityName; + } + + public void setSecurityName(String securityName) { + this.securityName = securityName; + } + + public String getAuthPassPhrase() { + return authPassPhrase; + } + + public void setAuthPassPhrase(String authenticationPassphrase) { + this.authPassPhrase = authenticationPassphrase; + } + + public String getPrivPassPhrase() { + return privPassPhrase; + } + + public void setPrivPassPhrase(String privacyPassphrase) { + this.privPassPhrase = privacyPassphrase; + } + + public String getAuthProtocol() { + return authProtocol; + } + + public void setAuthProtocol(String authenticationProtocol) { + this.authProtocol = authenticationProtocol; + } + + public String getPrivProtocol() { + return privProtocol; + } + + public void setPrivProtocol(String privacyProtocol) { + this.privProtocol = privacyProtocol; + } + + public String getLocalizationEngineID() { + return localizationEngineID; + } + + public void setLocalizationEngineID(String localizationEngineID) { + this.localizationEngineID = localizationEngineID; + } + +} diff --git a/core/snmp/impl-joesnmp/src/main/java/org/opennms/netmgt/snmp/joesnmp/JoeSnmpStrategy.java b/core/snmp/impl-joesnmp/src/main/java/org/opennms/netmgt/snmp/joesnmp/JoeSnmpStrategy.java index 3029d11..04320c1 100644 --- a/core/snmp/impl-joesnmp/src/main/java/org/opennms/netmgt/snmp/joesnmp/JoeSnmpStrategy.java +++ b/core/snmp/impl-joesnmp/src/main/java/org/opennms/netmgt/snmp/joesnmp/JoeSnmpStrategy.java @@ -34,6 +34,7 @@ import java.net.SocketException; import java.net.UnknownHostException; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.opennms.core.utils.InetAddressUtils; @@ -46,6 +47,7 @@ import org.opennms.netmgt.snmp.SnmpTrapBuilder; import org.opennms.netmgt.snmp.SnmpV1TrapBuilder; import org.opennms.netmgt.snmp.SnmpV2TrapBuilder; import org.opennms.netmgt.snmp.SnmpV3TrapBuilder; +import org.opennms.netmgt.snmp.SnmpV3User; import org.opennms.netmgt.snmp.SnmpValue; import org.opennms.netmgt.snmp.SnmpValueFactory; import org.opennms.netmgt.snmp.SnmpWalker; @@ -313,6 +315,10 @@ public class JoeSnmpStrategy implements SnmpStrategy { s_registrations.put(listener, info); } + public void registerForTraps(TrapNotificationListener listener, TrapProcessorFactory processorFactory, InetAddress address, int snmpTrapPort, List snmpv3Users) throws IOException { + registerForTraps(listener, processorFactory, address, snmpTrapPort, null); + } + public void registerForTraps(final TrapNotificationListener listener, final TrapProcessorFactory processorFactory, final int snmpTrapPort) throws IOException { registerForTraps(listener, processorFactory, null, snmpTrapPort); } @@ -402,5 +408,4 @@ public class JoeSnmpStrategy implements SnmpStrategy { throw new UnsupportedOperationException(); } - } diff --git a/core/snmp/impl-mock/src/main/java/org/opennms/netmgt/snmp/mock/MockSnmpStrategy.java b/core/snmp/impl-mock/src/main/java/org/opennms/netmgt/snmp/mock/MockSnmpStrategy.java index 9a49145..1673524 100644 --- a/core/snmp/impl-mock/src/main/java/org/opennms/netmgt/snmp/mock/MockSnmpStrategy.java +++ b/core/snmp/impl-mock/src/main/java/org/opennms/netmgt/snmp/mock/MockSnmpStrategy.java @@ -21,6 +21,7 @@ import org.opennms.netmgt.snmp.SnmpTrapBuilder; import org.opennms.netmgt.snmp.SnmpV1TrapBuilder; import org.opennms.netmgt.snmp.SnmpV2TrapBuilder; import org.opennms.netmgt.snmp.SnmpV3TrapBuilder; +import org.opennms.netmgt.snmp.SnmpV3User; import org.opennms.netmgt.snmp.SnmpValue; import org.opennms.netmgt.snmp.SnmpValueFactory; import org.opennms.netmgt.snmp.SnmpWalker; @@ -173,6 +174,11 @@ public class MockSnmpStrategy implements SnmpStrategy { } @Override + public void registerForTraps(TrapNotificationListener listener, TrapProcessorFactory processorFactory, InetAddress address, int snmpTrapPort, List snmpv3Users) throws IOException { + LogUtils.warnf(this, "Can't register for traps. No network in the MockSnmpStrategy!"); + } + + @Override public void unregisterForTraps(final TrapNotificationListener listener, final InetAddress address, final int snmpTrapPort) throws IOException { } @@ -249,4 +255,5 @@ public class MockSnmpStrategy implements SnmpStrategy { final AgentAddress addr = new AgentAddress(agentAddress, agentPort); m_loaders.remove(addr); } + } diff --git a/core/snmp/impl-snmp4j/src/main/java/org/opennms/netmgt/snmp/snmp4j/Snmp4JStrategy.java b/core/snmp/impl-snmp4j/src/main/java/org/opennms/netmgt/snmp/snmp4j/Snmp4JStrategy.java index 0ba2d22..4c85e44 100644 --- a/core/snmp/impl-snmp4j/src/main/java/org/opennms/netmgt/snmp/snmp4j/Snmp4JStrategy.java +++ b/core/snmp/impl-snmp4j/src/main/java/org/opennms/netmgt/snmp/snmp4j/Snmp4JStrategy.java @@ -34,18 +34,21 @@ import java.net.SocketException; import java.net.UnknownHostException; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.opennms.core.utils.LogUtils; import org.opennms.core.utils.ThreadCategory; import org.opennms.netmgt.snmp.CollectionTracker; import org.opennms.netmgt.snmp.SnmpAgentConfig; +import org.opennms.netmgt.snmp.SnmpConfiguration; import org.opennms.netmgt.snmp.SnmpObjId; import org.opennms.netmgt.snmp.SnmpStrategy; import org.opennms.netmgt.snmp.SnmpTrapBuilder; import org.opennms.netmgt.snmp.SnmpV1TrapBuilder; import org.opennms.netmgt.snmp.SnmpV2TrapBuilder; import org.opennms.netmgt.snmp.SnmpV3TrapBuilder; +import org.opennms.netmgt.snmp.SnmpV3User; import org.opennms.netmgt.snmp.SnmpValue; import org.opennms.netmgt.snmp.SnmpValueFactory; import org.opennms.netmgt.snmp.SnmpWalker; @@ -68,6 +71,7 @@ import org.snmp4j.security.SecurityModel; import org.snmp4j.security.SecurityModels; import org.snmp4j.security.SecurityProtocols; import org.snmp4j.security.USM; +import org.snmp4j.security.UsmUser; import org.snmp4j.smi.IpAddress; import org.snmp4j.smi.OID; import org.snmp4j.smi.OctetString; @@ -434,7 +438,7 @@ public class Snmp4JStrategy implements SnmpStrategy { } - public void registerForTraps(final TrapNotificationListener listener, final TrapProcessorFactory processorFactory, InetAddress address, int snmpTrapPort) throws IOException { + public void registerForTraps(final TrapNotificationListener listener, final TrapProcessorFactory processorFactory, InetAddress address, int snmpTrapPort, List snmpUsers) throws IOException { final RegistrationInfo info = new RegistrationInfo(listener, address, snmpTrapPort); final Snmp4JTrapNotifier m_trapHandler = new Snmp4JTrapNotifier(listener, processorFactory); @@ -450,6 +454,30 @@ public class Snmp4JStrategy implements SnmpStrategy { info.setTransportMapping(transport); Snmp snmp = new Snmp(transport); snmp.addCommandResponder(m_trapHandler); + + if (snmpUsers != null) { + for (SnmpV3User user : snmpUsers) { + SnmpAgentConfig config = new SnmpAgentConfig(); + config.setVersion(SnmpConfiguration.VERSION3); + config.setSecurityName(user.getSecurityName()); + config.setAuthProtocol(user.getAuthProtocol()); + config.setAuthPassPhrase(user.getAuthPassPhrase()); + config.setPrivProtocol(user.getPrivProtocol()); + config.setPrivPassPhrase(user.getPrivPassPhrase()); + Snmp4JAgentConfig agentConfig = new Snmp4JAgentConfig(config); + snmp.getUSM().addUser( + agentConfig.getSecurityName(), + new UsmUser( + agentConfig.getSecurityName(), + agentConfig.getAuthProtocol(), + agentConfig.getAuthPassPhrase(), + agentConfig.getPrivProtocol(), + agentConfig.getPrivPassPhrase() + ) + ); + } + } + info.setSession(snmp); s_registrations.put(listener, info); @@ -457,6 +485,10 @@ public class Snmp4JStrategy implements SnmpStrategy { snmp.listen(); } + public void registerForTraps(final TrapNotificationListener listener, final TrapProcessorFactory processorFactory, InetAddress address, int snmpTrapPort) throws IOException { + registerForTraps(listener, processorFactory, address, snmpTrapPort, null); + } + public void registerForTraps(final TrapNotificationListener listener, final TrapProcessorFactory processorFactory, final int snmpTrapPort) throws IOException { registerForTraps(listener, processorFactory, null, snmpTrapPort); } diff --git a/core/snmp/integration-tests/src/test/java/org/opennms/netmgt/snmp/snmp4j/Snmp4jTrapReceiverTest.java b/core/snmp/integration-tests/src/test/java/org/opennms/netmgt/snmp/snmp4j/Snmp4jTrapReceiverTest.java new file mode 100644 index 0000000..10903b2 --- /dev/null +++ b/core/snmp/integration-tests/src/test/java/org/opennms/netmgt/snmp/snmp4j/Snmp4jTrapReceiverTest.java @@ -0,0 +1,180 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2011 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ + +package org.opennms.netmgt.snmp.snmp4j; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Collections; + +import org.opennms.netmgt.snmp.SnmpConfiguration; +import org.opennms.netmgt.snmp.SnmpInstId; +import org.opennms.netmgt.snmp.SnmpObjId; +import org.opennms.netmgt.snmp.SnmpTrapBuilder; +import org.opennms.netmgt.snmp.SnmpUtils; +import org.opennms.netmgt.snmp.SnmpV3TrapBuilder; +import org.opennms.netmgt.snmp.SnmpV3User; +import org.opennms.netmgt.snmp.SnmpValue; +import org.opennms.netmgt.snmp.TrapIdentity; +import org.opennms.netmgt.snmp.TrapNotification; +import org.opennms.netmgt.snmp.TrapNotificationListener; +import org.opennms.netmgt.snmp.TrapProcessor; +import org.opennms.netmgt.snmp.TrapProcessorFactory; + +import org.snmp4j.CommandResponder; +import org.snmp4j.CommandResponderEvent; +import org.snmp4j.PDU; +import org.snmp4j.PDUv1; +import org.snmp4j.Snmp; +import org.snmp4j.security.AuthMD5; +import org.snmp4j.security.PrivDES; +import org.snmp4j.security.UsmUser; +import org.snmp4j.smi.OctetString; +import org.snmp4j.smi.UdpAddress; +import org.snmp4j.transport.DefaultUdpTransportMapping; + +public class Snmp4jTrapReceiverTest extends MockSnmpAgentTestCase implements TrapProcessorFactory, CommandResponder { + private final Snmp4JStrategy m_strategy = new Snmp4JStrategy(); + + private int trapCount = 0; + + private final class TestTrapListener implements TrapNotificationListener { + private boolean m_error = false; + private int m_receivedTrapCount = 0; + + public void trapReceived(TrapNotification trapNotification) { + m_receivedTrapCount++; + } + + public void trapError(int error, String msg) { + m_error = true; + } + + public boolean hasError() { + return m_error; + } + + public int getReceivedTrapCount() { + return m_receivedTrapCount; + } + } + + private final class TestTrapProcessor implements TrapProcessor { + public void setCommunity(String community) {} + public void setTimeStamp(long timeStamp) {} + public void setVersion(String version) {} + public void setAgentAddress(InetAddress agentAddress) {} + public void setTrapAddress(InetAddress trapAddress) {} + public void processVarBind(SnmpObjId name, SnmpValue value) {} + public void setTrapIdentity(TrapIdentity trapIdentity) {} + } + + /* + * IMPORTANT: + * + * The sentence snmp.getUSM().addUser(...), is the only requirement in order to properly process SNMPv3 traps. + * This is related with the credentials that should be created for Trapd in order to properly authenticate and/or decode SNMPv3 traps in OpennMS. + * This is a user that should be configured (or should be used) by the external devices to send SNMPv3 Traps to OpenNMS. + * The SNMPv3 users should be configured in trapd-configuration.xml + * + */ + public void testTrapReceiverWithoutOpenNMS() throws Exception { + System.out.println("SNMP4J: Register for Traps"); + trapCount = 0; + Snmp snmp = new Snmp(new DefaultUdpTransportMapping(new UdpAddress(9162))); + snmp.addCommandResponder(this); + snmp.getUSM().addUser( + new OctetString("opennmsUser"), + new UsmUser(new OctetString("opennmsUser"), AuthMD5.ID, new OctetString("0p3nNMSv3"), PrivDES.ID, new OctetString("0p3nNMSv3"))); + snmp.listen(); + + sendTraps(); + + System.out.println("SNMP4J: Unregister for Traps"); + snmp.close(); + + System.out.println("SNMP4J: Checking Trap status"); + assertEquals(2, trapCount); + } + + public void testTrapReceiverWithOpenNMS() throws Exception { + System.out.println("ONMS: Register for Traps"); + TestTrapListener trapListener = new TestTrapListener(); + SnmpV3User user = new SnmpV3User("agalue", "MD5", "0p3nNMSv3", "DES", "0p3nNMSv3"); + m_strategy.registerForTraps(trapListener, this, InetAddress.getLocalHost(), 9162, Collections.singletonList(user)); + + sendTraps(); + + System.out.println("ONMS: Unregister for Traps"); + m_strategy.unregisterForTraps(trapListener, 9162); + + System.out.println("ONMS: Checking Trap status"); + assertFalse(trapListener.hasError()); + assertEquals(2, trapListener.getReceivedTrapCount()); + } + + private void sendTraps() throws Exception, UnknownHostException, InterruptedException { + System.out.println("Sending V2 Trap"); + SnmpObjId enterpriseId = SnmpObjId.get(".0.0"); + SnmpObjId trapOID = SnmpObjId.get(enterpriseId, new SnmpInstId(1)); + SnmpTrapBuilder pdu = SnmpUtils.getV2TrapBuilder(); + pdu.addVarBind(SnmpObjId.get(".1.3.6.1.2.1.1.3.0"), SnmpUtils.getValueFactory().getTimeTicks(0)); + pdu.addVarBind(SnmpObjId.get(".1.3.6.1.6.3.1.1.4.1.0"), SnmpUtils.getValueFactory().getObjectId(trapOID)); + pdu.addVarBind(SnmpObjId.get(".1.3.6.1.6.3.1.1.4.3.0"), SnmpUtils.getValueFactory().getObjectId(enterpriseId)); + pdu.send(InetAddress.getLocalHost().getHostAddress(), 9162, "public"); + Thread.sleep(1000); + + System.out.println("Sending V3 Trap"); + SnmpV3TrapBuilder pduv3 = SnmpUtils.getV3TrapBuilder(); + pduv3.addVarBind(SnmpObjId.get(".1.3.6.1.2.1.1.3.0"), SnmpUtils.getValueFactory().getTimeTicks(0)); + pduv3.addVarBind(SnmpObjId.get(".1.3.6.1.6.3.1.1.4.1.0"), SnmpUtils.getValueFactory().getObjectId(trapOID)); + pduv3.addVarBind(SnmpObjId.get(".1.3.6.1.6.3.1.1.4.3.0"), SnmpUtils.getValueFactory().getObjectId(enterpriseId)); + pduv3.send(InetAddress.getLocalHost().getHostAddress(), 9162, SnmpConfiguration.AUTH_PRIV, "opennmsUser", "0p3nNMSv3", SnmpConfiguration.DEFAULT_AUTH_PROTOCOL, "0p3nNMSv3", SnmpConfiguration.DEFAULT_PRIV_PROTOCOL); + Thread.sleep(1000); + } + + public TrapProcessor createTrapProcessor() { + return new TestTrapProcessor(); + } + + public synchronized void processPdu(CommandResponderEvent cmdRespEvent) { + PDU pdu = cmdRespEvent.getPDU(); + System.out.println("Received PDU... " + pdu); + if (pdu != null) { + System.out.println(pdu.getClass().getName()); + System.out.println("trapType = " + pdu.getType()); + System.out.println("isPDUv1 = " + (pdu instanceof PDUv1)); + System.out.println("isTrap = " + (pdu.getType() == PDU.TRAP)); + System.out.println("isInform = " + (pdu.getType() == PDU.INFORM)); + System.out.println("variableBindings = " + pdu.getVariableBindings()); + trapCount++; + } else { + System.err.println("ERROR: Can't create PDU"); + } + } +} diff --git a/opennms-config/src/main/castor/trapd-configuration.xsd b/opennms-config/src/main/castor/trapd-configuration.xsd index ddc52fa..e2d239d 100644 --- a/opennms-config/src/main/castor/trapd-configuration.xsd +++ b/opennms-config/src/main/castor/trapd-configuration.xsd @@ -19,6 +19,14 @@ + + + + SNMPv3 configuration. + + + + The IP address on which trapd listens for connections. @@ -47,4 +55,93 @@ + + + + + SNMPv3 Configuration. + + + + + SNMPv3 + + + + + + SNMPv3 + + + + + + + + + + + + + SNMPv3 + + + + + + SNMPv3 + + + + + + + + + + + + SNMPv3 + + + + + + SNMPv3 + + + + + + SNMPv3 + + + + + + SNMPv3 + + + + + + SNMPv3 + + + + + + + + + + + + SNMPv3 + + + + + + diff --git a/opennms-services/src/main/java/org/opennms/netmgt/config/TrapdConfig.java b/opennms-services/src/main/java/org/opennms/netmgt/config/TrapdConfig.java index 7c0e2ac..d1654ab 100644 --- a/opennms-services/src/main/java/org/opennms/netmgt/config/TrapdConfig.java +++ b/opennms-services/src/main/java/org/opennms/netmgt/config/TrapdConfig.java @@ -28,6 +28,10 @@ package org.opennms.netmgt.config; +import java.util.List; + +import org.opennms.netmgt.snmp.SnmpV3User; + /** *

TrapdConfig interface.

* @@ -50,4 +54,6 @@ public interface TrapdConfig { * @return a boolean. */ public abstract boolean getNewSuspectOnTrap(); + + public abstract List getSnmpV3Users(); } diff --git a/opennms-services/src/main/java/org/opennms/netmgt/config/TrapdConfigFactory.java b/opennms-services/src/main/java/org/opennms/netmgt/config/TrapdConfigFactory.java index fd41c58..8d8c1f3 100644 --- a/opennms-services/src/main/java/org/opennms/netmgt/config/TrapdConfigFactory.java +++ b/opennms-services/src/main/java/org/opennms/netmgt/config/TrapdConfigFactory.java @@ -32,12 +32,16 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.Reader; +import java.util.ArrayList; +import java.util.List; import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.ValidationException; import org.opennms.core.xml.CastorUtils; import org.opennms.netmgt.ConfigFileConstants; +import org.opennms.netmgt.config.trapd.Snmpv3User; import org.opennms.netmgt.config.trapd.TrapdConfiguration; +import org.opennms.netmgt.snmp.SnmpV3User; import org.springframework.core.io.FileSystemResource; /** @@ -199,4 +203,17 @@ public final class TrapdConfigFactory implements TrapdConfig { return m_config.getNewSuspectOnTrap(); } + public synchronized List getSnmpV3Users() { + List snmpUsers = new ArrayList(); + for (Snmpv3User user : m_config.getSnmpv3UserCollection()) { + snmpUsers.add(new SnmpV3User( + user.getSecurityName(), + user.getAuthProtocol(), + user.getAuthPassphrase(), + user.getPrivacyProtocol(), + user.getPrivacyPassphrase())); + } + return snmpUsers; + } + } diff --git a/opennms-services/src/main/java/org/opennms/netmgt/trapd/Trapd.java b/opennms-services/src/main/java/org/opennms/netmgt/trapd/Trapd.java index 9a9c628..ba98c05 100644 --- a/opennms-services/src/main/java/org/opennms/netmgt/trapd/Trapd.java +++ b/opennms-services/src/main/java/org/opennms/netmgt/trapd/Trapd.java @@ -32,6 +32,7 @@ import java.io.IOException; import java.lang.reflect.UndeclaredThrowableException; import java.net.InetAddress; import java.sql.SQLException; +import java.util.List; import org.apache.log4j.Category; import org.apache.log4j.Logger; @@ -42,6 +43,7 @@ import org.opennms.core.utils.InetAddressUtils; import org.opennms.core.utils.LogUtils; import org.opennms.netmgt.daemon.AbstractServiceDaemon; import org.opennms.netmgt.snmp.SnmpUtils; +import org.opennms.netmgt.snmp.SnmpV3User; import org.opennms.netmgt.snmp.TrapNotification; import org.opennms.netmgt.snmp.TrapNotificationListener; import org.opennms.netmgt.snmp.TrapProcessor; @@ -103,6 +105,8 @@ public class Trapd extends AbstractServiceDaemon implements PausableFiber, TrapP private Integer m_snmpTrapPort; + private List m_snmpV3Users; + private boolean m_registeredForTraps; /** @@ -165,7 +169,7 @@ public class Trapd extends AbstractServiceDaemon implements PausableFiber, TrapP try { InetAddress address = getInetAddress(); LogUtils.infof(this, "Listening on %s:%d", address == null ? "[all interfaces]" : InetAddressUtils.str(address), getSnmpTrapPort()); - SnmpUtils.registerForTraps(this, this, address, getSnmpTrapPort()); + SnmpUtils.registerForTraps(this, this, address, getSnmpTrapPort(), getSnmpV3Users()); m_registeredForTraps = true; LogUtils.debugf(this, "init: Creating the trap session"); @@ -400,4 +404,13 @@ public class Trapd extends AbstractServiceDaemon implements PausableFiber, TrapP public void setSnmpTrapPort(int snmpTrapPort) { m_snmpTrapPort = snmpTrapPort; } + + public List getSnmpV3Users() { + return m_snmpV3Users; + } + + public void setSnmpV3Users(List snmpV3Users) { + this.m_snmpV3Users = snmpV3Users; + } + } diff --git a/opennms-services/src/main/resources/META-INF/opennms/applicationContext-trapDaemon.xml b/opennms-services/src/main/resources/META-INF/opennms/applicationContext-trapDaemon.xml index 60d0c78..ccb2cf4 100644 --- a/opennms-services/src/main/resources/META-INF/opennms/applicationContext-trapDaemon.xml +++ b/opennms-services/src/main/resources/META-INF/opennms/applicationContext-trapDaemon.xml @@ -12,6 +12,7 @@ + @@ -48,6 +49,8 @@ + +