/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at legal-notices/CDDLv1_0.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008 Sun Microsystems, Inc. * Portions copyright 2014 ForgeRock AS */ package org.opends.server.snmp; import com.sun.management.snmp.SnmpEngine; import com.sun.management.snmp.SnmpOid; import com.sun.management.snmp.SnmpOidTableSupport; import com.sun.management.snmp.manager.SnmpPeer; import com.sun.management.snmp.manager.SnmpSession; import com.sun.management.snmp.manager.usm.SnmpUsmPeer; import java.io.File; import java.net.InetAddress; import static org.testng.Assert.*; import java.util.ArrayList; import java.util.List; import org.opends.server.DirectoryServerTestCase; import org.opends.server.TestCaseUtils; import org.opends.server.api.ConnectionHandler; import org.opends.server.core.DirectoryServer; import org.opends.server.core.ModifyOperationBasis; import org.opends.server.protocols.internal.InternalClientConnection; import org.opends.server.types.Attributes; import org.opends.server.types.Control; import org.opends.server.types.DN; import org.opends.server.types.Modification; import org.forgerock.opendj.ldap.ModificationType; import org.testng.annotations.Test; /** * An abstract class that all SNMP unit test should extend. */ @Test(enabled = true, groups = { "precommit", "snmp" }, sequential = true) public abstract class SNMPConnectionManager extends DirectoryServerTestCase { /** * Snmp Port */ private int snmpPort; /** * Snmp Trap Port */ private int trapSnmpPort; /** * Set Up the Directory Server * * @throws java.lang.Exception */ protected void setUp() throws Exception { // Make sure that the server is up and running. TestCaseUtils.restartServer(); synchronized (this) { this.wait(500); } SNMPConnectionHandler snmpHandler = getSNMPConnectionHandler(); if (snmpHandler == null) { throw new Exception("Unable to get a SNMP connector"); } } /** * Set Down the Directory Server. * * @throws java.lang.Exception */ protected void setDown() throws Exception { TestCaseUtils.restartServer(); } /** * Gets the Snmp port on which the Connection Handler is listening * * @return */ protected int getSnmpPort() { return this.snmpPort; } /** * Gets the Snmp trap port on which the Connection Handler is * listening * * @return */ protected int getTrapSnmpPort() { return this.trapSnmpPort; } /** * Gets an SNMP V3 peer agent (proxy) * * @param port * @return */ protected SnmpUsmPeer getSnmpV3Peer(int port) { try { String host = InetAddress.getLocalHost().getCanonicalHostName(); SnmpOidTableSupport oidTable = new DIRECTORY_SERVER_MIBOidTable(); SnmpOid.setSnmpOidTable(oidTable); SnmpSession session = new SnmpSession("SyncManagerV3 session"); SnmpEngine engine = session.getEngine(); return new SnmpUsmPeer(engine, host, port); } catch (Exception ex) { return null; } } /** * Gets an SNMP V2 agent peer (proxy) * * @param port * @return */ protected SnmpPeer getSnmpV2Peer(int port) { try { String host = InetAddress.getLocalHost().getCanonicalHostName(); SnmpOidTableSupport oidTable = new DIRECTORY_SERVER_MIBOidTable(); SnmpOid.setSnmpOidTable(oidTable); return new SnmpPeer(host, port); } catch (Exception ex) { return null; } } /** * Get a reference to the SNMP connection handler. * * @return an SNMP Connection handler * @throws an * Exception is something went wrong. */ protected SNMPConnectionHandler getSNMPConnectionHandler() throws Exception { List handlers = DirectoryServer.getConnectionHandlers(); assertNotNull(handlers); SNMPConnectionHandler snmpConnectionHandler = null; for (ConnectionHandler handler : handlers) { if (handler instanceof SNMPConnectionHandler) { snmpConnectionHandler = (SNMPConnectionHandler) handler; break; } } if (snmpConnectionHandler == null) { enableSnmp(); synchronized (this) { this.wait(500); } for (ConnectionHandler handler : handlers) { if (handler instanceof SNMPConnectionHandler) { snmpConnectionHandler = (SNMPConnectionHandler) handler; break; } } } assertNotNull(snmpConnectionHandler); return snmpConnectionHandler; } /** * Enable SNMP with the port chosen in TestCaseUtils. * * @throws Exception * if the handler cannot be enabled. */ protected void enableSnmp() throws Exception { this.snmpPort = TestCaseUtils.findFreePort(); this.trapSnmpPort = TestCaseUtils.findFreePort(); ArrayList mods = new ArrayList(); InternalClientConnection conn = InternalClientConnection .getRootConnection(); mods.add(new Modification(ModificationType.REPLACE, Attributes.create( "ds-cfg-listen-port", String.valueOf(this.snmpPort)))); mods.add(new Modification(ModificationType.REPLACE, Attributes.create( "ds-cfg-trap-port", String.valueOf(this.trapSnmpPort)))); String hosts = InetAddress.getLocalHost().getCanonicalHostName(); mods.add(new Modification(ModificationType.ADD, Attributes.create( "ds-cfg-traps-destination", hosts))); String jarFileLocation = System .getProperty("org.opends.server.snmp.opendmk"); mods.add(new Modification(ModificationType.ADD, Attributes.create( "ds-cfg-opendmk-jarfile", jarFileLocation + File.separator + "jdmkrt.jar"))); ModifyOperationBasis op = new ModifyOperationBasis(conn, conn .nextOperationID(), conn.nextMessageID(), new ArrayList(), DN .valueOf("cn=SNMP Connection Handler,cn=Connection Handlers,cn=config"), mods); op.run(); mods.clear(); mods.add(new Modification(ModificationType.REPLACE, Attributes .create("ds-cfg-enabled", "true"))); op = new ModifyOperationBasis(conn, conn.nextOperationID(), conn .nextMessageID(), new ArrayList(), DN .valueOf("cn=SNMP Connection Handler,cn=Connection Handlers,cn=config"), mods); op.run(); } /** * Enable JMX with the port chosen in TestCaseUtils. * * @throws Exception * if the handler cannot be enabled. */ protected void enableJmx() throws Exception { ArrayList mods = new ArrayList(); InternalClientConnection conn = InternalClientConnection .getRootConnection(); mods.add(new Modification(ModificationType.REPLACE, Attributes.create( "ds-cfg-enabled", "true"))); ModifyOperationBasis op = new ModifyOperationBasis(conn, conn .nextOperationID(), conn.nextMessageID(), new ArrayList(), DN .valueOf("cn=JMX Connection Handler,cn=Connection Handlers,cn=config"), mods); op.run(); } }