From 0784c51efd47d487da5ceef923101c0ea1ea7373 Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Fri, 16 Mar 2007 14:10:42 +0000
Subject: [PATCH] Fix for issue 1382 (Provide a way to cleanup the registry/service information for Windows).

---
 opends/src/server/org/opends/server/tools/ConfigureWindowsService.java |  100 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 99 insertions(+), 1 deletions(-)

diff --git a/opends/src/server/org/opends/server/tools/ConfigureWindowsService.java b/opends/src/server/org/opends/server/tools/ConfigureWindowsService.java
index fd16026..72e243b 100644
--- a/opends/src/server/org/opends/server/tools/ConfigureWindowsService.java
+++ b/opends/src/server/org/opends/server/tools/ConfigureWindowsService.java
@@ -39,6 +39,7 @@
 import org.opends.server.util.args.ArgumentException;
 import org.opends.server.util.args.ArgumentParser;
 import org.opends.server.util.args.BooleanArgument;
+import org.opends.server.util.args.StringArgument;
 
 import static org.opends.server.messages.MessageHandler.getMessage;
 import static org.opends.server.messages.ToolMessages.*;
@@ -118,6 +119,27 @@
   public static final int SERVICE_STATE_ERROR = 2;
 
   /**
+   * Return codes for the method cleanupService.
+   */
+  /**
+   * The service cleanup worked.
+   */
+  public static final int SERVICE_CLEANUP_SUCCESS = 0;
+  /**
+   * The service could not be found.
+   */
+  public static final int SERVICE_NOT_FOUND = 1;
+  /**
+   * An error occurred cleaning up the service.
+   */
+  public static final int SERVICE_CLEANUP_ERROR = 2;
+  /**
+   * The service is marked for deletion.
+   */
+  public static final int SERVICE_CLEANUP_MARKED_FOR_DELETION = 3;
+
+
+  /**
    * Configures the Windows service for this instance on this machine.
    * This tool allows to enable and disable OpenDS to run as a Windows service
    * and allows to know if OpenDS is running as a Windows service or not.
@@ -174,6 +196,7 @@
     BooleanArgument enableService = null;
     BooleanArgument disableService = null;
     BooleanArgument serviceState = null;
+    StringArgument cleanupService = null;
     BooleanArgument showUsage = null;
 
     try
@@ -192,6 +215,11 @@
           MSGID_CONFIGURE_WINDOWS_SERVICE_DESCRIPTION_STATE);
       argParser.addArgument(serviceState);
 
+      cleanupService = new StringArgument("cleanupservice", 'c',
+          "cleanupService", false, false, true, "{serviceName}", null, null,
+          MSGID_CONFIGURE_WINDOWS_SERVICE_DESCRIPTION_CLEANUP);
+      argParser.addArgument(cleanupService);
+
       showUsage = new BooleanArgument("showusage", 'H', "help",
           MSGID_CONFIGURE_WINDOWS_SERVICE_DESCRIPTION_SHOWUSAGE);
       argParser.addArgument(showUsage);
@@ -241,6 +269,10 @@
       {
         nArgs++;
       }
+      if (cleanupService.isPresent())
+      {
+        nArgs++;
+      }
       if (nArgs > 1)
       {
         int msgID = MSGID_CONFIGURE_WINDOWS_SERVICE_TOO_MANY_ARGS;
@@ -269,10 +301,14 @@
       {
         returnValue = disableService(out, err);
       }
-      else
+      else if (serviceState.isPresent())
       {
         returnValue = serviceState(out, err);
       }
+      else
+      {
+        returnValue = cleanupService(cleanupService.getValue(), out, err);
+      }
     }
 
     return returnValue;
@@ -464,6 +500,68 @@
   }
 
   /**
+   * Cleans up a service for a given service name.
+   * @param serviceName the service name to be cleaned up.
+   * @param out the stream used to write the standard output.
+   * @param err the stream used to write the error output.
+   * @return <CODE>SERVICE_CLEANUP_SUCCESS</CODE>,
+   * <CODE>SERVICE_NOT_FOUND</CODE>,
+   * <CODE>SERVICE_MARKED_FOR_DELETION</CODE> or
+   * <CODE>SERVICE_CLEANUP_ERROR</CODE> depending on whether the service
+   * could be found or not.
+   */
+  public static int cleanupService(String serviceName, PrintStream out,
+      PrintStream err)
+  {
+    int returnValue;
+    String msg;
+    String[] cmd = {
+        getBinaryFullPath(),
+        "cleanup",
+        serviceName
+        };
+    try
+    {
+      int resultCode = Runtime.getRuntime().exec(cmd).waitFor();
+      switch (resultCode)
+      {
+      case 0:
+        returnValue = SERVICE_CLEANUP_SUCCESS;
+        msg = getMessage(MSGID_WINDOWS_SERVICE_CLEANUP_SUCCESS, serviceName);
+        out.println(msg);
+        break;
+      case 1:
+        returnValue = SERVICE_NOT_FOUND;
+        msg = getMessage(MSGID_WINDOWS_SERVICE_CLEANUP_NOT_FOUND, serviceName);
+        err.println(msg);
+        break;
+      case 2:
+        returnValue = SERVICE_CLEANUP_MARKED_FOR_DELETION;
+        msg = getMessage(MSGID_WINDOWS_SERVICE_CLEANUP_MARKED_FOR_DELETION,
+            serviceName);
+        out.println(msg);
+        break;
+      case 3:
+        returnValue = SERVICE_CLEANUP_ERROR;
+        msg = getMessage(MSGID_WINDOWS_SERVICE_CLEANUP_ERROR, serviceName);
+        err.println(msg);
+        break;
+      default:
+        returnValue = SERVICE_CLEANUP_ERROR;
+        msg = getMessage(MSGID_WINDOWS_SERVICE_CLEANUP_ERROR, serviceName);
+        err.println(msg);
+      }
+    }
+    catch (Throwable t)
+    {
+      returnValue = SERVICE_CLEANUP_ERROR;
+      msg = getMessage(MSGID_WINDOWS_SERVICE_CLEANUP_ERROR, serviceName);
+      err.println(msg);
+    }
+    return returnValue;
+  }
+
+  /**
     * Checks if OpenDS is enabled as a windows service and if it is
     * write the serviceName in the output stream (if it is not null).
     * @param out the stream used to write the standard output.

--
Gitblit v1.10.0