mod_info.c revision ed4f9ec869d7fc5bd220c8d70ee58eed9b32d60a
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye/* ====================================================================
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * The Apache Software License, Version 1.1
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Copyright (c) 2000-2001 The Apache Software Foundation. All rights
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Redistribution and use in source and binary forms, with or without
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * modification, are permitted provided that the following conditions
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * 1. Redistributions of source code must retain the above copyright
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * notice, this list of conditions and the following disclaimer.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * 2. Redistributions in binary form must reproduce the above copyright
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * notice, this list of conditions and the following disclaimer in
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * the documentation and/or other materials provided with the
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * distribution.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * 3. The end-user documentation included with the redistribution,
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * if any, must include the following acknowledgment:
fe80b749cd764b1f0f72b2f913b1fe10581911c3Knut Anders Hatlen * "This product includes software developed by the
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Apache Software Foundation (http://www.apache.org/)."
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Alternately, this acknowledgment may appear in the software itself,
cf1f7b5e81583dfca30972cfef322266a6928e7fKnut Anders Hatlen * if and wherever such third-party acknowledgments normally appear.
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye * 4. The names "Apache" and "Apache Software Foundation" must
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye * not be used to endorse or promote products derived from this
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco * software without prior written permission. For written
7e33e87b7d6c9a61ff11d23e37c02274b1223ce1Jens Elkner * permission, please contact apache@apache.org.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * 5. Products derived from this software may not be called "Apache",
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * nor may "Apache" appear in their name, without prior written
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * permission of the Apache Software Foundation.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * SUCH DAMAGE.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * ====================================================================
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * This software consists of voluntary contributions made by many
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * individuals on behalf of the Apache Software Foundation. For more
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * information on the Apache Software Foundation, please see
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Portions of this software are based upon public domain software
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * originally written at the National Center for Supercomputing Applications,
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * University of Illinois, Urbana-Champaign.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Info Module. Display configuration information for the server and
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * all included modules.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * <Location /server-info>
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * SetHandler server-info
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * </Location>
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * GET /server-info - Returns full configuration page for server and all modules
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * GET /server-info?server - Returns server configuration only
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * GET /server-info?module_name - Returns configuration for a single module
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * GET /server-info?list - Returns quick list of included modules
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Rasmus Lerdorf <rasmus@vex.net>, May 1996
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * 05.01.96 Initial Version
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Lou Langholtz <ldl@usi.utah.edu>, July 1997
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * 07.11.97 Addition of the AddModuleInfo directive
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * Ryan Morgan <rmorgan@covalent.net>
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * 8.11.00 Port to Apache 2.0. Read configuation from the configuration
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * tree rather than reparse the entire configuation file.
780cc7d1b57609ff15fb283201e93cb501ebe9e6Jorgen Austviktypedef struct {
780cc7d1b57609ff15fb283201e93cb501ebe9e6Jorgen Austviktypedef struct {
0466de7c67573e1ce5e0733325c1e5383270f5d5Knut Anders Hatlenstatic void *create_info_config(apr_pool_t *p, server_rec *s)
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye info_svr_conf *conf = (info_svr_conf *) apr_pcalloc(p, sizeof(info_svr_conf));
5a0c5ad4116f5a4dd0dd5a0a4e6d02973cd5eef9Lubos Kosco conf->more_info = apr_array_make(p, 20, sizeof(info_entry));
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvikstatic void *merge_info_config(apr_pool_t *p, void *basev, void *overridesv)
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye info_svr_conf *new = (info_svr_conf *) apr_pcalloc(p, sizeof(info_svr_conf));
8dc938f5c6296cffbadd8e06925dc0762dd79c5aLubos Kosco info_svr_conf *overrides = (info_svr_conf *) overridesv;
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik new->more_info = apr_array_append(p, overrides->more_info, base->more_info);
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvikstatic char *mod_info_html_cmd_string(const char *string, char *buf, size_t buf_len, int close)
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik const char *s;
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik /* keep space for \0 byte */
5a0c5ad4116f5a4dd0dd5a0a4e6d02973cd5eef9Lubos Kosco while ((*s) && (t < end_buf)) {
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik if (*s == '<') {
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal else if (*s == '>') {
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal else if (*s == '&') {
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal else if (*s == ' ') {
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco /* oops, overflowed... don't overwrite */
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Koscostatic void mod_info_module_cmds(request_rec * r, const command_rec * cmds,
e3bec3188dc818cc194cd67e6871c6d0af0d6b26Felix Annan (strcasecmp(cmd->name, tmptree->directive) == 0)) {
d7375a57cb329e3ca4984fc3b2923b177ddff562haufelex apr_snprintf(htmlstring, sizeof(htmlstring), "%s %s",
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye sizeof(buf), 0));
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen ap_rprintf(r, "<dd><tt> %s "
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen "<i>%s</i></tt><br>\n",
9cf771c10c134cc953a502f895eaf321ec927f13Lubos Kosco "<dd><tt> %s <i>%s</i></tt><br>\n",
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye ap_rprintf(r, "<dd><tt>%s <i>%s</i></tt><br>\n",
a5cc1506d5c0704805c6733a46c7f1f8f91ae724Knut Anders Hatlen apr_snprintf(htmlstring, sizeof(htmlstring), "%s %s",
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbyetypedef struct { /*XXX: should get something from apr_hooks.h instead */
7b046969a1b2565787df8ae3a8126359e8cd6fafTrond Norbye void (*pFunc)(void); /* just to get the right size */
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik const char * const *aszPredecessors;
b411dcdf67df825303fcb366759169c881936ac9Vladimir Kotal const char * const *aszSuccessors;
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen * hook_get_t is a pointer to a function that takes void as an argument and
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik * returns a pointer to an apr_array_header_t. The nasty WIN32 ifdef
d3d2404f9a49bf70b124053feabe666f85ef5361Knut Anders Hatlen * is required to account for the fact that the ap_hook* calls all use
64b763950bf11e9357facbd2b5666631a895c085Trond Norbye * STDCALL calling convention.
64b763950bf11e9357facbd2b5666631a895c085Trond Norbyetypedef struct {
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen {"Post-Read Request", ap_hook_get_post_read_request},
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen {"Translate Path", ap_hook_get_translate_name},
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen {"Check Access", ap_hook_get_access_checker},
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen {"Verify User Access", ap_hook_get_auth_checker},
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen {"Check Type", ap_hook_get_type_checker},
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlen {"Logging", ap_hook_get_log_transaction},
2dbc1835e0ae88ad102e2b9a85e5c7b5298b14b6Knut Anders Hatlenstatic void module_participate(request_rec *r,
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rvputs(r, "<tt>", lookup->name, "</tt>", NULL);
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Koscostatic void module_request_hook_participate(request_rec *r, module *modp)
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco ap_rputs("<dt><strong>Request Phase Participation:</strong> \n", r);
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco module_participate(r, modp, &request_hooks[i], &comma);
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Koscostatic const char *find_more_info(server_rec *s, const char *module_name)
6d7c6f82e644c205bc679ee5b1fa2929ec949963Lubos Kosco info_svr_conf *conf = (info_svr_conf *) ap_get_module_config(s->module_config,
f9fd2b96d1c5ea62664f74da0e34a04b6511a8ffLubos Kosco info_entry *entry = (info_entry *) conf->more_info->elts;
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "<html><head><title>Server Information</title></head>\n", r);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rputs("<body><h1 align=center>Apache Server Information</h1>\n", r);
a07b2874263e3c5f0cd2e83441719415d53059c2Knut Anders Hatlen ap_rputs("<tt><a href=\"#server\">Server Settings</a>, ", r);
a07b2874263e3c5f0cd2e83441719415d53059c2Knut Anders Hatlen for (modp = ap_top_module; modp; modp = modp->next) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rprintf(r, "<a href=\"#%s\">%s</a>", modp->name, modp->name);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (!r->args || !strcasecmp(r->args, "server")) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rprintf(r, "<a name=\"server\"><strong>Server Version:</strong> "
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "<font size=+1><tt>%s</tt></a></font><br>\n",
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rprintf(r, "<strong>Server Built:</strong> "
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "<font size=+1><tt>%s</tt></a></font><br>\n",
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "<tt>%d:%d</tt><br>\n",
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye MODULE_MAGIC_NUMBER_MAJOR, MODULE_MAGIC_NUMBER_MINOR);
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye ap_rprintf(r, "<strong>Hostname/port:</strong> "
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "<tt>%s:%u</tt><br>\n",
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "<tt>connection: %d "
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "keep-alive: %d</tt><br>",
a07b2874263e3c5f0cd2e83441719415d53059c2Knut Anders Hatlen serv->timeout, serv->keep_alive_timeout);
a07b2874263e3c5f0cd2e83441719415d53059c2Knut Anders Hatlen ap_mpm_query(AP_MPMQ_MAX_DAEMON_USED, &max_daemons);
edcb01bf549171673fd0bb4239f2edfc7a810397Knut Anders Hatlen ap_mpm_query(AP_MPMQ_IS_THREADED, &threaded);
c6963a7ea2753672325502d342e653700be550a8Lubos Kosco ap_rprintf(r, "MPM used is %s<br>\n", ap_show_mpm());
c6963a7ea2753672325502d342e653700be550a8Lubos Kosco ap_rprintf(r, "<strong>MPM Information:</strong> "
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye "<tt>Max Daemons: %d Threaded: %s Forked: %s</tt><br>\n",
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik for (modp = ap_top_module; modp; modp = modp->next) {
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik if (!r->args || !strcasecmp(modp->name, r->args)) {
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik ap_rprintf(r, "<dt><a name=\"%s\"><strong>Module Name:</strong> "
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik "<font size=+1><tt>%s</tt></a></font>\n",
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik ap_rputs("<dt><strong>Content handlers:</strong>", r);
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik ap_rprintf(r, " <tt>%s</tt>\n", hand->content_type);
a3a5f5c0500064f4c6ac3658b1e3e4d838912329Lubos Kosco if (module_find_hook(modp, ap_hook_get_handler)) {
c7eb123c8b2081a261deff3c401fbf92ddba1b58Jorgen Austvik ap_rputs("<dt><strong>Configuration Phase Participation:</strong> \n",
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye ap_rputs("<tt>Create Directory Config</tt>", r);
1f17ba9e3c026d75f488227451416bd72a222afeTrond Norbye ap_rputs("<tt>Merge Directory Configs</tt>", r);
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik ap_rputs("<tt>Create Server Config</tt>", r);
49f592091468eac515dde6139fbc8efa26056b0aJorgen Austvik ap_rputs("<tt>Merge Server Configs</tt>", r);
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik ap_rputs("<dt><strong>Module Directives:</strong> ", r);
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik ap_rputs("<dt><strong>Current Configuration:</strong>\n", r);
fcb68bae47907ba23c545e379c81c3ee6e19f778Lubos Kosco mod_info_module_cmds(r, modp->cmds, ap_conftree);
945f4c3c36a15447913781dfb1894b34f2941c57Jorgen Austvik more_info = find_more_info(serv, modp->name);
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco ap_rputs("<dt><strong>Additional Information:</strong>\n<dd>",
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye if (!modp && r->args && strcasecmp(r->args, "server")) {
30637745bf5a7db2ff9684a2536cc9f8c9df2218Lubos Kosco for (modp = ap_top_module; modp; modp = modp->next) {
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbye /* Done, turn off timeout, close file and return */
d4ce228a333ba2daa19ad8b0672a704c8e42a2dcTrond Norbyestatic const char *add_module_info(cmd_parms *cmd, void *dummy,
f09d46eefeb5e4db6dc11e02e417b448fa9362a9Jorgen Austvik info_svr_conf *conf = (info_svr_conf *) ap_get_module_config(s->module_config,
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik info_entry *new = apr_array_push(conf->more_info);
7ecd52b03dc1f0b03ff8f522b4891c8531896c3dJorgen Austvik AP_INIT_TAKE2("AddModuleInfo", add_module_info, NULL, RSRC_CONF,
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik "a module name and additional information on that module"),
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik ap_hook_handler(display_info, NULL, NULL, APR_HOOK_MIDDLE);
2e3c025fdd5908a27cc82eb1d5346368a8be4e0dJorgen Austvik NULL, /* dir merger --- default is to override */