mod_status.c revision b4c8a80f7dbfc9b56dbe03bdc28f0b5eb5f23697
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering/* ====================================================================
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * Copyright (c) 1995-1999 The Apache Group. All rights reserved.
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * Redistribution and use in source and binary forms, with or without
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * modification, are permitted provided that the following conditions
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * 1. Redistributions of source code must retain the above copyright
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * notice, this list of conditions and the following disclaimer.
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * 2. Redistributions in binary form must reproduce the above copyright
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * notice, this list of conditions and the following disclaimer in
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * the documentation and/or other materials provided with the
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * distribution.
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * 3. All advertising materials mentioning features or use of this
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * software must display the following acknowledgment:
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * "This product includes software developed by the Apache Group
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * for use in the Apache HTTP server project (http://www.apache.org/)."
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * 4. The names "Apache Server" and "Apache Group" must not be used to
dc3a1b76a6a6f9dfe9b451f534587251b50a0685Lennart Poettering * endorse or promote products derived from this software without
dc3a1b76a6a6f9dfe9b451f534587251b50a0685Lennart Poettering * prior written permission. For written permission, please contact
e8e581bf256b8c0fbd430935af79fa0e8ee570a1Zbigniew Jędrzejewski-Szmek * apache@apache.org.
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * 5. Products derived from this software may not be called "Apache"
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * nor may "Apache" appear in their names without prior written
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * permission of the Apache Group.
19adb8a3204fefd91411b5f0f350c8bc6bcf75feZbigniew Jędrzejewski-Szmek * 6. Redistributions of any form whatsoever must retain the following
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * acknowledgment:
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * "This product includes software developed by the Apache Group
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * for use in the Apache HTTP server project (http://www.apache.org/)."
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * OF THE POSSIBILITY OF SUCH DAMAGE.
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * ====================================================================
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * This software consists of voluntary contributions made by many
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * individuals on behalf of the Apache Group and was originally based
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * on public domain software written at the National Center for
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * Supercomputing Applications, University of Illinois, Urbana-Champaign.
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * For more information on the Apache Group and the Apache HTTP server
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * project, please see <http://www.apache.org/>.
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering/* Status Module. Display lots of internal data about how Apache is
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * performing and the state of all children processes.
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * To enable this, add the following lines into any config file:
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * <Location /server-status>
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * SetHandler server-status
af9792ac7f39354f80e9006c42c2400c5e41c447Lennart Poettering * You may want to protect this location by password or domain so no one
af9792ac7f39354f80e9006c42c2400c5e41c447Lennart Poettering * else can look at it. Then you can access the statistics with a URL like:
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * /server-status - Returns page using tables
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * /server-status?notable - Returns page for browsers without ap_table_t support
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * /server-status?refresh - Returns page with 1 second refresh
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * /server-status?refresh=6 - Returns page with refresh every 6 seconds
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * /server-status?auto - Returns page with data for automatic parsing
19adb8a3204fefd91411b5f0f350c8bc6bcf75feZbigniew Jędrzejewski-Szmek * Mark Cox, mark@ukweb.com, November 1995
19adb8a3204fefd91411b5f0f350c8bc6bcf75feZbigniew Jędrzejewski-Szmek * 12.11.95 Initial version for www.telescope.org
dc3a1b76a6a6f9dfe9b451f534587251b50a0685Lennart Poettering * 13.3.96 Updated to remove rprintf's [Mark]
19adb8a3204fefd91411b5f0f350c8bc6bcf75feZbigniew Jędrzejewski-Szmek * 18.3.96 Added CPU usage, process information, and tidied [Ben Laurie]
dc3a1b76a6a6f9dfe9b451f534587251b50a0685Lennart Poettering * 18.3.96 Make extra Scoreboard variables #definable
7801356442578ff6e1c65844eb9e65c819af4660Zbigniew Jędrzejewski-Szmek * 25.3.96 Make short report have full precision [Ben Laurie suggested]
af9792ac7f39354f80e9006c42c2400c5e41c447Lennart Poettering * 25.3.96 Show uptime better [Mark/Ben Laurie]
af9792ac7f39354f80e9006c42c2400c5e41c447Lennart Poettering * 29.3.96 Better HTML and explanation [Mark/Rob Hartill suggested]
dc3a1b76a6a6f9dfe9b451f534587251b50a0685Lennart Poettering * 09.4.96 Added message for non-STATUS compiled version
dc3a1b76a6a6f9dfe9b451f534587251b50a0685Lennart Poettering * 18.4.96 Added per child and per slot counters [Jim Jagielski]
dc3a1b76a6a6f9dfe9b451f534587251b50a0685Lennart Poettering * 01.5.96 Table format, cleanup, even more spiffy data [Chuck Murcko/Jim J.]
dc3a1b76a6a6f9dfe9b451f534587251b50a0685Lennart Poettering * 18.5.96 Adapted to use new rprintf() routine, incidentally fixing a missing
dc3a1b76a6a6f9dfe9b451f534587251b50a0685Lennart Poettering * piece in short reports [Ben Laurie]
dc3a1b76a6a6f9dfe9b451f534587251b50a0685Lennart Poettering * 21.5.96 Additional Status codes (DNS and LOGGING only enabled if
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * extended STATUS is enabled) [George Burgyan/Jim J.]
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * 10.8.98 Allow for extended status info at runtime (no more STATUS)
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering#include "http_conf_globals.h" /* for ap_extended_status */
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering#endif /* NEXT */
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering#define DEFAULT_TIME_FORMAT "%A, %d-%b-%Y %H:%M:%S %Z"
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering *command-related code. This is here to prevent use of ExtendedStatus
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering * without status_module included.
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poetteringstatic const char *set_extended_status(cmd_parms *cmd, void *dummy, char *arg)
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
23406ce58aa7142e8df3c5c9e5ac34a01e90e3e0Lennart Poettering if (!strcasecmp(arg, "off") || !strcmp(arg, "0")) {
{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;
char *loc;
int i, j, res;
int ready = 0;
int busy = 0;
unsigned long count = 0;
unsigned short conn_lres;
unsigned long bcount = 0;
unsigned long kbcount = 0;
long req_time;
#ifndef NO_TIMES
#ifdef _SC_CLK_TCK
int short_report = 0;
int no_table_report = 0;
if (!ap_exists_scoreboard_image()) {
return HTTP_INTERNAL_SERVER_ERROR;
return DECLINED;
if (r->args) {
case STAT_OPT_REFRESH:
case STAT_OPT_NOTABLE:
case STAT_OPT_AUTO:
if (r->header_only)
for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
for (j = 0; j < HARD_THREAD_LIMIT; ++j) {
ready++;
busy++;
if (ap_extended_status) {
#ifndef NO_TIMES
if (!short_report) {
if (ap_extended_status) {
if (short_report) {
#ifndef NO_TIMES
if (up_time > 0)
if (up_time > 0)
if (count > 0)
#ifndef NO_TIMES
if (up_time > 0)
if (up_time > 0) {
if (count > 0) {
if (!short_report)
if (!short_report)
for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
for (j = 0; j < HARD_THREAD_LIMIT; ++j) {
if (short_report)
if (!ap_extended_status) {
for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
for (j = 0; j < HARD_THREAD_LIMIT; ++j) {
stat_buffer[i][j]);
if (ap_extended_status) {
if (!short_report) {
if (no_table_report)
#ifdef NO_TIMES
ap_rputs("<p>\n\n<table border=0><tr><th>Srv<th>PID<th>TID<th>Acc<th>M\n<th>SS<th>Req<th>Conn<th>Child<th>Slot<th>Client<th>VHost<th>Request</tr>\n\n", r);
ap_rputs("<p>\n\n<table border=0><tr><th>Srv<th>PID<th>TID<th>Acc<th>M<th>CPU\n<th>SS<th>Req<th>Conn<th>Child<th>Slot<th>Client<th>VHost<th>Request</tr>\n\n", r);
for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
for (j = 0; j < HARD_THREAD_LIMIT; ++j) {
#if defined(NO_GETTIMEOFDAY)
#ifndef NO_TIMES
req_time = 0L;
#ifndef NO_TIMES
req_time = 0L;
req_time =
if (req_time < 0L)
req_time = 0L;
if (!short_report) {
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_DEAD:
case SERVER_GRACEFUL:
#ifdef NO_TIMES
#ifdef OPTIMIZE_TIMEOUTS
(long) req_time);
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_DEAD:
case SERVER_GRACEFUL:
case SERVER_ACCEPTING:
case SERVER_QUEUEING:
#ifdef NO_TIMES
#ifdef OPTIMIZE_TIMEOUTS
(long) req_time);
ap_rprintf(r,
ap_rprintf(r,
#ifdef NO_TIMES
if (!short_report) {
for (i = 0; i < SERVER_NUM_STATUS; i++)
{NULL}