| | |
| | | { |
| | | private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass(); |
| | | |
| | | private Utils() {} |
| | | |
| | | private static final int BUFFER_SIZE = 1024; |
| | | private static final int MAX_LINE_WIDTH = 80; |
| | | |
| | | private Utils() |
| | | { |
| | | } |
| | | /** Chars that require special treatment when passing them to command-line. */ |
| | | private static final char[] CHARS_TO_ESCAPE = |
| | | { ' ', '\t', '\n', '|', ';', '<', '>', '(', ')', '$', '`', '\\', '"', '\'' }; |
| | | |
| | | /** |
| | | * The class name that contains the control panel customizations for |
| | | * products. |
| | | */ |
| | | private static final String CUSTOMIZATION_CLASS_NAME = |
| | | "org.opends.server.util.ReleaseDefinition"; |
| | | |
| | | /** The class name that contains the control panel customizations for products. */ |
| | | private static final String CUSTOMIZATION_CLASS_NAME = "org.opends.server.util.ReleaseDefinition"; |
| | | |
| | | /** The service name required by the JNLP downloader. */ |
| | | public static final String JNLP_SERVICE_NAME = "javax.jnlp.DownloadService"; |
| | |
| | | /** |
| | | * Returns <CODE>true</CODE> if the provided port is free and we can use it, |
| | | * <CODE>false</CODE> otherwise. |
| | | * @param port the port we are analyzing. |
| | | * |
| | | * @param port |
| | | * the port we are analyzing. |
| | | * @return <CODE>true</CODE> if the provided port is free and we can use it, |
| | | * <CODE>false</CODE> otherwise. |
| | | * <CODE>false</CODE> otherwise. |
| | | */ |
| | | public static boolean canUseAsPort(int port) |
| | | { |
| | |
| | | /** |
| | | * Returns <CODE>true</CODE> if the provided port is a privileged port, |
| | | * <CODE>false</CODE> otherwise. |
| | | * @param port the port we are analyzing. |
| | | * |
| | | * @param port |
| | | * the port we are analyzing. |
| | | * @return <CODE>true</CODE> if the provided port is a privileged port, |
| | | * <CODE>false</CODE> otherwise. |
| | | * <CODE>false</CODE> otherwise. |
| | | */ |
| | | public static boolean isPrivilegedPort(int port) |
| | | { |
| | | return SetupUtils.isPrivilegedPort(port); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Tells whether the provided java installation supports a given option or |
| | | * not. |
| | | * @param javaHome the java installation path. |
| | | * @param option the java option that we want to check. |
| | | * @param installPath the install path of the server. |
| | | * |
| | | * @param javaHome |
| | | * the java installation path. |
| | | * @param option |
| | | * the java option that we want to check. |
| | | * @param installPath |
| | | * the install path of the server. |
| | | * @return <CODE>true</CODE> if the provided java installation supports a |
| | | * given option and <CODE>false</CODE> otherwise. |
| | | * given option and <CODE>false</CODE> otherwise. |
| | | */ |
| | | public static boolean supportsOption(String option, String javaHome, |
| | | String installPath) |
| | | public static boolean supportsOption(String option, String javaHome, String installPath) |
| | | { |
| | | boolean supported = false; |
| | | logger.info(LocalizableMessage.raw("Checking if options "+option+ |
| | | " are supported with java home: "+javaHome)); |
| | | logger.info(LocalizableMessage.raw("Checking if options " + option + " are supported with java home: " + javaHome)); |
| | | try |
| | | { |
| | | List<String> args = new ArrayList<String>(); |
| | | List<String> args = new ArrayList<>(); |
| | | String script; |
| | | String libPath = Utils.getPath(installPath, |
| | | Installation.LIBRARIES_PATH_RELATIVE); |
| | | String libPath = Utils.getPath(installPath, Installation.LIBRARIES_PATH_RELATIVE); |
| | | if (isWindows()) |
| | | { |
| | | script = Utils.getScriptPath(Utils.getPath(libPath, |
| | | Installation.SCRIPT_UTIL_FILE_WINDOWS)); |
| | | script = Utils.getScriptPath(Utils.getPath(libPath, Installation.SCRIPT_UTIL_FILE_WINDOWS)); |
| | | } |
| | | else |
| | | { |
| | | script = Utils.getScriptPath(Utils.getPath(libPath, |
| | | Installation.SCRIPT_UTIL_FILE_UNIX)); |
| | | script = Utils.getScriptPath(Utils.getPath(libPath, Installation.SCRIPT_UTIL_FILE_UNIX)); |
| | | } |
| | | args.add(script); |
| | | ProcessBuilder pb = new ProcessBuilder(args); |
| | |
| | | env.put("DO_NOT_PAUSE", "true"); |
| | | } |
| | | final Process process = pb.start(); |
| | | logger.info(LocalizableMessage.raw("launching "+args+ " with env: "+env)); |
| | | logger.info(LocalizableMessage.raw("launching " + args + " with env: " + env)); |
| | | InputStream is = process.getInputStream(); |
| | | BufferedReader reader = new BufferedReader(new InputStreamReader(is)); |
| | | String line; |
| | | boolean errorDetected = false; |
| | | while (null != (line = reader.readLine())) { |
| | | logger.info(LocalizableMessage.raw("The output: "+line)); |
| | | while (null != (line = reader.readLine())) |
| | | { |
| | | logger.info(LocalizableMessage.raw("The output: " + line)); |
| | | if (line.contains("ERROR: The detected Java version")) |
| | | { |
| | | if (isWindows()) |
| | |
| | | } |
| | | process.waitFor(); |
| | | int returnCode = process.exitValue(); |
| | | logger.info(LocalizableMessage.raw("returnCode: "+returnCode)); |
| | | logger.info(LocalizableMessage.raw("returnCode: " + returnCode)); |
| | | supported = returnCode == 0 && !errorDetected; |
| | | logger.info(LocalizableMessage.raw("supported: "+supported)); |
| | | logger.info(LocalizableMessage.raw("supported: " + supported)); |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | logger.warn(LocalizableMessage.raw("Error testing option "+option+" on "+javaHome, t)); |
| | | logger.warn(LocalizableMessage.raw("Error testing option " + option + " on " + javaHome, t)); |
| | | } |
| | | return supported; |
| | | } |
| | | |
| | | /** |
| | | * Creates a new file attempting to create the parent directories |
| | | * if necessary. |
| | | * @param f File to create |
| | | * Creates a new file attempting to create the parent directories if |
| | | * necessary. |
| | | * |
| | | * @param f |
| | | * File to create |
| | | * @return boolean indicating whether the file was created; false otherwise |
| | | * @throws IOException if something goes wrong |
| | | * @throws IOException |
| | | * if something goes wrong |
| | | */ |
| | | public static boolean createFile(File f) throws IOException { |
| | | public static boolean createFile(File f) throws IOException |
| | | { |
| | | boolean success = false; |
| | | if (f != null) { |
| | | if (f != null) |
| | | { |
| | | File parent = f.getParentFile(); |
| | | if (!parent.exists()) { |
| | | if (!parent.exists()) |
| | | { |
| | | parent.mkdirs(); |
| | | } |
| | | success = f.createNewFile(); |
| | |
| | | |
| | | /** |
| | | * Returns the absolute path for the given parentPath and relativePath. |
| | | * @param parentPath the parent path. |
| | | * @param relativePath the relative path. |
| | | * |
| | | * @param parentPath |
| | | * the parent path. |
| | | * @param relativePath |
| | | * the relative path. |
| | | * @return the absolute path for the given parentPath and relativePath. |
| | | */ |
| | | public static String getPath(String parentPath, String relativePath) |
| | |
| | | |
| | | /** |
| | | * Returns the String that can be used to launch an script using Runtime.exec. |
| | | * This method is required because in Windows the script that contain a "=" |
| | | * in their path must be quoted. |
| | | * @param script the script name |
| | | * This method is required because in Windows the script that contain a "=" in |
| | | * their path must be quoted. |
| | | * |
| | | * @param script |
| | | * the script name |
| | | * @return the absolute path for the given parentPath and relativePath. |
| | | */ |
| | | public static String getScriptPath(String script) |
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns the absolute path for the given file. It tries to get the |
| | | * canonical file path. If it fails it returns the string representation. |
| | | * @param f File to get the path |
| | | * Returns the absolute path for the given file. It tries to get the canonical |
| | | * file path. If it fails it returns the string representation. |
| | | * |
| | | * @param f |
| | | * File to get the path |
| | | * @return the absolute path for the given file. |
| | | */ |
| | | public static String getPath(File f) |
| | | { |
| | | String path = null; |
| | | if (f != null) { |
| | | if (f != null) |
| | | { |
| | | try |
| | | { |
| | | /* |
| | |
| | | } |
| | | catch (IOException ioe) |
| | | { |
| | | /* This is a best effort to get the best possible representation of the |
| | | /* |
| | | * This is a best effort to get the best possible representation of the |
| | | * file: reporting the error is not necessary. |
| | | */ |
| | | } |
| | |
| | | /** |
| | | * Returns <CODE>true</CODE> if the first provided path is under the second |
| | | * path in the file system. |
| | | * @param descendant the descendant candidate path. |
| | | * @param path the path. |
| | | * |
| | | * @param descendant |
| | | * the descendant candidate path. |
| | | * @param path |
| | | * the path. |
| | | * @return <CODE>true</CODE> if the first provided path is under the second |
| | | * path in the file system; <code>false</code> otherwise or if |
| | | * either of the files are null |
| | | * path in the file system; <code>false</code> otherwise or if either |
| | | * of the files are null |
| | | */ |
| | | public static boolean isDescendant(File descendant, File path) { |
| | | public static boolean isDescendant(File descendant, File path) |
| | | { |
| | | boolean isDescendant = false; |
| | | if (descendant != null && path != null) { |
| | | if (descendant != null && path != null) |
| | | { |
| | | File parent = descendant.getParentFile(); |
| | | while (parent != null && !isDescendant) { |
| | | while (parent != null && !isDescendant) |
| | | { |
| | | isDescendant = path.equals(parent); |
| | | if (!isDescendant) { |
| | | if (!isDescendant) |
| | | { |
| | | parent = parent.getParentFile(); |
| | | } |
| | | } |
| | |
| | | /** |
| | | * Returns <CODE>true</CODE> if the parent directory for the provided path |
| | | * exists and <CODE>false</CODE> otherwise. |
| | | * @param path the path that we are analyzing. |
| | | * |
| | | * @param path |
| | | * the path that we are analyzing. |
| | | * @return <CODE>true</CODE> if the parent directory for the provided path |
| | | * exists and <CODE>false</CODE> otherwise. |
| | | * exists and <CODE>false</CODE> otherwise. |
| | | */ |
| | | public static boolean parentDirectoryExists(String path) |
| | | { |
| | |
| | | /** |
| | | * Returns <CODE>true</CODE> if the the provided path is a file and exists and |
| | | * <CODE>false</CODE> otherwise. |
| | | * @param path the path that we are analyzing. |
| | | * |
| | | * @param path |
| | | * the path that we are analyzing. |
| | | * @return <CODE>true</CODE> if the the provided path is a file and exists and |
| | | * <CODE>false</CODE> otherwise. |
| | | * <CODE>false</CODE> otherwise. |
| | | */ |
| | | public static boolean fileExists(String path) |
| | | { |
| | |
| | | /** |
| | | * Returns <CODE>true</CODE> if the the provided path is a directory, exists |
| | | * and is not empty <CODE>false</CODE> otherwise. |
| | | * @param path the path that we are analyzing. |
| | | * |
| | | * @param path |
| | | * the path that we are analyzing. |
| | | * @return <CODE>true</CODE> if the the provided path is a directory, exists |
| | | * and is not empty <CODE>false</CODE> otherwise. |
| | | * and is not empty <CODE>false</CODE> otherwise. |
| | | */ |
| | | public static boolean directoryExistsAndIsNotEmpty(String path) |
| | | { |
| | |
| | | /** |
| | | * Returns <CODE>true</CODE> if the the provided string is a configuration DN |
| | | * and <CODE>false</CODE> otherwise. |
| | | * @param dn the String we are analyzing. |
| | | * |
| | | * @param dn |
| | | * the String we are analyzing. |
| | | * @return <CODE>true</CODE> if the the provided string is a configuration DN |
| | | * and <CODE>false</CODE> otherwise. |
| | | * and <CODE>false</CODE> otherwise. |
| | | */ |
| | | public static boolean isConfigurationDn(String dn) |
| | | { |
| | | boolean isConfigurationDn = false; |
| | | String[] configDns = |
| | | { "cn=config", Constants.SCHEMA_DN }; |
| | | String[] configDns = { "cn=config", Constants.SCHEMA_DN }; |
| | | for (int i = 0; i < configDns.length && !isConfigurationDn; i++) |
| | | { |
| | | isConfigurationDn = areDnsEqual(dn, configDns[i]); |
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns <CODE>true</CODE> if the the provided strings represent the same |
| | | * DN and <CODE>false</CODE> otherwise. |
| | | * @param dn1 the first dn to compare. |
| | | * @param dn2 the second dn to compare. |
| | | * @return <CODE>true</CODE> if the the provided strings represent the same |
| | | * DN and <CODE>false</CODE> otherwise. |
| | | * Returns <CODE>true</CODE> if the the provided strings represent the same DN |
| | | * and <CODE>false</CODE> otherwise. |
| | | * |
| | | * @param dn1 |
| | | * the first dn to compare. |
| | | * @param dn2 |
| | | * the second dn to compare. |
| | | * @return <CODE>true</CODE> if the the provided strings represent the same DN |
| | | * and <CODE>false</CODE> otherwise. |
| | | */ |
| | | public static boolean areDnsEqual(String dn1, String dn2) |
| | | { |
| | |
| | | LdapName name1 = new LdapName(dn1); |
| | | LdapName name2 = new LdapName(dn2); |
| | | areDnsEqual = name1.equals(name2); |
| | | } catch (Exception ex) { |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // do nothing |
| | | } |
| | | |
| | |
| | | |
| | | /** |
| | | * Creates the parent directory if it does not already exist. |
| | | * @param f File for which parentage will be insured |
| | | * @return boolean indicating whether or not the input <code>f</code> |
| | | * has a parent after this method is invoked. |
| | | * |
| | | * @param f |
| | | * File for which parentage will be insured |
| | | * @return boolean indicating whether or not the input <code>f</code> has a |
| | | * parent after this method is invoked. |
| | | */ |
| | | public static boolean insureParentsExist(File f) { |
| | | public static boolean insureParentsExist(File f) |
| | | { |
| | | final File parent = f.getParentFile(); |
| | | final boolean b = parent.exists(); |
| | | if (!b) { |
| | | if (!b) |
| | | { |
| | | return parent.mkdirs(); |
| | | } |
| | | return b; |
| | |
| | | |
| | | /** |
| | | * Creates the a directory in the provided path. |
| | | * @param path the path. |
| | | * |
| | | * @param path |
| | | * the path. |
| | | * @return <CODE>true</CODE> if the path was created or already existed (and |
| | | * was a directory) and <CODE>false</CODE> otherwise. |
| | | * @throws IOException if something goes wrong. |
| | | * was a directory) and <CODE>false</CODE> otherwise. |
| | | * @throws IOException |
| | | * if something goes wrong. |
| | | */ |
| | | public static boolean createDirectory(String path) throws IOException { |
| | | public static boolean createDirectory(String path) throws IOException |
| | | { |
| | | return createDirectory(new File(path)); |
| | | } |
| | | |
| | | /** |
| | | * Creates the a directory in the provided path. |
| | | * @param f the path. |
| | | * |
| | | * @param f |
| | | * the path. |
| | | * @return <CODE>true</CODE> if the path was created or already existed (and |
| | | * was a directory) and <CODE>false</CODE> otherwise. |
| | | * @throws IOException if something goes wrong. |
| | | * was a directory) and <CODE>false</CODE> otherwise. |
| | | * @throws IOException |
| | | * if something goes wrong. |
| | | */ |
| | | public static boolean createDirectory(File f) throws IOException |
| | | { |
| | |
| | | if (!f.exists()) |
| | | { |
| | | directoryCreated = f.mkdirs(); |
| | | } else |
| | | } |
| | | else |
| | | { |
| | | directoryCreated = f.isDirectory(); |
| | | } |
| | |
| | | /** |
| | | * Creates a file on the specified path with the contents of the provided |
| | | * stream. |
| | | * @param path the path where the file will be created. |
| | | * @param is the InputStream with the contents of the file. |
| | | * @throws IOException if something goes wrong. |
| | | * |
| | | * @param path |
| | | * the path where the file will be created. |
| | | * @param is |
| | | * the InputStream with the contents of the file. |
| | | * @throws IOException |
| | | * if something goes wrong. |
| | | */ |
| | | public static void createFile(File path, InputStream is) throws IOException |
| | | { |
| | |
| | | |
| | | /** |
| | | * Creates a file on the specified path with the contents of the provided |
| | | * String. The file is protected, so that 'others' have no access to it. |
| | | * @param path the path where the file will be created. |
| | | * @param content the String with the contents of the file. |
| | | * @throws IOException if something goes wrong. |
| | | * @throws InterruptedException if there is a problem changing the permissions |
| | | * of the file. |
| | | * String. The file is protected, so that 'others' have no access to it. |
| | | * |
| | | * @param path |
| | | * the path where the file will be created. |
| | | * @param content |
| | | * the String with the contents of the file. |
| | | * @throws IOException |
| | | * if something goes wrong. |
| | | * @throws InterruptedException |
| | | * if there is a problem changing the permissions of the file. |
| | | */ |
| | | public static void createProtectedFile(String path, String content) |
| | | throws IOException, InterruptedException |
| | | public static void createProtectedFile(String path, String content) throws IOException, InterruptedException |
| | | { |
| | | FileWriter file = new FileWriter(path); |
| | | PrintWriter out = new PrintWriter(file); |
| | |
| | | } |
| | | |
| | | /** |
| | | * This is a helper method that gets a LocalizableMessage representation of the elements |
| | | * in the Collection of Messages. The LocalizableMessage will display the different |
| | | * elements separated by the separator String. |
| | | * This is a helper method that gets a LocalizableMessage representation of |
| | | * the elements in the Collection of Messages. The LocalizableMessage will |
| | | * display the different elements separated by the separator String. |
| | | * |
| | | * @param col |
| | | * the collection containing the messages. |
| | | * @param separator |
| | | * the separator String to be used. |
| | | * @return the message representation for the collection; |
| | | * null if <code>col</code> is null |
| | | * @return the message representation for the collection; null if |
| | | * <code>col</code> is null |
| | | */ |
| | | public static LocalizableMessage getMessageFromCollection(Collection<LocalizableMessage> col, |
| | | String separator) { |
| | | if (col != null) { |
| | | public static LocalizableMessage getMessageFromCollection(Collection<LocalizableMessage> col, String separator) |
| | | { |
| | | if (col != null) |
| | | { |
| | | final LocalizableMessageBuilder mb = new LocalizableMessageBuilder(); |
| | | for (LocalizableMessage m : col) { |
| | | for (LocalizableMessage m : col) |
| | | { |
| | | mb.append(separator).append(m); |
| | | } |
| | | return mb.toMessage(); |
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns the default server location that will be proposed to the user |
| | | * in the installation. |
| | | * @return the default server location that will be proposed to the user |
| | | * in the installation. |
| | | * Returns the default server location that will be proposed to the user in |
| | | * the installation. |
| | | * |
| | | * @return the default server location that will be proposed to the user in |
| | | * the installation. |
| | | */ |
| | | public static String getDefaultServerLocation() |
| | | { |
| | | String userDir = System.getProperty("user.home"); |
| | | String firstLocation = userDir + File.separator |
| | | + SHORT_NAME.toLowerCase(Locale.ENGLISH); |
| | | String firstLocation = userDir + File.separator + SHORT_NAME.toLowerCase(Locale.ENGLISH); |
| | | String serverLocation = firstLocation; |
| | | int i = 1; |
| | | while (fileExists(serverLocation) |
| | | || directoryExistsAndIsNotEmpty(serverLocation)) |
| | | while (fileExists(serverLocation) || directoryExistsAndIsNotEmpty(serverLocation)) |
| | | { |
| | | serverLocation = firstLocation + "-" + i; |
| | | i++; |
| | |
| | | /** |
| | | * Returns <CODE>true</CODE> if there is more disk space in the provided path |
| | | * than what is specified with the bytes parameter. |
| | | * @param directoryPath the path. |
| | | * @param bytes the disk space. |
| | | * |
| | | * @param directoryPath |
| | | * the path. |
| | | * @param bytes |
| | | * the disk space. |
| | | * @return <CODE>true</CODE> if there is more disk space in the provided path |
| | | * than what is specified with the bytes parameter. |
| | | * than what is specified with the bytes parameter. |
| | | */ |
| | | public static synchronized boolean hasEnoughSpace(String directoryPath, |
| | | long bytes) |
| | | public static synchronized boolean hasEnoughSpace(String directoryPath, long bytes) |
| | | { |
| | | // TODO This does not work with quotas etc. but at least it seems that |
| | | // we do not write all data on disk if it fails. |
| | |
| | | { |
| | | deleteDirectory = directory.mkdir(); |
| | | } |
| | | |
| | | try |
| | | { |
| | | file = File.createTempFile("temp" + System.nanoTime(), ".tmp", directory); |
| | | raf = new RandomAccessFile(file, "rw"); |
| | | raf.setLength(bytes); |
| | | hasEnoughSpace = true; |
| | | } catch (IOException ex) |
| | | } |
| | | catch (IOException ex) |
| | | { /* do nothing */ |
| | | } finally |
| | | } |
| | | finally |
| | | { |
| | | StaticUtils.close(raf); |
| | | if (file != null) |
| | |
| | | file.delete(); |
| | | } |
| | | } |
| | | |
| | | if (deleteDirectory) |
| | | { |
| | | directory.delete(); |
| | | } |
| | | |
| | | return hasEnoughSpace; |
| | | } |
| | | |
| | | /** |
| | | * Gets a localized representation of the provide TopologyCacheException. |
| | | * @param te the exception. |
| | | * |
| | | * @param te |
| | | * the exception. |
| | | * @return a localized representation of the provide TopologyCacheException. |
| | | */ |
| | | public static LocalizableMessage getMessage(TopologyCacheException te) |
| | |
| | | } |
| | | else if (te.getCause() instanceof NamingException) |
| | | { |
| | | buf.append(getThrowableMsg(INFO_ERROR_CONNECTING_TO_LOCAL.get(), |
| | | te.getCause())); |
| | | buf.append(getThrowableMsg(INFO_ERROR_CONNECTING_TO_LOCAL.get(), te.getCause())); |
| | | } |
| | | else |
| | | { |
| | | logger.warn(LocalizableMessage.raw("Unexpected error: "+te, te)); |
| | | logger.warn(LocalizableMessage.raw("Unexpected error: " + te, te)); |
| | | // This is unexpected. |
| | | if (te.getCause() != null) |
| | | { |
| | |
| | | /** |
| | | * Sets the permissions of the provided paths with the provided permission |
| | | * String. |
| | | * @param paths the paths to set permissions on. |
| | | * @param permissions the UNIX-mode file system permission representation |
| | | * (for example "644" or "755") |
| | | * |
| | | * @param paths |
| | | * the paths to set permissions on. |
| | | * @param permissions |
| | | * the UNIX-mode file system permission representation (for example |
| | | * "644" or "755") |
| | | * @return the return code of the chmod command. |
| | | * @throws IOException if something goes wrong. |
| | | * @throws InterruptedException if the Runtime.exec method is interrupted. |
| | | * @throws IOException |
| | | * if something goes wrong. |
| | | * @throws InterruptedException |
| | | * if the Runtime.exec method is interrupted. |
| | | */ |
| | | public static int setPermissionsUnix(ArrayList<String> paths, |
| | | String permissions) throws IOException, InterruptedException |
| | | public static int setPermissionsUnix(ArrayList<String> paths, String permissions) throws IOException, |
| | | InterruptedException |
| | | { |
| | | String[] args = new String[paths.size() + 2]; |
| | | args[0] = "chmod"; |
| | |
| | | /** |
| | | * Sets the permissions of the provided paths with the provided permission |
| | | * String. |
| | | * @param path to set permissions on. |
| | | * @param permissions the UNIX-mode file system permission representation |
| | | * (for example "644" or "755") |
| | | * |
| | | * @param path |
| | | * to set permissions on. |
| | | * @param permissions |
| | | * the UNIX-mode file system permission representation (for example |
| | | * "644" or "755") |
| | | * @return the return code of the chmod command. |
| | | * @throws IOException if something goes wrong. |
| | | * @throws InterruptedException if the Runtime.exec method is interrupted. |
| | | * @throws IOException |
| | | * if something goes wrong. |
| | | * @throws InterruptedException |
| | | * if the Runtime.exec method is interrupted. |
| | | */ |
| | | public static int setPermissionsUnix(String path, |
| | | String permissions) throws IOException, InterruptedException |
| | | public static int setPermissionsUnix(String path, String permissions) throws IOException, InterruptedException |
| | | { |
| | | String[] args = new String[3]; |
| | | args[0] = "chmod"; |
| | |
| | | /** |
| | | * Returns <CODE>true</CODE> if this is executed from command line and |
| | | * <CODE>false</CODE> otherwise. |
| | | * |
| | | * @return <CODE>true</CODE> if this is executed from command line and |
| | | * <CODE>false</CODE> otherwise. |
| | | * <CODE>false</CODE> otherwise. |
| | | */ |
| | | public static boolean isCli() |
| | | { |
| | |
| | | |
| | | /** |
| | | * Creates an LDAP+StartTLS connection and returns the corresponding |
| | | * LdapContext. |
| | | * This method first creates an LdapContext with anonymous bind. Then it |
| | | * requests a StartTlsRequest extended operation. The StartTlsResponse is |
| | | * setup with the specified hostname verifier. Negotiation is done using a |
| | | * LdapContext. This method first creates an LdapContext with anonymous bind. |
| | | * Then it requests a StartTlsRequest extended operation. The StartTlsResponse |
| | | * is setup with the specified hostname verifier. Negotiation is done using a |
| | | * TrustSocketFactory so that the specified TrustManager gets called during |
| | | * the SSL handshake. |
| | | * If trust manager is null, certificates are not checked during SSL |
| | | * handshake. |
| | | * the SSL handshake. If trust manager is null, certificates are not checked |
| | | * during SSL handshake. |
| | | * |
| | | * @param ldapsURL the target *LDAPS* URL. |
| | | * @param dn passed as Context.SECURITY_PRINCIPAL if not null. |
| | | * @param pwd passed as Context.SECURITY_CREDENTIALS if not null. |
| | | * @param timeout passed as com.sun.jndi.ldap.connect.timeout if > 0. |
| | | * @param env null or additional environment properties. |
| | | * @param trustManager null or the trust manager to be invoked during SSL. |
| | | * negociation. |
| | | * @param verifier null or the hostname verifier to be setup in the |
| | | * StartTlsResponse. |
| | | * |
| | | * @param ldapsURL |
| | | * the target *LDAPS* URL. |
| | | * @param dn |
| | | * passed as Context.SECURITY_PRINCIPAL if not null. |
| | | * @param pwd |
| | | * passed as Context.SECURITY_CREDENTIALS if not null. |
| | | * @param timeout |
| | | * passed as com.sun.jndi.ldap.connect.timeout if > 0. |
| | | * @param env |
| | | * null or additional environment properties. |
| | | * @param trustManager |
| | | * null or the trust manager to be invoked during SSL. negociation. |
| | | * @param verifier |
| | | * null or the hostname verifier to be setup in the StartTlsResponse. |
| | | * @return the established connection with the given parameters. |
| | | * |
| | | * @throws NamingException the exception thrown when instantiating |
| | | * InitialLdapContext. |
| | | * |
| | | * @throws NamingException |
| | | * the exception thrown when instantiating InitialLdapContext. |
| | | * @see javax.naming.Context |
| | | * @see javax.naming.ldap.InitialLdapContext |
| | | * @see javax.naming.ldap.StartTlsRequest |
| | |
| | | * @see org.opends.admin.ads.util.TrustedSocketFactory |
| | | */ |
| | | |
| | | public static InitialLdapContext createStartTLSContext(String ldapsURL, |
| | | String dn, String pwd, int timeout, Hashtable<String, String> env, |
| | | TrustManager trustManager, HostnameVerifier verifier) |
| | | throws NamingException |
| | | public static InitialLdapContext createStartTLSContext(String ldapsURL, String dn, String pwd, int timeout, |
| | | Hashtable<String, String> env, TrustManager trustManager, HostnameVerifier verifier) throws NamingException |
| | | { |
| | | return ConnectionUtils.createStartTLSContext(ldapsURL, dn, pwd, timeout, |
| | | env, trustManager, null, verifier); |
| | | return ConnectionUtils.createStartTLSContext(ldapsURL, dn, pwd, timeout, env, trustManager, null, verifier); |
| | | } |
| | | |
| | | /** |
| | | * Returns a message object for the given NamingException. The code assume |
| | | * Returns a message object for the given NamingException. The code assume |
| | | * that we are trying to connect to the local server. |
| | | * @param ne the NamingException. |
| | | * |
| | | * @param ne |
| | | * the NamingException. |
| | | * @return a message object for the given NamingException. |
| | | */ |
| | | public static LocalizableMessage getMessageForException(NamingException ne) |
| | | { |
| | | LocalizableMessage msg; |
| | | final String detailedException = ne.toString(true); |
| | | if (isCertificateException(ne)) |
| | | { |
| | | msg = INFO_ERROR_READING_CONFIG_LDAP_CERTIFICATE.get(ne.toString(true)); |
| | | return INFO_ERROR_READING_CONFIG_LDAP_CERTIFICATE.get(detailedException); |
| | | } |
| | | else if (ne instanceof AuthenticationException) |
| | | { |
| | | msg = ERR_CANNOT_CONNECT_TO_LOCAL_AUTHENTICATION.get(ne.toString(true)); |
| | | return ERR_CANNOT_CONNECT_TO_LOCAL_AUTHENTICATION.get(detailedException); |
| | | } |
| | | else if (ne instanceof NoPermissionException) |
| | | { |
| | | msg = ERR_CANNOT_CONNECT_TO_LOCAL_PERMISSIONS.get(ne.toString(true)); |
| | | return ERR_CANNOT_CONNECT_TO_LOCAL_PERMISSIONS.get(detailedException); |
| | | } |
| | | else if (ne instanceof NamingSecurityException) |
| | | { |
| | | msg = ERR_CANNOT_CONNECT_TO_LOCAL_PERMISSIONS.get(ne.toString(true)); |
| | | return ERR_CANNOT_CONNECT_TO_LOCAL_PERMISSIONS.get(detailedException); |
| | | } |
| | | else if (ne instanceof CommunicationException) |
| | | { |
| | | msg = ERR_CANNOT_CONNECT_TO_LOCAL_COMMUNICATION.get(ne.toString(true)); |
| | | return ERR_CANNOT_CONNECT_TO_LOCAL_COMMUNICATION.get(detailedException); |
| | | } |
| | | else |
| | | { |
| | | msg = ERR_CANNOT_CONNECT_TO_LOCAL_GENERIC.get(ne.toString(true)); |
| | | return ERR_CANNOT_CONNECT_TO_LOCAL_GENERIC.get(detailedException); |
| | | } |
| | | return msg; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Returns the path of the installation of the directory server. Note that |
| | | * Returns the path of the installation of the directory server. Note that |
| | | * this method assumes that this code is being run locally. |
| | | * |
| | | * @return the path of the installation of the directory server. |
| | | */ |
| | | public static String getInstallPathFromClasspath() |
| | |
| | | String sep = System.getProperty("path.separator"); |
| | | String[] classPaths = System.getProperty("java.class.path").split(sep); |
| | | String path = getInstallPath(classPaths); |
| | | if (path != null) { |
| | | if (path != null) |
| | | { |
| | | File f = new File(path).getAbsoluteFile(); |
| | | File librariesDir = f.getParentFile(); |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns the path of the installation of the directory server. Note that |
| | | * Returns the path of the installation of the directory server. Note that |
| | | * this method assumes that this code is being run locally. |
| | | * @param installPath The installation path |
| | | * |
| | | * @param installPath |
| | | * The installation path |
| | | * @return the path of the installation of the directory server. |
| | | */ |
| | | public static String getInstancePathFromInstallPath(String installPath) |
| | | { |
| | | String instancePathFileName = Installation.INSTANCE_LOCATION_PATH; |
| | | File _svcScriptPathName = new File(installPath + File.separator + |
| | | Installation.LIBRARIES_PATH_RELATIVE + File.separator + |
| | | "_svc-opendj.sh"); |
| | | File _svcScriptPathName = new File( |
| | | installPath + File.separator + Installation.LIBRARIES_PATH_RELATIVE + File.separator + "_svc-opendj.sh"); |
| | | |
| | | // look for /etc/opt/opendj/instance.loc |
| | | File f = new File(instancePathFileName); |
| | | if (!_svcScriptPathName.exists() || !f.exists()) { |
| | | if (!_svcScriptPathName.exists() || !f.exists()) |
| | | { |
| | | // look for <installPath>/instance.loc |
| | | instancePathFileName = installPath + File.separator + |
| | | Installation.INSTANCE_LOCATION_PATH_RELATIVE; |
| | | instancePathFileName = installPath + File.separator + Installation.INSTANCE_LOCATION_PATH_RELATIVE; |
| | | f = new File(instancePathFileName); |
| | | if (!f.exists()) { |
| | | if (!f.exists()) |
| | | { |
| | | return installPath; |
| | | } |
| | | } |
| | |
| | | return installPath; |
| | | } |
| | | |
| | | |
| | | // Read the first line and close the file. |
| | | String line; |
| | | try |
| | | { |
| | | line = reader.readLine(); |
| | | File instanceLoc = new File (line.trim()); |
| | | File instanceLoc = new File(line.trim()); |
| | | if (instanceLoc.isAbsolute()) |
| | | { |
| | | return instanceLoc.getAbsolutePath(); |
| | | } |
| | | else |
| | | { |
| | | return new File(installPath + File.separator + instanceLoc.getPath()) |
| | | .getAbsolutePath(); |
| | | return new File(installPath + File.separator + instanceLoc.getPath()).getAbsolutePath(); |
| | | } |
| | | } |
| | | catch (Exception e) |
| | |
| | | } |
| | | |
| | | /** |
| | | |
| | | * Returns the max size in character of a line to be displayed in the command |
| | | * line. |
| | | * |
| | | * @return the max size in character of a line to be displayed in the command |
| | | * line. |
| | | * line. |
| | | */ |
| | | public static int getCommandLineMaxLineWidth() |
| | | { |
| | |
| | | |
| | | /** |
| | | * Puts Swing menus in the Mac OS menu bar, if using the Aqua look and feel, |
| | | * and sets the application name that is displayed in the application menu |
| | | * and in the dock. |
| | | * and sets the application name that is displayed in the application menu and |
| | | * in the dock. |
| | | * |
| | | * @param appName |
| | | * application name to display in the menu bar and the dock. |
| | | */ |
| | | public static void setMacOSXMenuBar(LocalizableMessage appName) |
| | | { |
| | | System.setProperty("apple.laf.useScreenMenuBar", "true"); |
| | | System.setProperty("com.apple.mrj.application.apple.menu.about.name", |
| | | String.valueOf(appName)); |
| | | System.setProperty("com.apple.mrj.application.apple.menu.about.name", String.valueOf(appName)); |
| | | } |
| | | |
| | | /** |
| | | * Returns the number of entries contained in the zip file. This is used to |
| | | * Returns the number of entries contained in the zip file. This is used to |
| | | * update properly the progress bar ratio. |
| | | * |
| | | * @return the number of entries contained in the zip file. |
| | | */ |
| | | public static int getNumberZipEntries() |
| | |
| | | } |
| | | |
| | | /** |
| | | * Creates a string consisting of the string representation of the |
| | | * elements in the <code>list</code> separated by <code>separator</code>. |
| | | * @param list the list to print |
| | | * @param separator to use in separating elements |
| | | * @param prefix prepended to each individual element in the list before |
| | | * adding to the returned string. |
| | | * @param suffix appended to each individual element in the list before |
| | | * adding to the returned string. |
| | | * Creates a string consisting of the string representation of the elements in |
| | | * the <code>list</code> separated by <code>separator</code>. |
| | | * |
| | | * @param list |
| | | * the list to print |
| | | * @param separator |
| | | * to use in separating elements |
| | | * @param prefix |
| | | * prepended to each individual element in the list before adding to |
| | | * the returned string. |
| | | * @param suffix |
| | | * appended to each individual element in the list before adding to |
| | | * the returned string. |
| | | * @return String representing the list |
| | | */ |
| | | public static String listToString(List<?> list, String separator, |
| | | String prefix, String suffix) { |
| | | public static String listToString(List<?> list, String separator, String prefix, String suffix) |
| | | { |
| | | StringBuilder sb = new StringBuilder(); |
| | | for (int i = 0; i < list.size(); i++) { |
| | | if (prefix != null) { |
| | | for (int i = 0; i < list.size(); i++) |
| | | { |
| | | if (prefix != null) |
| | | { |
| | | sb.append(prefix); |
| | | } |
| | | sb.append(list.get(i)); |
| | | if (suffix != null) { |
| | | if (suffix != null) |
| | | { |
| | | sb.append(suffix); |
| | | } |
| | | if (i < list.size() - 1) { |
| | | if (i < list.size() - 1) |
| | | { |
| | | sb.append(separator); |
| | | } |
| | | } |
| | |
| | | |
| | | /** |
| | | * Returns the file system permissions for a file. |
| | | * @param file the file for which we want the file permissions. |
| | | * |
| | | * @param file |
| | | * the file for which we want the file permissions. |
| | | * @return the file system permissions for the file. |
| | | */ |
| | | public static String getFileSystemPermissions(File file) |
| | | { |
| | | String name = file.getName(); |
| | | if (file.getParent().endsWith( |
| | | File.separator + Installation.WINDOWS_BINARIES_PATH_RELATIVE) || |
| | | file.getParent().endsWith( |
| | | File.separator + Installation.UNIX_BINARIES_PATH_RELATIVE)) { |
| | | if (name.endsWith(".bat")) { |
| | | return "644"; |
| | | } |
| | | else { |
| | | return "755"; |
| | | } |
| | | } else if (name.endsWith(".sh")) { |
| | | if (file.getParent().endsWith(File.separator + Installation.WINDOWS_BINARIES_PATH_RELATIVE) |
| | | || file.getParent().endsWith(File.separator + Installation.UNIX_BINARIES_PATH_RELATIVE)) |
| | | { |
| | | return name.endsWith(".bat") ? "644" : "755"; |
| | | } |
| | | else if (name.endsWith(".sh") |
| | | || name.endsWith(Installation.UNIX_SETUP_FILE_NAME) |
| | | || name.endsWith(Installation.UNIX_UNINSTALL_FILE_NAME) |
| | | || name.endsWith(Installation.UNIX_UPGRADE_FILE_NAME) |
| | | || name.endsWith(Installation.MAC_JAVA_APP_STUB_NAME)) |
| | | { |
| | | return "755"; |
| | | } else if (name.endsWith(Installation.UNIX_SETUP_FILE_NAME) || |
| | | name.endsWith(Installation.UNIX_UNINSTALL_FILE_NAME) || |
| | | name.endsWith(Installation.UNIX_UPGRADE_FILE_NAME)) { |
| | | return "755"; |
| | | } else if (name.endsWith(Installation.MAC_JAVA_APP_STUB_NAME)) { |
| | | return "755"; |
| | | } else { |
| | | } |
| | | else |
| | | { |
| | | return "644"; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Inserts HTML break tags into <code>d</code> breaking it up |
| | | * so that ideally no line is longer than <code>maxll</code> |
| | | * assuming no single word is longer then <code>maxll</code>. |
| | | * If the string already contains HTML tags that cause a line |
| | | * break (e.g break and closing list item tags) they are |
| | | * respected by this method when calculating where to place |
| | | * new breaks to control the maximum line length. |
| | | * Inserts HTML break tags into <code>d</code> breaking it up so that ideally |
| | | * no line is longer than <code>maxll</code> assuming no single word is longer |
| | | * then <code>maxll</code>. If the string already contains HTML tags that |
| | | * cause a line break (e.g break and closing list item tags) they are |
| | | * respected by this method when calculating where to place new breaks to |
| | | * control the maximum line length. |
| | | * |
| | | * @param cs String to break |
| | | * @param maxll int maximum line length |
| | | * @return String representing <code>d</code> with HTML break |
| | | * tags inserted |
| | | * @param cs |
| | | * String to break |
| | | * @param maxll |
| | | * int maximum line length |
| | | * @return String representing <code>d</code> with HTML break tags inserted |
| | | */ |
| | | public static String breakHtmlString(CharSequence cs, int maxll) { |
| | | if (cs != null) { |
| | | public static String breakHtmlString(CharSequence cs, int maxll) |
| | | { |
| | | if (cs != null) |
| | | { |
| | | String d = cs.toString(); |
| | | int len = d.length(); |
| | | if (len <= 0) |
| | | { |
| | | return d; |
| | | } |
| | | if (len > maxll) { |
| | | if (len > maxll) |
| | | { |
| | | |
| | | // First see if there are any tags that would cause a |
| | | // natural break in the line. If so start line break |
| | | // point evaluation from that point. |
| | | for (String tag : Constants.BREAKING_TAGS) { |
| | | for (String tag : Constants.BREAKING_TAGS) |
| | | { |
| | | int p = d.lastIndexOf(tag, maxll); |
| | | if (p > 0 && p < len) { |
| | | return d.substring(0, p + tag.length()) + |
| | | breakHtmlString( |
| | | d.substring(p + tag.length()), |
| | | maxll); |
| | | if (p > 0 && p < len) |
| | | { |
| | | return d.substring(0, p + tag.length()) + breakHtmlString(d.substring(p + tag.length()), maxll); |
| | | } |
| | | } |
| | | |
| | |
| | | // use the first space encountered after the max line |
| | | // length. |
| | | int p = d.lastIndexOf(' ', maxll); |
| | | if (p <= 0) { |
| | | if (p <= 0) |
| | | { |
| | | p = d.indexOf(' ', maxll); |
| | | } |
| | | if (p > 0 && p < len) { |
| | | return d.substring(0, p) + |
| | | Constants.HTML_LINE_BREAK + |
| | | breakHtmlString(d.substring(p + 1), maxll); |
| | | } else { |
| | | if (p > 0 && p < len) |
| | | { |
| | | return d.substring(0, p) + Constants.HTML_LINE_BREAK + breakHtmlString(d.substring(p + 1), maxll); |
| | | } |
| | | else |
| | | { |
| | | return d; |
| | | } |
| | | } else { |
| | | } |
| | | else |
| | | { |
| | | return d; |
| | | } |
| | | } else { |
| | | } |
| | | else |
| | | { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Converts existing HTML break tags to native line separators. |
| | | * @param s string to convert |
| | | * |
| | | * @param s |
| | | * string to convert |
| | | * @return converted string |
| | | */ |
| | | public static String convertHtmlBreakToLineSeparator(String s) { |
| | | public static String convertHtmlBreakToLineSeparator(String s) |
| | | { |
| | | return s.replaceAll("<br>", Constants.LINE_SEPARATOR); |
| | | } |
| | | |
| | | /** |
| | | * Strips any potential HTML markup from a given string. |
| | | * @param s string to strip |
| | | * |
| | | * @param s |
| | | * string to strip |
| | | * @return resulting string |
| | | */ |
| | | public static String stripHtml(String s) { |
| | | if (s != null) { |
| | | public static String stripHtml(String s) |
| | | { |
| | | if (s != null) |
| | | { |
| | | |
| | | // This is not a comprehensive solution but addresses the few tags |
| | | // that we have in Resources.properties at the moment. |
| | | // Note that the following might strip out more than is intended for non-tags |
| | | // like '<your name here>' or for funky tags like '<tag attr="1 > 0">'. |
| | | // See test class for cases that might cause problems. |
| | | return s.replaceAll("<.*?>",""); |
| | | return s.replaceAll("<.*?>", ""); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * Tests a text string to see if it contains HTML. |
| | | * @param text String to test |
| | | * |
| | | * @param text |
| | | * String to test |
| | | * @return true if the string contains HTML |
| | | */ |
| | | public static boolean containsHtml(String text) { |
| | | public static boolean containsHtml(String text) |
| | | { |
| | | return text != null && text.indexOf('<') != -1 && text.indexOf('>') != -1; |
| | | } |
| | | |
| | |
| | | |
| | | /** |
| | | * Returns a printstream that does not write anything to standard output. |
| | | * |
| | | * @return a printstream that does not write anything to standard output. |
| | | */ |
| | | public static EmptyPrintStream getEmptyPrintStream() |
| | |
| | | |
| | | /** |
| | | * Returns the current time of a server in milliseconds. |
| | | * @param ctx the connection to the server. |
| | | * |
| | | * @param ctx |
| | | * the connection to the server. |
| | | * @return the current time of a server in milliseconds. |
| | | */ |
| | | public static long getServerClock(InitialLdapContext ctx) |
| | |
| | | long time = -1; |
| | | SearchControls ctls = new SearchControls(); |
| | | ctls.setSearchScope(SearchControls.OBJECT_SCOPE); |
| | | ctls.setReturningAttributes( |
| | | new String[] { |
| | | "currentTime" |
| | | }); |
| | | ctls.setReturningAttributes(new String[] { "currentTime" }); |
| | | String filter = "(objectclass=*)"; |
| | | |
| | | try |
| | |
| | | { |
| | | while (listeners.hasMore()) |
| | | { |
| | | SearchResult sr = (SearchResult)listeners.next(); |
| | | SearchResult sr = (SearchResult) listeners.next(); |
| | | |
| | | String v = getFirstValue(sr, "currentTime"); |
| | | |
| | | TimeZone utcTimeZone = TimeZone.getTimeZone("UTC"); |
| | | |
| | | SimpleDateFormat formatter = |
| | | new SimpleDateFormat("yyyyMMddHHmmss'Z'"); |
| | | SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss'Z'"); |
| | | formatter.setTimeZone(utcTimeZone); |
| | | |
| | | time = formatter.parse(v).getTime(); |
| | |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | logger.warn(LocalizableMessage.raw("Error retrieving server current time: "+t, t)); |
| | | logger.warn(LocalizableMessage.raw("Error retrieving server current time: " + t, t)); |
| | | } |
| | | return time; |
| | | } |
| | | |
| | | /** |
| | | * Checks that the java version we are running is compatible with OpenDS. |
| | | * @throws IncompatibleVersionException if the java version we are running |
| | | * is not compatible with OpenDS. |
| | | * |
| | | * @throws IncompatibleVersionException |
| | | * if the java version we are running is not compatible with OpenDS. |
| | | */ |
| | | public static void checkJavaVersion() throws IncompatibleVersionException |
| | | { |
| | |
| | | if (i.getVendor().equalsIgnoreCase(vendor)) |
| | | { |
| | | // Compare versions. |
| | | boolean versionCompatible = |
| | | i.getVersion().compareToIgnoreCase(version) <= 0; |
| | | boolean versionCompatible = i.getVersion().compareToIgnoreCase(version) <= 0; |
| | | if (!versionCompatible) |
| | | { |
| | | String javaBin = System.getProperty("java.home")+File.separator+ |
| | | "bin"+File.separator+"java"; |
| | | throw new IncompatibleVersionException( |
| | | ERR_INCOMPATIBLE_VERSION.get(i.getVersion(), version, javaBin), |
| | | null); |
| | | String javaBin = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java"; |
| | | throw new IncompatibleVersionException(ERR_INCOMPATIBLE_VERSION.get(i.getVersion(), version, javaBin), null); |
| | | } |
| | | } |
| | | } |
| | |
| | | catch (Throwable t) |
| | | { |
| | | throw new IncompatibleVersionException( |
| | | INFO_DOWNLOADING_ERROR_NO_SERVICE_FOUND.get( |
| | | JNLP_SERVICE_NAME, getSetupFilename()), |
| | | t); |
| | | INFO_DOWNLOADING_ERROR_NO_SERVICE_FOUND.get(JNLP_SERVICE_NAME, getSetupFilename()), t); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Basic method to know if the host is local or not. This is only used to |
| | | * know if we can perform a port check or not. |
| | | * @param host the host to analyze. |
| | | * Basic method to know if the host is local or not. This is only used to know |
| | | * if we can perform a port check or not. |
| | | * |
| | | * @param host |
| | | * the host to analyze. |
| | | * @return <CODE>true</CODE> if it is the local host and <CODE>false</CODE> |
| | | * otherwise. |
| | | * otherwise. |
| | | */ |
| | | public static boolean isLocalHost(String host) |
| | | { |
| | |
| | | { |
| | | InetAddress localAddress = InetAddress.getLocalHost(); |
| | | InetAddress[] addresses = InetAddress.getAllByName(host); |
| | | for (InetAddress address : addresses) { |
| | | if (localAddress.equals(address)) { |
| | | for (InetAddress address : addresses) |
| | | { |
| | | if (localAddress.equals(address)) |
| | | { |
| | | return true; |
| | | } |
| | | } |
| | |
| | | public static String getHtml(String text) |
| | | { |
| | | StringBuilder buffer = new StringBuilder(); |
| | | if (text != null) { |
| | | if (text != null) |
| | | { |
| | | text = text.replaceAll("\r\n", "\n"); |
| | | String[] lines = text.split("[\n\r\u0085\u2028\u2029]"); |
| | | for (int i = 0; i < lines.length; i++) |
| | |
| | | } |
| | | |
| | | /** |
| | | * Tries to find a customized object in the customization class. If the |
| | | * customization class does not exist or it does not contain the field |
| | | * as the specified type of the object, returns the default value. |
| | | * @param <T> the type of the customized object. |
| | | * @param fieldName the name of the field representing an object in the |
| | | * customization class. |
| | | * @param defaultValue the default value. |
| | | * @param valueClass the class of the parametrized value. |
| | | * Tries to find a customized object in the customization class. If the |
| | | * customization class does not exist or it does not contain the field as the |
| | | * specified type of the object, returns the default value. |
| | | * |
| | | * @param <T> |
| | | * the type of the customized object. |
| | | * @param fieldName |
| | | * the name of the field representing an object in the customization |
| | | * class. |
| | | * @param defaultValue |
| | | * the default value. |
| | | * @param valueClass |
| | | * the class of the parametrized value. |
| | | * @return the customized object. |
| | | */ |
| | | public static <T> T getCustomizedObject(String fieldName, |
| | | T defaultValue, Class<T> valueClass) |
| | | public static <T> T getCustomizedObject(String fieldName, T defaultValue, Class<T> valueClass) |
| | | { |
| | | T value = defaultValue; |
| | | if (!isWebStart()) |
| | |
| | | |
| | | /** |
| | | * Adds word break tags to the provided html string. |
| | | * @param htmlString the string. |
| | | * @param from the first index to start the spacing from. |
| | | * @param spacing the minimal spacing between word breaks. |
| | | * |
| | | * @param htmlString |
| | | * the string. |
| | | * @param from |
| | | * the first index to start the spacing from. |
| | | * @param spacing |
| | | * the minimal spacing between word breaks. |
| | | * @return a string containing word breaks. |
| | | */ |
| | | public static String addWordBreaks(String htmlString, int from, int spacing) |
| | |
| | | boolean insideTag = false; |
| | | int totalAddedChars = 0; |
| | | int addedChars = 0; |
| | | for (int i = 0 ; i<htmlString.length(); i++) |
| | | for (int i = 0; i < htmlString.length(); i++) |
| | | { |
| | | char c = htmlString.charAt(i); |
| | | sb.append(c); |
| | |
| | | } |
| | | if (!insideTag && c != '>') |
| | | { |
| | | addedChars ++; |
| | | totalAddedChars ++; |
| | | addedChars++; |
| | | totalAddedChars++; |
| | | } |
| | | if ((addedChars > spacing) && (totalAddedChars > from) && !insideTag) |
| | | if (addedChars > spacing && totalAddedChars > from && !insideTag) |
| | | { |
| | | sb.append("<wbr>"); |
| | | addedChars = 0; |
| | |
| | | return sb.toString(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns the localized string describing the DataOptions chosen by the user. |
| | | * |
| | |
| | | final SuffixesToReplicateOptions suf = userInstallData.getSuffixesToReplicateOptions(); |
| | | final String backendType = userInstallData.getBackendType().getUserFriendlyName().toString(); |
| | | |
| | | boolean createSuffix = repl.getType() == DataReplicationOptions.Type.FIRST_IN_TOPOLOGY |
| | | || repl.getType() == DataReplicationOptions.Type.STANDALONE |
| | | || suf.getType() == SuffixesToReplicateOptions.Type.NEW_SUFFIX_IN_TOPOLOGY; |
| | | boolean createSuffix = |
| | | repl.getType() == DataReplicationOptions.Type.FIRST_IN_TOPOLOGY |
| | | || repl.getType() == DataReplicationOptions.Type.STANDALONE |
| | | || suf.getType() == SuffixesToReplicateOptions.Type.NEW_SUFFIX_IN_TOPOLOGY; |
| | | |
| | | if (createSuffix) |
| | | { |
| | |
| | | } |
| | | else if (options.getBaseDns().size() > 1) |
| | | { |
| | | msg = INFO_REVIEW_CREATE_SUFFIX.get( |
| | | backendType, joinAsString(Constants.LINE_SEPARATOR, options.getBaseDns()), arg2); |
| | | msg = |
| | | INFO_REVIEW_CREATE_SUFFIX.get(backendType, joinAsString(Constants.LINE_SEPARATOR, options.getBaseDns()), |
| | | arg2); |
| | | } |
| | | else |
| | | { |
| | |
| | | return msg.toString(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns a localized String representation of the provided SecurityOptions |
| | | * object. |
| | | * @param ops the SecurityOptions object from which we want to obtain the |
| | | * String representation. |
| | | * @param html whether the resulting String must be in HTML or not. |
| | | * |
| | | * @param ops |
| | | * the SecurityOptions object from which we want to obtain the String |
| | | * representation. |
| | | * @param html |
| | | * whether the resulting String must be in HTML or not. |
| | | * @return a localized String representation of the provided SecurityOptions |
| | | * object. |
| | | * object. |
| | | */ |
| | | public static String getSecurityOptionsString(SecurityOptions ops, |
| | | boolean html) |
| | | public static String getSecurityOptionsString(SecurityOptions ops, boolean html) |
| | | { |
| | | StringBuilder buf = new StringBuilder(); |
| | | |
| | | if (ops.getCertificateType() == |
| | | SecurityOptions.CertificateType.NO_CERTIFICATE) |
| | | if (ops.getCertificateType() == SecurityOptions.CertificateType.NO_CERTIFICATE) |
| | | { |
| | | buf.append(INFO_NO_SECURITY.get()); |
| | | } |
| | |
| | | break; |
| | | |
| | | default: |
| | | throw new IllegalStateException("Unknown certificate options type: "+ |
| | | ops.getCertificateType()); |
| | | throw new IllegalStateException("Unknown certificate options type: " + ops.getCertificateType()); |
| | | } |
| | | buf.append(certMsg); |
| | | } |
| | | |
| | | if (html) |
| | | { |
| | | return "<html>"+UIFactory.applyFontToHtml(buf.toString(), |
| | | UIFactory.SECONDARY_FIELD_VALID_FONT); |
| | | return "<html>" + UIFactory.applyFontToHtml(buf.toString(), UIFactory.SECONDARY_FIELD_VALID_FONT); |
| | | } |
| | | else |
| | | { |
| | |
| | | { |
| | | sbSeparator.append("\\"); |
| | | sbSeparator.append(formatter.getLineBreak()); |
| | | for (int i=0 ; i < 10 ; i++) |
| | | for (int i = 0; i < 10; i++) |
| | | { |
| | | sbSeparator.append(formatter.getSpace()); |
| | | } |
| | | } |
| | | |
| | | String lineSeparator = sbSeparator.toString(); |
| | | for (int i=initialIndex ; i<cmd.size(); i++) |
| | | for (int i = initialIndex; i < cmd.size(); i++) |
| | | { |
| | | String s = cmd.get(i); |
| | | if (s.startsWith("-")) |
| | |
| | | else |
| | | { |
| | | builder.append(formatter.getSpace()); |
| | | builder.append(formatter.getFormattedProgress(LocalizableMessage.raw( |
| | | escapeCommandLineValue(s)))); |
| | | builder.append(formatter.getFormattedProgress(LocalizableMessage.raw(escapeCommandLineValue(s)))); |
| | | } |
| | | } |
| | | return builder.toString(); |
| | | } |
| | | |
| | | /** Chars that require special treatment when passing them to command-line. */ |
| | | private static final char[] charsToEscape = {' ', '\t', '\n', '|', ';', '<', |
| | | '>', '(', ')', '$', '`', '\\', '"', '\''}; |
| | | |
| | | /** |
| | | * 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. |
| | | * |
| | | * @param value |
| | | * the String to be treated. |
| | | * @return the transformed value. |
| | | */ |
| | | public static String escapeCommandLineValue(String value) |
| | |
| | | StringBuilder b = new StringBuilder(); |
| | | if (isUnix()) |
| | | { |
| | | for (int i=0 ; i<value.length(); i++) |
| | | 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++) |
| | | for (int j = 0; j < CHARS_TO_ESCAPE.length && !charToEscapeFound; j++) |
| | | { |
| | | charToEscapeFound = c == charsToEscape[j]; |
| | | charToEscapeFound = c == CHARS_TO_ESCAPE[j]; |
| | | } |
| | | if (charToEscapeFound) |
| | | { |
| | |
| | | */ |
| | | public static List<String> getSetupEquivalentCommandLine(final UserData userData) |
| | | { |
| | | List<String> cmdLine = new ArrayList<String>(); |
| | | List<String> cmdLine = new ArrayList<>(); |
| | | cmdLine.add(getInstallDir(userData) + getSetupFilename()); |
| | | cmdLine.add("--cli"); |
| | | |
| | |
| | | |
| | | private static List<String> getSecurityOptionSetupEquivalentCmdLine(final UserData userData) |
| | | { |
| | | final List<String> cmdLine = new ArrayList<String>(); |
| | | final List<String> cmdLine = new ArrayList<>(); |
| | | |
| | | switch (userData.getSecurityOptions().getCertificateType()) |
| | | { |
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns the list of equivalent command-lines that must be executed to enable or initialize |
| | | * replication as the setup does. |
| | | * Returns the list of equivalent command-lines that must be executed to |
| | | * enable or initialize replication as the setup does. |
| | | * |
| | | * @param subcommand |
| | | * either {@code "enable"} or {@code "initialize"} |
| | | * @param userData |
| | | * the user data. |
| | | * @return the list of equivalent command-lines that must be executed to enable or initialize |
| | | * replication as the setup does. |
| | | * @return the list of equivalent command-lines that must be executed to |
| | | * enable or initialize replication as the setup does. |
| | | */ |
| | | public static List<List<String>> getDsReplicationEquivalentCommandLines(String subcommand, UserData userData) |
| | | { |
| | | final List<List<String>> cmdLines = new ArrayList<List<String>>(); |
| | | final List<List<String>> cmdLines = new ArrayList<>(); |
| | | final Map<ServerDescriptor, Set<String>> hmServerBaseDNs = getServerDescriptorBaseDNMap(userData); |
| | | for (ServerDescriptor server : hmServerBaseDNs.keySet()) |
| | | { |
| | |
| | | return cmdLines; |
| | | } |
| | | |
| | | private static void addEnableCommandOptions(UserData userData, ServerDescriptor server, ArrayList<String> cmdLine) |
| | | private static void addEnableCommandOptions(UserData userData, ServerDescriptor server, List<String> cmdLine) |
| | | { |
| | | DataReplicationOptions replOptions = userData.getReplicationOptions(); |
| | | cmdLine.add("--host1"); |
| | |
| | | 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()))) |
| | | 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()) |
| | | for (ServerDescriptor s : userData.getRemoteWithNoReplicationPort().keySet()) |
| | | { |
| | | if (s.getAdminConnectorURL().equals(server.getAdminConnectorURL())) |
| | | { |
| | | AuthenticationData remoteRepl = |
| | | userData.getRemoteWithNoReplicationPort().get(server); |
| | | AuthenticationData remoteRepl = userData.getRemoteWithNoReplicationPort().get(server); |
| | | int remoteReplicationPort = remoteRepl.getPort(); |
| | | |
| | | cmdLine.add("--replicationPort1"); |
| | |
| | | |
| | | /** |
| | | * Returns the full path of the command-line for a given script name. |
| | | * @param userData the user data. |
| | | * @param scriptBasicName the script basic name (with no extension). |
| | | * |
| | | * @param userData |
| | | * the user data. |
| | | * @param scriptBasicName |
| | | * the script basic name (with no extension). |
| | | * @return the full path of the command-line for a given script name. |
| | | */ |
| | | private static String getCommandLinePath(UserData userData, |
| | | String scriptBasicName) |
| | | private static String getCommandLinePath(UserData userData, String scriptBasicName) |
| | | { |
| | | String cmdLineName; |
| | | if (isWindows()) |
| | | { |
| | | cmdLineName = getInstallDir(userData) |
| | | + Installation.WINDOWS_BINARIES_PATH_RELATIVE |
| | | + File.separatorChar |
| | | + scriptBasicName + ".bat"; |
| | | cmdLineName = |
| | | getInstallDir(userData) + Installation.WINDOWS_BINARIES_PATH_RELATIVE + File.separatorChar + scriptBasicName |
| | | + ".bat"; |
| | | } |
| | | else |
| | | { |
| | | cmdLineName = getInstallDir(userData) |
| | | + Installation.UNIX_BINARIES_PATH_RELATIVE |
| | | + File.separatorChar |
| | | + scriptBasicName; |
| | | cmdLineName = |
| | | getInstallDir(userData) + Installation.UNIX_BINARIES_PATH_RELATIVE + File.separatorChar + scriptBasicName; |
| | | } |
| | | return cmdLineName; |
| | | } |
| | | |
| | | private static String installDir; |
| | | |
| | | /** |
| | | * Returns the installation directory. |
| | | * |
| | | * @return the installation directory. |
| | | */ |
| | | private static String getInstallDir(UserData userData) |
| | |
| | | return installDir; |
| | | } |
| | | |
| | | private static ArrayList<String> getDsReplicationEquivalentCommandLine( |
| | | String subcommand, UserData userData, Set<String> baseDNs, ServerDescriptor server) |
| | | private static List<String> getDsReplicationEquivalentCommandLine(String subcommand, UserData userData, |
| | | Set<String> baseDNs, ServerDescriptor server) |
| | | { |
| | | ArrayList<String> cmdLine = new ArrayList<String>(); |
| | | List<String> cmdLine = new ArrayList<>(); |
| | | String cmdName = getCommandLinePath(userData, "dsreplication"); |
| | | cmdLine.add(cmdName); |
| | | cmdLine.add(subcommand); |
| | |
| | | return cmdLine; |
| | | } |
| | | |
| | | private static void addInitializeCommandOptions(UserData userData, ServerDescriptor server, ArrayList<String> cmdLine) |
| | | private static void addInitializeCommandOptions(UserData userData, ServerDescriptor server, List<String> cmdLine) |
| | | { |
| | | cmdLine.add("--hostSource"); |
| | | cmdLine.add(server.getHostName()); |
| | |
| | | cmdLine.add(String.valueOf(userData.getAdminConnectorPort())); |
| | | } |
| | | |
| | | private static void addCommonOptions(UserData userData, Set<String> baseDNs, ArrayList<String> cmdLine) |
| | | private static void addCommonOptions(UserData userData, Set<String> baseDNs, List<String> cmdLine) |
| | | { |
| | | for (String baseDN : baseDNs) |
| | | { |
| | |
| | | cmdLine.add("--noPropertiesFile"); |
| | | } |
| | | |
| | | private static ArrayList<String> getBaseDNs(UserData userData) |
| | | private static List<String> getBaseDNs(UserData userData) |
| | | { |
| | | ArrayList<String> baseDNs = new ArrayList<String>(); |
| | | List<String> baseDNs = new ArrayList<>(); |
| | | |
| | | 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; |
| | | repl.getType() == DataReplicationOptions.Type.FIRST_IN_TOPOLOGY |
| | | || repl.getType() == DataReplicationOptions.Type.STANDALONE |
| | | || suf.getType() == SuffixesToReplicateOptions.Type.NEW_SUFFIX_IN_TOPOLOGY; |
| | | |
| | | if (createSuffix) |
| | | { |
| | |
| | | return baseDNs; |
| | | } |
| | | |
| | | private static Map<ServerDescriptor, Set<String>> |
| | | getServerDescriptorBaseDNMap(UserData userData) |
| | | private static Map<ServerDescriptor, Set<String>> getServerDescriptorBaseDNMap(UserData userData) |
| | | { |
| | | Map<ServerDescriptor, Set<String>> hm = |
| | | new HashMap<ServerDescriptor, Set<String>>(); |
| | | Map<ServerDescriptor, Set<String>> hm = new HashMap<>(); |
| | | |
| | | Set<SuffixDescriptor> suffixes = |
| | | userData.getSuffixesToReplicateOptions().getSuffixes(); |
| | | AuthenticationData authData = |
| | | userData.getReplicationOptions().getAuthenticationData(); |
| | | String ldapURL = ConnectionUtils.getLDAPUrl(authData.getHostName(), |
| | | authData.getPort(), authData.useSecureConnection()); |
| | | 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())) |
| | | if (ldapURL.equalsIgnoreCase(replica.getServer().getAdminConnectorURL())) |
| | | { |
| | | // This is the server we're configuring |
| | | found = true; |
| | | Set<String> baseDNs = hm.get(replica.getServer()); |
| | | if (baseDNs == null) |
| | | { |
| | | baseDNs = new LinkedHashSet<String>(); |
| | | baseDNs = new LinkedHashSet<>(); |
| | | hm.put(replica.getServer(), baseDNs); |
| | | } |
| | | baseDNs.add(suffix.getDN()); |
| | |
| | | ReplicaDescriptor replica = suffix.getReplicas().iterator().next(); |
| | | if (replica != null) |
| | | { |
| | | Set<String> baseDNs = new LinkedHashSet<String>(); |
| | | Set<String> baseDNs = new LinkedHashSet<>(); |
| | | hm.put(replica.getServer(), baseDNs); |
| | | baseDNs.add(suffix.getDN()); |
| | | } |
| | |
| | | */ |
| | | public static List<List<String>> getDsConfigReplicationEnableEquivalentCommandLines(UserData userData) |
| | | { |
| | | final List<List<String>> cmdLines = new ArrayList<List<String>>(); |
| | | final List<List<String>> cmdLines = new ArrayList<>(); |
| | | final String cmdName = getCommandLinePath(userData, "dsconfig"); |
| | | |
| | | ArrayList<String> connectionArgs = new ArrayList<String>(); |
| | | List<String> connectionArgs = new ArrayList<>(); |
| | | connectionArgs.add("--hostName"); |
| | | connectionArgs.add(userData.getHostName()); |
| | | connectionArgs.add("--port"); |
| | |
| | | connectionArgs.add("--no-prompt"); |
| | | connectionArgs.add("--noPropertiesFile"); |
| | | |
| | | ArrayList<String> cmdReplicationServer = new ArrayList<String>(); |
| | | List<String> cmdReplicationServer = new ArrayList<>(); |
| | | 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("replication-port:" + userData.getReplicationOptions().getReplicationPort()); |
| | | cmdReplicationServer.add("--set"); |
| | | cmdReplicationServer.add("replication-server-id:1"); |
| | | cmdReplicationServer.add("--type"); |
| | |
| | | |
| | | for (String baseDN : getBaseDNs(userData)) |
| | | { |
| | | ArrayList<String> cmdDomain = new ArrayList<String>(); |
| | | List<String> cmdDomain = new ArrayList<>(); |
| | | 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("base-dn:" + baseDN); |
| | | cmdDomain.add("--set"); |
| | | cmdDomain.add("replication-server:"+userData.getHostName()+":"+ |
| | | userData.getReplicationOptions().getReplicationPort()); |
| | | cmdDomain.add("replication-server:" + userData.getHostName() + ":" |
| | | + userData.getReplicationOptions().getReplicationPort()); |
| | | cmdDomain.add("--set"); |
| | | cmdDomain.add("server-id:1"); |
| | | cmdDomain.add("--type"); |
| | |
| | | /** |
| | | * This class is used to avoid displaying the error message related to display |
| | | * problems that we might have when trying to display the SplashWindow. |
| | | * |
| | | */ |
| | | class EmptyPrintStream extends PrintStream { |
| | | class EmptyPrintStream extends PrintStream |
| | | { |
| | | private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass(); |
| | | |
| | | /** |
| | | * Default constructor. |
| | | * |
| | | */ |
| | | /** Default constructor. */ |
| | | public EmptyPrintStream() |
| | | { |
| | | super(new ByteArrayOutputStream(), true); |
| | | } |
| | | |
| | | /** {@inheritDoc} */ |
| | | @Override |
| | | public void println(String msg) |
| | | { |
| | | logger.info(LocalizableMessage.raw("EmptyStream msg: "+msg)); |
| | | logger.info(LocalizableMessage.raw("EmptyStream msg: " + msg)); |
| | | } |
| | | } |