Fix for issues 2104 and 2162.
The modifications use the new option {no-prompt} instead of {interactive} so that the command-lines are interactive by default.
Modify the status command-line to have an interactive mode (until today it only asked for the password if it was missing).
1 files added
19 files modified
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns the LDAP URL for the provided parameters. |
| | | * @param host the host name. |
| | | * @param port the LDAP port. |
| | | * @param useSSL whether to use SSL or not. |
| | | * @return the LDAP URL for the provided parameters. |
| | | */ |
| | | public static String getLDAPUrl(String host, int port, boolean useSSL) |
| | | { |
| | | String ldapUrl; |
| | | host = getHostNameForLdapUrl(host); |
| | | if (useSSL) |
| | | { |
| | | ldapUrl = "ldaps://"+host+":"+port; |
| | | } |
| | | else |
| | | { |
| | | ldapUrl = "ldap://"+host+":"+port; |
| | | } |
| | | return ldapUrl; |
| | | } |
| | | |
| | | /** |
| | | * Tells whether the provided Throwable was caused because of a problem with |
| | | * a certificate while trying to establish a connection. |
| | | * @param t the Throwable to analyze. |
| | |
| | | import static org.opends.server.util.ServerConstants.MAX_LINE_WIDTH; |
| | | import static org.opends.server.util.StaticUtils.wrapText; |
| | | |
| | | import java.io.File; |
| | | import java.io.InputStream; |
| | | import java.io.OutputStream; |
| | | import java.io.PrintStream; |
| | | import java.util.ArrayList; |
| | |
| | | import java.util.logging.Logger; |
| | | |
| | | import javax.naming.NamingException; |
| | | import javax.naming.NoPermissionException; |
| | | import javax.naming.ldap.InitialLdapContext; |
| | | |
| | | import org.opends.admin.ads.ADSContext; |
| | |
| | | import org.opends.quicksetup.ApplicationException; |
| | | import org.opends.quicksetup.CliApplicationHelper; |
| | | import org.opends.quicksetup.Constants; |
| | | import org.opends.quicksetup.QuickSetupLog; |
| | | import org.opends.quicksetup.event.ProgressUpdateEvent; |
| | | import org.opends.quicksetup.event.ProgressUpdateListener; |
| | | import org.opends.quicksetup.installer.InstallerHelper; |
| | |
| | | */ |
| | | private static final String CLASS_NAME = ReplicationCliMain.class.getName(); |
| | | |
| | | /** Prefix for log files. */ |
| | | static public final String LOG_FILE_PREFIX = "opends-replication-"; |
| | | |
| | | /** Suffix for log files. */ |
| | | static public final String LOG_FILE_SUFFIX = ".log"; |
| | | |
| | | private static final Logger LOG = |
| | | Logger.getLogger(CliApplicationHelper.class.getName()); |
| | | |
| | | // The print stream to use for standard error. |
| | | private PrintStream err; |
| | | |
| | | // The print stream to use for standard output. |
| | | private PrintStream out; |
| | | |
| | | // The argument parser to be used. |
| | | private ReplicationCliParser argParser; |
| | | |
| | |
| | | /** |
| | | * Constructor for the ReplicationCliMain object. |
| | | * |
| | | * @param out the print stream to use for standard output. |
| | | * @param err the print stream to use for standard error. |
| | | * @param out the print stream to use for standard output. |
| | | * @param err the print stream to use for standard error. |
| | | * @param in the input stream to use for standard input. |
| | | */ |
| | | public ReplicationCliMain(PrintStream out, PrintStream err) |
| | | public ReplicationCliMain(PrintStream out, PrintStream err, InputStream in) |
| | | { |
| | | this.out = out; |
| | | this.err = err; |
| | | super(out, err, in); |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | public static void main(String[] args) |
| | | { |
| | | int retCode = mainCLI(args, true, System.out, System.err); |
| | | int retCode = mainCLI(args, true, System.out, System.err, System.in); |
| | | |
| | | if(retCode != 0) |
| | | { |
| | |
| | | |
| | | public static int mainCLI(String[] args) |
| | | { |
| | | return mainCLI(args, true, System.out, System.err); |
| | | return mainCLI(args, true, System.out, System.err, System.in); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @param errStream The output stream to use for standard error, or |
| | | * <CODE>null</CODE> if standard error is not |
| | | * needed. |
| | | * @param inStream The input stream to use for standard input. |
| | | * @return The error code. |
| | | */ |
| | | |
| | | public static int mainCLI(String[] args, boolean initializeServer, |
| | | OutputStream outStream, OutputStream errStream) |
| | | OutputStream outStream, OutputStream errStream, InputStream inStream) |
| | | { |
| | | PrintStream out; |
| | | if (outStream == null) |
| | |
| | | err = new PrintStream(errStream); |
| | | } |
| | | |
| | | ReplicationCliMain replicationCli = new ReplicationCliMain(out, err); |
| | | try { |
| | | QuickSetupLog.initLogFileHandler( |
| | | File.createTempFile(LOG_FILE_PREFIX, LOG_FILE_SUFFIX), |
| | | "org.opends.guitools.replicationcli"); |
| | | QuickSetupLog.disableConsoleLogging(); |
| | | } catch (Throwable t) { |
| | | System.err.println("Unable to initialize log"); |
| | | t.printStackTrace(); |
| | | } |
| | | |
| | | ReplicationCliMain replicationCli = new ReplicationCliMain(out, err, |
| | | inStream); |
| | | return replicationCli.execute(args, initializeServer); |
| | | } |
| | | |
| | |
| | | LOG.log(Level.WARNING, "Error connecting to "+host1+":"+port1, ne); |
| | | if (Utils.isCertificateException(ne)) |
| | | { |
| | | String usedUrl = getLDAPUrl(host1, port1, useSSL1); |
| | | String usedUrl = ConnectionUtils.getLDAPUrl(host1, port1, useSSL1); |
| | | if (!promptForCertificateConfirmation(ne, getTrustManager(), usedUrl)) |
| | | { |
| | | cancelled = true; |
| | |
| | | { |
| | | printLineBreak(); |
| | | printErrorMessage(ERR_ERROR_CONNECTING_TO_SERVER_PROMPT_AGAIN.get( |
| | | host1+":"+port1)); |
| | | host1+":"+port1, ne.getMessage())); |
| | | } |
| | | printLineBreak(); |
| | | if (!firstTimeAsked || (argParser.getHostName1() == null)) |
| | |
| | | if (!firstTimeAsked || (argParser.getBindDn1() == null)) |
| | | { |
| | | bindDn1 = promptForString( |
| | | INFO_REPLICATION_BINDDN_PROMPT.get(), |
| | | INFO_CLI_BINDDN_PROMPT.get(), |
| | | getValue(bindDn1, argParser.getDefaultBindDn1())); |
| | | } |
| | | if (!firstTimeAsked || (argParser.getBindPassword1() == null)) |
| | | { |
| | | pwd1 = promptForPassword(INFO_REPLICATION_PASSWORD_PROMPT.get()); |
| | | pwd1 = promptForPassword( |
| | | INFO_LDAPAUTH_PASSWORD_PROMPT.get(bindDn1)); |
| | | } |
| | | if (!firstTimeAsked || (!useSSL1 && !useStartTLS1)) |
| | | { |
| | | useSSL1 = confirm(INFO_REPLICATION_USESSL_PROMPT.get(), |
| | | useSSL1); |
| | | useSSL1 = confirm(INFO_CLI_USESSL_PROMPT.get(), useSSL1); |
| | | if (!useSSL1) |
| | | { |
| | | useStartTLS1 = confirm(INFO_REPLICATION_USESTARTTLS_PROMPT.get(), |
| | | useStartTLS1 = confirm(INFO_CLI_USESTARTTLS_PROMPT.get(), |
| | | useStartTLS1); |
| | | } |
| | | } |
| | |
| | | LOG.log(Level.WARNING, "Error connecting to "+host2+":"+port2, ne); |
| | | if (Utils.isCertificateException(ne)) |
| | | { |
| | | String usedUrl = getLDAPUrl(host2, port2, useSSL2); |
| | | String usedUrl = ConnectionUtils.getLDAPUrl(host2, port2, useSSL2); |
| | | if (!promptForCertificateConfirmation(ne, getTrustManager(), usedUrl)) |
| | | { |
| | | cancelled = true; |
| | |
| | | { |
| | | printLineBreak(); |
| | | printErrorMessage(ERR_ERROR_CONNECTING_TO_SERVER_PROMPT_AGAIN.get( |
| | | host2+":"+port2)); |
| | | host2+":"+port2, ne.getMessage())); |
| | | } |
| | | printLineBreak(); |
| | | if (!firstTimeAsked || (argParser.getHostName2() == null)) |
| | |
| | | } |
| | | if (!firstTimeAsked || (argParser.getBindDn2() == null)) |
| | | { |
| | | bindDn2 = promptForString( |
| | | INFO_REPLICATION_BINDDN_PROMPT.get(), |
| | | bindDn2 = promptForString(INFO_CLI_BINDDN_PROMPT.get(), |
| | | getValue(bindDn2, argParser.getDefaultBindDn2())); |
| | | } |
| | | if (!firstTimeAsked || (argParser.getBindPassword2() == null)) |
| | | { |
| | | pwd2 = promptForPassword(INFO_REPLICATION_PASSWORD_PROMPT.get()); |
| | | pwd2 = promptForPassword( |
| | | INFO_LDAPAUTH_PASSWORD_PROMPT.get(bindDn2)); |
| | | } |
| | | if (!firstTimeAsked || !useSSL2 || !useStartTLS2) |
| | | { |
| | | useSSL2 = confirm(INFO_REPLICATION_USESSL_PROMPT.get(), |
| | | useSSL2 = confirm(INFO_CLI_USESSL_PROMPT.get(), |
| | | useSSL2); |
| | | if (!useSSL2) |
| | | { |
| | | useStartTLS2 = confirm(INFO_REPLICATION_USESTARTTLS_PROMPT.get(), |
| | | useStartTLS2 = confirm(INFO_CLI_USESTARTTLS_PROMPT.get(), |
| | | useStartTLS2); |
| | | } |
| | | } |
| | |
| | | LOG.log(Level.WARNING, "Error connecting to "+host+":"+port, ne); |
| | | if (Utils.isCertificateException(ne)) |
| | | { |
| | | String usedUrl = getLDAPUrl(host, port, useSSL); |
| | | String usedUrl = ConnectionUtils.getLDAPUrl(host, port, useSSL); |
| | | if (!promptForCertificateConfirmation(ne, getTrustManager(), usedUrl)) |
| | | { |
| | | cancelled = true; |
| | |
| | | { |
| | | printLineBreak(); |
| | | printErrorMessage(ERR_ERROR_CONNECTING_TO_SERVER_PROMPT_AGAIN.get( |
| | | host+":"+port)); |
| | | host+":"+port, ne.getMessage())); |
| | | printLineBreak(); |
| | | if (!firstTimeAsked || (argParser.getHostNameToDisable() == null)) |
| | | { |
| | |
| | | } |
| | | if (!firstTimeAsked || useSSL) |
| | | { |
| | | useSSL = confirm(INFO_REPLICATION_USESSL_PROMPT.get(), useSSL); |
| | | useSSL = confirm(INFO_CLI_USESSL_PROMPT.get(), useSSL); |
| | | if (!useSSL) |
| | | { |
| | | useStartTLS = |
| | | confirm(INFO_REPLICATION_USESTARTTLS_PROMPT.get(), useStartTLS); |
| | | confirm(INFO_CLI_USESTARTTLS_PROMPT.get(), useStartTLS); |
| | | } |
| | | } |
| | | firstTimeAsked = false; |
| | |
| | | ne); |
| | | if (Utils.isCertificateException(ne)) |
| | | { |
| | | String usedUrl = getLDAPUrl(hostSource, portSource, useSSLSource); |
| | | String usedUrl = ConnectionUtils.getLDAPUrl(hostSource, portSource, |
| | | useSSLSource); |
| | | if (!promptForCertificateConfirmation(ne, getTrustManager(), usedUrl)) |
| | | { |
| | | cancelled = true; |
| | |
| | | { |
| | | printLineBreak(); |
| | | printErrorMessage(ERR_ERROR_CONNECTING_TO_SERVER_PROMPT_AGAIN.get( |
| | | hostSource+":"+portSource)); |
| | | hostSource+":"+portSource, ne.getMessage())); |
| | | printLineBreak(); |
| | | if (!firstTimeAsked || (argParser.getHostNameSource() == null)) |
| | | { |
| | |
| | | } |
| | | if (!firstTimeAsked || useSSLSource) |
| | | { |
| | | useSSLSource = confirm(INFO_REPLICATION_USESSL_PROMPT.get(), |
| | | useSSLSource); |
| | | useSSLSource = confirm(INFO_CLI_USESSL_PROMPT.get(), useSSLSource); |
| | | if (!useSSLSource) |
| | | { |
| | | useStartTLSSource = |
| | | confirm(INFO_REPLICATION_USESTARTTLS_PROMPT.get(), |
| | | useStartTLSSource); |
| | | confirm(INFO_CLI_USESTARTTLS_PROMPT.get(), useStartTLSSource); |
| | | } |
| | | } |
| | | firstTimeAsked = false; |
| | |
| | | |
| | | if (Utils.isCertificateException(ne)) |
| | | { |
| | | String usedUrl = getLDAPUrl(hostDestination, portDestination, |
| | | useSSLDestination); |
| | | String usedUrl = ConnectionUtils.getLDAPUrl(hostDestination, |
| | | portDestination, useSSLDestination); |
| | | if (!promptForCertificateConfirmation(ne, getTrustManager(), usedUrl)) |
| | | { |
| | | cancelled = true; |
| | |
| | | { |
| | | printLineBreak(); |
| | | printErrorMessage(ERR_ERROR_CONNECTING_TO_SERVER_PROMPT_AGAIN.get( |
| | | hostDestination+":"+portDestination)); |
| | | hostDestination+":"+portDestination, ne.getMessage())); |
| | | printLineBreak(); |
| | | if (!firstTimeAsked || (argParser.getHostNameDestination() == null)) |
| | | { |
| | |
| | | } |
| | | if (!firstTimeAsked || useSSLDestination) |
| | | { |
| | | useSSLDestination = confirm(INFO_REPLICATION_USESSL_PROMPT.get(), |
| | | useSSLDestination = confirm(INFO_CLI_USESSL_PROMPT.get(), |
| | | useSSLDestination); |
| | | if (!useSSLDestination) |
| | | { |
| | | useStartTLSDestination = |
| | | confirm(INFO_REPLICATION_USESTARTTLS_PROMPT.get(), |
| | | confirm(INFO_CLI_USESTARTTLS_PROMPT.get(), |
| | | useStartTLSDestination); |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns an InitialLdapContext using the provided parameters. We try |
| | | * to guarantee that the connection is able to read the configuration. |
| | | * @param host the host name. |
| | | * @param port the port to connect. |
| | | * @param useSSL whether to use SSL or not. |
| | | * @param useStartTLS whether to use StartTLS or not. |
| | | * @param bindDn the bind dn to be used. |
| | | * @param pwd the password. |
| | | * @param trustManager the trust manager. |
| | | * @return an InitialLdapContext connected. |
| | | * @throws NamingException if there was an error establishing the connection. |
| | | */ |
| | | private InitialLdapContext createContext(String host, int port, |
| | | boolean useSSL, boolean useStartTLS, String bindDn, String pwd, |
| | | ApplicationTrustManager trustManager) |
| | | throws NamingException |
| | | { |
| | | InitialLdapContext ctx; |
| | | String ldapUrl = getLDAPUrl(host, port, useSSL); |
| | | if (useSSL) |
| | | { |
| | | ctx = Utils.createLdapsContext(ldapUrl, bindDn, pwd, |
| | | Utils.getDefaultLDAPTimeout(), null, trustManager); |
| | | } |
| | | else if (useStartTLS) |
| | | { |
| | | ctx = Utils.createStartTLSContext(ldapUrl, bindDn, pwd, |
| | | Utils.getDefaultLDAPTimeout(), null, trustManager, |
| | | null); |
| | | } |
| | | else |
| | | { |
| | | ctx = Utils.createLdapContext(ldapUrl, bindDn, pwd, |
| | | Utils.getDefaultLDAPTimeout(), null); |
| | | } |
| | | if (!ConnectionUtils.connectedAsAdministrativeUser(ctx)) |
| | | { |
| | | throw new NoPermissionException( |
| | | ERR_NOT_ADMINISTRATIVE_USER.get().toString()); |
| | | } |
| | | return ctx; |
| | | } |
| | | |
| | | /** |
| | | * Returns the LDAP URL for the provided parameters. |
| | | * @param host the host name. |
| | | * @param port the LDAP port. |
| | | * @param useSSL whether to use SSL or not. |
| | | * @return the LDAP URL for the provided parameters. |
| | | */ |
| | | private String getLDAPUrl(String host, int port, boolean useSSL) |
| | | { |
| | | String ldapUrl; |
| | | host = Utils.getHostNameForLdapUrl(host); |
| | | if (useSSL) |
| | | { |
| | | ldapUrl = "ldaps://"+host+":"+port; |
| | | } |
| | | else |
| | | { |
| | | ldapUrl = "ldap://"+host+":"+port; |
| | | } |
| | | return ldapUrl; |
| | | } |
| | | |
| | | /** |
| | | * Tells whether the server to which the LdapContext is connected has a |
| | | * replication port or not. |
| | | * @param ctx the InitialLdapContext to be used. |
| | |
| | | printLineBreak(); |
| | | printErrorMessage( |
| | | ERR_ERROR_CONNECTING_TO_SERVER_PROMPT_AGAIN.get( |
| | | host+":"+port)); |
| | | host+":"+port, t.getMessage())); |
| | | LOG.log(Level.WARNING, "Complete error stack:", t); |
| | | printLineBreak(); |
| | | } |
| | |
| | | private SubCommand disableReplicationSubCmd; |
| | | private SubCommand initializeReplicationSubCmd; |
| | | |
| | | private BooleanArgument interactive; |
| | | private BooleanArgument noPromptArg; |
| | | |
| | | /** |
| | | * The 'hostName' global argument for the first server. |
| | |
| | | { |
| | | defaultArgs.remove(argsToRemove[i]); |
| | | } |
| | | int index = 0; |
| | | |
| | | baseDNsArg = new StringArgument("baseDNs", 'b', |
| | | "baseDNs", false, true, true, OPTION_VALUE_BASEDN, null, |
| | | null, INFO_DESCRIPTION_REPLICATION_BASEDNS.get()); |
| | | defaultArgs.add(baseDNsArg); |
| | | defaultArgs.add(index++, baseDNsArg); |
| | | |
| | | adminUidArg = new StringArgument("adminUID", 'I', |
| | | "adminUID", false, false, true, "adminUID", |
| | | Constants.GLOBAL_ADMIN_UID, null, |
| | | INFO_DESCRIPTION_REPLICATION_ADMIN_UID.get( |
| | | ENABLE_REPLICATION_SUBCMD_NAME)); |
| | | defaultArgs.add(adminUidArg); |
| | | defaultArgs.add(index++, adminUidArg); |
| | | |
| | | adminPasswordArg = new StringArgument("adminPassword", |
| | | OPTION_SHORT_BINDPWD, "adminPassword", false, false, true, |
| | | OPTION_VALUE_BINDPWD, null, null, |
| | | INFO_DESCRIPTION_REPLICATION_ADMIN_BINDPASSWORD.get()); |
| | | defaultArgs.add(adminPasswordArg); |
| | | defaultArgs.add(index++, adminPasswordArg); |
| | | |
| | | adminPasswordFileArg = new FileBasedArgument("adminPasswordFile", |
| | | OPTION_SHORT_BINDPWD_FILE, "adminPasswordFile", false, false, |
| | | OPTION_VALUE_BINDPWD_FILE, null, null, |
| | | INFO_DESCRIPTION_REPLICATION_ADMIN_BINDPASSWORDFILE.get()); |
| | | defaultArgs.add(adminPasswordFileArg); |
| | | defaultArgs.add(index++, adminPasswordFileArg); |
| | | |
| | | defaultArgs.remove(verboseArg); |
| | | interactive = new BooleanArgument( |
| | | INTERACTIVE_OPTION_LONG, |
| | | INTERACTIVE_OPTION_SHORT, |
| | | INTERACTIVE_OPTION_LONG, |
| | | INFO_DESCRIPTION_INTERACTIVE.get()); |
| | | defaultArgs.add(interactive); |
| | | noPromptArg = new BooleanArgument( |
| | | NO_PROMPT_OPTION_LONG, |
| | | NO_PROMPT_OPTION_SHORT, |
| | | NO_PROMPT_OPTION_LONG, |
| | | INFO_DESCRIPTION_NO_PROMPT.get()); |
| | | defaultArgs.add(index++, noPromptArg); |
| | | |
| | | quietArg = new BooleanArgument( |
| | | SecureConnectionCliParser.QUIET_OPTION_LONG, |
| | |
| | | */ |
| | | public boolean isInteractive() |
| | | { |
| | | return interactive.isPresent(); |
| | | return !noPromptArg.isPresent(); |
| | | } |
| | | |
| | | /** |
| | |
| | | return url; |
| | | } |
| | | |
| | | /** |
| | | * Retuns the LDAP URL for the specified connection policy. |
| | | * @param policy the connection policy to be used. |
| | | * @return the LDAP URL for the specified connection policy. |
| | | * @throws ConfigException if a valid LDAP URL could not be found. |
| | | */ |
| | | public String getURL(ConnectionProtocolPolicy policy) throws ConfigException |
| | | { |
| | | String url; |
| | | String ldapUrl = getLDAPURL(); |
| | | String startTlsUrl = getStartTLSURL(); |
| | | String ldapsUrl = getLDAPSURL(); |
| | | switch (policy) |
| | | { |
| | | case USE_STARTTLS: |
| | | if (startTlsUrl != null) |
| | | { |
| | | url = startTlsUrl; |
| | | } |
| | | else |
| | | { |
| | | throw new ConfigException(ERR_COULD_NOT_FIND_VALID_LDAPURL.get()); |
| | | } |
| | | break; |
| | | case USE_LDAPS: |
| | | if (ldapsUrl != null) |
| | | { |
| | | url = ldapsUrl; |
| | | } |
| | | else |
| | | { |
| | | throw new ConfigException(ERR_COULD_NOT_FIND_VALID_LDAPURL.get()); |
| | | } |
| | | break; |
| | | case USE_LDAP: |
| | | if (ldapUrl != null) |
| | | { |
| | | url = ldapUrl; |
| | | } |
| | | else |
| | | { |
| | | throw new ConfigException(ERR_COULD_NOT_FIND_VALID_LDAPURL.get()); |
| | | } |
| | | break; |
| | | case USE_MOST_SECURE_AVAILABLE: |
| | | if (ldapsUrl != null) |
| | | { |
| | | url = ldapsUrl; |
| | | } |
| | | else if (startTlsUrl != null) |
| | | { |
| | | url = startTlsUrl; |
| | | } |
| | | else if (ldapUrl != null) |
| | | { |
| | | url = ldapUrl; |
| | | } |
| | | else |
| | | { |
| | | throw new ConfigException(ERR_COULD_NOT_FIND_VALID_LDAPURL.get()); |
| | | } |
| | | break; |
| | | case USE_LESS_SECURE_AVAILABLE: |
| | | if (ldapUrl != null) |
| | | { |
| | | url = ldapUrl; |
| | | } |
| | | else if (ldapsUrl != null) |
| | | { |
| | | url = ldapsUrl; |
| | | } |
| | | else |
| | | { |
| | | throw new ConfigException(ERR_COULD_NOT_FIND_VALID_LDAPURL.get()); |
| | | } |
| | | break; |
| | | default: |
| | | throw new IllegalStateException("Unknown connection policy: "+ |
| | | policy); |
| | | } |
| | | return url; |
| | | } |
| | | |
| | | private String getLDAPURL(boolean secure) |
| | | { |
| | | String url = null; |
| | |
| | | this.trustManager = trustManager; |
| | | this.offlineConf = offlineConf; |
| | | this.policy = policy; |
| | | String ldapUrl = getURL(offlineConf, policy); |
| | | String ldapUrl = offlineConf.getURL(policy); |
| | | |
| | | if (!Utils.areDnsEqual(dn, this.dn) || |
| | | !pwd.equals(this.pwd) || |
| | |
| | | { |
| | | return ConfigFromFile.isConfigBackend(id); |
| | | } |
| | | |
| | | private String getURL(ConfigFromFile offlineConf, |
| | | ConnectionProtocolPolicy policy) throws ConfigException |
| | | { |
| | | String url; |
| | | String ldapUrl = offlineConf.getLDAPURL(); |
| | | String startTlsUrl = offlineConf.getStartTLSURL(); |
| | | String ldapsUrl = offlineConf.getLDAPSURL(); |
| | | switch (policy) |
| | | { |
| | | case USE_STARTTLS: |
| | | if (startTlsUrl != null) |
| | | { |
| | | url = startTlsUrl; |
| | | } |
| | | else |
| | | { |
| | | throw new ConfigException(ERR_COULD_NOT_FIND_VALID_LDAPURL.get()); |
| | | } |
| | | break; |
| | | case USE_LDAPS: |
| | | if (ldapsUrl != null) |
| | | { |
| | | url = ldapsUrl; |
| | | } |
| | | else |
| | | { |
| | | throw new ConfigException(ERR_COULD_NOT_FIND_VALID_LDAPURL.get()); |
| | | } |
| | | break; |
| | | case USE_LDAP: |
| | | if (ldapUrl != null) |
| | | { |
| | | url = ldapUrl; |
| | | } |
| | | else |
| | | { |
| | | throw new ConfigException(ERR_COULD_NOT_FIND_VALID_LDAPURL.get()); |
| | | } |
| | | break; |
| | | case USE_MOST_SECURE_AVAILABLE: |
| | | if (ldapsUrl != null) |
| | | { |
| | | url = ldapsUrl; |
| | | } |
| | | else if (startTlsUrl != null) |
| | | { |
| | | url = startTlsUrl; |
| | | } |
| | | else if (ldapUrl != null) |
| | | { |
| | | url = ldapUrl; |
| | | } |
| | | else |
| | | { |
| | | throw new ConfigException(ERR_COULD_NOT_FIND_VALID_LDAPURL.get()); |
| | | } |
| | | break; |
| | | case USE_LESS_SECURE_AVAILABLE: |
| | | if (ldapUrl != null) |
| | | { |
| | | url = ldapUrl; |
| | | } |
| | | else if (ldapsUrl != null) |
| | | { |
| | | url = ldapsUrl; |
| | | } |
| | | else |
| | | { |
| | | throw new ConfigException(ERR_COULD_NOT_FIND_VALID_LDAPURL.get()); |
| | | } |
| | | break; |
| | | default: |
| | | throw new IllegalStateException("Unknown connection policy: "+ |
| | | policy); |
| | | } |
| | | return url; |
| | | } |
| | | } |
| | |
| | | package org.opends.guitools.statuspanel; |
| | | |
| | | import java.io.File; |
| | | import java.util.ArrayList; |
| | | import java.io.InputStream; |
| | | import java.io.OutputStream; |
| | | import java.io.PrintStream; |
| | | import java.net.URI; |
| | | import java.util.HashSet; |
| | | import java.util.Iterator; |
| | | import java.util.Set; |
| | | import java.util.TreeSet; |
| | | import java.util.logging.Level; |
| | | import java.util.logging.Logger; |
| | | |
| | | import javax.naming.NamingException; |
| | | import javax.naming.ldap.InitialLdapContext; |
| | | import javax.swing.table.TableModel; |
| | | |
| | | import org.opends.admin.ads.util.ApplicationTrustManager; |
| | | import org.opends.admin.ads.util.ConnectionUtils; |
| | | import org.opends.guitools.statuspanel.ui.DatabasesTableModel; |
| | | import org.opends.guitools.statuspanel.ui.ListenersTableModel; |
| | | import org.opends.quicksetup.CliApplicationHelper; |
| | | import org.opends.quicksetup.Installation; |
| | | import org.opends.quicksetup.QuickSetupLog; |
| | | import org.opends.quicksetup.util.Utils; |
| | | |
| | | import static org.opends.quicksetup.util.Utils.*; |
| | | |
| | | import org.opends.server.admin.client.cli.DsFrameworkCliReturnCode; |
| | | import org.opends.server.admin.client.cli.SecureConnectionCliParser; |
| | | import org.opends.server.core.DirectoryServer; |
| | | |
| | | import org.opends.messages.Message; |
| | |
| | | import static org.opends.messages.AdminToolMessages.*; |
| | | import static org.opends.messages.QuickSetupMessages.*; |
| | | |
| | | import org.opends.server.util.args.Argument; |
| | | import org.opends.server.types.NullOutputStream; |
| | | import org.opends.server.util.args.ArgumentException; |
| | | |
| | | /** |
| | |
| | | * in the command line. |
| | | * |
| | | */ |
| | | class StatusCli extends SecureConnectionCliParser |
| | | class StatusCli extends CliApplicationHelper |
| | | { |
| | | private String[] args; |
| | | |
| | | private boolean displayMustAuthenticateLegend; |
| | | private boolean displayMustStartLegend; |
| | | |
| | | /** Prefix for log files. */ |
| | | static public final String LOG_FILE_PREFIX = "opends-status-"; |
| | | |
| | | /** Suffix for log files. */ |
| | | static public final String LOG_FILE_SUFFIX = ".log"; |
| | | |
| | | /** |
| | | * The enumeration containing the different return codes that the command-line |
| | | * can have. |
| | | * |
| | | */ |
| | | enum ErrorReturnCode |
| | | { |
| | | /** |
| | | * Successful display of the status. |
| | | */ |
| | | SUCCESSFUL(0), |
| | | /** |
| | | * We did no have an error but the status was not displayed (displayed |
| | | * version or usage). |
| | | */ |
| | | SUCCESSFUL_NOP(0), |
| | | /** |
| | | * Unexpected error (potential bug). |
| | | */ |
| | | ERROR_UNEXPECTED(1), |
| | | /** |
| | | * Cannot parse arguments. |
| | | */ |
| | | ERROR_PARSING_ARGS(2), |
| | | /** |
| | | * User cancelled (for instance not accepting the certificate proposed). |
| | | */ |
| | | USER_CANCELLED(3); |
| | | |
| | | private int returnCode; |
| | | private ErrorReturnCode(int returnCode) |
| | | { |
| | | this.returnCode = returnCode; |
| | | } |
| | | |
| | | /** |
| | | * Get the corresponding return code value. |
| | | * |
| | | * @return The corresponding return code value. |
| | | */ |
| | | public int getReturnCode() |
| | | { |
| | | return returnCode; |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * The Logger. |
| | | */ |
| | | static private final Logger LOG = Logger.getLogger(StatusCli.class.getName()); |
| | | |
| | | // The argument parser |
| | | private StatusCliParser argParser; |
| | | |
| | | /** |
| | | * The main method which is called by the status command lines. |
| | | * @param args the arguments passed by the status command lines. |
| | | * Constructor for the StatusCli object. |
| | | * |
| | | * @param out the print stream to use for standard output. |
| | | * @param err the print stream to use for standard error. |
| | | * @param in the input stream to use for standard input. |
| | | */ |
| | | public StatusCli(PrintStream out, PrintStream err, InputStream in) |
| | | { |
| | | super(out, err, in); |
| | | } |
| | | |
| | | /** |
| | | * The main method for the status CLI tool. |
| | | * |
| | | * @param args the command-line arguments provided to this program. |
| | | */ |
| | | |
| | | public static void main(String[] args) |
| | | { |
| | | QuickSetupLog.disableConsoleLogging(); |
| | | StatusCli cli = new StatusCli(args); |
| | | System.exit(cli.run()); |
| | | int retCode = mainCLI(args, true, System.out, System.err, System.in); |
| | | |
| | | if(retCode != 0) |
| | | { |
| | | System.exit(retCode); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * The constructor for this object. |
| | | * @param args the arguments of the status command line. |
| | | * Parses the provided command-line arguments and uses that information to |
| | | * run the replication tool. |
| | | * |
| | | * @param args the command-line arguments provided to this program. |
| | | * |
| | | * @return The error code. |
| | | */ |
| | | StatusCli(String[] args) |
| | | |
| | | public static int mainCLI(String[] args) |
| | | { |
| | | super(org.opends.guitools.statuspanel.StatusCli.class.getName(), |
| | | INFO_STATUS_CLI_USAGE_DESCRIPTION.get(), false); |
| | | this.args = args; |
| | | DirectoryServer.bootstrapClient(); |
| | | return mainCLI(args, true, System.out, System.err, System.in); |
| | | } |
| | | |
| | | /** |
| | | * Parses the user data and displays usage if something is missing and the |
| | | * status otherwise. |
| | | * Parses the provided command-line arguments and uses that information to |
| | | * run the replication tool. |
| | | * |
| | | * @param args The command-line arguments provided to this |
| | | * program. |
| | | * @param initializeServer Indicates whether to initialize the server. |
| | | * @param outStream The output stream to use for standard output, or |
| | | * <CODE>null</CODE> if standard output is not |
| | | * needed. |
| | | * @param errStream The output stream to use for standard error, or |
| | | * <CODE>null</CODE> if standard error is not |
| | | * needed. |
| | | * @param inStream The input stream to use for standard input. |
| | | * @return The error code. |
| | | */ |
| | | |
| | | public static int mainCLI(String[] args, boolean initializeServer, |
| | | OutputStream outStream, OutputStream errStream, InputStream inStream) |
| | | { |
| | | PrintStream out; |
| | | if (outStream == null) |
| | | { |
| | | out = NullOutputStream.printStream(); |
| | | } |
| | | else |
| | | { |
| | | out = new PrintStream(outStream); |
| | | } |
| | | |
| | | PrintStream err; |
| | | if (errStream == null) |
| | | { |
| | | err = NullOutputStream.printStream(); |
| | | } |
| | | else |
| | | { |
| | | err = new PrintStream(errStream); |
| | | } |
| | | |
| | | try { |
| | | QuickSetupLog.initLogFileHandler( |
| | | File.createTempFile(LOG_FILE_PREFIX, LOG_FILE_SUFFIX), |
| | | "org.opends.guitools.statuspanel"); |
| | | QuickSetupLog.disableConsoleLogging(); |
| | | } catch (Throwable t) { |
| | | System.err.println("Unable to initialize log"); |
| | | t.printStackTrace(); |
| | | } |
| | | |
| | | StatusCli statusCli = new StatusCli(out, err, inStream); |
| | | |
| | | return statusCli.execute(args, initializeServer); |
| | | } |
| | | |
| | | /** |
| | | * Parses the provided command-line arguments and uses that information to |
| | | * run the status CLI. |
| | | * |
| | | * @param args the command-line arguments provided to this program. |
| | | * @param initializeServer Indicates whether to initialize the server. |
| | | * |
| | | * @return the return code (SUCCESSFUL, USER_DATA_ERROR or BUG. |
| | | */ |
| | | int run() |
| | | public int execute(String[] args, boolean initializeServer) |
| | | { |
| | | if (initializeServer) |
| | | { |
| | | DirectoryServer.bootstrapClient(); |
| | | } |
| | | |
| | | argParser = new StatusCliParser(StatusCli.class.getName()); |
| | | try |
| | | { |
| | | ArrayList<Argument> defaultArgs = |
| | | new ArrayList<Argument>(createGlobalArguments(System.err)); |
| | | defaultArgs.remove(portArg); |
| | | defaultArgs.remove(hostNameArg); |
| | | defaultArgs.remove(verboseArg); |
| | | initializeGlobalArguments(defaultArgs); |
| | | argParser.initializeGlobalArguments(err); |
| | | } |
| | | catch (ArgumentException ae) |
| | | { |
| | | Message message = ERR_CANNOT_INITIALIZE_ARGS.get(ae.getMessage()); |
| | | System.err.println(wrap(message)); |
| | | return DsFrameworkCliReturnCode.ERROR_UNEXPECTED.getReturnCode(); |
| | | err.println(wrap(message)); |
| | | return ErrorReturnCode.ERROR_UNEXPECTED.getReturnCode(); |
| | | } |
| | | |
| | | // Validate user provided data |
| | | try |
| | | { |
| | | parseArguments(args); |
| | | argParser.parseArguments(args); |
| | | } |
| | | catch (ArgumentException ae) |
| | | { |
| | | Message message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage()); |
| | | System.err.println(wrap(message)); |
| | | System.err.println(getUsage()); |
| | | err.println(wrap(message)); |
| | | err.println(argParser.getUsage()); |
| | | |
| | | return DsFrameworkCliReturnCode.ERROR_PARSING_ARGS.getReturnCode(); |
| | | return ErrorReturnCode.ERROR_PARSING_ARGS.getReturnCode(); |
| | | } |
| | | |
| | | // If we should just display usage or version information, |
| | | // then print it and exit. |
| | | if (usageOrVersionDisplayed()) |
| | | if (argParser.usageOrVersionDisplayed()) |
| | | { |
| | | return DsFrameworkCliReturnCode.SUCCESSFUL_NOP.getReturnCode(); |
| | | return ErrorReturnCode.SUCCESSFUL_NOP.getReturnCode(); |
| | | } |
| | | int v = validateGlobalOptions(System.err); |
| | | int v = argParser.validateGlobalOptions(err); |
| | | |
| | | if (v != DsFrameworkCliReturnCode.SUCCESSFUL_NOP.getReturnCode()) |
| | | { |
| | | System.err.println(getUsage()); |
| | | err.println(argParser.getUsage()); |
| | | return v; |
| | | } |
| | | else |
| | |
| | | { |
| | | if (isServerRunning) |
| | | { |
| | | String directoryManagerDn = getBindDN(); |
| | | String directoryManagerPwd = getBindPassword(directoryManagerDn, |
| | | System.out, System.err); |
| | | if (directoryManagerDn == null) |
| | | String bindDn = argParser.getBindDN(); |
| | | String bindPwd; |
| | | boolean useSSL = argParser.useSSL(); |
| | | boolean useStartTLS = argParser.useStartTLS(); |
| | | if (argParser.isInteractive()) |
| | | { |
| | | directoryManagerDn = ""; |
| | | } |
| | | if (directoryManagerPwd == null) |
| | | { |
| | | directoryManagerPwd = ""; |
| | | } |
| | | ServerStatusDescriptor desc = createServerStatusDescriptor( |
| | | directoryManagerDn, directoryManagerPwd); |
| | | ConfigFromLDAP onLineConf = new ConfigFromLDAP(); |
| | | ConnectionProtocolPolicy policy; |
| | | if (useStartTLSArg.isPresent()) |
| | | { |
| | | policy = ConnectionProtocolPolicy.USE_STARTTLS; |
| | | } |
| | | if (useSSLArg.isPresent()) |
| | | { |
| | | policy = ConnectionProtocolPolicy.USE_LDAPS; |
| | | boolean connected = false; |
| | | boolean cancelled = false; |
| | | |
| | | bindPwd = argParser.getBindPassword(); |
| | | if (bindPwd == null) |
| | | { |
| | | bindPwd = promptForPassword( |
| | | INFO_LDAPAUTH_PASSWORD_PROMPT.get(bindDn)); |
| | | } |
| | | |
| | | InitialLdapContext ctx = null; |
| | | while (!connected && !cancelled) |
| | | { |
| | | String host = "localhost"; |
| | | int port = 389; |
| | | try |
| | | { |
| | | String ldapUrl = offLineConf.getURL( |
| | | getConnectionPolicy(useSSL, useStartTLS)); |
| | | try |
| | | { |
| | | URI uri = new URI(ldapUrl); |
| | | host = uri.getHost(); |
| | | port = uri.getPort(); |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | LOG.log(Level.SEVERE, "Error parsing url: "+ldapUrl); |
| | | } |
| | | ctx = createContext(host, port, useSSL, useStartTLS, bindDn, |
| | | bindPwd, getTrustManager()); |
| | | connected = true; |
| | | } |
| | | catch (ConfigException ce) |
| | | { |
| | | LOG.log(Level.WARNING, "Error reading config file: "+ce, ce); |
| | | printLineBreak(); |
| | | printErrorMessage(ERR_COULD_NOT_FIND_VALID_LDAPURL.get()); |
| | | useSSL = confirm(INFO_CLI_USESSL_PROMPT.get(), useSSL); |
| | | if (!useSSL) |
| | | { |
| | | useStartTLS = |
| | | confirm(INFO_CLI_USESTARTTLS_PROMPT.get(), useStartTLS); |
| | | } |
| | | } |
| | | catch (NamingException ne) |
| | | { |
| | | LOG.log(Level.WARNING, "Error connecting: "+ne, ne); |
| | | |
| | | if (Utils.isCertificateException(ne)) |
| | | { |
| | | String usedUrl = ConnectionUtils.getLDAPUrl(host, port, |
| | | useSSL); |
| | | if (!promptForCertificateConfirmation(ne, getTrustManager(), |
| | | usedUrl)) |
| | | { |
| | | cancelled = true; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | printLineBreak(); |
| | | printErrorMessage( |
| | | ERR_STATUS_CLI_ERROR_CONNECTING_PROMPT_AGAIN.get( |
| | | ne.getMessage())); |
| | | String defaultValue = (bindDn != null) ? bindDn : |
| | | argParser.getDefaultBindDn(); |
| | | |
| | | bindDn = promptForString( |
| | | INFO_CLI_BINDDN_PROMPT.get(), defaultValue); |
| | | |
| | | bindPwd = promptForPassword( |
| | | INFO_LDAPAUTH_PASSWORD_PROMPT.get(bindDn)); |
| | | |
| | | printLineBreak(); |
| | | useSSL = confirm(INFO_CLI_USESSL_PROMPT.get(), useSSL); |
| | | if (!useSSL) |
| | | { |
| | | useStartTLS = |
| | | confirm(INFO_CLI_USESTARTTLS_PROMPT.get(), useStartTLS); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | if (ctx != null) |
| | | { |
| | | try |
| | | { |
| | | ctx.close(); |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | } |
| | | } |
| | | if (cancelled) |
| | | { |
| | | return ErrorReturnCode.USER_CANCELLED.getReturnCode(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | policy = ConnectionProtocolPolicy.USE_MOST_SECURE_AVAILABLE; |
| | | bindPwd = argParser.getBindPassword(); |
| | | |
| | | if (bindDn == null) |
| | | { |
| | | bindDn = ""; |
| | | } |
| | | if (bindPwd == null) |
| | | { |
| | | bindPwd = ""; |
| | | } |
| | | } |
| | | onLineConf.setConnectionInfo(offLineConf, policy, directoryManagerDn, |
| | | directoryManagerPwd, getTrustManager()); |
| | | ServerStatusDescriptor desc = createServerStatusDescriptor( |
| | | bindDn, bindPwd); |
| | | ConfigFromLDAP onLineConf = new ConfigFromLDAP(); |
| | | ConnectionProtocolPolicy policy = getConnectionPolicy(useSSL, |
| | | useStartTLS); |
| | | onLineConf.setConnectionInfo(offLineConf, policy, bindDn, |
| | | bindPwd, getTrustManager()); |
| | | onLineConf.readConfiguration(); |
| | | updateDescriptorWithOnLineInfo(desc, onLineConf); |
| | | writeStatus(desc); |
| | |
| | | } |
| | | catch (ConfigException ce) |
| | | { |
| | | System.err.println(wrap(ce.getMessageObject())); |
| | | printErrorMessage(ce.getMessageObject()); |
| | | } |
| | | } |
| | | |
| | | return DsFrameworkCliReturnCode.SUCCESSFUL_NOP.getReturnCode(); |
| | | return ErrorReturnCode.SUCCESSFUL.getReturnCode(); |
| | | } |
| | | |
| | | private ServerStatusDescriptor createServerStatusDescriptor(String dn, |
| | |
| | | { |
| | | labelWidth = Math.max(labelWidth, labels[i].length()); |
| | | } |
| | | System.out.println(); |
| | | out.println(); |
| | | Message title = INFO_SERVER_STATUS_TITLE.get(); |
| | | System.out.println(centerTitle(title)); |
| | | out.println(centerTitle(title)); |
| | | writeStatusContents(desc, labelWidth); |
| | | writeCurrentConnectionContents(desc, labelWidth); |
| | | System.out.println(); |
| | | out.println(); |
| | | |
| | | title = INFO_SERVER_DETAILS_TITLE.get(); |
| | | System.out.println(centerTitle(title)); |
| | | out.println(centerTitle(title)); |
| | | writeAdministrativeUserContents(desc, labelWidth); |
| | | writeInstallPathContents(desc, labelWidth); |
| | | writeVersionContents(desc, labelWidth); |
| | | writeJavaVersionContents(desc, labelWidth); |
| | | System.out.println(); |
| | | out.println(); |
| | | |
| | | writeListenerContents(desc); |
| | | System.out.println(); |
| | | out.println(); |
| | | |
| | | writeDatabaseContents(desc); |
| | | |
| | |
| | | |
| | | if (displayMustStartLegend) |
| | | { |
| | | System.out.println(); |
| | | System.out.println(wrap(INFO_NOT_AVAILABLE_SERVER_DOWN_CLI_LEGEND.get())); |
| | | out.println(); |
| | | out.println(wrap(INFO_NOT_AVAILABLE_SERVER_DOWN_CLI_LEGEND.get())); |
| | | } |
| | | else if (displayMustAuthenticateLegend) |
| | | { |
| | | System.out.println(); |
| | | System.out.println( |
| | | out.println(); |
| | | out.println( |
| | | wrap(INFO_NOT_AVAILABLE_AUTHENTICATION_REQUIRED_CLI_LEGEND.get())); |
| | | } |
| | | System.out.println(); |
| | | out.println(); |
| | | } |
| | | |
| | | /** |
| | |
| | | private void writeListenerContents(ServerStatusDescriptor desc) |
| | | { |
| | | Message title = INFO_LISTENERS_TITLE.get(); |
| | | System.out.println(centerTitle(title)); |
| | | out.println(centerTitle(title)); |
| | | |
| | | Set<ListenerDescriptor> listeners = desc.getListeners(); |
| | | |
| | |
| | | { |
| | | if (!desc.isAuthenticated()) |
| | | { |
| | | System.out.println( |
| | | out.println( |
| | | wrap(INFO_NOT_AVAILABLE_AUTHENTICATION_REQUIRED_CLI_LABEL.get())); |
| | | } |
| | | else |
| | | { |
| | | System.out.println(wrap(INFO_NO_LISTENERS_FOUND.get())); |
| | | out.println(wrap(INFO_NO_LISTENERS_FOUND.get())); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | System.out.println(wrap(INFO_NO_LISTENERS_FOUND.get())); |
| | | out.println(wrap(INFO_NO_LISTENERS_FOUND.get())); |
| | | } |
| | | } |
| | | else |
| | |
| | | private void writeDatabaseContents(ServerStatusDescriptor desc) |
| | | { |
| | | Message title = INFO_DATABASES_TITLE.get(); |
| | | System.out.println(centerTitle(title)); |
| | | out.println(centerTitle(title)); |
| | | |
| | | Set<DatabaseDescriptor> databases = desc.getDatabases(); |
| | | |
| | |
| | | { |
| | | if (!desc.isAuthenticated()) |
| | | { |
| | | System.out.println( |
| | | out.println( |
| | | wrap(INFO_NOT_AVAILABLE_AUTHENTICATION_REQUIRED_CLI_LABEL.get())); |
| | | } |
| | | else |
| | | { |
| | | System.out.println(wrap(INFO_NO_DBS_FOUND.get())); |
| | | out.println(wrap(INFO_NO_DBS_FOUND.get())); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | System.out.println(wrap(INFO_NO_DBS_FOUND.get())); |
| | | out.println(wrap(INFO_NO_DBS_FOUND.get())); |
| | | } |
| | | } |
| | | else |
| | |
| | | Message errorMsg = desc.getErrorMessage(); |
| | | if (errorMsg != null) |
| | | { |
| | | System.out.println(); |
| | | System.out.println(wrap(errorMsg)); |
| | | out.println(); |
| | | out.println(wrap(errorMsg)); |
| | | } |
| | | } |
| | | |
| | |
| | | headerLine.append(" "); |
| | | } |
| | | } |
| | | System.out.println(wrap(headerLine.toMessage())); |
| | | out.println(wrap(headerLine.toMessage())); |
| | | MessageBuilder t = new MessageBuilder(); |
| | | for (int i=0; i<headerLine.length(); i++) |
| | | { |
| | | t.append("="); |
| | | } |
| | | System.out.println(wrap(t.toMessage())); |
| | | out.println(wrap(t.toMessage())); |
| | | |
| | | for (int i=0; i<tableModel.getRowCount(); i++) |
| | | { |
| | |
| | | line.append(" "); |
| | | } |
| | | } |
| | | System.out.println(wrap(line.toMessage())); |
| | | out.println(wrap(line.toMessage())); |
| | | } |
| | | } |
| | | |
| | |
| | | { |
| | | if (i > 0) |
| | | { |
| | | System.out.println(); |
| | | out.println(); |
| | | } |
| | | for (int j=0; j<tableModel.getColumnCount(); j++) |
| | | { |
| | |
| | | buf.append(" "); |
| | | } |
| | | buf.append(" ").append(String.valueOf(value)); |
| | | System.out.println(wrap(buf.toMessage())); |
| | | out.println(wrap(buf.toMessage())); |
| | | |
| | | } |
| | | |
| | |
| | | } |
| | | return centered; |
| | | } |
| | | |
| | | /** |
| | | * Returns the trust manager to be used by this application. |
| | | * @return the trust manager to be used by this application. |
| | | */ |
| | | private ApplicationTrustManager getTrustManager() |
| | | { |
| | | return argParser.getTrustManager(); |
| | | } |
| | | |
| | | /** |
| | | * Returns the ConnectionPolicy to be used with the parameters provided |
| | | * by the user. |
| | | * @param useSSL whether the user asked to use SSL or not. |
| | | * @param useStartTLS whether the user asked to use Start TLS or not. |
| | | * @return the ConnectionPolicy to be used with the parameters provided |
| | | * by the user. |
| | | */ |
| | | private ConnectionProtocolPolicy getConnectionPolicy(boolean useSSL, |
| | | boolean useStartTLS) |
| | | { |
| | | ConnectionProtocolPolicy policy; |
| | | if (useStartTLS) |
| | | { |
| | | policy = ConnectionProtocolPolicy.USE_STARTTLS; |
| | | } |
| | | if (useSSL) |
| | | { |
| | | policy = ConnectionProtocolPolicy.USE_LDAPS; |
| | | } |
| | | else |
| | | { |
| | | policy = ConnectionProtocolPolicy.USE_LESS_SECURE_AVAILABLE; |
| | | } |
| | | return policy; |
| | | } |
| | | } |
| | | |
| | | |
| New file |
| | |
| | | /* |
| | | * 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 |
| | | * trunk/opends/resource/legal-notices/OpenDS.LICENSE |
| | | * or https://OpenDS.dev.java.net/OpenDS.LICENSE. |
| | | * 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 |
| | | * trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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 |
| | | * |
| | | * |
| | | * Portions Copyright 2007 Sun Microsystems, Inc. |
| | | */ |
| | | |
| | | package org.opends.guitools.statuspanel; |
| | | |
| | | import static org.opends.messages.AdminToolMessages.*; |
| | | import static org.opends.messages.ToolMessages.*; |
| | | |
| | | import java.io.OutputStream; |
| | | import java.util.ArrayList; |
| | | |
| | | import org.opends.server.admin.client.cli.SecureConnectionCliParser; |
| | | import org.opends.server.util.args.Argument; |
| | | import org.opends.server.util.args.ArgumentException; |
| | | import org.opends.server.util.args.BooleanArgument; |
| | | |
| | | /** |
| | | * The class that is used to parse the arguments provided in the status command |
| | | * line. |
| | | * |
| | | */ |
| | | public class StatusCliParser extends SecureConnectionCliParser |
| | | { |
| | | private BooleanArgument noPromptArg; |
| | | |
| | | /** |
| | | * Creates a new instance of this argument parser with no arguments. |
| | | * |
| | | * @param mainClassName |
| | | * The fully-qualified name of the Java class that should |
| | | * be invoked to launch the program with which this |
| | | * argument parser is associated. |
| | | */ |
| | | public StatusCliParser(String mainClassName) |
| | | { |
| | | super(mainClassName, INFO_STATUS_CLI_USAGE_DESCRIPTION.get(), false); |
| | | } |
| | | |
| | | /** |
| | | * Initialize Global option. |
| | | * |
| | | * @param outStream |
| | | * The output stream used for the usage. |
| | | * @throws ArgumentException |
| | | * If there is a problem with any of the parameters used |
| | | * to create this argument. |
| | | */ |
| | | public void initializeGlobalArguments(OutputStream outStream) |
| | | throws ArgumentException |
| | | { |
| | | ArrayList<Argument> defaultArgs = |
| | | new ArrayList<Argument>(createGlobalArguments(outStream)); |
| | | defaultArgs.remove(portArg); |
| | | defaultArgs.remove(hostNameArg); |
| | | defaultArgs.remove(verboseArg); |
| | | noPromptArg = new BooleanArgument( |
| | | NO_PROMPT_OPTION_LONG, |
| | | NO_PROMPT_OPTION_SHORT, |
| | | NO_PROMPT_OPTION_LONG, |
| | | INFO_DESCRIPTION_NO_PROMPT.get()); |
| | | defaultArgs.add(0, noPromptArg); |
| | | initializeGlobalArguments(defaultArgs); |
| | | } |
| | | |
| | | /** |
| | | * Tells whether the user specified to have an interactive uninstall or not. |
| | | * This method must be called after calling parseArguments. |
| | | * @return <CODE>true</CODE> if the user specified to have an interactive |
| | | * uninstall and <CODE>false</CODE> otherwise. |
| | | */ |
| | | public boolean isInteractive() |
| | | { |
| | | return !noPromptArg.isPresent(); |
| | | } |
| | | |
| | | /** |
| | | * Returns the first server bind dn explicitly provided in the enable |
| | | * replication subcommand. |
| | | * @return the first server bind dn explicitly provided in the enable |
| | | * replication subcommand. Returns -1 if no port was explicitly provided. |
| | | */ |
| | | public String getExplicitBindDn() |
| | | { |
| | | String dn = null; |
| | | if (bindDnArg.isPresent()) |
| | | { |
| | | dn = bindDnArg.getValue(); |
| | | } |
| | | return dn; |
| | | } |
| | | |
| | | /** |
| | | * Returns the first server bind dn default value in the enable replication |
| | | * subcommand. |
| | | * @return the first server bind dn default value in the enable replication |
| | | * subcommand. |
| | | */ |
| | | public String getDefaultBindDn() |
| | | { |
| | | return bindDnArg.getDefaultValue(); |
| | | } |
| | | } |
| | |
| | | private UninstallerArgumentParser parser; |
| | | |
| | | /** |
| | | * Default constructor. |
| | | */ |
| | | public UninstallCliHelper() |
| | | { |
| | | super(System.out, System.err, System.in); |
| | | } |
| | | |
| | | /** |
| | | * Creates a UserData based in the arguments provided. It asks |
| | | * user for additional information if what is provided in the arguments is not |
| | | * enough. |
| | |
| | | try |
| | | { |
| | | String dn = ADSContext.getAdministratorDN(uid); |
| | | if ((ldapsUrl != null) && (parser.useSSL() || !parser.startTLS())) |
| | | if ((ldapsUrl != null) && (parser.useSSL() || !parser.useStartTLS())) |
| | | { |
| | | usedUrl = ldapsUrl; |
| | | ctx = Utils.createLdapsContext(ldapsUrl, dn, pwd, |
| | | Utils.getDefaultLDAPTimeout(), null, userData.getTrustManager()); |
| | | } |
| | | else if ((startTlsUrl != null) && |
| | | (!parser.useSSL() || parser.startTLS())) |
| | | (!parser.useSSL() || parser.useStartTLS())) |
| | | { |
| | | usedUrl = startTlsUrl; |
| | | ctx = Utils.createStartTLSContext(startTlsUrl, dn, pwd, |
| | | Utils.getDefaultLDAPTimeout(), null, userData.getTrustManager(), |
| | | null); |
| | | } |
| | | else if ((ldapUrl != null) && !parser.useSSL() && !parser.startTLS()) |
| | | else if ((ldapUrl != null) && !parser.useSSL() && !parser.useStartTLS()) |
| | | { |
| | | usedUrl = ldapUrl; |
| | | ctx = Utils.createLdapContext(ldapUrl, dn, pwd, |
| | |
| | | String adminUid = userData.getAdminUID(); |
| | | String pwd = userData.getAdminPwd(); |
| | | String dn = ADSContext.getAdministratorDN(adminUid); |
| | | if ((ldapsUrl != null) && (parser.useSSL() || !parser.startTLS())) |
| | | if ((ldapsUrl != null) && (parser.useSSL() || !parser.useStartTLS())) |
| | | { |
| | | ctx = Utils.createLdapsContext(ldapsUrl, dn, pwd, |
| | | Utils.getDefaultLDAPTimeout(), null, userData.getTrustManager()); |
| | | } |
| | | else if ((startTlsUrl != null) && |
| | | (!parser.useSSL() || parser.startTLS())) |
| | | (!parser.useSSL() || parser.useStartTLS())) |
| | | { |
| | | ctx = Utils.createStartTLSContext(startTlsUrl, dn, pwd, |
| | | Utils.getDefaultLDAPTimeout(), null, userData.getTrustManager(), |
| | | null); |
| | | } |
| | | else if ((ldapUrl != null) && !parser.useSSL() && !parser.startTLS()) |
| | | else if ((ldapUrl != null) && !parser.useSSL() && !parser.useStartTLS()) |
| | | { |
| | | ctx = Utils.createLdapContext(ldapUrl, dn, pwd, |
| | | Utils.getDefaultLDAPTimeout(), null); |
| | |
| | | */ |
| | | public class UninstallerArgumentParser extends SecureConnectionCliParser |
| | | { |
| | | private BooleanArgument interactive; |
| | | private BooleanArgument noPrompt; |
| | | private BooleanArgument forceOnError; |
| | | private BooleanArgument quiet; |
| | | private BooleanArgument removeAll; |
| | |
| | | INFO_UNINSTALLDS_DESCRIPTION_REMOVE_LDIF_FILES.get() |
| | | ); |
| | | args.add(removeLDIFFiles); |
| | | interactive = new BooleanArgument( |
| | | INTERACTIVE_OPTION_LONG, |
| | | INTERACTIVE_OPTION_SHORT, |
| | | INTERACTIVE_OPTION_LONG, |
| | | INFO_DESCRIPTION_INTERACTIVE.get()); |
| | | args.add(interactive); |
| | | noPrompt = new BooleanArgument( |
| | | NO_PROMPT_OPTION_LONG, |
| | | NO_PROMPT_OPTION_SHORT, |
| | | NO_PROMPT_OPTION_LONG, |
| | | INFO_DESCRIPTION_NO_PROMPT.get()); |
| | | args.add(noPrompt); |
| | | forceOnError = new BooleanArgument( |
| | | "forceOnError", |
| | | 'f', |
| | | "forceOnError", |
| | | INFO_UNINSTALLDS_DESCRIPTION_FORCE.get()); |
| | | INFO_UNINSTALLDS_DESCRIPTION_FORCE.get(noPrompt.getLongIdentifier())); |
| | | args.add(forceOnError); |
| | | quiet = new BooleanArgument( |
| | | SecureConnectionCliParser.QUIET_OPTION_LONG, |
| | |
| | | */ |
| | | public boolean isInteractive() |
| | | { |
| | | return interactive.isPresent(); |
| | | return !noPrompt.isPresent(); |
| | | } |
| | | |
| | | /** |
| | |
| | | public int validateGlobalOptions(MessageBuilder buf) |
| | | { |
| | | int returnValue; |
| | | if (interactive.isPresent() && forceOnError.isPresent()) |
| | | if (!noPrompt.isPresent() && forceOnError.isPresent()) |
| | | { |
| | | Message message = ERR_TOOL_CONFLICTING_ARGS.get( |
| | | interactive.getLongIdentifier(), |
| | | forceOnError.getLongIdentifier()); |
| | | Message message = ERR_UNINSTALL_FORCE_REQUIRES_NO_PROMPT.get( |
| | | forceOnError.getLongIdentifier(), noPrompt.getLongIdentifier()); |
| | | if (buf.length() > 0) |
| | | { |
| | | buf.append(EOL); |
| | |
| | | INFO_STATE_COLUMN=State |
| | | INFO_STATUS_CLI_USAGE_DESCRIPTION=This utility may be used to display basic \ |
| | | server information |
| | | INFO_CLI_INVALID_PORT=The provided value is not a valid port |
| | | SEVERE_ERR_STATUS_PANEL_LAUNCHER_GUI_LAUNCH_FAILED=Could not launch Status \ |
| | | Panel. Check that you have access to the display. |
| | | SEVERE_ERR_STATUS_PANEL_LAUNCHER_GUI_LAUNCH_FAILED_DETAILS=Could not launch \ |
| | |
| | | INFO_UNKNOWN_LABEL=-- |
| | | INFO_UNINSTALLDS_DESCRIPTION_FORCE=Specifies whether the uninstall should \ |
| | | continue if there is an error updating references to this server in remote \ |
| | | OpenDS instances or not. This argument is not compatible with interactive \ |
| | | argument |
| | | OpenDS instances or not. This argument can only be used with the {%s} no \ |
| | | prompt argument. |
| | | INFO_DESCRIPTION_REFERENCED_HOST=The name of this host (or IP address) as \ |
| | | it is referenced in remote servers for replication |
| | | INFO_UNINSTALLDS_DESCRIPTION_CLI=Specifies to use the command line \ |
| | |
| | | but no action was required |
| | | MILD_ERR_REPLICATION_USER_CANCELLED=User cancelled the operation |
| | | SEVERE_ERR_REPLICATION_NO_MESSAGE= |
| | | |
| | | SEVERE_ERR_UNINSTALL_FORCE_REQUIRES_NO_PROMPT=The {%s} argument only can be \ |
| | | used when {%s} has been specified |
| | | INFO_ADMINISTRATOR_UID_PROMPT=Global Administrator User ID: |
| | | INFO_ADMINISTRATOR_PWD_PROMPT=Global Administrator Password: |
| | | INFO_ADMINISTRATOR_PWD_CONFIRM_PROMPT=Confirm Password: |
| | | MILD_ERR_ADMINISTRATOR_PWD_DO_NOT_MATCH=The provided passwords do not match. |
| | | MILD_ERR_ERROR_CONNECTING_TO_SERVER_PROMPT_AGAIN=Could not connect to the \ |
| | | Directory Server %s with the provided credentials.%nProvide again the \ |
| | | required information to connect to the server: |
| | | Directory Server %s with the provided credentials.%nError details: %s%nProvide \ |
| | | again the required information to connect to the server: |
| | | MILD_ERR_STATUS_CLI_ERROR_CONNECTING_PROMPT_AGAIN=Could not connect to the \ |
| | | Directory Server with the provided credentials.%nError details: %s%nProvide \ |
| | | again the required information to connect to the server: |
| | | INFO_REPLICATION_ENABLE_HOSTNAME1_PROMPT=Host name of the first server: |
| | | INFO_REPLICATION_ENABLE_PORT1_PROMPT=LDAP port of the first server: |
| | | INFO_REPLICATION_ENABLE_REPLICATIONPORT1_PROMPT=Replication port for the first \ |
| | |
| | | destination server: |
| | | INFO_REPLICATION_INITIALIZE_PORTDESTINATION_PROMPT=LDAP port of the \ |
| | | destination server: |
| | | INFO_REPLICATION_BINDDN_PROMPT=Bind DN |
| | | INFO_REPLICATION_PASSWORD_PROMPT=Password |
| | | INFO_REPLICATION_USESSL_PROMPT=Use SSL to connect |
| | | INFO_CLI_BINDDN_PROMPT=Bind DN |
| | | INFO_CLI_USESSL_PROMPT=Use SSL to connect? |
| | | INFO_CLI_INVALID_PORT=The provided value is not a valid port |
| | | INFO_REPLICATION_USESTARTTLS_PROMPT=Use StartTLS to connect |
| | | INFO_CLI_USESTARTTLS_PROMPT=Use StartTLS to connect? |
| | | SEVERE_ERR_REPLICATION_PORT_AND_REPLICATION_PORT_EQUAL=The server LDAP port \ |
| | | and the replication port cannot have the same value. You provided %s for both. |
| | | SEVERE_ERR_NO_SUFFIXES_AVAILABLE_TO_ENABLE_REPLICATION=There are no base DNs \ |
| | |
| | | %s. |
| | | INFO_ERROR_LOGGING_OPERATION=Error writting operation details to log. |
| | | INFO_ERROR_OPTION_REQUIRED=Option %s is required. |
| | | INFO_ERROR_OPTION_REQUIRED_OR_INTERACTIVE=Option %s is required when not \ |
| | | invoking this command in interactive mode. See the usage statement. |
| | | INFO_ERROR_OPTION_REQUIRED_OR_INTERACTIVE=Option %s is required when invoking \ |
| | | this command in non-interactive mode. See the usage statement. |
| | | INFO_ERROR_PARSING_OPTIONS=Error parsing options. |
| | | INFO_ERROR_POOLING_INITIALIZATION=Error reading the progress of the \ |
| | | initialization with contents from server %s. |
| | |
| | | property value per line |
| | | INFO_DESCRIPTION_QUIET_1075=Use quiet mode |
| | | INFO_DESCRIPTION_SCRIPT_FRIENDLY_1076=Use script-friendly mode |
| | | INFO_DESCRIPTION_INTERACTIVE_1077=Use interactive mode |
| | | INFO_DESCRIPTION_NO_PROMPT_1077=Use non-interactive mode. If some data in \ |
| | | the command is missing the user will not be prompted and the tool will fail |
| | | INFO_DSCFG_DESCRIPTION_UNIT_TIME_1078=Display time data using the specified \ |
| | | unit. The value for UNIT can be one of ms, s, m, h, d, or w (milliseconds, \ |
| | | seconds, minutes, hours, days, or weeks) |
| | |
| | | INFO_UPGRADE_DESCRIPTION_FILE_1190=Specifies an existing OpenDS package \ |
| | | (.zip) file to which the current build will be upgraded using the command \ |
| | | line version of this tool |
| | | INFO_UPGRADE_DESCRIPTION_INTERACTIVE_1191=Prompt for any required information \ |
| | | rather than fail |
| | | INFO_UPGRADE_DESCRIPTION_NO_PROMPT_1191=Use non-interactive mode. Prompt for \ |
| | | any required information rather than fail |
| | | INFO_UPGRADE_DESCRIPTION_SILENT_1192=Perform a quiet upgrade |
| | | INFO_LDIFIMPORT_DESCRIPTION_COUNT_REJECTS_1195=Count the number of entries \ |
| | | rejected by the server and return that value as the exit code (values > 255 \ |
| | |
| | | root directory |
| | | SEVERE_ERR_CREATERC_CANNOT_WRITE_1325=An error occurred while attempting to \ |
| | | generate the RC script: %s |
| | | |
| | | SEVERE_ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE_1326=If you specify \ |
| | | the {%s} argument you must also specify {%s} |
| | |
| | | |
| | | |
| | | import org.opends.admin.ads.util.ApplicationTrustManager; |
| | | import org.opends.admin.ads.util.ConnectionUtils; |
| | | import org.opends.quicksetup.ui.CertificateDialog; |
| | | import org.opends.messages.Message; |
| | | import org.opends.messages.MessageBuilder; |
| | | import static org.opends.messages.AdminToolMessages.*; |
| | | import static org.opends.messages.ToolMessages.*; |
| | | import static org.opends.messages.QuickSetupMessages.*; |
| | | |
| | | import org.opends.quicksetup.util.Utils; |
| | |
| | | import java.util.logging.Logger; |
| | | import java.util.logging.Level; |
| | | |
| | | import javax.naming.NamingException; |
| | | import javax.naming.NoPermissionException; |
| | | import javax.naming.ldap.InitialLdapContext; |
| | | |
| | | /** |
| | | * Helper class containing useful methods for processing input and output |
| | | * for a CliApplication. |
| | | */ |
| | | public class CliApplicationHelper { |
| | | public abstract class CliApplicationHelper { |
| | | |
| | | static private final Logger LOG = |
| | | Logger.getLogger(CliApplication.class.getName()); |
| | | Logger.getLogger(CliApplicationHelper.class.getName()); |
| | | |
| | | /** Format string used for deriving the console prompt. */ |
| | | static public final String PROMPT_FORMAT = "%s%n[%s]:"; |
| | | |
| | | private BooleanArgument interactiveArg = null; |
| | | private BooleanArgument noPromptArg = null; |
| | | |
| | | private BooleanArgument quietArg = null; |
| | | |
| | | /** The print stream to use for standard error. */ |
| | | protected PrintStream err; |
| | | |
| | | /** The print stream to use for standard output. */ |
| | | protected PrintStream out; |
| | | |
| | | /** The input stream. */ |
| | | protected InputStream in; |
| | | |
| | | /** |
| | | * Constructor for the CliApplicationHelper object. |
| | | * |
| | | * @param out the print stream to use for standard output. |
| | | * @param err the print stream to use for standard error. |
| | | * @param in the input stream to use for standard input. |
| | | */ |
| | | protected CliApplicationHelper(PrintStream out, PrintStream err, |
| | | InputStream in) |
| | | { |
| | | this.out = out; |
| | | this.err = err; |
| | | this.in = in; |
| | | } |
| | | |
| | | /** |
| | | * Interactively prompts (on standard output) the user to provide a string |
| | | * value. Any non-empty string will be allowed (the empty string will |
| | |
| | | |
| | | Message msg = Message.raw(PROMPT_FORMAT, prompt, defaultValue); |
| | | |
| | | System.out.print(msg); |
| | | System.out.flush(); |
| | | out.print(msg); |
| | | out.flush(); |
| | | |
| | | response = Message.raw(readLine()); |
| | | if (response.toString().equals("")) |
| | |
| | | Utils.getCommandLineMaxLineWidth()); |
| | | |
| | | while (true) { |
| | | System.out.print(wrappedPrompt); |
| | | out.print(wrappedPrompt); |
| | | |
| | | if (defaultValue == null) { |
| | | System.out.print(": "); |
| | | out.print(": "); |
| | | } else { |
| | | System.out.print("["); |
| | | System.out.print(defaultValue); |
| | | System.out.print("]: "); |
| | | out.print("["); |
| | | out.print(defaultValue); |
| | | out.print("]: "); |
| | | } |
| | | |
| | | System.out.flush(); |
| | | out.flush(); |
| | | |
| | | String response = readLine(); |
| | | if (response.equals("")) { |
| | | if (defaultValue == null) { |
| | | Message message = INFO_ERROR_EMPTY_RESPONSE.get(); |
| | | System.err.println(StaticUtils.wrapText(message, |
| | | err.println(StaticUtils.wrapText(message, |
| | | Utils.getCommandLineMaxLineWidth())); |
| | | } else { |
| | | return defaultValue; |
| | |
| | | printLineBreak(); |
| | | String wrappedPrompt = StaticUtils.wrapText(msg, |
| | | Utils.getCommandLineMaxLineWidth()); |
| | | System.out.print(wrappedPrompt+" "); |
| | | System.out.flush(); |
| | | out.print(wrappedPrompt+" "); |
| | | out.flush(); |
| | | try |
| | | { |
| | | char[] pwChars = PasswordReader.readPassword(); |
| | |
| | | if (port == -1) |
| | | { |
| | | Message message = INFO_CLI_INVALID_PORT.get(); |
| | | System.err.println(StaticUtils.wrapText(message, |
| | | err.println(StaticUtils.wrapText(message, |
| | | Utils.getCommandLineMaxLineWidth())); |
| | | } |
| | | } |
| | |
| | | * attempting to read the response. |
| | | */ |
| | | public String readLine() { |
| | | return readLine(System.in, System.err); |
| | | return readLine(in, err); |
| | | } |
| | | |
| | | /** |
| | |
| | | * <CODE>false</CODE> otherwise. |
| | | */ |
| | | protected boolean isInteractive() { |
| | | return interactiveArg != null && interactiveArg.isPresent(); |
| | | return noPromptArg == null || !noPromptArg.isPresent(); |
| | | } |
| | | |
| | | /** |
| | |
| | | // Initialize all the common command-line argument types and register |
| | | // them with the parser. |
| | | try { |
| | | interactiveArg = |
| | | new BooleanArgument("noninteractive session", |
| | | SecureConnectionCliParser.INTERACTIVE_OPTION_SHORT, |
| | | SecureConnectionCliParser.INTERACTIVE_OPTION_LONG, |
| | | null); |
| | | argParser.addArgument(interactiveArg); |
| | | noPromptArg = new BooleanArgument( |
| | | SecureConnectionCliParser.NO_PROMPT_OPTION_LONG, |
| | | SecureConnectionCliParser.NO_PROMPT_OPTION_SHORT, |
| | | SecureConnectionCliParser.NO_PROMPT_OPTION_LONG, |
| | | INFO_DESCRIPTION_NO_PROMPT.get()); |
| | | argParser.addArgument(noPromptArg); |
| | | |
| | | quietArg = |
| | | new BooleanArgument("silent session", |
| | | SecureConnectionCliParser.QUIET_OPTION_SHORT, |
| | | SecureConnectionCliParser.QUIET_OPTION_LONG, |
| | | null); |
| | | new BooleanArgument( |
| | | SecureConnectionCliParser.QUIET_OPTION_LONG, |
| | | SecureConnectionCliParser.QUIET_OPTION_SHORT, |
| | | SecureConnectionCliParser.QUIET_OPTION_LONG, |
| | | INFO_DESCRIPTION_QUIET.get()); |
| | | argParser.addArgument(quietArg); |
| | | |
| | | } catch (ArgumentException e) { |
| | |
| | | */ |
| | | protected void printErrorMessage(Message msg) |
| | | { |
| | | System.err.println(org.opends.server.util.StaticUtils.wrapText(msg, |
| | | err.println(org.opends.server.util.StaticUtils.wrapText(msg, |
| | | Utils.getCommandLineMaxLineWidth())); |
| | | } |
| | | |
| | |
| | | */ |
| | | protected void printErrorMessage(String msg) |
| | | { |
| | | System.err.println(org.opends.server.util.StaticUtils.wrapText(msg, |
| | | err.println(org.opends.server.util.StaticUtils.wrapText(msg, |
| | | Utils.getCommandLineMaxLineWidth())); |
| | | } |
| | | |
| | |
| | | */ |
| | | protected void printLineBreak() |
| | | { |
| | | System.out.println(); |
| | | out.println(); |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns an InitialLdapContext using the provided parameters. We try |
| | | * to guarantee that the connection is able to read the configuration. |
| | | * @param host the host name. |
| | | * @param port the port to connect. |
| | | * @param useSSL whether to use SSL or not. |
| | | * @param useStartTLS whether to use StartTLS or not. |
| | | * @param bindDn the bind dn to be used. |
| | | * @param pwd the password. |
| | | * @param trustManager the trust manager. |
| | | * @return an InitialLdapContext connected. |
| | | * @throws NamingException if there was an error establishing the connection. |
| | | */ |
| | | protected InitialLdapContext createContext(String host, int port, |
| | | boolean useSSL, boolean useStartTLS, String bindDn, String pwd, |
| | | ApplicationTrustManager trustManager) |
| | | throws NamingException |
| | | { |
| | | InitialLdapContext ctx; |
| | | String ldapUrl = ConnectionUtils.getLDAPUrl(host, port, useSSL); |
| | | if (useSSL) |
| | | { |
| | | ctx = Utils.createLdapsContext(ldapUrl, bindDn, pwd, |
| | | Utils.getDefaultLDAPTimeout(), null, trustManager); |
| | | } |
| | | else if (useStartTLS) |
| | | { |
| | | ctx = Utils.createStartTLSContext(ldapUrl, bindDn, pwd, |
| | | Utils.getDefaultLDAPTimeout(), null, trustManager, |
| | | null); |
| | | } |
| | | else |
| | | { |
| | | ctx = Utils.createLdapContext(ldapUrl, bindDn, pwd, |
| | | Utils.getDefaultLDAPTimeout(), null); |
| | | } |
| | | if (!ConnectionUtils.connectedAsAdministrativeUser(ctx)) |
| | | { |
| | | throw new NoPermissionException( |
| | | ERR_NOT_ADMINISTRATIVE_USER.get().toString()); |
| | | } |
| | | return ctx; |
| | | } |
| | | |
| | | /** |
| | | * Prompts the user to accept the certificate. |
| | | * @param t the throwable that was generated because the certificate was |
| | | * not trusted. |
| | |
| | | } |
| | | else |
| | | { |
| | | System.err.println(); |
| | | err.println(); |
| | | Message msg = Utils.getThrowableMsg(INFO_ERROR_CONNECTING_TO_LOCAL.get(), |
| | | t); |
| | | printErrorMessage(msg); |
| | |
| | | }; |
| | | for (int j=0; j<labels.length; j++) |
| | | { |
| | | System.out.println(StaticUtils.wrapText(labels[j]+" "+values[j], |
| | | out.println(StaticUtils.wrapText(labels[j]+" "+values[j], |
| | | Utils.getCommandLineMaxLineWidth())); |
| | | } |
| | | } |
| | | System.out.flush(); |
| | | out.flush(); |
| | | } |
| | | } |
| | |
| | | */ |
| | | public class CliUserInteraction extends CliApplicationHelper |
| | | implements UserInteraction { |
| | | |
| | | private PrintStream out; |
| | | private PrintStream err; |
| | | private InputStream in; |
| | | |
| | | /** |
| | | * Creates an instance that will use standard streams for interaction. |
| | | */ |
| | | public CliUserInteraction() { |
| | | this.out = System.out; |
| | | this.err = System.err; |
| | | this.in = System.in; |
| | | super(System.out, System.err, System.in); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @param in InputStream from which information will be read |
| | | */ |
| | | public CliUserInteraction(PrintStream out, PrintStream err, InputStream in) { |
| | | this.out = out; |
| | | this.err = err; |
| | | this.in = in; |
| | | super(out, err, in); |
| | | } |
| | | |
| | | /** |
| | |
| | | BooleanArgument showUsage; |
| | | FileBasedArgument file; |
| | | BooleanArgument quiet; |
| | | BooleanArgument interactive; |
| | | BooleanArgument noPrompt; |
| | | try |
| | | { |
| | | file = new FileBasedArgument( |
| | |
| | | "{file}", |
| | | null, null, INFO_UPGRADE_DESCRIPTION_FILE.get()); |
| | | argParser.addArgument(file); |
| | | interactive = new BooleanArgument( |
| | | SecureConnectionCliParser.INTERACTIVE_OPTION_LONG, |
| | | SecureConnectionCliParser.INTERACTIVE_OPTION_SHORT, |
| | | SecureConnectionCliParser.INTERACTIVE_OPTION_LONG, |
| | | INFO_UPGRADE_DESCRIPTION_INTERACTIVE.get()); |
| | | argParser.addArgument(interactive); |
| | | noPrompt = new BooleanArgument( |
| | | SecureConnectionCliParser.NO_PROMPT_OPTION_LONG, |
| | | SecureConnectionCliParser.NO_PROMPT_OPTION_SHORT, |
| | | SecureConnectionCliParser.NO_PROMPT_OPTION_LONG, |
| | | INFO_UPGRADE_DESCRIPTION_NO_PROMPT.get()); |
| | | argParser.addArgument(noPrompt); |
| | | quiet = new BooleanArgument( |
| | | SecureConnectionCliParser.QUIET_OPTION_LONG, |
| | | SecureConnectionCliParser.QUIET_OPTION_SHORT, |
| | |
| | | StringArgument localInstallPackFileNameArg = null; |
| | | |
| | | /** |
| | | * Default constructor. |
| | | */ |
| | | public UpgraderCliHelper() |
| | | { |
| | | super(System.out, System.err, System.in); |
| | | } |
| | | |
| | | /** |
| | | * Creates a set of user data from command line arguments and installation |
| | | * status. |
| | | * @param args String[] of arguments passed in from the command line |
| | |
| | | return null; |
| | | } |
| | | } |
| | | else if (startTLS()) |
| | | else if (useStartTLS()) |
| | | { |
| | | String ldapUrl = "ldap://" + host + ":" + port; |
| | | try |
| | |
| | | CANNOT_INITIALIZE_ARGS(1, ERR_ADMIN_NO_MESSAGE.get()), |
| | | |
| | | /** |
| | | * Cannot parse argument. |
| | | * Cannot parse arguments. |
| | | */ |
| | | ERROR_PARSING_ARGS(2, ERR_ADMIN_NO_MESSAGE.get()), |
| | | /** |
| | |
| | | */ |
| | | protected BooleanArgument useStartTLSArg = null; |
| | | |
| | | // the trust manager. |
| | | private ApplicationTrustManager trustManager; |
| | | |
| | | /** Short form of the option for specifying a noninteractive session. */ |
| | | static public final Character INTERACTIVE_OPTION_SHORT = 'i'; |
| | | static public final Character NO_PROMPT_OPTION_SHORT = 'n'; |
| | | |
| | | /** Long form of the option for specifying a quiet session. */ |
| | | static public final String QUIET_OPTION_LONG = "quiet"; |
| | | |
| | | /** Long form of the option for specifying a noninteractive session. */ |
| | | static public final String INTERACTIVE_OPTION_LONG = "interactive"; |
| | | static public final String NO_PROMPT_OPTION_LONG = "no-prompt"; |
| | | |
| | | /** Short form of the option for specifying a quiet session. */ |
| | | static public final Character QUIET_OPTION_SHORT = 'Q'; |
| | |
| | | try |
| | | { |
| | | out.write(INFO_LDAPAUTH_PASSWORD_PROMPT.get(dn).getBytes()); |
| | | out.flush(); |
| | | char[] pwChars = PasswordReader.readPassword(); |
| | | bindPasswordValue = new String(pwChars); |
| | | } catch(Exception ex) |
| | |
| | | // read the password from the stdin. |
| | | try |
| | | { |
| | | out.write(INFO_LDAPAUTH_PASSWORD_PROMPT.get(dn).toString() |
| | | .getBytes()); |
| | | out.write(INFO_LDAPAUTH_PASSWORD_PROMPT.get(dn).toString().getBytes()); |
| | | out.flush(); |
| | | char[] pwChars = PasswordReader.readPassword(); |
| | | return new String(pwChars); |
| | | } |
| | |
| | | * |
| | | * @return True if startTLS mode is required |
| | | */ |
| | | public boolean startTLS() |
| | | public boolean useStartTLS() |
| | | { |
| | | if (useStartTLSArg.isPresent()) |
| | | { |
| | |
| | | */ |
| | | public ApplicationTrustManager getTrustManager() |
| | | { |
| | | ApplicationTrustManager truststoreManager = null ; |
| | | KeyStore truststore = null ; |
| | | if (trustAllArg.isPresent()) |
| | | if (trustManager == null) |
| | | { |
| | | // Running a null TrustManager will force createLdapsContext and |
| | | // createStartTLSContext to use a bindTrustManager. |
| | | return null ; |
| | | } |
| | | else |
| | | if (trustStorePathArg.isPresent()) |
| | | { |
| | | try |
| | | KeyStore truststore = null ; |
| | | if (trustAllArg.isPresent()) |
| | | { |
| | | FileInputStream fos = new FileInputStream(trustStorePathArg.getValue()); |
| | | String trustStorePasswordStringValue = null; |
| | | char[] trustStorePasswordValue = null; |
| | | if (trustStorePasswordArg.isPresent()) |
| | | // Running a null TrustManager will force createLdapsContext and |
| | | // createStartTLSContext to use a bindTrustManager. |
| | | return null ; |
| | | } |
| | | else |
| | | if (trustStorePathArg.isPresent()) |
| | | { |
| | | trustStorePasswordStringValue = trustStorePasswordArg.getValue(); |
| | | } |
| | | else if (trustStorePasswordFileArg.isPresent()) |
| | | { |
| | | trustStorePasswordStringValue = trustStorePasswordFileArg.getValue(); |
| | | } |
| | | try |
| | | { |
| | | FileInputStream fos = |
| | | new FileInputStream(trustStorePathArg.getValue()); |
| | | String trustStorePasswordStringValue = null; |
| | | char[] trustStorePasswordValue = null; |
| | | if (trustStorePasswordArg.isPresent()) |
| | | { |
| | | trustStorePasswordStringValue = trustStorePasswordArg.getValue(); |
| | | } |
| | | else if (trustStorePasswordFileArg.isPresent()) |
| | | { |
| | | trustStorePasswordStringValue = |
| | | trustStorePasswordFileArg.getValue(); |
| | | } |
| | | |
| | | if (trustStorePasswordStringValue != null) |
| | | { |
| | | trustStorePasswordStringValue = System |
| | | if (trustStorePasswordStringValue != null) |
| | | { |
| | | trustStorePasswordStringValue = System |
| | | .getProperty("javax.net.ssl.trustStorePassword"); |
| | | } |
| | | |
| | | |
| | | if (trustStorePasswordStringValue != null) |
| | | { |
| | | trustStorePasswordValue = |
| | | trustStorePasswordStringValue.toCharArray(); |
| | | } |
| | | |
| | | truststore = KeyStore.getInstance(KeyStore.getDefaultType()); |
| | | truststore.load(fos, trustStorePasswordValue); |
| | | fos.close(); |
| | | } |
| | | catch (KeyStoreException e) |
| | | { |
| | | // Nothing to do: if this occurs we will systematically refuse the |
| | | // certificates. Maybe we should avoid this and be strict, but we |
| | | // are in a best effort mode. |
| | | LOG.log(Level.WARNING, "Error with the truststore", e); |
| | | } |
| | | catch (NoSuchAlgorithmException e) |
| | | { |
| | | // Nothing to do: if this occurs we will systematically refuse the |
| | | // certificates. Maybe we should avoid this and be strict, but we |
| | | // are in a best effort mode. |
| | | LOG.log(Level.WARNING, "Error with the truststore", e); |
| | | } |
| | | catch (CertificateException e) |
| | | { |
| | | // Nothing to do: if this occurs we will systematically refuse the |
| | | // certificates. Maybe we should avoid this and be strict, but we |
| | | // are in a best effort mode. |
| | | LOG.log(Level.WARNING, "Error with the truststore", e); |
| | | } |
| | | catch (IOException e) |
| | | { |
| | | // Nothing to do: if this occurs we will systematically refuse the |
| | | // certificates. Maybe we should avoid this and be strict, but we |
| | | // are in a best effort mode. |
| | | LOG.log(Level.WARNING, "Error with the truststore", e); |
| | | } |
| | | } |
| | | |
| | | |
| | | if (trustStorePasswordStringValue != null) |
| | | { |
| | | trustStorePasswordValue = trustStorePasswordStringValue.toCharArray(); |
| | | } |
| | | |
| | | truststore = KeyStore.getInstance(KeyStore.getDefaultType()); |
| | | truststore.load(fos, trustStorePasswordValue); |
| | | fos.close(); |
| | | } |
| | | catch (KeyStoreException e) |
| | | { |
| | | // Nothing to do: if this occurs we will systematically refuse the |
| | | // certificates. Maybe we should avoid this and be strict, but we are |
| | | // in a best effort mode. |
| | | LOG.log(Level.WARNING, "Error with the truststore", e); |
| | | } |
| | | catch (NoSuchAlgorithmException e) |
| | | { |
| | | // Nothing to do: if this occurs we will systematically refuse the |
| | | // certificates. Maybe we should avoid this and be strict, but we are |
| | | // in a best effort mode. |
| | | LOG.log(Level.WARNING, "Error with the truststore", e); |
| | | } |
| | | catch (CertificateException e) |
| | | { |
| | | // Nothing to do: if this occurs we will systematically refuse the |
| | | // certificates. Maybe we should avoid this and be strict, but we are |
| | | // in a best effort mode. |
| | | LOG.log(Level.WARNING, "Error with the truststore", e); |
| | | } |
| | | catch (IOException e) |
| | | { |
| | | // Nothing to do: if this occurs we will systematically refuse the |
| | | // certificates. Maybe we should avoid this and be strict, but we are |
| | | // in a best effort mode. |
| | | LOG.log(Level.WARNING, "Error with the truststore", e); |
| | | } |
| | | trustManager = new ApplicationTrustManager(truststore); |
| | | } |
| | | truststoreManager = new ApplicationTrustManager(truststore); |
| | | return truststoreManager; |
| | | return trustManager; |
| | | } |
| | | |
| | | /** |
| | |
| | | import org.opends.server.admin.Tag; |
| | | import org.opends.server.admin.client.ManagedObjectDecodingException; |
| | | import org.opends.server.admin.client.ManagementContext; |
| | | import org.opends.server.admin.client.cli.SecureConnectionCliParser; |
| | | import org.opends.server.loggers.debug.DebugTracer; |
| | | import org.opends.server.tools.ClientException; |
| | | import org.opends.server.types.DebugLogLevel; |
| | |
| | | private final Map<SubCommand, SubCommandHandler> handlers = |
| | | new HashMap<SubCommand, SubCommandHandler>(); |
| | | |
| | | // The argument which should be used to request interactive |
| | | // The argument which should be used to request non interactive |
| | | // behavior. |
| | | private BooleanArgument interactiveArgument; |
| | | private BooleanArgument noPromptArgument; |
| | | |
| | | // The command-line argument parser. |
| | | private final SubCommandArgumentParser parser; |
| | |
| | | * {@inheritDoc} |
| | | */ |
| | | public boolean isInteractive() { |
| | | return interactiveArgument.isPresent(); |
| | | return !noPromptArgument.isPresent(); |
| | | } |
| | | |
| | | |
| | |
| | | verboseArgument = new BooleanArgument("verbose", 'v', "verbose", |
| | | INFO_DESCRIPTION_VERBOSE.get()); |
| | | |
| | | quietArgument = new BooleanArgument("quiet", 'Q', "quiet", |
| | | quietArgument = new BooleanArgument( |
| | | SecureConnectionCliParser.QUIET_OPTION_LONG, |
| | | SecureConnectionCliParser.QUIET_OPTION_SHORT, |
| | | SecureConnectionCliParser.QUIET_OPTION_LONG, |
| | | INFO_DESCRIPTION_QUIET.get()); |
| | | |
| | | scriptFriendlyArgument = new BooleanArgument("script-friendly", 's', |
| | | "script-friendly", INFO_DESCRIPTION_SCRIPT_FRIENDLY.get()); |
| | | |
| | | interactiveArgument = new BooleanArgument("interactive", 'i', |
| | | "interactive", INFO_DESCRIPTION_INTERACTIVE.get()); |
| | | noPromptArgument = new BooleanArgument( |
| | | SecureConnectionCliParser.NO_PROMPT_OPTION_LONG, |
| | | SecureConnectionCliParser.NO_PROMPT_OPTION_SHORT, |
| | | SecureConnectionCliParser.NO_PROMPT_OPTION_LONG, |
| | | INFO_DESCRIPTION_NO_PROMPT.get()); |
| | | |
| | | showUsageArgument = new BooleanArgument("showUsage", OPTION_SHORT_HELP, |
| | | OPTION_LONG_HELP, |
| | |
| | | parser.addGlobalArgument(verboseArgument); |
| | | parser.addGlobalArgument(quietArgument); |
| | | parser.addGlobalArgument(scriptFriendlyArgument); |
| | | parser.addGlobalArgument(interactiveArgument); |
| | | parser.addGlobalArgument(noPromptArgument); |
| | | |
| | | // Register any global arguments required by the management |
| | | // context factory. |
| | |
| | | return 1; |
| | | } |
| | | |
| | | if (quietArgument.isPresent() && interactiveArgument.isPresent()) { |
| | | Message message = ERR_TOOL_CONFLICTING_ARGS.get( |
| | | if (quietArgument.isPresent() && !noPromptArgument.isPresent()) { |
| | | Message message = ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE.get( |
| | | quietArgument.getLongIdentifier(), |
| | | interactiveArgument.getLongIdentifier()); |
| | | noPromptArgument.getLongIdentifier()); |
| | | displayMessageAndUsageReference(message); |
| | | return 1; |
| | | } |