/* * 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-2010 Sun Microsystems, Inc. * Portions Copyright 2011-2015 ForgeRock AS. */ package org.opends.server.tools; import static org.opends.messages.ToolMessages.*; import static com.forgerock.opendj.cli.ArgumentConstants.*; import static com.forgerock.opendj.util.OperatingSystem.*; import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.i18n.LocalizableMessageDescriptor.Arg1; import org.forgerock.i18n.slf4j.LocalizedLogger; import org.opends.quicksetup.Constants; import org.opends.quicksetup.Installation; import org.opends.quicksetup.UserData; import org.opends.quicksetup.util.Utils; import org.opends.server.admin.AdministrationConnector; import org.opends.server.core.DirectoryServer.DirectoryServerVersionHandler; import com.forgerock.opendj.cli.Argument; import com.forgerock.opendj.cli.ArgumentException; import com.forgerock.opendj.cli.ArgumentParser; import com.forgerock.opendj.cli.BooleanArgument; import com.forgerock.opendj.cli.CliConstants; import com.forgerock.opendj.cli.CommonArguments; import com.forgerock.opendj.cli.FileBasedArgument; import com.forgerock.opendj.cli.IntegerArgument; import com.forgerock.opendj.cli.StringArgument; /** * Class used to parse the arguments of the setup command-line and to check * that there are not conflicting arguments (nor missing arguments in no prompt * mode). * Note that this class does not perform checks involving network (like if * a given port is free) nor the validity of the certificate information * provided. */ public class InstallDSArgumentParser extends ArgumentParser { private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass(); BooleanArgument testOnlyArg; BooleanArgument cliArg; BooleanArgument addBaseEntryArg; BooleanArgument showUsageArg; BooleanArgument quietArg; BooleanArgument noPromptArg; BooleanArgument verboseArg; StringArgument propertiesFileArgument; BooleanArgument noPropertiesFileArgument; BooleanArgument skipPortCheckArg; BooleanArgument enableWindowsServiceArg; BooleanArgument doNotStartArg; BooleanArgument enableStartTLSArg; BooleanArgument generateSelfSignedCertificateArg; StringArgument hostNameArg; BooleanArgument usePkcs11Arg; FileBasedArgument directoryManagerPwdFileArg; FileBasedArgument keyStorePasswordFileArg; IntegerArgument ldapPortArg; IntegerArgument adminConnectorPortArg; IntegerArgument ldapsPortArg; IntegerArgument jmxPortArg; IntegerArgument sampleDataArg; StringArgument baseDNArg; StringArgument importLDIFArg; StringArgument rejectedImportFileArg; StringArgument skippedImportFileArg; StringArgument directoryManagerDNArg; StringArgument directoryManagerPwdStringArg; StringArgument useJavaKeyStoreArg; StringArgument useJCEKSArg; StringArgument usePkcs12Arg; StringArgument keyStorePasswordArg; StringArgument certNicknameArg; StringArgument progNameArg; IntegerArgument connectTimeoutArg; BooleanArgument acceptLicense; StringArgument backendTypeArg; /** * The default constructor for this class. * @param mainClassName the class name of the main class for the command-line * that is being used. */ public InstallDSArgumentParser(String mainClassName) { super(mainClassName, INFO_INSTALLDS_TOOL_DESCRIPTION.get(), false); setShortToolDescription(REF_SHORT_DESC_SETUP.get()); setVersionHandler(new DirectoryServerVersionHandler()); } /** * Initializes the arguments without parsing them. * @throws ArgumentException if there was an error creating or adding the * arguments. If this occurs is likely to be a bug. */ public void initializeArguments() throws ArgumentException { testOnlyArg = new BooleanArgument( OPTION_LONG_TESTONLY_ARGUMENT.toLowerCase(), null, OPTION_LONG_TESTONLY_ARGUMENT, INFO_ARGUMENT_DESCRIPTION_TESTONLY.get()); testOnlyArg.setHidden(true); testOnlyArg.setPropertyName(OPTION_LONG_TESTONLY_ARGUMENT); addArgument(testOnlyArg); cliArg = CommonArguments.getCLI(); addArgument(cliArg); String defaultProgName; if (isWindows()) { defaultProgName = Installation.WINDOWS_SETUP_FILE_NAME; } else { defaultProgName = Installation.UNIX_SETUP_FILE_NAME; } progNameArg = new StringArgument( "programName".toLowerCase(), 'P', "programName", false, false, true, INFO_PROGRAM_NAME_PLACEHOLDER.get(), defaultProgName, "programName", INFO_INSTALLDS_DESCRIPTION_PROGNAME.get()); progNameArg.setHidden(true); addArgument(progNameArg); noPromptArg = CommonArguments.getNoPrompt(); addArgument(noPromptArg); quietArg = CommonArguments.getQuiet(); addArgument(quietArg); verboseArg = CommonArguments.getVerbose(); addArgument(verboseArg); propertiesFileArgument = new StringArgument( OPTION_LONG_PROP_FILE_PATH.toLowerCase(), null, OPTION_LONG_PROP_FILE_PATH, false, false, true, INFO_PROP_FILE_PATH_PLACEHOLDER.get(), null, null, INFO_DESCRIPTION_PROP_FILE_PATH.get()); addArgument(propertiesFileArgument); setFilePropertiesArgument(propertiesFileArgument); noPropertiesFileArgument = new BooleanArgument( OPTION_LONG_NO_PROP_FILE.toLowerCase(), null, OPTION_LONG_NO_PROP_FILE, INFO_DESCRIPTION_NO_PROP_FILE.get()); addArgument(noPropertiesFileArgument); setNoPropertiesFileArgument(noPropertiesFileArgument); baseDNArg = new StringArgument( OPTION_LONG_BASEDN.toLowerCase(), OPTION_SHORT_BASEDN, OPTION_LONG_BASEDN, false, true, true, INFO_BASEDN_PLACEHOLDER.get(), null, OPTION_LONG_BASEDN, INFO_INSTALLDS_DESCRIPTION_BASEDN.get()); addArgument(baseDNArg); addBaseEntryArg = new BooleanArgument( "addBaseEntry".toLowerCase(), 'a', "addBaseEntry", INFO_INSTALLDS_DESCRIPTION_ADDBASE.get()); addBaseEntryArg.setPropertyName("addBaseEntry"); addArgument(addBaseEntryArg); importLDIFArg = new StringArgument( OPTION_LONG_LDIF_FILE.toLowerCase(), OPTION_SHORT_LDIF_FILE, OPTION_LONG_LDIF_FILE, false, true, true, INFO_LDIFFILE_PLACEHOLDER.get(), null, OPTION_LONG_LDIF_FILE, INFO_INSTALLDS_DESCRIPTION_IMPORTLDIF.get()); addArgument(importLDIFArg); rejectedImportFileArg = new StringArgument( "rejectFile".toLowerCase(), 'R', "rejectFile", false, false, true, INFO_REJECT_FILE_PLACEHOLDER.get(), null, "rejectFile", INFO_INSTALLDS_DESCRIPTION_REJECTED_FILE.get()); addArgument(rejectedImportFileArg); skippedImportFileArg = new StringArgument( "skipFile".toLowerCase(), null, "skipFile", false, false, true, INFO_SKIP_FILE_PLACEHOLDER.get(), null, "skipFile", INFO_INSTALLDS_DESCRIPTION_SKIPPED_FILE.get()); addArgument(skippedImportFileArg); sampleDataArg = new IntegerArgument( "sampleData".toLowerCase(), 'd', "sampleData", false, false, true, INFO_NUM_ENTRIES_PLACEHOLDER.get(), 0, "sampleData", true, 0, false, 0, INFO_INSTALLDS_DESCRIPTION_SAMPLE_DATA.get()); addArgument(sampleDataArg); int defaultLdapPort = UserData.getDefaultPort(); if (defaultLdapPort == -1) { defaultLdapPort = 389; } ldapPortArg = new IntegerArgument( "ldapPort".toLowerCase(), OPTION_SHORT_PORT, "ldapPort", false, false, true, INFO_PORT_PLACEHOLDER.get(), defaultLdapPort, "ldapPort", true, 1, true, 65535, INFO_INSTALLDS_DESCRIPTION_LDAPPORT.get()); addArgument(ldapPortArg); int defaultAdminPort = UserData.getDefaultAdminConnectorPort(); if (defaultAdminPort == -1) { defaultAdminPort = AdministrationConnector.DEFAULT_ADMINISTRATION_CONNECTOR_PORT; } adminConnectorPortArg = new IntegerArgument( "adminConnectorPort".toLowerCase(), null, "adminConnectorPort", false, false, true, INFO_PORT_PLACEHOLDER.get(), defaultAdminPort, "adminConnectorPort", true, 1, true, 65535, INFO_INSTALLDS_DESCRIPTION_ADMINCONNECTORPORT.get()); addArgument(adminConnectorPortArg); jmxPortArg = new IntegerArgument( "jmxPort".toLowerCase(), 'x', "jmxPort", false, false, true, INFO_JMXPORT_PLACEHOLDER.get(), CliConstants.DEFAULT_JMX_PORT, "jmxPort", true, 1, true, 65535, INFO_INSTALLDS_DESCRIPTION_JMXPORT.get()); addArgument(jmxPortArg); skipPortCheckArg = new BooleanArgument( "skipPortCheck".toLowerCase(), 'S', "skipPortCheck", INFO_INSTALLDS_DESCRIPTION_SKIPPORT.get()); skipPortCheckArg.setPropertyName("skipPortCheck"); addArgument(skipPortCheckArg); directoryManagerDNArg = new StringArgument( OPTION_LONG_ROOT_USER_DN.toLowerCase(), OPTION_SHORT_ROOT_USER_DN, OPTION_LONG_ROOT_USER_DN, false, false, true, INFO_ROOT_USER_DN_PLACEHOLDER.get(), "cn=Directory Manager", OPTION_LONG_ROOT_USER_DN, INFO_INSTALLDS_DESCRIPTION_ROOTDN.get()); addArgument(directoryManagerDNArg); directoryManagerPwdStringArg = new StringArgument( "rootUserPassword".toLowerCase(), OPTION_SHORT_BINDPWD, "rootUserPassword", false, false, true, INFO_ROOT_USER_PWD_PLACEHOLDER.get(), null, "rootUserPassword", INFO_INSTALLDS_DESCRIPTION_ROOTPW.get()); addArgument(directoryManagerPwdStringArg); directoryManagerPwdFileArg = new FileBasedArgument( "rootUserPasswordFile".toLowerCase(), OPTION_SHORT_BINDPWD_FILE, "rootUserPasswordFile", false, false, INFO_ROOT_USER_PWD_FILE_PLACEHOLDER.get(), null, "rootUserPasswordFile", INFO_INSTALLDS_DESCRIPTION_ROOTPWFILE.get()); addArgument(directoryManagerPwdFileArg); enableWindowsServiceArg = new BooleanArgument( "enableWindowsService".toLowerCase(), 'e', "enableWindowsService", INFO_INSTALLDS_DESCRIPTION_ENABLE_WINDOWS_SERVICE.get()); enableWindowsServiceArg.setPropertyName("enableWindowsService"); if (isWindows()) { addArgument(enableWindowsServiceArg); } doNotStartArg = new BooleanArgument( "doNotStart".toLowerCase(), 'O', "doNotStart", INFO_INSTALLDS_DESCRIPTION_DO_NOT_START.get()); doNotStartArg.setPropertyName("doNotStart"); addArgument(doNotStartArg); enableStartTLSArg = new BooleanArgument( "enableStartTLS".toLowerCase(), OPTION_SHORT_START_TLS, "enableStartTLS", INFO_INSTALLDS_DESCRIPTION_ENABLE_STARTTLS.get()); enableStartTLSArg.setPropertyName("enableStartTLS"); addArgument(enableStartTLSArg); int defaultSecurePort = UserData.getDefaultSslPort(defaultLdapPort); if (defaultSecurePort == -1) { defaultSecurePort = 636; } ldapsPortArg = new IntegerArgument( "ldapsPort".toLowerCase(), OPTION_SHORT_USE_SSL, "ldapsPort", false, false, true, INFO_PORT_PLACEHOLDER.get(), defaultSecurePort, "ldapsPort", true, 1, true, 65535, INFO_INSTALLDS_DESCRIPTION_LDAPSPORT.get()); addArgument(ldapsPortArg); generateSelfSignedCertificateArg = new BooleanArgument( "generateSelfSignedCertificate".toLowerCase(), null, "generateSelfSignedCertificate", INFO_INSTALLDS_DESCRIPTION_USE_SELF_SIGNED.get()); generateSelfSignedCertificateArg.setPropertyName( "generateSelfSignedCertificate"); addArgument(generateSelfSignedCertificateArg); hostNameArg = new StringArgument(OPTION_LONG_HOST.toLowerCase(), OPTION_SHORT_HOST, OPTION_LONG_HOST, false, false, true, INFO_HOST_PLACEHOLDER.get(), UserData.getDefaultHostName(), null, INFO_INSTALLDS_DESCRIPTION_HOST_NAME.get()); hostNameArg.setPropertyName(OPTION_LONG_HOST); addDefaultArgument(hostNameArg); usePkcs11Arg = new BooleanArgument("usePkcs11Keystore".toLowerCase(), null, "usePkcs11Keystore", INFO_INSTALLDS_DESCRIPTION_USE_PKCS11.get()); usePkcs11Arg.setPropertyName("usePkcs11Keystore"); addArgument(usePkcs11Arg); useJavaKeyStoreArg = new StringArgument("useJavaKeystore".toLowerCase(), null, "useJavaKeystore", false, false, true, INFO_KEYSTOREPATH_PLACEHOLDER.get(), null, "useJavaKeystore", INFO_INSTALLDS_DESCRIPTION_USE_JAVAKEYSTORE.get()); addArgument(useJavaKeyStoreArg); useJCEKSArg = new StringArgument("useJCEKS".toLowerCase(), null, "useJCEKS", false, false, true, INFO_KEYSTOREPATH_PLACEHOLDER.get(), null, "useJCEKS", INFO_INSTALLDS_DESCRIPTION_USE_JCEKS.get()); addArgument(useJCEKSArg); usePkcs12Arg = new StringArgument("usePkcs12keyStore".toLowerCase(), null, "usePkcs12keyStore", false, false, true, INFO_KEYSTOREPATH_PLACEHOLDER.get(), null, "usePkcs12keyStore", INFO_INSTALLDS_DESCRIPTION_USE_PKCS12.get()); addArgument(usePkcs12Arg); keyStorePasswordArg = new StringArgument( OPTION_LONG_KEYSTORE_PWD.toLowerCase(), OPTION_SHORT_KEYSTORE_PWD, OPTION_LONG_KEYSTORE_PWD, false, false, true, INFO_KEYSTORE_PWD_PLACEHOLDER.get(), null, OPTION_LONG_KEYSTORE_PWD, INFO_INSTALLDS_DESCRIPTION_KEYSTOREPASSWORD.get()); addDefaultArgument(keyStorePasswordArg); keyStorePasswordFileArg = new FileBasedArgument( OPTION_LONG_KEYSTORE_PWD_FILE.toLowerCase(), OPTION_SHORT_KEYSTORE_PWD_FILE, OPTION_LONG_KEYSTORE_PWD_FILE, false, false, INFO_KEYSTORE_PWD_FILE_PLACEHOLDER.get(), null, OPTION_LONG_KEYSTORE_PWD_FILE, INFO_INSTALLDS_DESCRIPTION_KEYSTOREPASSWORD_FILE.get()); addDefaultArgument(keyStorePasswordFileArg); certNicknameArg = new StringArgument( OPTION_LONG_CERT_NICKNAME.toLowerCase(), OPTION_SHORT_CERT_NICKNAME, OPTION_LONG_CERT_NICKNAME, false, false, true, INFO_NICKNAME_PLACEHOLDER.get(), null, OPTION_LONG_CERT_NICKNAME, INFO_INSTALLDS_DESCRIPTION_CERT_NICKNAME.get()); addDefaultArgument(certNicknameArg); connectTimeoutArg = CommonArguments.getConnectTimeOut(); addArgument(connectTimeoutArg); acceptLicense = CommonArguments.getAcceptLicense(); addArgument(acceptLicense); showUsageArg = CommonArguments.getShowUsage(); addArgument(showUsageArg); setUsageArgument(showUsageArg); backendTypeArg = new StringArgument( OPTION_LONG_BACKEND_TYPE.toLowerCase(), OPTION_SHORT_BACKEND_TYPE, OPTION_LONG_BACKEND_TYPE, false, false, true, INFO_INSTALLDS_BACKEND_TYPE_PLACEHOLDER.get(), BackendTypeHelper.filterSchemaBackendName( new BackendTypeHelper().getBackendTypes().get(0).getName()), OPTION_LONG_BACKEND_TYPE, INFO_INSTALLDS_DESCRIPTION_BACKEND_TYPE.get() ); addArgument(backendTypeArg); } /** * Returns whether the command was launched in CLI mode or not. * @return true if the command was launched to use CLI mode and * false otherwise. */ public boolean isCli() { return cliArg.isPresent(); } /** {@inheritDoc} */ @Override public void parseArguments(String[] args) throws ArgumentException { LinkedHashSet errorMessages = new LinkedHashSet<>(); try { super.parseArguments(args); } catch (ArgumentException ae) { logger.error(LocalizableMessage.raw("Error parsing arguments: "+ae, ae)); errorMessages.add(ae.getMessageObject()); } if (!isUsageArgumentPresent() && !isVersionArgumentPresent()) { checkServerPassword(errorMessages); checkProvidedPorts(errorMessages); checkImportDataArguments(errorMessages); checkSecurityArguments(errorMessages); if (!errorMessages.isEmpty()) { throw new ArgumentException(ERR_CANNOT_INITIALIZE_ARGS.get( Utils.getMessageFromCollection(errorMessages, Constants.LINE_SEPARATOR))); } } } /** * Returns the directory manager password provided by the user. This method * should be called after a call to parseArguments. * @return the directory manager password provided by the user. */ public String getDirectoryManagerPassword() { if (directoryManagerPwdStringArg.isPresent()) { return directoryManagerPwdStringArg.getValue(); } else if (directoryManagerPwdFileArg.isPresent()) { return directoryManagerPwdFileArg.getValue(); } return null; } /** * Returns the key store password provided by the user. This method should be * called after a call to parseArguments. * @return the key store password provided by the user. */ public String getKeyStorePassword() { if (keyStorePasswordArg.isPresent()) { return keyStorePasswordArg.getValue(); } else if (keyStorePasswordFileArg.isPresent()) { return keyStorePasswordFileArg.getValue(); } return null; } /** * Checks that there are no conflicts with the directory manager passwords. * If we are in no prompt mode, check that the password was provided. * @param errorMessages the list of messages to which we add the error * messages describing the problems encountered during the execution of the * checking. */ private void checkServerPassword(Collection errorMessages) { if (directoryManagerPwdStringArg.isPresent() && directoryManagerPwdFileArg.isPresent()) { errorMessages.add(ERR_INSTALLDS_TWO_CONFLICTING_ARGUMENTS.get( directoryManagerPwdStringArg.getLongIdentifier(), directoryManagerPwdFileArg.getLongIdentifier())); } if (noPromptArg.isPresent() && !directoryManagerPwdStringArg.isPresent() && !directoryManagerPwdFileArg.isPresent()) { errorMessages.add(ERR_INSTALLDS_NO_ROOT_PASSWORD.get( directoryManagerPwdStringArg.getLongIdentifier(), directoryManagerPwdFileArg.getLongIdentifier())); } } /** * Checks that there are no conflicts with the provided ports (like if the * user provided the same port for different protocols). * @param errorMessages the list of messages to which we add the error * messages describing the problems encountered during the execution of the * checking. */ private void checkProvidedPorts(Collection errorMessages) { try { Set ports = new HashSet<>(); ports.add(ldapPortArg.getIntValue()); checkPortAlreadyUsed(ports, adminConnectorPortArg.getIntValue(), errorMessages, ERR_CONFIGDS_PORT_ALREADY_SPECIFIED); if (jmxPortArg.isPresent()) { checkPortAlreadyUsed(ports, jmxPortArg.getIntValue(), errorMessages, ERR_CONFIGDS_PORT_ALREADY_SPECIFIED); } if (ldapsPortArg.isPresent()) { checkPortAlreadyUsed(ports, ldapsPortArg.getIntValue(), errorMessages, ERR_CONFIGDS_PORT_ALREADY_SPECIFIED); } } catch (ArgumentException ae) { logger.error(LocalizableMessage.raw("Unexpected error. "+ "Assuming that it is caused by a previous parsing issue: "+ae, ae)); } } private void checkPortAlreadyUsed(Set ports, int port, Collection errorMessages, Arg1 errorMsg) { if (ports.contains(port)) { errorMessages.add(errorMsg.get(port)); } else { ports.add(port); } } /** * Checks that there are no conflicts with the import data arguments. * * @param errorMessages * the list of messages to which we add the error messages describing * the problems encountered during the execution of the checking. */ private void checkImportDataArguments(Collection errorMessages) { // Make sure that the user didn't provide conflicting arguments. if (addBaseEntryArg.isPresent()) { if (importLDIFArg.isPresent()) { errorMessages.add(conflictingArgs(addBaseEntryArg, importLDIFArg)); } else if (sampleDataArg.isPresent()) { errorMessages.add(conflictingArgs(addBaseEntryArg, sampleDataArg)); } } else if (importLDIFArg.isPresent() && sampleDataArg.isPresent()) { errorMessages.add(conflictingArgs(importLDIFArg, sampleDataArg)); } if (rejectedImportFileArg.isPresent() && addBaseEntryArg.isPresent()) { errorMessages.add(conflictingArgs(addBaseEntryArg, rejectedImportFileArg)); } else if (rejectedImportFileArg.isPresent() && sampleDataArg.isPresent()) { errorMessages.add(conflictingArgs(rejectedImportFileArg, sampleDataArg)); } if (skippedImportFileArg.isPresent() && addBaseEntryArg.isPresent()) { errorMessages.add(conflictingArgs(addBaseEntryArg, skippedImportFileArg)); } else if (skippedImportFileArg.isPresent() && sampleDataArg.isPresent()) { errorMessages.add(conflictingArgs(skippedImportFileArg, sampleDataArg)); } final boolean noBaseDNProvided = !baseDNArg.isPresent() && baseDNArg.getDefaultValue() == null; if (noPromptArg.isPresent() && noBaseDNProvided) { final Argument[] args = {importLDIFArg, addBaseEntryArg, sampleDataArg, backendTypeArg}; for (Argument arg : args) { if (arg.isPresent()) { errorMessages.add(ERR_INSTALLDS_NO_BASE_DN_AND_CONFLICTING_ARG.get("--" + arg.getLongIdentifier())); } } } } private LocalizableMessage conflictingArgs(Argument arg1, Argument arg2) { return ERR_TOOL_CONFLICTING_ARGS.get(arg1.getLongIdentifier(), arg2.getLongIdentifier()); } /** * Checks that there are no conflicts with the security arguments. * If we are in no prompt mode, check that all the information required has * been provided (but not if this information is valid: we do not try to * open the keystores or to check that the LDAPS port is in use). * @param errorMessages the list of messages to which we add the error * messages describing the problems encountered during the execution of the * checking. */ private void checkSecurityArguments(Collection errorMessages) { boolean certificateRequired = ldapsPortArg.isPresent() || enableStartTLSArg.isPresent(); int certificateType = 0; if (generateSelfSignedCertificateArg.isPresent()) { certificateType++; } if (useJavaKeyStoreArg.isPresent()) { certificateType++; } if (useJCEKSArg.isPresent()) { certificateType++; } if (usePkcs11Arg.isPresent()) { certificateType++; } if (usePkcs12Arg.isPresent()) { certificateType++; } if (certificateType > 1) { errorMessages.add(ERR_INSTALLDS_SEVERAL_CERTIFICATE_TYPE_SPECIFIED.get()); } if (certificateRequired && noPromptArg.isPresent() && certificateType == 0) { errorMessages.add( ERR_INSTALLDS_CERTIFICATE_REQUIRED_FOR_SSL_OR_STARTTLS.get()); } if (certificateType == 1) { if (!generateSelfSignedCertificateArg.isPresent()) { // Check that we have only a password. if (keyStorePasswordArg.isPresent() && keyStorePasswordFileArg.isPresent()) { errorMessages.add(ERR_INSTALLDS_TWO_CONFLICTING_ARGUMENTS.get( keyStorePasswordArg.getLongIdentifier(), keyStorePasswordFileArg.getLongIdentifier())); } // Check that we have one password in no prompt mode. if (noPromptArg.isPresent() && !keyStorePasswordArg.isPresent() && !keyStorePasswordFileArg.isPresent()) { errorMessages.add(ERR_INSTALLDS_NO_KEYSTORE_PASSWORD.get( keyStorePasswordArg.getLongIdentifier(), keyStorePasswordFileArg.getLongIdentifier())); } } if (noPromptArg.isPresent() && !ldapsPortArg.isPresent() && !enableStartTLSArg.isPresent()) { errorMessages.add(ERR_INSTALLDS_SSL_OR_STARTTLS_REQUIRED.get( ldapsPortArg.getLongIdentifier(), enableStartTLSArg.getLongIdentifier())); } } } /** * Returns the timeout to be used to connect in milliseconds. The method * must be called after parsing the arguments. * @return the timeout to be used to connect in milliseconds. Returns * {@code 0} if there is no timeout. * @throws IllegalStateException if the method is called before * parsing the arguments. */ public int getConnectTimeout() throws IllegalStateException { try { return connectTimeoutArg.getIntValue(); } catch (ArgumentException ae) { throw new IllegalStateException("Argument parser is not parsed: "+ae, ae); } } }