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 /** 042 * This class is used to stop the Windows service associated with this 043 * instance on this machine. 044 * This tool allows to stop OpenDS as a Windows service. 045 */ 046 public class StopWindowsService 047 { 048 /** 049 * The service was successfully stopped. 050 */ 051 public static int SERVICE_STOP_SUCCESSFUL = 0; 052 /** 053 * The service could not be found. 054 */ 055 public static int SERVICE_NOT_FOUND = 1; 056 /** 057 * The service was already stopped. 058 */ 059 public static int SERVICE_ALREADY_STOPPED = 2; 060 /** 061 * The service could not be stopped. 062 */ 063 public static int SERVICE_STOP_ERROR = 3; 064 065 /** 066 * Invokes the net stop on the service corresponding to this server. 067 * 068 * @param args The command-line arguments provided to this program. 069 */ 070 public static void main(String[] args) 071 { 072 int result = stopWindowsService(System.out, System.err); 073 074 System.exit(filterExitCode(result)); 075 } 076 077 /** 078 * Invokes the net stop on the service corresponding to this server, it writes 079 * information and error messages in the provided streams. 080 * @return <CODE>SERVICE_STOP_SUCCESSFUL</CODE>, 081 * <CODE>SERVICE_NOT_FOUND</CODE>, <CODE>SERVICE_ALREADY_STOPPED</CODE> or 082 * <CODE>SERVICE_STOP_ERROR</CODE> depending on whether the service could be 083 * stopped or not. 084 * @param outStream The stream to write standard output messages. 085 * @param errStream The stream to write error messages. 086 */ 087 public static int stopWindowsService(OutputStream outStream, 088 OutputStream errStream) 089 { 090 int returnValue; 091 PrintStream out; 092 if (outStream == null) 093 { 094 out = NullOutputStream.printStream(); 095 } 096 else 097 { 098 out = new PrintStream(outStream); 099 } 100 101 PrintStream err; 102 if (errStream == null) 103 { 104 err = NullOutputStream.printStream(); 105 } 106 else 107 { 108 err = new PrintStream(errStream); 109 } 110 111 String serviceName = ConfigureWindowsService.getServiceName(); 112 if (serviceName == null) 113 { 114 115 Message message = ERR_WINDOWS_SERVICE_NOT_FOUND.get(); 116 err.println(message); 117 returnValue = SERVICE_NOT_FOUND; 118 } 119 else 120 { 121 String[] cmd; 122 if (SetupUtils.isVista()) 123 { 124 cmd= new String[] { 125 ConfigureWindowsService.getLauncherBinaryFullPath(), 126 ConfigureWindowsService.LAUNCHER_OPTION, 127 ConfigureWindowsService.getLauncherAdministratorBinaryFullPath(), 128 ConfigureWindowsService.LAUNCHER_OPTION, 129 "net", 130 "stop", 131 serviceName 132 }; 133 } 134 else 135 { 136 cmd= new String[] { 137 "net", 138 "stop", 139 serviceName 140 }; 141 } 142 /* Check if is a running service */ 143 try 144 { 145 if (Runtime.getRuntime().exec(cmd).waitFor() == 0) 146 { 147 returnValue = SERVICE_STOP_SUCCESSFUL; 148 } 149 else 150 { 151 returnValue = SERVICE_STOP_ERROR; 152 } 153 } 154 catch (Throwable t) 155 { 156 157 Message message = ERR_WINDOWS_SERVICE_STOP_ERROR.get(); 158 out.println(message); 159 returnValue = SERVICE_STOP_ERROR; 160 } 161 } 162 return returnValue; 163 } 164 } 165