From 856bfa759bec64b3cfc710fa26b755855bcc61c8 Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Wed, 28 Feb 2007 11:35:55 +0000
Subject: [PATCH] Fix for issue 1285.

---
 opends/src/statuspanel/org/opends/statuspanel/StatusCli.java             |    6 
 opends/src/statuspanel/org/opends/statuspanel/ui/LoginDialog.java        |    3 
 opends/src/server/org/opends/server/tools/InstallDS.java                 |   71 ++++-----
 opends/src/statuspanel/org/opends/statuspanel/StatusPanelController.java |    7 
 opends/build.xml                                                         |    4 
 opends/src/quicksetup/org/opends/quicksetup/CurrentInstallStatus.java    |   38 ++++
 opends/src/quicksetup/org/opends/quicksetup/util/Utils.java              |  135 ------------------
 opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java |    4 
 opends/src/statuspanel/org/opends/statuspanel/ServerStatusPooler.java    |    3 
 opends/src/server/org/opends/server/types/OperatingSystem.java           |   15 +-
 opends/src/server/org/opends/server/util/SetupUtils.java                 |  105 ++++++++++++++
 11 files changed, 195 insertions(+), 196 deletions(-)

diff --git a/opends/build.xml b/opends/build.xml
index aebd3e9..fffa8e2 100644
--- a/opends/build.xml
+++ b/opends/build.xml
@@ -417,7 +417,7 @@
     </copy>
     <copy todir="${quicksetup.classes.dir}">
       <fileset dir="${classes.dir}"
-               includes="**/DynamicConstants.class **/SetupUtils.class" />
+               includes="**/DynamicConstants.class **/SetupUtils.class **/OperatingSystem.class" />
     </copy>
   </target>
 
@@ -516,7 +516,7 @@
 
     <copy todir="${quicksetup.classes.dir}">
         <fileset dir="${classes.dir}"
-            includes="**/DynamicConstants.class **/SetupUtils.class"/>
+            includes="**/DynamicConstants.class **/SetupUtils.class **/OperatingSystem.class"/>
     </copy>
 
     <!-- Generate the quicksetup.jar file -->
diff --git a/opends/src/quicksetup/org/opends/quicksetup/CurrentInstallStatus.java b/opends/src/quicksetup/org/opends/quicksetup/CurrentInstallStatus.java
index b5afae0..9b39593 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/CurrentInstallStatus.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/CurrentInstallStatus.java
@@ -213,14 +213,40 @@
   }
 
   /**
-   * Indicates whether there is the server is running.
-   *
-   * @return <CODE>true</CODE> if the server is running, or <CODE>false</CODE>
-   *         if not.
+   * Returns if the server is running on the given path.
+   * NOTE: this method is to be called only when the OpenDS.jar class has
+   * already been loaded as it uses classes in that jar.
+   * @return <CODE>true</CODE> if the server is running and <CODE>false</CODE>
+   * otherwise.
    */
