⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mod_status.c

📁 apache简化版
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ==================================================================== * Copyright (c) 1995-1998 The Apache Group.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * 3. All advertising materials mentioning features or use of this *    software must display the following acknowledgment: *    "This product includes software developed by the Apache Group *    for use in the Apache HTTP server project (http://www.apache.org/)." * * 4. The names "Apache Server" and "Apache Group" must not be used to *    endorse or promote products derived from this software without *    prior written permission. For written permission, please contact *    apache@apache.org. * * 5. Products derived from this software may not be called "Apache" *    nor may "Apache" appear in their names without prior written *    permission of the Apache Group. * * 6. Redistributions of any form whatsoever must retain the following *    acknowledgment: *    "This product includes software developed by the Apache Group *    for use in the Apache HTTP server project (http://www.apache.org/)." * * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Group and was originally based * on public domain software written at the National Center for * Supercomputing Applications, University of Illinois, Urbana-Champaign. * For more information on the Apache Group and the Apache HTTP server * project, please see <http://www.apache.org/>. * *//* Status Module.  Display lots of internal data about how Apache is * performing and the state of all children processes. * * To enable this, add the following lines into any config file: * * <Location /server-status> * SetHandler server-status * </Location> * * You may want to protect this location by password or domain so no one * else can look at it.  Then you can access the statistics with a URL like: * * http://your_server_name/server-status * * /server-status - Returns page using tables * /server-status?notable - Returns page for browsers without table support * /server-status?refresh - Returns page with 1 second refresh * /server-status?refresh=6 - Returns page with refresh every 6 seconds * /server-status?auto - Returns page with data for automatic parsing * * Mark Cox, mark@ukweb.com, November 1995 * * 12.11.95 Initial version for www.telescope.org * 13.3.96  Updated to remove rprintf's [Mark] * 18.3.96  Added CPU usage, process information, and tidied [Ben Laurie] * 18.3.96  Make extra Scoreboard variables #definable * 25.3.96  Make short report have full precision [Ben Laurie suggested] * 25.3.96  Show uptime better [Mark/Ben Laurie] * 29.3.96  Better HTML and explanation [Mark/Rob Hartill suggested] * 09.4.96  Added message for non-STATUS compiled version * 18.4.96  Added per child and per slot counters [Jim Jagielski] * 01.5.96  Table format, cleanup, even more spiffy data [Chuck Murcko/Jim J.] * 18.5.96  Adapted to use new rprintf() routine, incidentally fixing a missing *          piece in short reports [Ben Laurie] * 21.5.96  Additional Status codes (DNS and LOGGING only enabled if *          extended STATUS is enabled) [George Burgyan/Jim J.] * 10.8.98  Allow for extended status info at runtime (no more STATUS) *          [Jim J.] */#define CORE_PRIVATE#include "httpd.h"#include "http_config.h"#include "http_core.h"#include "http_protocol.h"#include "http_conf_globals.h"	/* for ap_extended_status */#include "http_main.h"#include "util_script.h"#include <time.h>#include "scoreboard.h"#include "http_log.h"#ifdef NEXT#if (NX_CURRENT_COMPILER_RELEASE == 410)#ifdef m68k#define HZ 64#else#define HZ 100#endif#else#include <machine/param.h>#endif#endif /* NEXT */#define STATUS_MAXLINE		64#define KBYTE			1024#define	MBYTE			1048576L#define	GBYTE			1073741824L#ifndef DEFAULT_TIME_FORMAT #define DEFAULT_TIME_FORMAT "%A, %d-%b-%Y %H:%M:%S %Z"#endifmodule MODULE_VAR_EXPORT status_module;/* *command-related code. This is here to prevent use of ExtendedStatus * without status_module included. */static const char *set_extended_status(cmd_parms *cmd, void *dummy, char *arg) {    const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);    if (err != NULL) {        return err;    }    if (!strcasecmp(arg, "off") || !strcmp(arg, "0")) {	ap_extended_status = 0;    }    else {	ap_extended_status = 1;    }    return NULL;}static const command_rec status_module_cmds[] ={    { "ExtendedStatus", set_extended_status, NULL, RSRC_CONF, TAKE1,      "\"On\" to enable extended status information, \"Off\" to disable" },    {NULL}};/* Format the number of bytes nicely */static void format_byte_out(request_rec *r, unsigned long bytes){    if (bytes < (5 * KBYTE))	ap_rprintf(r, "%d B", (int) bytes);    else if (bytes < (MBYTE / 2))	ap_rprintf(r, "%.1f kB", (float) bytes / KBYTE);    else if (bytes < (GBYTE / 2))	ap_rprintf(r, "%.1f MB", (float) bytes / MBYTE);    else	ap_rprintf(r, "%.1f GB", (float) bytes / GBYTE);}static void format_kbyte_out(request_rec *r, unsigned long kbytes){    if (kbytes < KBYTE)	ap_rprintf(r, "%d kB", (int) kbytes);    else if (kbytes < MBYTE)	ap_rprintf(r, "%.1f MB", (float) kbytes / KBYTE);    else	ap_rprintf(r, "%.1f GB", (float) kbytes / MBYTE);}static void show_time(request_rec *r, time_t tsecs){    long days, hrs, mins, secs;    secs = tsecs % 60;    tsecs /= 60;    mins = tsecs % 60;    tsecs /= 60;    hrs = tsecs % 24;    days = tsecs / 24;    if (days)	ap_rprintf(r, " %ld day%s", days, days == 1 ? "" : "s");    if (hrs)	ap_rprintf(r, " %ld hour%s", hrs, hrs == 1 ? "" : "s");    if (mins)	ap_rprintf(r, " %ld minute%s", mins, mins == 1 ? "" : "s");    if (secs)	ap_rprintf(r, " %ld second%s", secs, secs == 1 ? "" : "s");}/* Main handler for x-httpd-status requests *//* ID values for command table */#define STAT_OPT_END		-1#define STAT_OPT_REFRESH	0#define STAT_OPT_NOTABLE	1#define STAT_OPT_AUTO		2struct stat_opt {    int id;    const char *form_data_str;    const char *hdr_out_str;};static const struct stat_opt status_options[] =	/* see #defines above */{    {STAT_OPT_REFRESH, "refresh", "Refresh"},    {STAT_OPT_NOTABLE, "notable", NULL},    {STAT_OPT_AUTO, "auto", NULL},    {STAT_OPT_END, NULL, NULL}};static char status_flags[SERVER_NUM_STATUS];static int status_handler(request_rec *r){    char *loc;    time_t nowtime = time(NULL);    time_t up_time;    int i, res;    int ready = 0;    int busy = 0;    unsigned long count = 0;    unsigned long lres, bytes;    unsigned long my_lres, my_bytes, conn_bytes;    unsigned short conn_lres;    unsigned long bcount = 0;    unsigned long kbcount = 0;    long req_time;#ifndef NO_TIMES#ifdef _SC_CLK_TCK    float tick = sysconf(_SC_CLK_TCK);#else    float tick = HZ;#endif#endif    int short_report = 0;    int no_table_report = 0;    short_score score_record;    parent_score ps_record;    char stat_buffer[HARD_SERVER_LIMIT];    int pid_buffer[HARD_SERVER_LIMIT];    clock_t tu, ts, tcu, tcs;    tu = ts = tcu = tcs = 0;    if (!ap_exists_scoreboard_image()) {	ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,		    "Server status unavailable in inetd mode");	return HTTP_INTERNAL_SERVER_ERROR;    }    r->allowed = (1 << M_GET);    if (r->method_number != M_GET)	return DECLINED;    r->content_type = "text/html";    /*     * Simple table-driven form data set parser that lets you alter the header     */    if (r->args) {	i = 0;	while (status_options[i].id != STAT_OPT_END) {	    if ((loc = strstr(r->args, status_options[i].form_data_str)) != NULL) {		switch (status_options[i].id) {		case STAT_OPT_REFRESH:		    if (*(loc + strlen(status_options[i].form_data_str)) == '=')			ap_table_set(r->headers_out,			      status_options[i].hdr_out_str,			      loc + strlen(status_options[i].hdr_out_str) + 1);		    else			ap_table_set(r->headers_out,			      status_options[i].hdr_out_str, "1");		    break;		case STAT_OPT_NOTABLE:		    no_table_report = 1;		    break;		case STAT_OPT_AUTO:		    r->content_type = "text/plain";		    short_report = 1;		    break;		}	    }	    i++;	}    }    ap_send_http_header(r);    if (r->header_only)	return 0;    ap_sync_scoreboard_image();    for (i = 0; i < HARD_SERVER_LIMIT; ++i) {	score_record = ap_scoreboard_image->servers[i];	ps_record = ap_scoreboard_image->parent[i];	res = score_record.status;	stat_buffer[i] = status_flags[res];	pid_buffer[i] = (int) ps_record.pid;	if (res == SERVER_READY)	    ready++;	else if (res != SERVER_DEAD)	    busy++;	if (ap_extended_status) {	    lres = score_record.access_count;	    bytes = score_record.bytes_served;	    if (lres != 0 || (res != SERVER_READY && res != SERVER_DEAD)) {#ifndef NO_TIMES		tu += score_record.times.tms_utime;		ts += score_record.times.tms_stime;		tcu += score_record.times.tms_cutime;		tcs += score_record.times.tms_cstime;#endif /* NO_TIMES */		count += lres;		bcount += bytes;		if (bcount >= KBYTE) {		    kbcount += (bcount >> 10);		    bcount = bcount & 0x3ff;		}	    }	}    }    up_time = nowtime - ap_restart_time;    ap_hard_timeout("send status info", r);    if (!short_report) {	ap_rputs("<HTML><HEAD>\n<TITLE>Apache Status</TITLE>\n</HEAD><BODY>\n", r);	ap_rputs("<H1>Apache Server Status for ", r);	ap_rvputs(r, ap_get_server_name(r), "</H1>\n\n", NULL);	ap_rvputs(r, "Server Version: ",	  ap_get_server_version(), "<br>\n", NULL);	ap_rvputs(r, "Server Built: ",	  ap_get_server_built(), "<br>\n<hr>\n", NULL);	ap_rvputs(r, "Current Time: ",	  ap_ht_time(r->pool, nowtime, DEFAULT_TIME_FORMAT, 0), "<br>\n", NULL);	ap_rvputs(r, "Restart Time: ",	  ap_ht_time(r->pool, ap_restart_time, DEFAULT_TIME_FORMAT, 0), 	  "<br>\n", NULL);	ap_rputs("Server uptime: ", r);	show_time(r, up_time);	ap_rputs("<br>\n", r);    }    if (ap_extended_status) {	if (short_report) {	    ap_rprintf(r, "Total Accesses: %lu\nTotal kBytes: %lu\n",		count, kbcount);#ifndef NO_TIMES	    /* Allow for OS/2 not having CPU stats */	    if (ts || tu || tcu || tcs)		ap_rprintf(r, "CPULoad: %g\n",		    (tu + ts + tcu + tcs) / tick / up_time * 100.);#endif	    ap_rprintf(r, "Uptime: %ld\n", (long) (up_time));	    if (up_time > 0)		ap_rprintf(r, "ReqPerSec: %g\n",		    (float) count / (float) up_time);	    if (up_time > 0)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -