From cff43fc7f41e92c215f656b1e4b7f2f711532959 Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Wed, 25 Oct 2006 18:55:52 +0000
Subject: [PATCH] Make several changes to administrative shell scripts provided with OpenDS. All of these changes fall under the blanket of issue 882, but are also associated with a number of individual sub-issues.

---
 opends/src/server/org/opends/server/core/DirectoryServer.java |   92 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 92 insertions(+), 0 deletions(-)

diff --git a/opends/src/server/org/opends/server/core/DirectoryServer.java b/opends/src/server/org/opends/server/core/DirectoryServer.java
index abc190e..25ac8f5 100644
--- a/opends/src/server/org/opends/server/core/DirectoryServer.java
+++ b/opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -27,6 +27,9 @@
 package org.opends.server.core;
 
 
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
 import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -142,6 +145,7 @@
 import org.opends.server.types.ResultCode;
 import org.opends.server.types.Schema;
 import org.opends.server.types.WritabilityMode;
+import org.opends.server.util.MultiOutputStream;
 import org.opends.server.util.TimeThread;
 import org.opends.server.util.args.ArgumentException;
 import org.opends.server.util.args.ArgumentParser;
@@ -1041,6 +1045,16 @@
       // Deregister the startup-specific debug and error loggers.
       removeDebugLogger(startupDebugLogger);
       removeErrorLogger(startupErrorLogger);
+
+
+      // If a server.starting file exists, then remove it.
+      File serverStartingFile =
+                new File(configHandler.getServerRoot() + File.separator +
+                         "logs" + File.separator + "server.starting");
+      if (serverStartingFile.exists())
+      {
+        serverStartingFile.delete();
+      }
     }
   }
 
@@ -7408,6 +7422,7 @@
     BooleanArgument displayUsage = null;
     BooleanArgument dumpMessages = null;
     BooleanArgument fullVersion  = null;
+    BooleanArgument noDetach     = null;
     BooleanArgument systemInfo   = null;
     BooleanArgument version      = null;
     StringArgument  configClass  = null;
@@ -7460,6 +7475,12 @@
       argParser.addArgument(dumpMessages);
 
 
+      noDetach = new BooleanArgument("nodetach", 'N', "noDetach",
+                                     MSGID_DSCORE_DESCRIPTION_NODETACH);
+      noDetach.setHidden(true);
+      argParser.addArgument(noDetach);
+
+
       displayUsage = new BooleanArgument("help", 'H', "help",
                                          MSGID_DSCORE_DESCRIPTION_USAGE);
       argParser.addArgument(displayUsage);
@@ -7539,6 +7560,8 @@
                          System.getProperty("java.vm.version"));
       System.out.println("JVM Vendor:             " +
                          System.getProperty("java.vm.vendor"));
+      System.out.println("Java Home:              " +
+                         System.getProperty("java.home"));
       System.out.println("Class Path:             " +
                          System.getProperty("java.class.path"));
       System.out.println("Current Directory:      " +
@@ -7581,6 +7604,75 @@
     }
 
 
+    // Redirect standard output and standard error to the server.out file.  If
+    // the server hasn't detached from the terminal, then also continue writing
+    // to the original standard output and standard error.  Also, configure the
+    // JVM to delete the PID file on exit, if it exists.
+    PrintStream serverOutStream;
+    try
+    {
+      // We need to figure out where to put the file.  See if the server root
+      // is available as an environment variable and if so then use it.
+      // Otherwise, try to figure it out from the location of the config file.
+      String serverRoot = System.getenv(ENV_VAR_INSTANCE_ROOT);
+      if (serverRoot == null)
+      {
+        serverRoot = new File(configFile.getValue()).getParentFile().
+                              getParentFile().getAbsolutePath();
+      }
+
+      if (serverRoot == null)
+      {
+        System.err.println("WARNING:  Unable to determine server root in " +
+                           "order to redirect standard output and standard " +
+                           "error.");
+      }
+      else
+      {
+        File logDir = new File(serverRoot + File.separator + "logs");
+        if (logDir.exists())
+        {
+          FileOutputStream fos =
+               new FileOutputStream(new File(logDir, "server.out"), true);
+          serverOutStream = new PrintStream(fos);
+
+          if (noDetach.isPresent())
+          {
+            MultiOutputStream multiStream =
+                 new MultiOutputStream(System.out, serverOutStream);
+            serverOutStream = new PrintStream(multiStream);
+          }
+
+          System.setOut(serverOutStream);
+          System.setErr(serverOutStream);
+
+          File f = new File(logDir, "server.pid");
+          if (f.exists())
+          {
+            f.deleteOnExit();
+          }
+
+          f = new File(logDir, "server.starting");
+          if (f.exists())
+          {
+            f.deleteOnExit();
+          }
+        }
+        else
+        {
+          System.err.println("WARNING:  Unable to redirect standard output " +
+                             "and standard error because the logs directory " +
+                             logDir.getAbsolutePath() + " does not exist.");
+        }
+      }
+    }
+    catch (Exception e)
+    {
+      System.err.println("WARNING:  Unable to redirect standard output and " +
+                         "standard error:  " + stackTraceToSingleLineString(e));
+    }
+
+
     // Bootstrap and start the Directory Server.
     DirectoryServer directoryServer = DirectoryServer.getInstance();
     try

--
Gitblit v1.10.0