HostManagerServletpublic class HostManagerServlet extends HttpServlet implements org.apache.catalina.ContainerServletServlet that enables remote management of the virtual hosts installed
on the server. Normally, this functionality will be protected by
a security constraint in the web application deployment descriptor.
However, this requirement can be relaxed during testing.
This servlet examines the value returned by getPathInfo()
and related query parameters to determine what action is being requested.
The following actions and parameters (starting after the servlet path)
are supported:
- /add?name={host-name}&aliases={host-aliases}&manager={manager} -
Create and add a new virtual host. The
host-name attribute
indicates the name of the new host. The host-aliases
attribute is a comma separated list of the host alias names.
The manager attribute is a boolean value indicating if the
webapp manager will be installed in the newly created host (optional,
false by default).
- /remove?name={host-name} - Remove a virtual host.
The
host-name attribute indicates the name of the host.
- /list - List the virtual hosts installed on the server.
Each host will be listed with the following format
host-name#host-aliases .
- /start?name={host-name} - Start the virtual host.
- /stop?name={host-name} - Stop the virtual host.
NOTE - Attempting to stop or remove the host containing
this servlet itself will not succeed. Therefore, this servlet should
generally be deployed in a separate virtual host.
NOTE - For security reasons, this application will not operate
when accessed via the invoker servlet. You must explicitly map this servlet
with a servlet mapping, and you will always want to protect it with
appropriate security constraints as well.
The following servlet initialization parameters are recognized:
- debug - The debugging detail level that controls the amount
of information that is logged by this servlet. Default is zero.
|
Fields Summary |
---|
protected File | configBasePath where context descriptors should be deployed. | protected org.apache.catalina.Context | contextThe Context container associated with our web application. | protected int | debugThe debugging detail level for this servlet. | protected org.apache.catalina.Host | hostThe associated host. | protected org.apache.catalina.Engine | engineThe associated engine. | protected MBeanServer | mBeanServerMBean server. | protected static org.apache.catalina.util.StringManager | smThe string manager for this package. | protected org.apache.catalina.Wrapper | wrapperThe Wrapper container associated with this servlet. |
Methods Summary |
---|
protected void | add(javax.servlet.http.HttpServletRequest request, java.io.PrintWriter writer, java.lang.String name, boolean htmlMode)Add host with the given parameters.
String aliases = request.getParameter("aliases");
String appBase = request.getParameter("appBase");
boolean manager = booleanParameter(request, "manager", false, htmlMode);
boolean autoDeploy = booleanParameter(request, "autoDeploy", true, htmlMode);
boolean deployOnStartup = booleanParameter(request, "deployOnStartup", true, htmlMode);
boolean deployXML = booleanParameter(request, "deployXML", true, htmlMode);
boolean unpackWARs = booleanParameter(request, "unpackWARs", true, htmlMode);
boolean xmlNamespaceAware = booleanParameter(request, "xmlNamespaceAware", false, htmlMode);
boolean xmlValidation = booleanParameter(request, "xmlValidation", false, htmlMode);
add(writer, name, aliases, appBase, manager,
autoDeploy,
deployOnStartup,
deployXML,
unpackWARs,
xmlNamespaceAware,
xmlValidation);
| protected synchronized void | add(java.io.PrintWriter writer, java.lang.String name, java.lang.String aliases, java.lang.String appBase, boolean manager, boolean autoDeploy, boolean deployOnStartup, boolean deployXML, boolean unpackWARs, boolean xmlNamespaceAware, boolean xmlValidation)Add a host using the specified parameters.
if (debug >= 1) {
log("add: Adding host '" + name + "'");
}
// Validate the requested host name
if ((name == null) || name.length() == 0) {
writer.println(sm.getString("hostManagerServlet.invalidHostName", name));
return;
}
// Check if host already exists
if (engine.findChild(name) != null) {
writer.println
(sm.getString("hostManagerServlet.alreadyHost", name));
return;
}
// Validate and create appBase
File appBaseFile = null;
if (appBase == null || appBase.length() == 0) {
appBase = name;
}
File file = new File(appBase);
if (!file.isAbsolute())
file = new File(System.getProperty("catalina.base"), appBase);
try {
appBaseFile = file.getCanonicalFile();
} catch (IOException e) {
appBaseFile = file;
}
if (!appBaseFile.exists()) {
appBaseFile.mkdirs();
}
// Create base for config files
File configBaseFile = getConfigBase(name);
// Copy manager.xml if requested
if (manager) {
InputStream is = null;
OutputStream os = null;
try {
is = getServletContext().getResourceAsStream("/manager.xml");
os = new FileOutputStream(new File(configBaseFile, "manager.xml"));
byte buffer[] = new byte[512];
int len = buffer.length;
while (true) {
len = is.read(buffer);
if (len == -1)
break;
os.write(buffer, 0, len);
}
} catch (IOException e) {
writer.println
(sm.getString("hostManagerServlet.managerXml"));
return;
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
if (os != null) {
try {
os.close();
} catch (IOException e) {
}
}
}
}
StandardHost host = new StandardHost();
host.setAppBase(appBase);
host.setName(name);
host.addLifecycleListener(new HostConfig());
// Add host aliases
if ((aliases != null) && !("".equals(aliases))) {
StringTokenizer tok = new StringTokenizer(aliases, ", ");
while (tok.hasMoreTokens()) {
host.addAlias(tok.nextToken());
}
}
host.setAutoDeploy(autoDeploy);
host.setDeployOnStartup(deployOnStartup);
host.setDeployXML(deployXML);
host.setUnpackWARs(unpackWARs);
host.setXmlNamespaceAware(xmlNamespaceAware);
host.setXmlValidation(xmlValidation);
// Add new host
try {
engine.addChild(host);
} catch (Exception e) {
writer.println(sm.getString("hostManagerServlet.exception",
e.toString()));
return;
}
host = (StandardHost) engine.findChild(name);
if (host != null) {
writer.println(sm.getString("hostManagerServlet.add", name));
} else {
// Something failed
writer.println(sm.getString("hostManagerServlet.addFailed", name));
}
| protected boolean | booleanParameter(javax.servlet.http.HttpServletRequest request, java.lang.String parameter, boolean theDefault, boolean htmlMode)extract boolean value from checkbox with default
String value = request.getParameter(parameter);
boolean booleanValue = theDefault;
if (value != null) {
if (htmlMode) {
if (value.equals("on")) {
booleanValue = true;
}
} else if (theDefault) {
if (value.equals("false")) {
booleanValue = false;
}
} else if (value.equals("true")) {
booleanValue = true;
}
} else if (htmlMode)
booleanValue = false;
return booleanValue;
| public void | destroy()Finalize this servlet.
; // No actions necessary
| public void | doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)Process a GET request for the specified resource.
// Verify that we were not accessed using the invoker servlet
if (request.getAttribute(Globals.INVOKED_ATTR) != null)
throw new UnavailableException
(sm.getString("hostManagerServlet.cannotInvoke"));
// Identify the request parameters that we need
String command = request.getPathInfo();
if (command == null)
command = request.getServletPath();
String name = request.getParameter("name");
// Prepare our output writer to generate the response message
response.setContentType("text/plain; charset=" + Constants.CHARSET);
PrintWriter writer = response.getWriter();
// Process the requested command
if (command == null) {
writer.println(sm.getString("hostManagerServlet.noCommand"));
} else if (command.equals("/add")) {
add(request, writer, name, false);
} else if (command.equals("/remove")) {
remove(writer, name);
} else if (command.equals("/list")) {
list(writer);
} else if (command.equals("/start")) {
start(writer, name);
} else if (command.equals("/stop")) {
stop(writer, name);
} else {
writer.println(sm.getString("hostManagerServlet.unknownCommand",
command));
}
// Finish up the response
writer.flush();
writer.close();
| protected java.io.File | getConfigBase(java.lang.String hostName)Get config base.
File configBase =
new File(System.getProperty("catalina.base"), "conf");
if (!configBase.exists()) {
return null;
}
if (engine != null) {
configBase = new File(configBase, engine.getName());
}
if (host != null) {
configBase = new File(configBase, hostName);
}
configBase.mkdirs();
return configBase;
| public org.apache.catalina.Wrapper | getWrapper()Return the Wrapper with which we are associated.
// ----------------------------------------------- ContainerServlet Methods
return (this.wrapper);
| public void | init()Initialize this servlet.
// Ensure that our ContainerServlet properties have been set
if ((wrapper == null) || (context == null))
throw new UnavailableException
(sm.getString("hostManagerServlet.noWrapper"));
// Verify that we were not accessed using the invoker servlet
String servletName = getServletConfig().getServletName();
if (servletName == null)
servletName = "";
if (servletName.startsWith("org.apache.catalina.INVOKER."))
throw new UnavailableException
(sm.getString("hostManagerServlet.cannotInvoke"));
// Set our properties from the initialization parameters
String value = null;
try {
value = getServletConfig().getInitParameter("debug");
debug = Integer.parseInt(value);
} catch (Throwable t) {
;
}
| protected void | list(java.io.PrintWriter writer)Render a list of the currently active Contexts in our virtual host.
if (debug >= 1)
log("list: Listing hosts for engine '"
+ engine.getName() + "'");
writer.println(sm.getString("hostManagerServlet.listed",
engine.getName()));
Container[] hosts = engine.findChildren();
for (int i = 0; i < hosts.length; i++) {
Host host = (Host) hosts[i];
String name = host.getName();
String[] aliases = host.findAliases();
StringBuffer buf = new StringBuffer();
if (aliases.length > 0) {
buf.append(aliases[0]);
for (int j = 1; j < aliases.length; j++) {
buf.append(',").append(aliases[j]);
}
}
writer.println(sm.getString("hostManagerServlet.listitem",
name, buf.toString()));
}
| protected synchronized void | remove(java.io.PrintWriter writer, java.lang.String name)Remove the specified host.
if (debug >= 1) {
log("remove: Removing host '" + name + "'");
}
// Validate the requested host name
if ((name == null) || name.length() == 0) {
writer.println(sm.getString("hostManagerServlet.invalidHostName", name));
return;
}
// Check if host exists
if (engine.findChild(name) == null) {
writer.println
(sm.getString("hostManagerServlet.noHost", name));
return;
}
// Prevent removing our own host
if (engine.findChild(name) == host) {
writer.println
(sm.getString("hostManagerServlet.cannotRemoveOwnHost", name));
return;
}
// Remove host
// Note that the host will not get physically removed
try {
Container child = engine.findChild(name);
engine.removeChild(child);
if ( child instanceof ContainerBase ) ((ContainerBase)child).destroy();
} catch (Exception e) {
writer.println(sm.getString("hostManagerServlet.exception",
e.toString()));
return;
}
Host host = (StandardHost) engine.findChild(name);
if (host == null) {
writer.println(sm.getString("hostManagerServlet.remove", name));
} else {
// Something failed
writer.println(sm.getString("hostManagerServlet.removeFailed", name));
}
| public void | setWrapper(org.apache.catalina.Wrapper wrapper)Set the Wrapper with which we are associated.
this.wrapper = wrapper;
if (wrapper == null) {
context = null;
host = null;
engine = null;
} else {
context = (Context) wrapper.getParent();
host = (Host) context.getParent();
engine = (Engine) host.getParent();
}
// Retrieve the MBean server
mBeanServer = Registry.getRegistry(null, null).getMBeanServer();
| protected void | start(java.io.PrintWriter writer, java.lang.String name)Start the host with the specified name.
if (debug >= 1)
log("start: Starting host with name '" + name + "'");
// Validate the requested host name
if ((name == null) || name.length() == 0) {
writer.println(sm.getString("hostManagerServlet.invalidHostName", name));
return;
}
// Check if host exists
if (engine.findChild(name) == null) {
writer.println
(sm.getString("hostManagerServlet.noHost", name));
return;
}
// Prevent starting our own host
if (engine.findChild(name) == host) {
writer.println
(sm.getString("hostManagerServlet.cannotStartOwnHost", name));
return;
}
// Start host
try {
((Lifecycle) engine.findChild(name)).start();
writer.println
(sm.getString("hostManagerServlet.started", name));
} catch (Throwable t) {
getServletContext().log
(sm.getString("hostManagerServlet.startFailed", name), t);
writer.println
(sm.getString("hostManagerServlet.startFailed", name));
writer.println(sm.getString("hostManagerServlet.exception",
t.toString()));
return;
}
| protected void | stop(java.io.PrintWriter writer, java.lang.String name)Start the host with the specified name.
if (debug >= 1)
log("stop: Stopping host with name '" + name + "'");
// Validate the requested host name
if ((name == null) || name.length() == 0) {
writer.println(sm.getString("hostManagerServlet.invalidHostName", name));
return;
}
// Check if host exists
if (engine.findChild(name) == null) {
writer.println
(sm.getString("hostManagerServlet.noHost", name));
return;
}
// Prevent starting our own host
if (engine.findChild(name) == host) {
writer.println
(sm.getString("hostManagerServlet.cannotStopOwnHost", name));
return;
}
// Start host
try {
((Lifecycle) engine.findChild(name)).stop();
writer.println
(sm.getString("hostManagerServlet.stopped", name));
} catch (Throwable t) {
getServletContext().log
(sm.getString("hostManagerServlet.stopFailed", name), t);
writer.println
(sm.getString("hostManagerServlet.stopFailed", name));
writer.println(sm.getString("hostManagerServlet.exception",
t.toString()));
return;
}
|
|