/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2008 Sun Microsystems, Inc.
* Portions Copyright 2010-2013 ForgeRock AS
*/
package org.opends.server.tools;
import java.io.File;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import org.opends.messages.Message;
import org.opends.server.core.DirectoryServer;
import org.opends.server.types.FilePermission;
import org.opends.server.types.NullOutputStream;
import org.opends.server.types.OperatingSystem;
import org.opends.server.util.EmbeddedUtils;
import org.opends.server.util.SetupUtils;
import org.opends.server.util.args.ArgumentParser;
import org.opends.server.util.args.ArgumentException;
import org.opends.server.util.args.BooleanArgument;
import org.opends.server.util.args.StringArgument;
import static org.opends.messages.ToolMessages.*;
import static org.opends.server.config.ConfigConstants.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.DynamicConstants.*;
import static org.opends.server.util.StaticUtils.*;
/**
* This program provides a tool that may be used to generate an RC script that
* can be used to start, stop, and restart the Directory Server, as well as to
* display its current status. It is only intended for use on UNIX-based
* systems that support the use of RC scripts in a location like /etc/init.d.
*/
public class CreateRCScript
{
/**
* Parse the command line arguments and create an RC script that can be used
* to control the server.
*
* @param args The command-line arguments provided to this program.
*/
public static void main(String[] args)
{
int exitCode = main(args, System.out, System.err);
if (exitCode != 0)
{
System.exit(exitCode);
}
}
/**
* Parse the command line arguments and create an RC script that can be used
* to control the server.
*
* @param args The command-line arguments provided to this program.
* @param outStream The output stream to which standard output should be
* directed, or {@code null} if standard output should be
* suppressed.
* @param errStream The output stream to which standard error should be
* directed, or {@code null} if standard error should be
* suppressed.
*
* @return Zero if all processing completed successfully, or nonzero if an
* error occurred.
*/
public static int main(String[] args, OutputStream outStream,
OutputStream errStream)
{
PrintStream err;
if (errStream == null)
{
err = NullOutputStream.printStream();
}
else
{
err = new PrintStream(errStream);
}
EmbeddedUtils.initializeForClientUse();
OperatingSystem operatingSystem = DirectoryServer.getOperatingSystem();
if (! OperatingSystem.isUNIXBased(operatingSystem))
{
err.println(ERR_CREATERC_ONLY_RUNS_ON_UNIX.get().toString());
return 1;
}
File serverRoot = DirectoryServer.getEnvironmentConfig().getServerRoot();
if (serverRoot == null)
{
err.println(ERR_CREATERC_UNABLE_TO_DETERMINE_SERVER_ROOT.get(
PROPERTY_SERVER_ROOT, ENV_VAR_INSTALL_ROOT).toString());
return 1;
}
Message description = INFO_CREATERC_TOOL_DESCRIPTION.get();
ArgumentParser argParser =
new ArgumentParser(CreateRCScript.class.getName(), description, false);
BooleanArgument showUsage;
StringArgument javaArgs;
StringArgument javaHome;
StringArgument outputFile;
StringArgument userName;
try
{
outputFile = new StringArgument("outputfile", 'f', "outputFile", true,
false, true, INFO_PATH_PLACEHOLDER.get(),
null, null,
INFO_CREATERC_OUTFILE_DESCRIPTION.get());
argParser.addArgument(outputFile);
userName = new StringArgument("username", 'u', "userName", false, false,
true, INFO_USER_NAME_PLACEHOLDER.get(),
null, null,
INFO_CREATERC_USER_DESCRIPTION.get());
argParser.addArgument(userName);
javaHome = new StringArgument("javahome", 'j', "javaHome", false, false,
true, INFO_PATH_PLACEHOLDER.get(), null,
null,
INFO_CREATERC_JAVA_HOME_DESCRIPTION.get());
argParser.addArgument(javaHome);
javaArgs = new StringArgument("javaargs", 'J', "javaArgs", false, false,
true, INFO_ARGS_PLACEHOLDER.get(), null,
null,
INFO_CREATERC_JAVA_ARGS_DESCRIPTION.get());
argParser.addArgument(javaArgs);
showUsage = new BooleanArgument("help", 'H', "help",
INFO_DESCRIPTION_SHOWUSAGE.get());
argParser.addArgument(showUsage);
argParser.setUsageArgument(showUsage);
}
catch (ArgumentException ae)
{
err.println(ERR_CANNOT_INITIALIZE_ARGS.get(ae.getMessage()));
return 1;
}
try
{
argParser.parseArguments(args);
}
catch (ArgumentException ae)
{
err.println(ERR_ERROR_PARSING_ARGS.get(ae.getMessage()).toString());
return 1;
}
if (argParser.usageOrVersionDisplayed())
{
return 0;
}
// Determine the path to the Java installation that should be used.
String javaHomeDir;
if (javaHome.isPresent())
{
File f = new File(javaHome.getValue());
if (! (f.exists() && f.isDirectory()))
{
err.println(ERR_CREATERC_JAVA_HOME_DOESNT_EXIST.get(
javaHome.getValue()).toString());
return 1;
}
javaHomeDir = f.getAbsolutePath();
}
else
{
javaHomeDir = System.getenv(SetupUtils.OPENDJ_JAVA_HOME);
}
String suString = "";
String EscQuote1 = "\"";
String EscQuote2 = "";
if (userName.isPresent())
{
String suCmd = "/bin/su";
File f = new File(suCmd);
if (! f.exists())
{
suCmd = "/usr/bin/su";
File f2 = new File(suCmd);
if (! f2.exists())
{
// Default to /bin/su anyway
suCmd = "/bin/su";
}
}
suString = suCmd + " " + userName.getValue() + " -c ";
EscQuote1 = "";
EscQuote2 = "\"";
}
// Start writing the output file.
try
{
File f = new File(outputFile.getValue());
PrintWriter w = new PrintWriter(f);
w.println("#!/bin/sh");
w.println("#");
for (String headerLine : CDDL_HEADER_LINES)
{
w.println("# " + headerLine);
}
w.println("# chkconfig: 345 95 5");
w.println("# description: Control the " +
SHORT_NAME + " Directory Server");
w.println();
w.println();
w.println("# Set the path to the " + SHORT_NAME + " instance to manage");
w.println("INSTALL_ROOT=\"" + serverRoot.getAbsolutePath() + "\"");
w.println("export INSTALL_ROOT");
w.println();
w.println("cd ${INSTALL_ROOT}");
w.println();
if (javaHomeDir != null)
{
w.println("# Specify the path to the Java installation to use");
w.println("OPENDJ_JAVA_HOME=\"" + javaHomeDir + "\"");
w.println("export OPENDJ_JAVA_HOME");
w.println();
}
if (javaArgs.isPresent())
{
w.println("# Specify arguments that should be provided to the JVM");
w.println("OPENDJ_JAVA_ARGS=\"" + javaArgs.getValue() + "\"");
w.println("export OPENDJ_JAVA_ARGS");
w.println();
}
w.println("# Determine what action should be performed on the server");
w.println("case \"${1}\" in");
w.println("start)");
w.println(" " + suString + "\"${INSTALL_ROOT}/bin/start-ds"+
EscQuote1 + " --quiet" + EscQuote2);
w.println(" exit ${?}");
w.println(" ;;");
w.println("stop)");
w.println(" " + suString + "\"${INSTALL_ROOT}/bin/stop-ds"+
EscQuote1 + " --quiet" + EscQuote2);
w.println(" exit ${?}");
w.println(" ;;");
w.println("restart)");
w.println(" " + suString + "\"${INSTALL_ROOT}/bin/stop-ds"+
EscQuote1 + " --restart --quiet" + EscQuote2);
w.println(" exit ${?}");
w.println(" ;;");
w.println("*)");
w.println(" echo \"Usage: $0 { start | stop | restart }\"");
w.println(" exit 1");
w.println(" ;;");
w.println("esac");
w.println();
w.close();
if (FilePermission.canSetPermissions())
{
FilePermission.setPermissions(f, FilePermission.decodeUNIXMode("755"));
}
}
catch (Exception e)
{
err.println(ERR_CREATERC_CANNOT_WRITE.get(
getExceptionMessage(e)).toString());
return 1;
}
// If we've gotten here, then everything has completed successfully.
return 0;
}
}