-  public boolean isServerRunning()
+  public static boolean isServerRunning()
   {
-    return Utils.isServerRunning(Utils.getInstallPathFromClasspath());
+    boolean isServerRunning;
+    String lockFile =
+      org.opends.server.core.LockFileManager.getServerLockFileName();
+    StringBuilder failureReason = new StringBuilder();
+    try
+    {
+      if (org.opends.server.core.LockFileManager.acquireExclusiveLock(lockFile,
+          failureReason))
+      {
+        org.opends.server.core.LockFileManager.releaseLock(lockFile,
+            failureReason);
+        isServerRunning = false;
+      }
+      else
+      {
+        isServerRunning = true;
+      }
+    }
+    catch (Throwable t)
+    {
+      t.printStackTrace();
+      // Assume that if we cannot acquire the lock file the server is
+      // running.
+      isServerRunning = true;
+    }
+    return isServerRunning;
   }
 
   /**
diff --git a/opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java b/opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java
index f6038e1..eb45df9 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/uninstaller/Uninstaller.java
@@ -39,6 +39,7 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.opends.quicksetup.CurrentInstallStatus;
 import org.opends.quicksetup.event.UninstallProgressUpdateEvent;
 import org.opends.quicksetup.event.UninstallProgressUpdateListener;
 import org.opends.quicksetup.i18n.ResourceProvider;
@@ -686,8 +687,7 @@
 
           for (int i=0; i<nTries && !stopped; i++)
           {
-            stopped = !Utils.isServerRunning(
-                Utils.getInstallPathFromClasspath());
+            stopped = !CurrentInstallStatus.isServerRunning();
             if (!stopped)
             {
               String msg =
diff --git a/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java b/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
index ce0a509..e722310 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
@@ -31,7 +31,6 @@
 import java.awt.Toolkit;
 import java.awt.Window;
 import java.io.BufferedOutputStream;
-import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.FileWriter;
@@ -39,11 +38,7 @@
 import java.io.InputStream;
 import java.io.PrintWriter;
 import java.io.RandomAccessFile;
-import java.io.Writer;
 import java.net.ConnectException;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -62,6 +57,7 @@
 import org.opends.quicksetup.CurrentInstallStatus;
 import org.opends.quicksetup.i18n.ResourceProvider;
 import org.opends.quicksetup.installer.webstart.JnlpProperties;
+import org.opends.server.util.SetupUtils;
 
 
 /**
@@ -229,51 +225,7 @@
    */
   public static boolean canUseAsPort(int port)
   {
-    boolean canUseAsPort = false;
-    ServerSocket serverSocket = null;
-    try
-    {
-      InetSocketAddress socketAddress = new InetSocketAddress(port);
-      serverSocket = new ServerSocket();
-      if (!isWindows())
-      {
-        serverSocket.setReuseAddress(true);
-      }
-      serverSocket.bind(socketAddress);
-      canUseAsPort = true;
-
-      serverSocket.close();
-
-      /* Try to create a socket because sometimes even if we can create a server
-       * socket there is already someone listening to the port (is the case
-       * of products as Sun DS 6.0).
-       */
-      try
-      {
-        new Socket("localhost", port);
-        canUseAsPort = false;
-
-      } catch (IOException ioe)
-      {
-      }
-
-    } catch (IOException ex)
-    {
-      canUseAsPort = false;
-    } finally
-    {
-      try
-      {
-        if (serverSocket != null)
-        {
-          serverSocket.close();
-        }
-      } catch (Exception ex)
-      {
-      }
-    }
-
-    return canUseAsPort;
+    return SetupUtils.canUseAsPort(port);
   }
 
   /**
@@ -285,7 +237,7 @@
    */
   public static boolean isPriviledgedPort(int port)
   {
-    return (port <= 1024) && !isWindows();
+    return SetupUtils.isPriviledgedPort(port);
   }
 
   /**
@@ -369,7 +321,7 @@
    */
   public static boolean isWindows()
   {
-    return containsOsProperty("windows");
+    return SetupUtils.isWindows();
   }
 
   /**
@@ -380,7 +332,7 @@
    */
   public static boolean isMacOS()
   {
-    return containsOsProperty("mac os");
+    return SetupUtils.isMacOS();
   }
 
   /**
@@ -391,7 +343,7 @@
    */
   public static boolean isUnix()
   {
-    return !isWindows();
+    return SetupUtils.isUnix();
   }
 
   /**
@@ -773,25 +725,6 @@
   }
 
   /**
-   * Commodity method to help identifying the OS we are running on.
-   * @param s the String that represents an OS.
-   * @return <CODE>true</CODE> if there is os java property exists and contains
-   * the value specified in s, <CODE>false</CODE> otherwise.
-   */
-  private static boolean containsOsProperty(String s)
-  {
-    boolean containsOsProperty = false;
-
-    String osName = System.getProperty("os.name");
-    if (osName != null)
-    {
-      containsOsProperty = osName.toLowerCase().indexOf(s) != -1;
-    }
-
-    return containsOsProperty;
-  }
-
-  /**
    * Sets the permissions of the provided paths with the provided permission
    * String.
    * @param paths the paths to set permissions on.
@@ -1362,62 +1295,6 @@
   }
 
   /**
-   * Returns if the server is running on the given path.
-   * @param serverPath the installation path of the server.
-   * @return <CODE>true</CODE> if the server is running and <CODE>false</CODE>
-   * otherwise.
-   */
-  public static boolean isServerRunning(String serverPath)
-  {
-    boolean isServerRunning;
-    if (isWindows())
-    {
-      String testPath = serverPath+File.separator+
-      "locks"+File.separator+"server.lock";
-      File testFile = new File(testPath);
-
-      boolean canWriteFile = false;
-      Writer output = null;
-      try {
-        //use buffering
-        //FileWriter always assumes default encoding is OK!
-        output = new BufferedWriter( new FileWriter(testFile) );
-        output.write("test");
-        output.close();
-        output = new BufferedWriter( new FileWriter(testFile) );
-        output.write("");
-        output.close();
-
-        canWriteFile = true;
-
-      }
-      catch (Throwable t)
-      {
-      }
-      finally
-      {
-        if (output != null)
-        {
-          try
-          {
-            output.close();
-          }
-          catch (Throwable t)
-          {
-          }
-        }
-      }
-      isServerRunning = !canWriteFile;
-    }
-    else
-    {
-      isServerRunning = fileExists(serverPath+File.separator+
-          "logs"+File.separator+"server.pid");
-    }
-    return isServerRunning;
-  }
-
-  /**
    * This is just a commodity method used to try to get an InitialLdapContext.
    * @param t the Thread to be used to create the InitialLdapContext.
    * @param pair an Object[] array that contains the InitialLdapContext and the
diff --git a/opends/src/server/org/opends/server/tools/InstallDS.java b/opends/src/server/org/opends/server/tools/InstallDS.java
index ba2e087..9447387 100644
--- a/opends/src/server/org/opends/server/tools/InstallDS.java
+++ b/opends/src/server/org/opends/server/tools/InstallDS.java
@@ -30,9 +30,6 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.LinkedList;
@@ -424,6 +421,29 @@
       try
       {
         ldapPortNumber = ldapPort.getIntValue();
+
+        if (! skipPortCheck.isPresent())
+        {
+          // Check if the port can be used.
+          if (!SetupUtils.canUseAsPort(ldapPortNumber))
+          {
+            int msgID;
+            String message;
+            if (SetupUtils.isPriviledgedPort(ldapPortNumber))
+            {
+              msgID   = MSGID_INSTALLDS_CANNOT_BIND_TO_PRIVILEGED_PORT;
+              message = getMessage(msgID, ldapPortNumber);
+              System.err.println(wrapText(message, MAX_LINE_WIDTH));
+            }
+            else
+            {
+              msgID   = MSGID_INSTALLDS_CANNOT_BIND_TO_PORT;
+              message = getMessage(msgID, ldapPortNumber);
+              System.err.println(wrapText(message, MAX_LINE_WIDTH));
+            }
+            return 1;
+          }
+        }
       }
       catch (ArgumentException ae)
       {
@@ -439,45 +459,20 @@
         String message = getMessage(msgID);
         ldapPortNumber = promptForInteger(message, 389, 1, 65535);
 
-        if (! skipPortCheck.isPresent())
+        if (skipPortCheck.isPresent())
         {
-          try
+            break;
+        }
+        else
+        {
+          // Check if the port can be used.
+          if (SetupUtils.canUseAsPort(ldapPortNumber))
           {
-            InetSocketAddress socketAddress =
-                                   new InetSocketAddress(ldapPortNumber);
-            ServerSocket serverSocket = new ServerSocket();
-            serverSocket.setReuseAddress(true);
-            serverSocket.bind(socketAddress);
-            serverSocket.close();
-
-            try
-            {
-              Socket socket = new Socket("127.0.0.1", ldapPortNumber);
-              socket.close();
-              if ((ldapPortNumber <= 1024) && (! isWindows))
-              {
-                msgID   = MSGID_INSTALLDS_CANNOT_BIND_TO_PRIVILEGED_PORT;
-                message = getMessage(msgID, ldapPortNumber);
-                System.err.println(wrapText(message, MAX_LINE_WIDTH));
-              }
-              else
-              {
-                msgID   = MSGID_INSTALLDS_CANNOT_BIND_TO_PORT;
-                message = getMessage(msgID, ldapPortNumber);
-                System.err.println(wrapText(message, MAX_LINE_WIDTH));
-              }
-
-              continue;
-            }
-            catch (Exception e)
-            {
-              // This is expected, so no action should be taken.
               break;
-            }
           }
-          catch (Exception e)
+          else
           {
-            if ((ldapPortNumber <= 1024) && (! isWindows))
+            if (SetupUtils.isPriviledgedPort(ldapPortNumber))
             {
               msgID   = MSGID_INSTALLDS_CANNOT_BIND_TO_PRIVILEGED_PORT;
               message = getMessage(msgID, ldapPortNumber);
@@ -489,8 +484,6 @@
               message = getMessage(msgID, ldapPortNumber);
               System.err.println(wrapText(message, MAX_LINE_WIDTH));
             }
-
-            continue;
           }
         }
       }
diff --git a/opends/src/server/org/opends/server/types/OperatingSystem.java b/opends/src/server/org/opends/server/types/OperatingSystem.java
index f6d4a1b..3f4250b 100644
--- a/opends/src/server/org/opends/server/types/OperatingSystem.java
+++ b/opends/src/server/org/opends/server/types/OperatingSystem.java
@@ -26,15 +26,16 @@
  */
 package org.opends.server.types;
 
