From 43d448ea9173f0ffc89920a14d874356f51351fc Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Tue, 22 Dec 2009 16:54:18 +0000
Subject: [PATCH] Fix for issue 4414 (It would be nice to have the equivalent command-line displayed in setup) Implement the feature as it is described in the issue.

---
 opends/src/quicksetup/org/opends/quicksetup/util/Utils.java |  586 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 586 insertions(+), 0 deletions(-)

diff --git a/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java b/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
index 21e22f8..df040c2 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
@@ -61,10 +61,14 @@
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.TrustManager;
 
+import org.opends.admin.ads.ADSContext;
+import org.opends.admin.ads.ReplicaDescriptor;
+import org.opends.admin.ads.ServerDescriptor;
 import org.opends.admin.ads.SuffixDescriptor;
 import org.opends.admin.ads.TopologyCacheException;
 import org.opends.admin.ads.util.ConnectionUtils;
 import org.opends.quicksetup.*;
+import org.opends.quicksetup.installer.AuthenticationData;
 import org.opends.quicksetup.installer.DataReplicationOptions;
 import org.opends.quicksetup.installer.NewSuffixOptions;
 import org.opends.quicksetup.installer.SuffixesToReplicateOptions;
@@ -2183,6 +2187,588 @@
       return buf.toString();
     }
   }
