/*********************************************************************** * * Copyright (C) 2006 Novell, Inc. All Rights Reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; version 2.1 * of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, Novell, Inc. * * To contact Novell about this file by physical or electronic mail, * you may find current contact information at www.novell.com. * * Author: Juan Carlos Luciani * ***********************************************************************/ package SetupAsWindowsService; import java.io.*; import java.util.*; /** * Summary description for Program */ public class Program { final static int ERROR_NO_ERROR = 0; final static int ERROR_INVALID_NUMBER_OF_PARAMS = -1; final static int ERROR_EXEC_FAILED = -2; final static int ERROR_EXEC_INTERRUPTED = -3; // final static int ERROR_MISSING_TEMPLATE = -3; // final static int ERROR_MISSING_TEMPLATE_FILE = -8; // final static int ERROR_OUTPUT_PROPERTY_MISSING = -9; // final static int ERROR_OUTPUT_COPY_FAILED = -12; final static int ERROR_IO_EXCEPTION = -13; // final static int ERROR_MISSING_PROPERTIES = -15; final static int ERROR_UNABLE_TO_READ_PROPERTIES = -16; // final static int ERROR_PROPERTIES_FILE_IS_EMPTY = -17; final static int ERROR_MISSING_INSTALL_DIR = -18; final static int ERROR_INSTALL_DIR_NOT_A_DIR = -19; final static int ERROR_BAD_INSTALL_DIR_PARAM = -20; final static int ERROR_BAD_PROPERTY_FILE_PARAM = -21; final static int ERROR_MISSING_PROPERTIES_FILE = -22; final static int ERROR_MISSING_INSTALL_DIR_PARAM = -23; final static int ERROR_MISSING_PROPERTY_FILE_PARAM = -24; // final static int ERROR_BAD_TEMPLATE_FILE_PARAM = -25; // final static int ERROR_BAD_OUTPUT_FILE_PARAM = -26; // final static int ERROR_MISSING_TEMPLATE_FILE_PARAM = -27; // final static int ERROR_MISSING_OUTPUT_FILE_PARAM = -28; final static int ERROR_BAD_PROPERTY_PARAM = -29; // final static String TEMPLATE_FILE_PARAM = "template="; // final static String OUTPUT_FILE_PARAM = "output="; final static String INSTALL_DIR_PROPERTY = "ATS_INSTALL_DIR"; final static String PROPERTY_FILE_PARAM = "propertyfile="; final static String INSTALL_DIR = "installdir="; final static String PROPERTY_FILE = "propertyfile="; Properties properties; File fileProperties; FileInputStream fisProperties; File fileOutput; File file; FileWriter fw; String sInstallDir; String sOutput; public static void main(String[] args) { Program p = new Program(args); } Program(String[] args) { int rc = ERROR_NO_ERROR; properties = new Properties(); fileProperties = null; fisProperties = null; fileOutput = null; try { file = new File("c:\\test6.log"); fw = new FileWriter(file); log("Here we go: " + args.length); for (int i = 0; i < args.length; i++) { log("Arg " + i + " = " + args[i]); } // Process the arguments if (ERROR_NO_ERROR == (rc = processArgs(args))) { // Process the properties if (ERROR_NO_ERROR == (rc = processProperties())) { rc = setupService(); } } } catch (IOException e) { rc = ERROR_IO_EXCEPTION; } finally { try { log("return code = " + rc); fw.flush(); fw.close(); } catch (Exception e1) { } } System.exit(rc); } int processArgs(String[] args) { String sProperties; File fileInstallDir = null; int i; int iEquals; String sKey; String sValue; // Validate the number of parameters if (args.length != 2) { return ERROR_INVALID_NUMBER_OF_PARAMS; } for (i = 0; i < args.length; i++) { log("arg[" + i + "] = " +args[i]); // is this the install dir param? if (args[i].startsWith(INSTALL_DIR)) { // Make sure it is more the the param tag if (args[i].length() <= INSTALL_DIR.length()) { return ERROR_BAD_INSTALL_DIR_PARAM; } sInstallDir = args[i].substring(INSTALL_DIR.length()).trim(); fileInstallDir = new File(sInstallDir); // Make sure the install dir can be found if (!fileInstallDir.exists()) { return ERROR_MISSING_INSTALL_DIR; } // Make sure the install dir is a directory if (!fileInstallDir.isDirectory()) { return ERROR_INSTALL_DIR_NOT_A_DIR; } properties.setProperty(INSTALL_DIR_PROPERTY, sInstallDir); } // is this the properties file param? else if (args[i].startsWith(PROPERTY_FILE_PARAM)) { // Make sure it is more than the param tag if (args[i].length() <= PROPERTY_FILE_PARAM.length()) { return ERROR_BAD_PROPERTY_FILE_PARAM; } sProperties = args[i].substring(PROPERTY_FILE_PARAM.length()).trim(); fileProperties = new File(sProperties); // Make sure the properties file can be found if (!fileProperties.exists()) { return ERROR_MISSING_PROPERTIES_FILE; } // Read the properties try { fisProperties = new FileInputStream(fileProperties); properties.load(fisProperties); } catch (IOException ioe) { return ERROR_UNABLE_TO_READ_PROPERTIES; } } // Handle additional parameters else { if (-1 == (iEquals = args[i].indexOf("=")) || 0 == iEquals || args[i].length() == iEquals) { return ERROR_BAD_PROPERTY_PARAM; } sKey = args[i].substring(0, iEquals); sValue = args[i].substring(iEquals + 1); properties.setProperty(sKey, sValue); } } // Make sure we got an install dir if (null == fileInstallDir) { return ERROR_MISSING_INSTALL_DIR_PARAM; } // Note: the properties file parameter is optional return ERROR_NO_ERROR; } int processProperties() { try { Enumeration e; String sKey; String sValue; e = properties.propertyNames(); while (e.hasMoreElements()) { sKey = (String)e.nextElement(); sValue = (String)properties.get(sKey); log("Property key = " + sKey + " Value = " + sValue); } } catch (Exception ex1) { return -111; } return ERROR_NO_ERROR; } int setupService() { String sDirInstall = (String)properties.get(INSTALL_DIR_PROPERTY); String sDirCatalinaBase = sInstallDir + "ats/catalinabase"; String sDirCatalinaHome = (String)properties.get("TOMCAT_HOME"); String sExe = sDirCatalinaHome + "/bin/tomcat5.exe"; String sFileJaasConf = (String)properties.get("JAAS_CONF"); String sDirConfig = sDirInstall + "ats/etc/svc"; String sDirJavaHome = (String)properties.get("ATS_JAVA_HOME"); String sLogPrefix = "casa-auth-token-svc"; String sDirLogs = sDirCatalinaBase + "/logs"; String sCommand = ""; int iReturn = ERROR_NO_ERROR; sCommand = sExe + " //IS//CasaAuthTokenService --StartClass org.apache.catalina.startup.Bootstrap --StopClass org.apache.catalina.startup.Bootstrap --StartParams start --StopParams stop"; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService --Startup auto"; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService --JvmOptions \"-Dcatalina.base=" + sDirCatalinaBase + "\""; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService ++JvmOptions \"-Dcatalina.home=" + sDirCatalinaHome + "\""; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService ++JvmOptions \"-Djava.endorsed.dirs=" + sDirCatalinaHome + "/common/endorsed\""; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService ++JvmOptions \"-Djava.security.auth.login.config=" + sFileJaasConf + "\""; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService ++JvmOptions \"-Dcom.novell.casa.authtoksvc.config=" + sDirConfig + "\""; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService ++JvmOptions \"-Djava.io.tmpdir=" + sDirCatalinaBase+ "/temp\""; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService --StartMode jvm --StopMode jvm"; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService --JvmMs 128 --JvmMx 512"; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService --Classpath \"" + sDirCatalinaHome + "/bin/bootstrap.jar\""; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService --Jvm \"" + sDirJavaHome + "/jre/bin/server/jvm.dll\""; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService --LogPath \"" + sDirLogs + "\""; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService --LogPrefix \"" + sLogPrefix + "_service.log\""; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService --StdOutput \"" + sDirLogs + File.separator + sLogPrefix + "_stdout.log\""; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService --StdError \"" + sDirLogs + File.separator + sLogPrefix + "_stderr.log\""; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService --DisplayName " + "CasaAuthTokenSvc"; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } sCommand = sExe + " //US//CasaAuthTokenService --Description " + "\"Casa Authentication Token Service\""; if (ERROR_NO_ERROR != (iReturn = invokeCommand(sCommand))) { return iReturn; } /* sCommand += sTomcatDir; String casaConfDir = new File(SystemConfig.getConfDir(), "casa").getAbsolutePath(); String libDir = SystemConfig.getLibDir().getAbsolutePath(); String tomcatDir = new File(SystemConfig.getShareDir(), "tomcat").getAbsolutePath(); String binDir = SystemConfig.getBinDir().getAbsolutePath() + File.separator; String tomcatBinDir = tomcatDir + File.separator + "bin" + File.separator; String tomcatLogDir = SystemConfig.getLogDir().getAbsolutePath(); String jvmOptions = "\"-Dcatalina.base=" + tomcatDir + ";" + "-Dcom.novell.casa.authtoksvc.config=" + casaConfDir + ";" + "-Djava.security.auth.login.config=" + casaConfDir + "\\casa-jaas.conf;" + "-Dcatalina.home=" + tomcatDir + ";" + "-Djava.endorsed.dirs=" + tomcatDir + ";" + "-Djava.io.tmpdir=" + tomcatDir + "\\temp;" + "-Djava.library.path=" + libDir + "\""; String jvmDll = new File(SystemConfig.getJavaDir(), "jre/bin/server/jvm.dll").getAbsolutePath(); String serviceName = serviceAddress.get(services.ZEN_SERVER); String displayName = Res.getString(Res.ZENWORKS_SERVER_NAME); String description = Res.getString(Res.ZENWORKS_SERVER_DESCRIPTION); String exe = binDir + "zenserver"; String logPrefix = "novell-zenworks-server"; String dependsOn = ""; if (FirstServerConfigureAction.isFirstServer() && IsEmbeddedDBConfigureAction.isEmbedded()) { dependsOn = serviceAddress.get(services.ZEN_DATABASE); } String commandType = getCommandType(serviceName, exe); String[] args = new String[]{ String sCommand = ""; sCommand = sDirTomcat + "//" + "IS" + "//" + "AuthTokenService" + " --Startup" + "auto", "--StartClass", "org.apache.catalina.startup.Bootstrap", "--StopClass", "org.apache.catalina.startup.Bootstrap", "--StartParams", "start", "--StopParams", "stop", "--Classpath", tomcatBinDir + "bootstrap.jar", "--Jvm", jvmDll, "--JvmOptions", jvmOptions, "--StartMode", "jvm", "--StopMode", "jvm", "--JvmMx", "512", "--LogPath", tomcatLogDir, "--LogPrefix", logPrefix + "_service.log", "--StdOutput", tomcatLogDir + File.separator + logPrefix + "_stdout.log", "--StdError", tomcatLogDir + File.separator + logPrefix + "_stderr.log", "--DisplayName", displayName, "--Description", description, "--DependsOn", dependsOn, //don't put anything after the dependsOn param because the dependsOn string may be empty //resulting in an invalid dependency being created. * }; */ return ERROR_NO_ERROR; } int invokeCommand(String sCommand) { Process p; int rc; log("invoke command: " + sCommand); Runtime runtime = Runtime.getRuntime(); try { p = runtime.exec(sCommand); try { rc = p.waitFor(); log("invoke command return code: " + rc); } catch (InterruptedException ie) { log(ERROR_EXEC_INTERRUPTED, sCommand); return ERROR_EXEC_INTERRUPTED; } } catch (IOException e) { log("IOException"); log(e.get_StackTrace()); return ERROR_EXEC_FAILED; } return ERROR_NO_ERROR; } void log(int err) { log(err, null); } void log(int err, String s) { String sMessage = ""; switch (err) { case ERROR_NO_ERROR: sMessage = "No error"; break; case ERROR_INVALID_NUMBER_OF_PARAMS: sMessage = "Invalid number of parameters: 4 expected"; break; case ERROR_IO_EXCEPTION: sMessage = "IOException"; break; default: sMessage = "Unknown error: " + err; break; } if (null != s) { sMessage = sMessage + s; } log(sMessage); } void log(String s) { try { fw.write(this.getClass().getName() + ": " + s + "\r\n"); } catch (IOException ioe) { } } }