-
-
-import static org.opends.server.util.StaticUtils.*;
-
-
-
 /**
  * This class defines an enumeration that may be used to identify
  * the operating system on which the JVM is running.
+ *
+ * NOTE: to share code this class is used in SetupUtils and should
+ * not contain any dependency with other classes (not even with
+ * classes in this package).
+ * If this class is modified to depend on other classes it will break
+ * the quicksetup.  If this must be done, the references to this
+ * class in SetupUtils must be removed.
  */
 public enum OperatingSystem
 {
@@ -148,7 +149,7 @@
     }
 
 
-    String lowerName = toLowerCase(osName);
+    String lowerName = osName.toLowerCase();
 
     if ((lowerName.indexOf("solaris") >= 0) ||
         (lowerName.indexOf("sunos") >= 0))
diff --git a/opends/src/server/org/opends/server/util/SetupUtils.java b/opends/src/server/org/opends/server/util/SetupUtils.java
index b954cc1..a4908be 100644
--- a/opends/src/server/org/opends/server/util/SetupUtils.java
+++ b/opends/src/server/org/opends/server/util/SetupUtils.java
@@ -32,8 +32,12 @@
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
 import java.util.LinkedList;
 
+import org.opends.server.types.OperatingSystem;
 
 
 /**
@@ -116,7 +120,27 @@
     return templateFile;
   }
 
+  /**
+   * Returns {@code true} if we are running under Mac OS and
+   * {@code false} otherwise.
+   * @return {@code true} if we are running under Mac OS and
+   * {@code false} otherwise.
+   */
+  public static boolean isMacOS()
+  {
+    return OperatingSystem.MACOS == getOperatingSystem();
+  }
 
