public static void main(String[] args) throws Exception {
if (args.length == 0)
{
displayUsage();
System.exit(0);
}
String sopts = "-:hD:s:n:a:u:p:Se:H:";
LongOpt[] lopts =
{
new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h"),
new LongOpt("server", LongOpt.REQUIRED_ARGUMENT, null, 's"),
new LongOpt("adapter", LongOpt.REQUIRED_ARGUMENT, null, 'a"),
new LongOpt("serverName", LongOpt.REQUIRED_ARGUMENT, null, 'n"),
new LongOpt("shutdown", LongOpt.NO_ARGUMENT, null, 'S"),
new LongOpt("exit", LongOpt.REQUIRED_ARGUMENT, null, 'e"),
new LongOpt("halt", LongOpt.REQUIRED_ARGUMENT, null, 'H"),
new LongOpt("user", LongOpt.REQUIRED_ARGUMENT, null, 'u"),
new LongOpt("password", LongOpt.REQUIRED_ARGUMENT, null, 'p"),
};
Getopt getopt = new Getopt(PROGRAM_NAME, args, sopts, lopts);
int code;
String arg;
String serverURL = null;
String adapterName = "jmx/rmi/RMIAdaptor";
String username = null;
String password = null;
ObjectName serverJMXName = ServerImplMBean.OBJECT_NAME;
boolean exit = false;
boolean halt = false;
int exitcode = -1;
while ((code = getopt.getopt()) != -1)
{
switch (code)
{
case ':":
case '?":
// for now both of these should exit with error status
System.exit(1);
break;
case 1:
// this will catch non-option arguments
// (which we don't currently care about)
System.err.println(PROGRAM_NAME + ": unused non-option argument: " +
getopt.getOptarg());
break;
case 'h":
displayUsage();
System.exit(0);
break;
case 'D":
{
// set a system property
arg = getopt.getOptarg();
String name, value;
int i = arg.indexOf("=");
if (i == -1)
{
name = arg;
value = "true";
}
else
{
name = arg.substring(0, i);
value = arg.substring(i + 1, arg.length());
}
System.setProperty(name, value);
break;
}
case 's":
serverURL = getopt.getOptarg();
break;
case 'n":
serverJMXName = new ObjectName(getopt.getOptarg());
break;
case 'S":
// nothing...
break;
case 'a":
adapterName = getopt.getOptarg();
break;
case 'u":
username = getopt.getOptarg();
SecurityAssociation.setPrincipal(new SimplePrincipal(username));
break;
case 'p":
password = getopt.getOptarg();
SecurityAssociation.setCredential(password);
break;
case 'e":
exitcode = Integer.parseInt(getopt.getOptarg());
exit = true;
break;
case 'H":
exitcode = Integer.parseInt(getopt.getOptarg());
halt = true;
break;
}
}
InitialContext ctx;
// If there was a username specified, but no password prompt for it
if( username != null && password == null )
{
System.out.print("Enter password for "+username+": ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
password = br.readLine();
SecurityAssociation.setCredential(password);
}
if (serverURL == null)
{
ctx = new InitialContext();
}
else
{
Hashtable env = new Hashtable();
env.put(Context.PROVIDER_URL, serverURL);
env.put(NamingContext.JNP_DISABLE_DISCOVERY, "true");
ctx = new InitialContext(env);
}
Object obj = ctx.lookup(adapterName);
if (!(obj instanceof MBeanServerConnection))
{
throw new RuntimeException("Object not of type: MBeanServerConnection, but: " +
(obj == null ? "not found" : obj.getClass().getName()));
}
MBeanServerConnection adaptor = (MBeanServerConnection) obj;
ServerProxyHandler handler = new ServerProxyHandler(adaptor, serverJMXName);
Class[] ifaces = {Server.class};
ClassLoader tcl = Thread.currentThread().getContextClassLoader();
Server server = (Server) Proxy.newProxyInstance(tcl, ifaces, handler);
if (exit)
{
server.exit(exitcode);
}
else if (halt)
{
server.halt(exitcode);
}
else
{
server.shutdown();
}
System.out.println("Shutdown message has been posted to the server.");
System.out.println("Server shutdown may take a while - check logfiles for completion");
}
|