mod_status.c revision f0e395a55abfcad3d2bd7c63470003b08a93d567
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu/* ====================================================================
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * The Apache Software License, Version 1.1
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * Copyright (c) 2000-2003 The Apache Software Foundation. All rights
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * Redistribution and use in source and binary forms, with or without
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * modification, are permitted provided that the following conditions
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * 1. Redistributions of source code must retain the above copyright
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * notice, this list of conditions and the following disclaimer.
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * 2. Redistributions in binary form must reproduce the above copyright
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * notice, this list of conditions and the following disclaimer in
17f1de180b775332d98ff24c7ce51d6866272dcdChristian Maeder * the documentation and/or other materials provided with the
dc792317de0a95aac4e9a6dadfb78df050e5022eChristian Maeder * distribution.
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * 3. The end-user documentation included with the redistribution,
3f5d611a1388ce3cd33f86da3f1e9b7ad68d087cMihaela Turcu * if any, must include the following acknowledgment:
17f1de180b775332d98ff24c7ce51d6866272dcdChristian Maeder * "This product includes software developed by the
17f1de180b775332d98ff24c7ce51d6866272dcdChristian Maeder * Apache Software Foundation (http://www.apache.org/)."
17f1de180b775332d98ff24c7ce51d6866272dcdChristian Maeder * Alternately, this acknowledgment may appear in the software itself,
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * if and wherever such third-party acknowledgments normally appear.
53d2d31717e8c65bb3c2d1f2cd891d626cf45e5bChristian Maeder * 4. The names "Apache" and "Apache Software Foundation" must
dc792317de0a95aac4e9a6dadfb78df050e5022eChristian Maeder * not be used to endorse or promote products derived from this
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * software without prior written permission. For written
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * permission, please contact apache@apache.org.
53d2d31717e8c65bb3c2d1f2cd891d626cf45e5bChristian Maeder * 5. Products derived from this software may not be called "Apache",
53d2d31717e8c65bb3c2d1f2cd891d626cf45e5bChristian Maeder * nor may "Apache" appear in their name, without prior written
de2d031e186086e2cb775bc59bacda87c9b18371Christian Maeder * permission of the Apache Software Foundation.
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
de2d031e186086e2cb775bc59bacda87c9b18371Christian Maeder * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * SUCH DAMAGE.
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * ====================================================================
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * This software consists of voluntary contributions made by many
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * individuals on behalf of the Apache Software Foundation. For more
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * information on the Apache Software Foundation, please see
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * Portions of this software are based upon public domain software
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * originally written at the National Center for Supercomputing Applications,
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * University of Illinois, Urbana-Champaign.
3f5d611a1388ce3cd33f86da3f1e9b7ad68d087cMihaela Turcu/* Status Module. Display lots of internal data about how Apache is
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * performing and the state of all children processes.
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * To enable this, add the following lines into any config file:
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * <Location /server-status>
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * SetHandler server-status
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * </Location>
d20b265a2765e843986ceed6bf0055582981bf0fChristian Maeder * You may want to protect this location by password or domain so no one
7cfd47f6dc4147e9a3d21d72f68c6325552092f0Christian Maeder * else can look at it. Then you can access the statistics with a URL like:
17f1de180b775332d98ff24c7ce51d6866272dcdChristian Maeder * /server-status - Returns page using tables
1070181294f9381ac4ac19eba1c3ecc40fc731a4Mihaela Turcu * /server-status?notable - Returns page for browsers without table support
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * /server-status?refresh - Returns page with 1 second refresh
de2d031e186086e2cb775bc59bacda87c9b18371Christian Maeder * /server-status?refresh=6 - Returns page with refresh every 6 seconds
de2d031e186086e2cb775bc59bacda87c9b18371Christian Maeder * /server-status?auto - Returns page with data for automatic parsing
de2d031e186086e2cb775bc59bacda87c9b18371Christian Maeder * Mark Cox, mark@ukweb.com, November 1995
de2d031e186086e2cb775bc59bacda87c9b18371Christian Maeder * 12.11.95 Initial version for www.telescope.org
de2d031e186086e2cb775bc59bacda87c9b18371Christian Maeder * 13.3.96 Updated to remove rprintf's [Mark]
de2d031e186086e2cb775bc59bacda87c9b18371Christian Maeder * 18.3.96 Added CPU usage, process information, and tidied [Ben Laurie]
7cfd47f6dc4147e9a3d21d72f68c6325552092f0Christian Maeder * 18.3.96 Make extra Scoreboard variables #definable
d20b265a2765e843986ceed6bf0055582981bf0fChristian Maeder * 25.3.96 Make short report have full precision [Ben Laurie suggested]
17f1de180b775332d98ff24c7ce51d6866272dcdChristian Maeder * 25.3.96 Show uptime better [Mark/Ben Laurie]
64610ae60115fa0465d6d8548827b13d214cdc9eChristian Maeder * 29.3.96 Better HTML and explanation [Mark/Rob Hartill suggested]
17f1de180b775332d98ff24c7ce51d6866272dcdChristian Maeder * 09.4.96 Added message for non-STATUS compiled version
17f1de180b775332d98ff24c7ce51d6866272dcdChristian Maeder * 18.4.96 Added per child and per slot counters [Jim Jagielski]
17f1de180b775332d98ff24c7ce51d6866272dcdChristian Maeder * 01.5.96 Table format, cleanup, even more spiffy data [Chuck Murcko/Jim J.]
7cfd47f6dc4147e9a3d21d72f68c6325552092f0Christian Maeder * 18.5.96 Adapted to use new rprintf() routine, incidentally fixing a missing
de2d031e186086e2cb775bc59bacda87c9b18371Christian Maeder * piece in short reports [Ben Laurie]
de2d031e186086e2cb775bc59bacda87c9b18371Christian Maeder * 21.5.96 Additional Status codes (DNS and LOGGING only enabled if
7cfd47f6dc4147e9a3d21d72f68c6325552092f0Christian Maeder * extended STATUS is enabled) [George Burgyan/Jim J.]
de2d031e186086e2cb775bc59bacda87c9b18371Christian Maeder * 10.8.98 Allow for extended status info at runtime (no more STATUS)
dc792317de0a95aac4e9a6dadfb78df050e5022eChristian Maeder#endif /* NEXT */
53d2d31717e8c65bb3c2d1f2cd891d626cf45e5bChristian Maeder#define DEFAULT_TIME_FORMAT "%A, %d-%b-%Y %H:%M:%S %Z"
dc792317de0a95aac4e9a6dadfb78df050e5022eChristian Maeder#define STATUS_MAGIC_TYPE "application/x-httpd-status"
dc792317de0a95aac4e9a6dadfb78df050e5022eChristian Maedermodule AP_MODULE_DECLARE_DATA status_module;
dc792317de0a95aac4e9a6dadfb78df050e5022eChristian Maeder/* Implement 'ap_run_status_hook'. */
dc792317de0a95aac4e9a6dadfb78df050e5022eChristian MaederAPR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ap, STATUS, int, status_hook,
(r, flags),
return err;
return NULL;
{NULL}
if (days)
if (hrs)
if (mins)
if (secs)
#define STAT_OPT_REFRESH 0
struct stat_opt {
int id;
const char *form_data_str;
const char *hdr_out_str;
const char *loc;
int j, i, res;
int ready;
int busy;
unsigned long count;
long req_time;
#ifdef HAVE_TIMES
float tick;
int short_report;
int no_table_report;
char *stat_buffer;
return DECLINED;
#ifdef HAVE_TIMES
#ifdef _SC_CLK_TCK
ready = 0;
busy = 0;
count = 0;
bcount = 0;
kbcount = 0;
short_report = 0;
no_table_report = 0;
if (!ap_exists_scoreboard_image()) {
return HTTP_INTERNAL_SERVER_ERROR;
return DECLINED;
if (r->args) {
case STAT_OPT_REFRESH:
loc +
case STAT_OPT_NOTABLE:
case STAT_OPT_AUTO:
for (i = 0; i < server_limit; ++i) {
for (j = 0; j < thread_limit; ++j) {
ready++;
busy++;
if (ap_extended_status) {
#ifdef HAVE_TIMES
if (!short_report) {
DEFAULT_TIME_FORMAT, 0),
(int)ap_my_generation);
if (ap_extended_status) {
if (short_report) {
#ifdef HAVE_TIMES
if (up_time > 0)
if (up_time > 0)
if (count > 0)
#ifdef HAVE_TIMES
if (up_time > 0)
if (up_time > 0) {
/ (float) up_time));
if (count > 0) {
/ (float) count));
if (!short_report)
if (!short_report)
for (i = 0; i < server_limit; ++i) {
for (j = 0; j < thread_limit; ++j) {
&& !short_report)
if (short_report)
if (!ap_extended_status) {
for (i = 0; i < server_limit; ++i) {
for (j = 0; j < thread_limit; ++j) {
if (no_table_report)
#ifdef HAVE_TIMES
for (i = 0; i < server_limit; ++i) {
for (j = 0; j < thread_limit; ++j) {
req_time = 0L;
req_time = (long)
if (req_time < 0L)
req_time = 0L;
if (no_table_report) {
ap_rprintf(r,
ap_rprintf(r,
case SERVER_READY:
case SERVER_STARTING:
case SERVER_BUSY_READ:
case SERVER_BUSY_WRITE:
case SERVER_BUSY_KEEPALIVE:
case SERVER_BUSY_LOG:
case SERVER_BUSY_DNS:
case SERVER_CLOSING:
case SERVER_DEAD:
case SERVER_GRACEFUL:
case SERVER_IDLE_KILL:
#ifdef HAVE_TIMES
#ifdef HAVE_TIMES
(long) req_time);
ap_rprintf(r,
ap_rprintf(r,
ap_rprintf(r,
case SERVER_READY:
case SERVER_STARTING:
case SERVER_BUSY_READ:
case SERVER_BUSY_WRITE:
case SERVER_BUSY_KEEPALIVE:
case SERVER_BUSY_LOG:
case SERVER_BUSY_DNS:
case SERVER_CLOSING:
case SERVER_DEAD:
case SERVER_GRACEFUL:
case SERVER_IDLE_KILL:
ap_rprintf(r,
#ifdef HAVE_TIMES
#ifdef HAVE_TIMES
(long)req_time);
ap_rprintf(r,
ap_rprintf(r,
if (!no_table_report) {
#ifdef HAVE_TIMES
if (!short_report) {
int flags =
if (!short_report) {
server_rec *s)
return OK;