+  /**
+   * Returns {@code true} if we are running under Unix and
+   * {@code false} otherwise.
+   * @return {@code true} if we are running under Unix and
+   * {@code false} otherwise.
+   */
+  public static boolean isUnix()
+  {
+    return OperatingSystem.isUNIXBased(getOperatingSystem());
+  }
 
   /**
    * Indicates whether the underlying operating system is a Windows variant.
@@ -126,8 +150,17 @@
    */
   public static boolean isWindows()
   {
-    String osName = System.getProperty("os.name");
-    return ((osName != null) && (osName.toLowerCase().indexOf("windows") >= 0));
+      return OperatingSystem.WINDOWS == getOperatingSystem();
+  }
+
+
+  /**
+   * Commodity method to help identifying the OS we are running on.
+   * @return the OperatingSystem we are running on.
+   */
+  private static OperatingSystem getOperatingSystem()
+  {
+    return OperatingSystem.forName(System.getProperty("os.name"));
   }
 
 
@@ -200,5 +233,73 @@
 
     return setJavaHomeFile;
   }
+
+  /**
+   * Returns {@code true} if the provided port is free and we can use it,
+   * {@code false} otherwise.
+   * @param port the port we are analyzing.
+   * @return {@code true} if the provided port is free and we can use it,
+   * {@code false} otherwise.
+   */
+  public static boolean canUseAsPort(int port)
+  {
+    boolean canUseAsPort = false;
+    ServerSocket serverSocket = null;
+    try
+    {
+      InetSocketAddress socketAddress = new InetSocketAddress(port);
+      serverSocket = new ServerSocket();
+      if (!isWindows())
+      {
+        serverSocket.setReuseAddress(true);
+      }
+      serverSocket.bind(socketAddress);
+      canUseAsPort = true;
+
+      serverSocket.close();
+
+      /* Try to create a socket because sometimes even if we can create a server
+       * socket there is already someone listening to the port (is the case
+       * of products as Sun DS 6.0).
+       */
+      try
+      {
+        new Socket("localhost", port);
+        canUseAsPort = false;
+
+      } catch (IOException ioe)
+      {
+      }
+
+    } catch (IOException ex)
+    {
+      canUseAsPort = false;
+    } finally
+    {
+      try
+      {
+        if (serverSocket != null)
+        {
+          serverSocket.close();
+        }
+      } catch (Exception ex)
+      {
+      }
+    }
+
+    return canUseAsPort;
+  }
+
+  /**
+   * Returns {@code true} if the provided port is a priviledged port,
+   * {@code false} otherwise.
+   * @param port the port we are analyzing.
+   * @return {@code true} if the provided port is a priviledged port,
+   * {@code false} otherwise.
+   */
+  public static boolean isPriviledgedPort(int port)
+  {
+    return (port <= 1024) && !isWindows();
+  }
 }
 
