001    /*
002     * CDDL HEADER START
003     *
004     * The contents of this file are subject to the terms of the
005     * Common Development and Distribution License, Version 1.0 only
006     * (the "License").  You may not use this file except in compliance
007     * with the License.
008     *
009     * You can obtain a copy of the license at
010     * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011     * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012     * See the License for the specific language governing permissions
013     * and limitations under the License.
014     *
015     * When distributing Covered Code, include this CDDL HEADER in each
016     * file and include the License file at
017     * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
018     * add the following below this CDDL HEADER, with the fields enclosed
019     * by brackets "[]" replaced with your own identifying information:
020     *      Portions Copyright [yyyy] [name of copyright owner]
021     *
022     * CDDL HEADER END
023     *
024     *
025     *      Copyright 2008 Sun Microsystems, Inc.
026     */
027    
028    package org.opends.server.tools;
029    import org.opends.messages.Message;
030    
031    import java.io.OutputStream;
032    import java.io.PrintStream;
033    
034    import org.opends.server.types.NullOutputStream;
035    import org.opends.server.util.SetupUtils;
036    
037    import static org.opends.messages.ToolMessages.*;
038    import static org.opends.server.util.StaticUtils.*;
039    
040    /**
041      * This class is used to start the Windows service associated with this
042      * instance on this machine.
043      * This tool allows to start OpenDS and to make it run as a Windows service.
044      */
045    public class StartWindowsService
046    {
047      /**
048        * The service was successfully started.
049        */
050      private static int SERVICE_START_SUCCESSFUL = 0;
051      /**
052        * The service could not be found.
053        */
054      private static int SERVICE_NOT_FOUND = 1;
055    
056      /**
057        * The service could not be started.
058        */
059      private static int SERVICE_START_ERROR = 2;
060    
061      /**
062       * Invokes the net start on the service corresponding to this server.
063       *
064       * @param  args  The command-line arguments provided to this program.
065       */
066      public static void main(String[] args)
067      {
068        int result = startWindowsService(System.out, System.err);
069    
070        System.exit(filterExitCode(result));
071      }
072    
073      /**
074       * Invokes the net start on the service corresponding to this server, it
075       * writes information and error messages in the provided streams.
076       * @return <CODE>SERVICE_START_SUCCESSFUL</CODE>,
077       * <CODE>SERVICE_NOT_FOUND</CODE>, <CODE>SERVICE_ALREADY_STARTED</CODE> or
078       * <CODE>SERVICE_START_ERROR</CODE> depending on whether the service could be
079       * stopped or not.
080       * @param  outStream  The stream to write standard output messages.
081       * @param  errStream  The stream to write error messages.
082       */
083      public static int startWindowsService(OutputStream outStream,
084                               OutputStream errStream)
085      {
086        int returnValue;
087        PrintStream out;
088        if (outStream == null)
089        {
090          out = NullOutputStream.printStream();
091        }
092        else
093        {
094          out = new PrintStream(outStream);
095        }
096    
097        PrintStream err;
098        if (errStream == null)
099        {
100          err = NullOutputStream.printStream();
101        }
102        else
103        {
104          err = new PrintStream(errStream);
105        }
106    
107        String serviceName = ConfigureWindowsService.getServiceName();
108        if (serviceName == null)
109        {
110    
111          Message message = ERR_WINDOWS_SERVICE_NOT_FOUND.get();
112          err.println(message);
113          returnValue = SERVICE_NOT_FOUND;
114        }
115        else
116        {
117          String[] cmd;
118          if (SetupUtils.isVista())
119          {
120            cmd= new String[] {
121                ConfigureWindowsService.getLauncherBinaryFullPath(),
122                ConfigureWindowsService.LAUNCHER_OPTION,
123                ConfigureWindowsService.getLauncherAdministratorBinaryFullPath(),
124                ConfigureWindowsService.LAUNCHER_OPTION,
125                "net",
126                "start",
127                serviceName
128            };
129          }
130          else
131          {
132            cmd= new String[] {
133                "net",
134                "start",
135                serviceName
136            };
137          }
138          /* Check if is a running service */
139          try
140          {
141            if (Runtime.getRuntime().exec(cmd).waitFor() == 0)
142            {
143              returnValue = SERVICE_START_SUCCESSFUL;
144            }
145            else
146            {
147              returnValue = SERVICE_START_ERROR;
148            }
149          }
150          catch (Throwable t)
151          {
152    
153            Message message = ERR_WINDOWS_SERVICE_START_ERROR.get();
154            out.println(message);
155            returnValue = SERVICE_START_ERROR;
156          }
157        }
158        return returnValue;
159      }
160    }