+
+  /**
+   * Returns a String representation of the provided command-line.
+   * @param cmd the command-line arguments.
+   * @param formatter the formatted to be used to create the String
+   * representation.
+   * @return a String representation of the provided command-line.
+   */
+  public static String getFormattedEquivalentCommandLine(ArrayList<String> cmd,
+      ProgressMessageFormatter formatter)
+  {
+    StringBuilder builder = new StringBuilder();
+    builder.append(formatter.getFormattedProgress(Message.raw(cmd.get(0))));
+    int initialIndex = 1;
+    StringBuilder sbSeparator = new StringBuilder();
+    if (Utils.isWindows())
+    {
+      sbSeparator.append(formatter.getSpace());
+    }
+    else
+    {
+      sbSeparator.append(formatter.getSpace());
+      sbSeparator.append("\\");
+      sbSeparator.append(formatter.getLineBreak());
+      for (int i=0 ; i < 10 ; i++)
+      {
+        sbSeparator.append(formatter.getSpace());
+      }
+    }
+
+    String lineSeparator = sbSeparator.toString();
+    for (int i=initialIndex ; i<cmd.size(); i++)
+    {
+      String s = cmd.get(i);
+      if (s.startsWith("-") && i > initialIndex)
+      {
+        builder.append(lineSeparator);
+        builder.append(formatter.getFormattedProgress(Message.raw(s)));
+      }
+      else
+      {
+        builder.append(formatter.getSpace());
+        builder.append(formatter.getFormattedProgress(Message.raw(
+            escapeValue(s))));
+      }
+    }
+    return builder.toString();
+  }
+
+  //Chars that require special treatment when passing them to command-line.
+  private final static char[] charsToEscape = {' ', '\t', '\n', '|', ';', '<',
+    '>', '(', ')', '$', '`', '\\', '"', '\''};
+  private static final String OBFUSCATED_VALUE = "******";
+
+  /**
+   * This method simply takes a value and tries to transform it (with escape or
+   * '"') characters so that it can be used in a command line.
+   * @param value the String to be treated.
+   * @return the transformed value.
+   */
+  private static String escapeValue(String value)
+  {
+    StringBuilder b = new StringBuilder();
+    if (Utils.isUnix())
+    {
+      for (int i=0 ; i<value.length(); i++)
+      {
+        char c = value.charAt(i);
+        boolean charToEscapeFound = false;
+        for (int j=0; j<charsToEscape.length && !charToEscapeFound; j++)
+        {
+          charToEscapeFound = c == charsToEscape[j];
+        }
+        if (charToEscapeFound)
+        {
+          b.append('\\');
+        }
+        b.append(c);
+      }
+    }
+    else
+    {
+      b.append('"').append(value).append('"');
+    }
+
+    return b.toString();
+  }
+
+  /**
+   * Returns the equivalent setup CLI command-line.  Note that this command-line
+   * does not cover all the replication part of the GUI install.  Note also
+   * that to avoid problems in the WebStart setup, all the Strings are
+   * hard-coded in the implementation of this method.
+   * @param userData the user data.
+   * @return the equivalent setup command-line.
+   */
+  public static ArrayList<String> getSetupEquivalentCommandLine(
+      UserData userData)
+  {
+    ArrayList<String> cmdLine = new ArrayList<String>();
+    String setupFile;
+    if (Utils.isWindows())
+    {
+      setupFile = Installation.WINDOWS_SETUP_FILE_NAME;
+    }
+    else
+    {
+      setupFile = Installation.UNIX_SETUP_FILE_NAME;
+    }
+    cmdLine.add(setupFile);
+    cmdLine.add("--cli");
+
+    for (String baseDN : getBaseDNs(userData))
+    {
+      cmdLine.add("--baseDN");
+      cmdLine.add(baseDN);
+    }
+
+    switch (userData.getNewSuffixOptions().getType())
+    {
+    case CREATE_BASE_ENTRY:
+      cmdLine.add("--addBaseEntry");
+      break;
+    case IMPORT_AUTOMATICALLY_GENERATED_DATA:
+      cmdLine.add("--sampleData");
+      cmdLine.add(String.valueOf(
+          userData.getNewSuffixOptions().getNumberEntries()));
+      break;
+    case IMPORT_FROM_LDIF_FILE:
+      for (String ldifFile : userData.getNewSuffixOptions().getLDIFPaths())
+      {
+        cmdLine.add("--ldifFile");
+        cmdLine.add(ldifFile);
+      }
+      String rejectFile = userData.getNewSuffixOptions().getRejectedFile();
+      if (rejectFile != null)
+      {
+        cmdLine.add("--rejectFile");
+        cmdLine.add(rejectFile);
+      }
+      String skipFile = userData.getNewSuffixOptions().getSkippedFile();
+      if (skipFile != null)
+      {
+        cmdLine.add("--skipFile");
+        cmdLine.add(skipFile);
+      }
+      break;
+    }
+
+    cmdLine.add("--ldapPort");
+    cmdLine.add(String.valueOf(userData.getServerPort()));
+    cmdLine.add("--adminConnectorPort");
+    cmdLine.add(String.valueOf(userData.getAdminConnectorPort()));
+    if (userData.getServerJMXPort() != -1)
+    {
+      cmdLine.add("--jmxPort");
+      cmdLine.add(String.valueOf(userData.getServerJMXPort()));
+    }
+    cmdLine.add("--rootUserDN");
+    cmdLine.add(userData.getDirectoryManagerDn());
+    cmdLine.add("--rootUserPassword");
+    cmdLine.add(OBFUSCATED_VALUE);
+
+    if (userData.getReplicationOptions().getType() ==
+      DataReplicationOptions.Type.STANDALONE &&
+      !userData.getStartServer())
+    {
+      cmdLine.add("--doNotStart");
+    }
+
+    if (userData.getSecurityOptions().getEnableStartTLS())
+    {
+      cmdLine.add("--enableStartTLS");
+    }
+    if (userData.getSecurityOptions().getEnableSSL())
+    {
+      cmdLine.add("--ldapsPort");
+      cmdLine.add(String.valueOf(userData.getSecurityOptions().getSslPort()));
+    }
+    switch (userData.getSecurityOptions().getCertificateType())
+    {
+    case SELF_SIGNED_CERTIFICATE:
+      cmdLine.add("--generateSelfSignedCertificate");
+      cmdLine.add("--hostName");
+      cmdLine.add(userData.getHostName());
+      break;
+    case JKS:
+      cmdLine.add("--useJavaKeystore");
+      cmdLine.add(userData.getSecurityOptions().getKeystorePath());
+      if (userData.getSecurityOptions().getKeystorePassword() != null)
+      {
+        cmdLine.add("--keyStorePassword");
+        cmdLine.add(OBFUSCATED_VALUE);
+      }
+      if (userData.getSecurityOptions().getAliasToUse() != null)
+      {
+        cmdLine.add("--certNickname");
+        cmdLine.add(userData.getSecurityOptions().getAliasToUse());
+      }
+      break;
+    case JCEKS:
+      cmdLine.add("--useJCEKS");
+      cmdLine.add(userData.getSecurityOptions().getKeystorePath());
+      if (userData.getSecurityOptions().getKeystorePassword() != null)
+      {
+        cmdLine.add("--keyStorePassword");
+        cmdLine.add(OBFUSCATED_VALUE);
+      }
+      if (userData.getSecurityOptions().getAliasToUse() != null)
+      {
+        cmdLine.add("--certNickname");
+        cmdLine.add(userData.getSecurityOptions().getAliasToUse());
+      }
+      break;
+    case PKCS12:
+      cmdLine.add("--usePkcs12keyStore");
+      cmdLine.add(userData.getSecurityOptions().getKeystorePath());
+      if (userData.getSecurityOptions().getKeystorePassword() != null)
+      {
+        cmdLine.add("--keyStorePassword");
+        cmdLine.add(OBFUSCATED_VALUE);
+      }
+      if (userData.getSecurityOptions().getAliasToUse() != null)
+      {
+        cmdLine.add("--certNickname");
+        cmdLine.add(userData.getSecurityOptions().getAliasToUse());
+      }
+      break;
+    case PKCS11:
+      cmdLine.add("--usePkcs11Keystore");
+      if (userData.getSecurityOptions().getKeystorePassword() != null)
+      {
+        cmdLine.add("--keyStorePassword");
+        cmdLine.add(OBFUSCATED_VALUE);
+      }
+      if (userData.getSecurityOptions().getAliasToUse() != null)
+      {
+        cmdLine.add("--certNickname");
+        cmdLine.add(userData.getSecurityOptions().getAliasToUse());
+      }
+      break;
+    }
+
+    cmdLine.add("--no-prompt");
+    cmdLine.add("--noPropertiesFile");
+    return cmdLine;
+  }
+
+  /**
+   * Returns the list of equivalent command-lines that must be executed to
+   * enable replication as the setup does.
+   * @param userData the user data.
+   * @return the list of equivalent command-lines that must be executed to
+   * enable replication as the setup does.
+   */
+  public static ArrayList<ArrayList<String>>
+  getDsReplicationEnableEquivalentCommandLines(
+      UserData userData)
+  {
+    ArrayList<ArrayList<String>> cmdLines = new ArrayList<ArrayList<String>>();
+    Map<ServerDescriptor, Set<String>> hmServerBaseDNs =
+      getServerDescriptorBaseDNMap(userData);
+    for (ServerDescriptor server : hmServerBaseDNs.keySet())
+    {
+      cmdLines.add(getDsReplicationEnableEquivalentCommandLine(userData,
+          hmServerBaseDNs.get(server), server));
+    }
+    return cmdLines;
+  }
+
+  /**
+   * Returns the list of equivalent command-lines that must be executed to
+   * initialize replication as the setup does.
+   * @param userData the user data.
+   * @return the list of equivalent command-lines that must be executed to
+   * initialize replication as the setup does.
+   */
+  public static ArrayList<ArrayList<String>>
+  getDsReplicationInitializeEquivalentCommandLines(
+      UserData userData)
+  {
+    ArrayList<ArrayList<String>> cmdLines = new ArrayList<ArrayList<String>>();
+    Map<ServerDescriptor, Set<String>> hmServerBaseDNs =
+      getServerDescriptorBaseDNMap(userData);
+    for (ServerDescriptor server : hmServerBaseDNs.keySet())
+    {
+      cmdLines.add(getDsReplicationInitializeEquivalentCommandLine(userData,
+          hmServerBaseDNs.get(server), server));
+    }
+    return cmdLines;
+  }
+
+  private static ArrayList<String> getDsReplicationEnableEquivalentCommandLine(
+      UserData userData, Set<String> baseDNs, ServerDescriptor server)
+  {
+    ArrayList<String> cmdLine = new ArrayList<String>();
+    String cmdName;
+    if (Utils.isWindows())
+    {
+      cmdName = "dsreplication.bat";
+    }
+    else
+    {
+      cmdName = "dsreplication";
+    }
+    cmdLine.add(cmdName);
+    cmdLine.add("enable");
+
+    DataReplicationOptions replOptions = userData.getReplicationOptions();
+    cmdLine.add("--host1");
+    cmdLine.add(server.getHostName());
+    cmdLine.add("--port1");
+    cmdLine.add(String.valueOf(server.getEnabledAdministrationPorts().get(0)));
+
+    AuthenticationData authData =
+      userData.getReplicationOptions().getAuthenticationData();
+    if (!Utils.areDnsEqual(authData.getDn(),
+        ADSContext.getAdministratorDN(userData.getGlobalAdministratorUID())))
+    {
+      cmdLine.add("--bindDN1");
+      cmdLine.add(authData.getDn());
+      cmdLine.add("--bindPassword1");
+      cmdLine.add(OBFUSCATED_VALUE);
+    }
+    for (ServerDescriptor s :
+      userData.getRemoteWithNoReplicationPort().keySet())
+    {
+      if (s.getAdminConnectorURL().equals(server.getAdminConnectorURL()))
+      {
+        AuthenticationData remoteRepl =
+          userData.getRemoteWithNoReplicationPort().get(server);
+        int remoteReplicationPort = remoteRepl.getPort();
+
+        cmdLine.add("--replicationPort1");
+        cmdLine.add(String.valueOf(remoteReplicationPort));
+        if (remoteRepl.useSecureConnection())
+        {
+          cmdLine.add("--secureReplication1");
+        }
+      }
+    }
+    cmdLine.add("--host2");
+    cmdLine.add(userData.getHostName());
+    cmdLine.add("--port2");
+    cmdLine.add(String.valueOf(userData.getAdminConnectorPort()));
+    cmdLine.add("--bindDN2");
+    cmdLine.add(userData.getDirectoryManagerDn());
+    cmdLine.add("--bindPassword2");
+    cmdLine.add(OBFUSCATED_VALUE);
+    if (replOptions.getReplicationPort() != -1)
+    {
+      cmdLine.add("--replicationPort2");
+      cmdLine.add(
+         String.valueOf(replOptions.getReplicationPort()));
+      if (replOptions.useSecureReplication())
+      {
+        cmdLine.add("--secureReplication2");
+      }
+    }
+
+    for (String baseDN : baseDNs)
+    {
+      cmdLine.add("--baseDN");
+      cmdLine.add(baseDN);
+    }
+
+    cmdLine.add("--adminUID");
+    cmdLine.add(userData.getGlobalAdministratorUID());
+    cmdLine.add("--adminPassword");
+    cmdLine.add(OBFUSCATED_VALUE);
+
+    cmdLine.add("--trustAll");
+    cmdLine.add("--no-prompt");
+    cmdLine.add("--noPropertiesFile");
+    return cmdLine;
+  }
+
+  private static ArrayList<String>
+  getDsReplicationInitializeEquivalentCommandLine(
+      UserData userData, Set<String> baseDNs, ServerDescriptor server)
+  {
+    ArrayList<String> cmdLine = new ArrayList<String>();
+    String cmdName;
+    if (Utils.isWindows())
+    {
+      cmdName = "dsreplication.bat";
+    }
+    else
+    {
+      cmdName = "dsreplication";
+    }
+    cmdLine.add(cmdName);
+    cmdLine.add("initialize");
+
+    cmdLine.add("--hostSource");
+    cmdLine.add(server.getHostName());
+    cmdLine.add("--portSource");
+    cmdLine.add(String.valueOf(server.getEnabledAdministrationPorts().get(0)));
+
+    cmdLine.add("--hostDestination");
+    cmdLine.add(userData.getHostName());
+    cmdLine.add("--portDestination");
+    cmdLine.add(String.valueOf(userData.getAdminConnectorPort()));
+
+    for (String baseDN : baseDNs)
+    {
+      cmdLine.add("--baseDN");
+      cmdLine.add(baseDN);
+    }
+
+    cmdLine.add("--adminUID");
+    cmdLine.add(userData.getGlobalAdministratorUID());
+    cmdLine.add("--adminPassword");
+    cmdLine.add(OBFUSCATED_VALUE);
+
+    cmdLine.add("--trustAll");
+    cmdLine.add("--no-prompt");
+    cmdLine.add("--noPropertiesFile");
+    return cmdLine;
+  }
+
+  private static ArrayList<String> getBaseDNs(UserData userData)
+  {
+    ArrayList<String> baseDNs = new ArrayList<String>();
+
+    DataReplicationOptions repl = userData.getReplicationOptions();
+    SuffixesToReplicateOptions suf = userData.getSuffixesToReplicateOptions();
+
+    boolean createSuffix =
+      repl.getType() == DataReplicationOptions.Type.FIRST_IN_TOPOLOGY ||
+      repl.getType() == DataReplicationOptions.Type.STANDALONE ||
+      suf.getType() == SuffixesToReplicateOptions.Type.NEW_SUFFIX_IN_TOPOLOGY;
+
+    if (createSuffix)
+    {
+      NewSuffixOptions options = userData.getNewSuffixOptions();
+      baseDNs.addAll(options.getBaseDns());
+    }
+    else
+    {
+      Set<SuffixDescriptor> suffixes = suf.getSuffixes();
+      for (SuffixDescriptor suffix : suffixes)
+      {
+        baseDNs.add(suffix.getDN());
+      }
+    }
+    return baseDNs;
+  }
+
+  private static Map<ServerDescriptor, Set<String>>
+  getServerDescriptorBaseDNMap(UserData userData)
+  {
+    Map<ServerDescriptor, Set<String>> hm =
+      new HashMap<ServerDescriptor, Set<String>>();
+
+    Set<SuffixDescriptor> suffixes =
+      userData.getSuffixesToReplicateOptions().getSuffixes();
+    AuthenticationData authData =
+      userData.getReplicationOptions().getAuthenticationData();
+    String ldapURL = ConnectionUtils.getLDAPUrl(authData.getHostName(),
+        authData.getPort(), authData.useSecureConnection());
+    for (SuffixDescriptor suffix : suffixes)
+    {
+      boolean found = false;
+      for (ReplicaDescriptor replica : suffix.getReplicas())
+      {
+        if (ldapURL.equalsIgnoreCase(
+            replica.getServer().getAdminConnectorURL()))
+        {
+          found = true;
+          Set<String> baseDNs = hm.get(replica.getServer());
+          if (baseDNs == null)
+          {
+            baseDNs = new LinkedHashSet<String>();
+            hm.put(replica.getServer(), baseDNs);
+          }
+          baseDNs.add(suffix.getDN());
+          break;
+        }
+      }
+      if (!found)
+      {
+        for (ReplicaDescriptor replica : suffix.getReplicas())
+        {
+          if (hm.keySet().contains(replica.getServer()))
+          {
+            hm.get(replica.getServer()).add(suffix.getDN());
+            found = true;
+            break;
+          }
+        }
+      }
+      if (!found)
+      {
+        for (ReplicaDescriptor replica : suffix.getReplicas())
+        {
+          Set<String> baseDNs = new LinkedHashSet<String>();
+          hm.put(replica.getServer(), baseDNs);
+          baseDNs.add(suffix.getDN());
+          break;
+        }
+      }
+    }
+    return hm;
+  }
+
+  /**
+   * Returns the equivalent dsconfig command-line required to configure
+   * the first replicated server in the topology.
+   * @param userData the user data.
+   * @return the equivalent dsconfig command-line required to configure
+   * the first replicated server in the topology.
+   */
+  public static ArrayList<ArrayList<String>>
+  getDsConfigReplicationEnableEquivalentCommandLines(
+      UserData userData)
+  {
+    ArrayList<ArrayList<String>> cmdLines = new ArrayList<ArrayList<String>>();
+
+    String cmdName;
+    if (Utils.isWindows())
+    {
+      cmdName = "dsconfig.bat";
+    }
+    else
+    {
+      cmdName = "dsconfig";
+    }
+
+    ArrayList<String> connectionArgs = new ArrayList<String>();
+    connectionArgs.add("--hostName");
+    connectionArgs.add(userData.getHostName());
+    connectionArgs.add("--port");
+    connectionArgs.add(String.valueOf(userData.getAdminConnectorPort()));
+    connectionArgs.add("--bindDN");
+    connectionArgs.add(userData.getDirectoryManagerDn());
+    connectionArgs.add("--bindPassword");
+    connectionArgs.add(OBFUSCATED_VALUE);
+    connectionArgs.add("--trustAll");
+    connectionArgs.add("--no-prompt");
+    connectionArgs.add("--noPropertiesFile");
+
+    ArrayList<String> cmdReplicationServer = new ArrayList<String>();
+    cmdReplicationServer.add(cmdName);
+    cmdReplicationServer.add("create-replication-server");
+    cmdReplicationServer.add("--provider-name");
+    cmdReplicationServer.add("Multimaster Synchronization");
+    cmdReplicationServer.add("--set");
+    cmdReplicationServer.add("replication-port:"+
+        userData.getReplicationOptions().getReplicationPort());
+    cmdReplicationServer.add("--set");
+    cmdReplicationServer.add("replication-server-id:1");
+    cmdReplicationServer.add("--type");
+    cmdReplicationServer.add("generic");
+    cmdReplicationServer.addAll(connectionArgs);
+
+    cmdLines.add(cmdReplicationServer);
+
+    for (String baseDN : getBaseDNs(userData))
+    {
+      ArrayList<String> cmdDomain = new ArrayList<String>();
+      cmdDomain.add(cmdName);
+      cmdDomain.add("create-replication-domain");
+      cmdDomain.add("--provider-name");
+      cmdDomain.add("Multimaster Synchronization");
+      cmdDomain.add("--set");
+      cmdDomain.add("base-dn:"+baseDN);
+      cmdDomain.add("--set");
+      cmdDomain.add("replication-server:"+userData.getHostName()+":"+
+          userData.getReplicationOptions().getReplicationPort());
+      cmdDomain.add("--set");
+      cmdDomain.add("server-id:1");
+      cmdDomain.add("--type");
+      cmdDomain.add("generic");
+      cmdDomain.add("--domain-name");
+      cmdDomain.add(baseDN);
+      cmdDomain.addAll(connectionArgs);
+      cmdLines.add(cmdDomain);
+    }
+
+    return cmdLines;
+  }
 }
 
 /**

--
Gitblit v1.10.0