diff --git a/opends/src/statuspanel/org/opends/statuspanel/ServerStatusPooler.java b/opends/src/statuspanel/org/opends/statuspanel/ServerStatusPooler.java
index 6839df9..57b4c33 100644
--- a/opends/src/statuspanel/org/opends/statuspanel/ServerStatusPooler.java
+++ b/opends/src/statuspanel/org/opends/statuspanel/ServerStatusPooler.java
@@ -30,6 +30,7 @@
 import java.io.File;
 import java.util.HashSet;
 
+import org.opends.quicksetup.CurrentInstallStatus;
 import org.opends.quicksetup.util.Utils;
 import org.opends.statuspanel.event.ServerStatusChangeEvent;
 import org.opends.statuspanel.event.ServerStatusChangeListener;
@@ -280,7 +281,7 @@
     {
       desc.setStatus(ServerStatusDescriptor.ServerStatus.STOPPING);
     }
-    else if (Utils.isServerRunning(Utils.getInstallPathFromClasspath()))
+    else if (CurrentInstallStatus.isServerRunning())
     {
       desc.setStatus(ServerStatusDescriptor.ServerStatus.STARTED);
     }
diff --git a/opends/src/statuspanel/org/opends/statuspanel/StatusCli.java b/opends/src/statuspanel/org/opends/statuspanel/StatusCli.java
index 346b51f..9509499 100644
--- a/opends/src/statuspanel/org/opends/statuspanel/StatusCli.java
+++ b/opends/src/statuspanel/org/opends/statuspanel/StatusCli.java
@@ -37,6 +37,7 @@
 
 import javax.swing.table.TableModel;
 
