/*
* 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 2014 ForgeRock AS.
*/
package org.forgerock.opendj.server.setup.model;
import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import static com.forgerock.opendj.cli.CliConstants.*;
/**
* This class provides listener settings for the OpenDJ3 setup.
*/
public class ListenerSettings {
private String hostName;
private int ldapPort;
private int ldapsPort;
private int adminPort;
private boolean isJMXConnectionHandlerEnabled;
private int jmxPort;
private boolean isHTTPConnectionHandlerEnabled;
private int httpPort;
private boolean isSNMPConnectionHandlerEnabled;
private int snmpPort;
private String rootUserDN;
private char[] password;
private File passwordFile;
private boolean isSSLEnabled;
private boolean isTLSEnabled;
private int sslPortNumber;
private Certificate certificate;
/**
* Default constructor.
*/
public ListenerSettings() {
hostName = "";
ldapPort = DEFAULT_LDAP_PORT;
ldapsPort = DEFAULT_LDAPS_PORT;
adminPort = DEFAULT_ADMIN_PORT;
jmxPort = DEFAULT_JMX_PORT;
isJMXConnectionHandlerEnabled = false;
httpPort = DEFAULT_HTTP_PORT;
isHTTPConnectionHandlerEnabled = true;
snmpPort = DEFAULT_SNMP_PORT;
isSNMPConnectionHandlerEnabled = false;
rootUserDN = DEFAULT_ROOT_USER_DN;
isSSLEnabled = false;
isTLSEnabled = false;
sslPortNumber = DEFAULT_SSL_PORT;
certificate = null;
}
/**
* Returns the host name.
*
* @return The host name of the local machine.
*/
public String getHostName() {
return hostName;
}
/**
* Sets the host name of the machine.
*
* @param hostName
* The host name of the current machine.
*/
public void setHostName(String hostName) {
this.hostName = hostName;
}
/**
* Returns the value of the LDAP port.
*
* @return The value of the LDAP port.
*/
public int getLdapPort() {
return ldapPort;
}
/**
* Sets the value of the LDAP port.
*
* @param ldapPort
* The LDAP port's value to set.
*/
public void setLdapPort(int ldapPort) {
this.ldapPort = ldapPort;
}
/**
* Return the LDAPs port.
*
* @return The LDAPs port's value.
*/
public int getLdapsPort() {
return ldapsPort;
}
/**
* Sets the LDAPs port value.
*
* @param ldapsPort
* The LDAPs port's value to set.
*/
public void setLdapsPort(int ldapsPort) {
this.ldapsPort = ldapsPort;
}
/**
* Returns the administration connector port.
*
* @return The administration connector's port
*/
public int getAdminPort() {
return adminPort;
}
/**
* Sets the administration connector 's port.
*
* @param adminPort
* The administration connector.
*/
public void setAdminPort(int adminPort) {
this.adminPort = adminPort;
}
/**
* Returns the JMX's port value.
*
* @return The JMX's port value.
*/
public int getJMXPort() {
return jmxPort;
}
/**
* Sets the JMX port's value.
*
* @param jmxPort
* The JMX port's value.
*/
public void setJMXPort(int jmxPort) {
this.jmxPort = jmxPort;
}
/**
* Returns {@code true} if the JMX connection handler is enabled.
*
* @return {@code true} if the JMX connection handler is enabled.
*/
public boolean isJMXConnectionHandlerEnabled() {
return isJMXConnectionHandlerEnabled;
}
/**
* Sets the status of the JMX connection handler.
*
* @param isJMXConnectionHandlerEnabled
* true} if the JMX connection handler is enabled.
*/
public void setJMXConnectionHandlerEnabled(boolean isJMXConnectionHandlerEnabled) {
this.isJMXConnectionHandlerEnabled = isJMXConnectionHandlerEnabled;
}
/**
* Returns the value of the HTTP connection handler port.
*
* @return The value of the HTTP connection handler port.
*/
public int getHTTPPort() {
return httpPort;
}
/**
* Sets the value of the port which is going to be used bu the HTTP connection handler.
*
* @param httpPort
* The value of the HTTP port.
*/
public void setHTTPPort(int httpPort) {
this.httpPort = httpPort;
}
/**
* Returns {@code true} if the HTTP connection handler is enabled.
*
* @return {@code true} if the HTTP connection handler is enabled.
*/
public boolean isHTTPConnectionHandlerEnabled() {
return isHTTPConnectionHandlerEnabled;
}
/**
* Sets the status of the HTTP connection handler.
*
* @param isHTTPConnectionHandlerEnabled
* true} if the HTTP connection handler is enabled.
*/
public void setHTTPConnectionHandlerEnabled(boolean isHTTPConnectionHandlerEnabled) {
this.isHTTPConnectionHandlerEnabled = isHTTPConnectionHandlerEnabled;
}
/**
* Returns the value of the port used by SNMP.
*
* @return The value of the port used by SNMP.
*/
public int getSNMPPort() {
return snmpPort;
}
/**
* Sets the value of the port used by SNMP.
*
* @param snmpPort
* The value of the port used by SNMP.
*/
public void setSNMPPort(int snmpPort) {
this.snmpPort = snmpPort;
}
/**
* Returns {@code true} if the SNMP connection handler is enabled.
*
* @return {@code true} if the SNMP connection handler is enabled. {@code false} otherwise.
*/
public boolean isSNMPConnectionHandlerEnabled() {
return isSNMPConnectionHandlerEnabled;
}
/**
* Sets the status of the HTTP connection handler.
*
* @param isSNMPConnectionHandlerEnabled
* {@code true} if the HTTP connection handler is enabled.
*/
public void setSNMPConnectionHandlerEnabled(boolean isSNMPConnectionHandlerEnabled) {
this.isSNMPConnectionHandlerEnabled = isSNMPConnectionHandlerEnabled;
}
/**
* Returns the root user DN.
*
* @return The root user DN.
*/
public String getRootUserDN() {
return rootUserDN;
}
/**
* Sets the root user DN.
*
* @param rootUserDN
* The root user DN.
*/
public void setRootUserDN(String rootUserDN) {
this.rootUserDN = rootUserDN;
}
/**
* Returns the password linked to this root user DN.
*
* @return The password linked to this root user DN.
*/
public String getPassword() {
if (password != null) {
return String.valueOf(password);
}
return null;
}
/**
* Sets the user root's password.
*
* @param password
* The password to set to this user root DN.
*/
public void setPassword(String password) {
this.password = password.toCharArray();
}
/**
* The file containing the password for the initial root user for the directory server.
*
* @return The file containing the password for the initial root user.
*/
public File getPasswordFile() {
return passwordFile;
}
/**
* Sets the file containing the password for the initial root user for the directory server.
*
* @param pwdFile
* The file containing the password for the initial root user for the directory server.
*/
public void setPasswordFile(File pwdFile) {
this.passwordFile = pwdFile;
}
/**
* Returns {@code true} is SSL is enabled.
*
* @return {@code true} is SSL is enabled, {@code false} otherwise.
*/
public boolean isSSLEnabled() {
return isSSLEnabled;
}
/**
* Sets a flag is SSL is enabled.
*
* @param isSSLEnabled
* {@code true} is SSL is enabled, {@code false} otherwise.
*/
public void setSSLEnabled(boolean isSSLEnabled) {
this.isSSLEnabled = isSSLEnabled;
}
/**
* Returns {@code true} is TLS is enabled.
*
* @return {@code true} is TLS is enabled, {@code false} otherwise.
*/
public boolean isTLSEnabled() {
return isTLSEnabled;
}
/**
* Sets a flag is TLS is enabled.
*
* @param isTLSEnabled
* {@code true} is TLS is enabled, {@code false} otherwise.
*/
public void setTLSEnabled(boolean isTLSEnabled) {
this.isTLSEnabled = isTLSEnabled;
}
/**
* Returns the port number which is used with SSL.
*
* @return The SSL port's number.
*/
public int getSSLPortNumber() {
return sslPortNumber;
}
/**
* Sets the SSL's port number.
*
* @param sslPortNumber
* The port number which should be used with SSL.
*/
public void setSSLPortNumber(int sslPortNumber) {
this.sslPortNumber = sslPortNumber;
}
/**
* Returns the certificate linked to this setup.
*
* @return The certificate linked to this setup.
*/
public Certificate getCertificate() {
return certificate;
}
/**
* Sets the certificate used in this setup.
*
* @param certificate
* The certificate used in this setup.
*/
public void setCertificate(Certificate certificate) {
this.certificate = certificate;
}
/**
* Returns the port number which is currently free.
* @param startPortNumber The port number to start with.
* @return The port number which is currently free.
*/
static int getFreeSocketPort(int startPortNumber) {
return getFreeSocketPort(startPortNumber, new TestPortImpl());
}
private static int getFreeSocketPort(int startPortNumber, TestPort testPort) {
int port = startPortNumber;
while (port >= 0 && port <= 65535) {
try {
testPort.canBindToPort(port);
return port;
} catch (IOException e) {
port = port + PORT_INCREMENT;
}
}
throw new IllegalArgumentException("Invalid port.");
}
interface TestPort {
void canBindToPort(int portNumber) throws IOException;
}
static class TestPortImpl implements TestPort {
public void canBindToPort(int portNumber) throws IOException {
ServerSocket socket = null;
try {
socket = new ServerSocket();
socket.setReuseAddress(true);
socket.bind(new InetSocketAddress(portNumber));
} finally {
close(socket);
}
}
private void close(ServerSocket socket) {
try {
if (socket != null) {
socket.close();
}
} catch (final IOException ignored) {
// Ignore.
}
}
}
}