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
030 import org.apache.geronimo.gbean.GBeanInfo;
031 import org.apache.geronimo.gbean.GBeanInfoBuilder;
032 import org.apache.geronimo.kernel.Kernel;
033 import org.apache.geronimo.kernel.util.Main;
034 import org.apache.geronimo.system.jmx.KernelDelegate;
035
036 /**
037 * @version $Rev: 535507 $ $Date: 2007-05-05 07:22:39 -0400 (Sat, 05 May 2007) $
038 */
039 public class StopServer implements Main {
040
041 public static final String RMI_NAMING_CONFG_ID = "org/apache/geronimo/RMINaming";
042
043 public static final String DEFAULT_PORT = "1099"; // 1099 is used by java.rmi.registry.Registry
044
045 String port;
046
047 String user;
048
049 String password;
050
051 private String[] args;
052
053 public static void main(String[] args) throws Exception {
054 StopServer cmd = new StopServer();
055 cmd.execute(args);
056 }
057
058 public int execute(Object opaque) {
059 if (! (opaque instanceof String[])) {
060 throw new IllegalArgumentException("Argument type is [" + opaque.getClass() + "]; expected [" + String[].class + "]");
061 }
062 this.args = (String[]) opaque;
063
064 int i = 0;
065 while (i < args.length && args[i].startsWith("--")) {
066 if (setParam(i++)) {
067 i++;
068 }
069 }
070
071 if (i < args.length) {
072 // There was an argument error somewhere.
073 printUsage();
074 }
075
076 try {
077 if (port != null) {
078 Integer.parseInt(port);
079 }
080 } catch (NumberFormatException e) {
081 System.out.println("Invalid port number specified.");
082 return 1;
083 }
084
085 try {
086 InputPrompt prompt = new InputPrompt(System.in, System.out);
087 if (user == null) {
088 user = prompt.getInput("Username: ");
089 }
090 if (password == null) {
091 password = prompt.getPassword("Password: ");
092 }
093 } catch (IOException e) {
094 System.out.println("Unable to prompt for login.");
095 return 1;
096 }
097
098 try {
099 if (port == null) {
100 port = DEFAULT_PORT;
101 }
102 System.out.print("Locating server on port " + port + "... ");
103 Kernel kernel = null;
104 try {
105 kernel = getRunningKernel();
106 } catch (IOException e) {
107 System.out.println("\nCould not communicate with the server. The server may not be running or the port number may be incorrect.");
108 }
109 if (kernel != null) {
110 System.out.println("Server found.");
111 System.out.println("Server shutdown started");
112 kernel.shutdown();
113 System.out.println("Server shutdown completed");
114 }
115 } catch (Exception e) {
116 e.printStackTrace();
117 return 1;
118 }
119 return 0;
120 }
121
122 private boolean argumentHasValue(int i) {
123 return i + 1 < args.length && !args[i + 1].startsWith("--");
124 }
125
126 private boolean setParam(int i) {
127 if (argumentHasValue(i)) {
128 if (args[i].equals("--user")) {
129 user = args[++i];
130 } else if (args[i].equals("--password")) {
131 password = args[++i];
132 } else if (args[i].equals("--port")) {
133 port = args[++i];
134 } else {
135 printUsage();
136 }
137 return true;
138 } else {
139 printUsage();
140 }
141 return false;
142 }
143
144 public Kernel getRunningKernel() throws IOException {
145 Map map = new HashMap();
146 map.put("jmx.remote.credentials", new String[] { user, password });
147 Kernel kernel = null;
148 try {
149 JMXServiceURL address = new JMXServiceURL(
150 "service:jmx:rmi:///jndi/rmi://localhost" + ":" + port + "/JMXConnector");
151 JMXConnector jmxConnector = JMXConnectorFactory.connect(address, map);
152 MBeanServerConnection mbServerConnection = jmxConnector.getMBeanServerConnection();
153 kernel = new KernelDelegate(mbServerConnection);
154 } catch (MalformedURLException e) {
155 e.printStackTrace();
156 }
157 return kernel;
158 }
159
160 public void printUsage() {
161 System.out.println();
162 System.out.println("Command-line shutdown syntax:");
163 System.out.println(" shutdown [options]");
164 System.out.println();
165 System.out.println("The available options are:");
166 System.out.println(" --user");
167 System.out.println(" --password");
168 System.out.println(" --port");
169 System.exit(1);
170 }
171
172 public static final GBeanInfo GBEAN_INFO;
173
174 static {
175 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(StopServer.class, "StopServer");
176
177 infoBuilder.addInterface(Main.class);
178
179 infoBuilder.setConstructor(new String[0]);
180
181 GBEAN_INFO = infoBuilder.getBeanInfo();
182 }
183
184 public static GBeanInfo getGBeanInfo() {
185 return GBEAN_INFO;
186 }
187
188 }