+import org.opends.quicksetup.CurrentInstallStatus;
 import org.opends.quicksetup.util.Utils;
 
 import org.opends.server.core.DirectoryServer;
@@ -231,8 +232,7 @@
     }
     else
     {
-      boolean isServerRunning =
-        Utils.isServerRunning(Utils.getInstallPathFromClasspath());
+      boolean isServerRunning = CurrentInstallStatus.isServerRunning();
       /* This is required to retrieve the ldap url to be used by the
        * ConfigFromLDAP class.
        */
@@ -355,7 +355,7 @@
     ServerStatusDescriptor desc = new ServerStatusDescriptor();
     desc.setAuthenticated((dn != null) && (pwd != null));
 
-    if (Utils.isServerRunning(Utils.getInstallPathFromClasspath()))
+    if (CurrentInstallStatus.isServerRunning())
     {
       desc.setStatus(ServerStatusDescriptor.ServerStatus.STARTED);
     }
diff --git a/opends/src/statuspanel/org/opends/statuspanel/StatusPanelController.java b/opends/src/statuspanel/org/opends/statuspanel/StatusPanelController.java
index 9b866d0..b396de7 100644
--- a/opends/src/statuspanel/org/opends/statuspanel/StatusPanelController.java
+++ b/opends/src/statuspanel/org/opends/statuspanel/StatusPanelController.java
@@ -39,6 +39,7 @@
 
 import org.opends.server.core.DirectoryServer;
 
+import org.opends.quicksetup.CurrentInstallStatus;
 import org.opends.quicksetup.ui.UIFactory;
 import org.opends.quicksetup.util.BackgroundTask;
 import org.opends.quicksetup.util.HtmlProgressMessageFormatter;
@@ -581,8 +582,7 @@
         boolean running = false;
         for (int i=0; i<5 && !running; i++)
         {
-          running = Utils.isServerRunning(
-              Utils.getInstallPathFromClasspath());
+          running = CurrentInstallStatus.isServerRunning();
         }
 
         if (!running)
@@ -706,8 +706,7 @@
           int nTries = 10;
           for (int i=0; i<nTries && !stopped; i++)
           {
-            stopped = !Utils.isServerRunning(
-                Utils.getInstallPathFromClasspath());
+            stopped = !CurrentInstallStatus.isServerRunning();
             if (!stopped)
             {
               String msg =
diff --git a/opends/src/statuspanel/org/opends/statuspanel/ui/LoginDialog.java b/opends/src/statuspanel/org/opends/statuspanel/ui/LoginDialog.java
index 327cd9a..b16e1c9 100644
--- a/opends/src/statuspanel/org/opends/statuspanel/ui/LoginDialog.java
+++ b/opends/src/statuspanel/org/opends/statuspanel/ui/LoginDialog.java
@@ -48,6 +48,7 @@
 import javax.swing.JTextField;
 import javax.swing.text.JTextComponent;
 
+import org.opends.quicksetup.CurrentInstallStatus;
 import org.opends.quicksetup.event.MinimumSizeComponentListener;
 import org.opends.quicksetup.ui.UIFactory;
 import org.opends.quicksetup.util.BackgroundTask;
@@ -535,7 +536,7 @@
    */
   private boolean isServerRunning()
   {
-    return Utils.isServerRunning(Utils.getInstallPathFromClasspath());
+    return CurrentInstallStatus.isServerRunning();
   }
 
   /**

--
Gitblit v1.10.0