001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.geronimo.deployment.cli;
019
020 import java.io.IOException;
021 import java.net.MalformedURLException;
022 import java.util.HashMap;
023 import java.util.Map;
024
025 import javax.management.MBeanServerConnection;
026 import javax.management.remote.JMXConnector;
027 import javax.management.remote.JMXConnectorFactory;
028 import javax.management.remote.JMXServiceURL;
029 import javax.management.remote.rmi.RMIConnectorServer;
030 import javax.rmi.ssl.SslRMIClientSocketFactory;
031
032 import org.apache.geronimo.gbean.GBeanInfo;
033 import org.apache.geronimo.gbean.GBeanInfoBuilder;
034 import org.apache.geronimo.kernel.Kernel;
035 import org.apache.geronimo.kernel.util.Main;
036 import org.apache.geronimo.system.jmx.KernelDelegate;
037
038 /**
039 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
040 */
041 public class StopServer implements Main {
042
043 public static final String RMI_NAMING_CONFG_ID = "org/apache/geronimo/RMINaming";
044
045 public static final String DEFAULT_PORT = "1099"; // 1099 is used by java.rmi.registry.Registry
046
047 String host = "localhost";
048
049 String port;
050
051 String user;
052
053 String password;
054
055 boolean secure = false;
056
057 private String[] args;
058
059 public static void main(String[] args) throws Exception {
060 StopServer cmd = new StopServer();
061 cmd.execute(args);
062 }
063
064 public int execute(Object opaque) {
065 if (! (opaque instanceof String[])) {
066 throw new IllegalArgumentException("Argument type is [" + opaque.getClass() + "]; expected [" + String[].class + "]");
067 }
068 this.args = (String[]) opaque;
069
070 int i = 0;
071 while (i < args.length && args[i].startsWith("--")) {
072 if (setParam(i++)) {
073 i++;
074 }
075 }
076
077 if (i < args.length) {
078 // There was an argument error somewhere.
079 printUsage();
080 }
081
082 try {
083 if (port != null) {
084 Integer.parseInt(port);
085 }
086 } catch (NumberFormatException e) {
087 System.out.println("Invalid port number specified.");
088 return 1;
089 }
090
091 try {
092 InputPrompt prompt = new InputPrompt(System.in, System.out);
093 if (user == null) {
094 user = prompt.getInput("Username: ");
095 }
096 if (password == null) {
097 password = prompt.getPassword("Password: ");
098 }
099 } catch (IOException e) {
100 System.out.println("Unable to prompt for login.");
101 return 1;
102 }
103
104 try {
105 if (port == null) {
106 port = DEFAULT_PORT;
107 }
108 System.out.print("Locating server on port " + port + "... ");
109 Kernel kernel = null;
110 try {
111 kernel = getRunningKernel();
112 } catch (IOException e) {
113 System.out.println();
114 System.out.println("Could not communicate with the server. The server may not be running or the port number may be incorrect (" + e.getMessage() + ")");
115 }
116 if (kernel != null) {
117 System.out.println("Server found.");
118 System.out.println("Server shutdown started");
119 kernel.shutdown();
120 System.out.println("Server shutdown completed");
121 }
122 } catch (Exception e) {
123 e.printStackTrace();
124 return 1;
125 }
126 return 0;
127 }
128
129 private boolean argumentHasValue(int i) {
130 return i + 1 < args.length && !args[i + 1].startsWith("--");
131 }
132
133 private boolean setParam(int i) {
134 if (argumentHasValue(i)) {
135 if (args[i].equals("--user")) {
136 user = args[++i];
137 } else if (args[i].equals("--password")) {
138 password = args[++i];
139 } else if (args[i].equals("--port")) {
140 port = args[++i];
141 } else if (args[i].equals("--host")) {
142 host = args[++i];
143 } else {
144 printUsage();
145 }
146 return true;
147 } else if (args[i].equals("--secure")) {
148 secure = true;
149 } else {
150 printUsage();
151 }
152 return false;
153 }
154
155 public Kernel getRunningKernel() throws IOException {
156 Map map = new HashMap();
157 map.put(JMXConnector.CREDENTIALS, new String[] { user, password });
158 String connectorName = "/JMXConnector";
159 if (secure) {
160 connectorName = "/JMXSecureConnector";
161 SslRMIClientSocketFactory csf = new SslRMIClientSocketFactory();
162 map.put(RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE, csf);
163 }
164 Kernel kernel = null;
165 try {
166 JMXServiceURL address = new JMXServiceURL(
167 "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + connectorName);
168 JMXConnector jmxConnector = JMXConnectorFactory.connect(address, map);
169 MBeanServerConnection mbServerConnection = jmxConnector.getMBeanServerConnection();
170 kernel = new KernelDelegate(mbServerConnection);
171 } catch (MalformedURLException e) {
172 e.printStackTrace();
173 }
174 return kernel;
175 }
176
177 public void printUsage() {
178 System.out.println();
179 System.out.println("Command-line shutdown syntax:");
180 System.out.println(" shutdown [options]");
181 System.out.println();
182 System.out.println("The available options are:");
183 System.out.println(" --user <username>");
184 System.out.println(" --password <password>");
185 System.out.println(" --host <hostname>");
186 System.out.println(" --port <port>");
187 System.out.println(" --secure");
188 System.exit(1);
189 }
190
191 public static final GBeanInfo GBEAN_INFO;
192
193 static {
194 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(StopServer.class, "StopServer");
195
196 infoBuilder.addInterface(Main.class);
197
198 infoBuilder.setConstructor(new String[0]);
199
200 GBEAN_INFO = infoBuilder.getBeanInfo();
201 }
202
203 public static GBeanInfo getGBeanInfo() {
204 return GBEAN_INFO;
205 }
206
207 }