PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
[ start all new proposals below, under PATCHES PROPOSED. ]
- *) mod_ssl, mod_proxy, mod_cache_socache, mod_socache_*: Add plain text
- output to status hook (server-status) when called with "?auto"
- (machine readable form).
- trunk patch: http://svn.apache.org/r1671397
- http://svn.apache.org/r1672466
- http://svn.apache.org/r1672564
- 2.4.x patch: http://people.apache.org/~rjung/patches/enhance-socache-status-auto.patch
- (same as trunk but combined into one)
- +1: rjung, covener, jim
-
*) mod_proxy_wstunnel: Bypass the handler while the connection is not
upgraded to WebSocket, so that other modules can possibly take over
the leading HTTP requests.
return DECLINED;
}
- ap_rputs("<hr>\n"
- "<table cellspacing=0 cellpadding=0>\n"
- "<tr><td bgcolor=\"#000000\">\n"
- "<b><font color=\"#ffffff\" face=\"Arial,Helvetica\">"
- "mod_cache_socache Status:</font></b>\n"
- "</td></tr>\n"
- "<tr><td bgcolor=\"#ffffff\">\n", r);
+ if (!(flags & AP_STATUS_SHORT)) {
+ ap_rputs("<hr>\n"
+ "<table cellspacing=0 cellpadding=0>\n"
+ "<tr><td bgcolor=\"#000000\">\n"
+ "<b><font color=\"#ffffff\" face=\"Arial,Helvetica\">"
+ "mod_cache_socache Status:</font></b>\n"
+ "</td></tr>\n"
+ "<tr><td bgcolor=\"#ffffff\">\n", r);
+ }
+ else {
+ ap_rputs("ModCacheSocacheStatus\n", r);
+ }
if (socache_mutex) {
status = apr_global_mutex_lock(socache_mutex);
}
if (status != APR_SUCCESS) {
- ap_rputs("No cache status data available\n", r);
+ if (!(flags & AP_STATUS_SHORT)) {
+ ap_rputs("No cache status data available\n", r);
+ }
+ else {
+ ap_rputs("NotAvailable\n", r);
+ }
} else {
conf->provider->socache_provider->status(conf->provider->socache_instance,
r, flags);
}
}
- ap_rputs("</td></tr>\n</table>\n", r);
+ if (!(flags & AP_STATUS_SHORT)) {
+ ap_rputs("</td></tr>\n</table>\n", r);
+ }
return OK;
}
#include "http_protocol.h"
#include "http_config.h"
#include "mpm_common.h"
+#include "mod_status.h"
#include "apr.h"
#include "apr_strings.h"
avg = (int)(size / (long)elts);
else
avg = 0;
- ap_rprintf(r, "cache type: <b>DBM</b>, maximum size: <b>unlimited</b><br>");
- ap_rprintf(r, "current entries: <b>%d</b>, current size: <b>%ld</b> bytes<br>", elts, size);
- ap_rprintf(r, "average entry size: <b>%d</b> bytes<br>", avg);
+ if (!(flags & AP_STATUS_SHORT)) {
+ ap_rprintf(r, "cache type: <b>DBM</b>, maximum size: <b>unlimited</b><br>");
+ ap_rprintf(r, "current entries: <b>%d</b>, current size: <b>%ld</b> bytes<br>", elts, size);
+ ap_rprintf(r, "average entry size: <b>%d</b> bytes<br>", avg);
+ }
+ else {
+ ap_rputs("CacheType: DBM\n", r);
+ ap_rputs("CacheMaximumSize: unlimited\n", r);
+ ap_rprintf(r, "CacheCurrentEntries: %d\n", elts);
+ ap_rprintf(r, "CacheCurrentSize: %ld\n", size);
+ ap_rprintf(r, "CacheAvgEntrySize: %d\n", avg);
+ }
return;
}
#include "http_request.h"
#include "http_config.h"
#include "http_protocol.h"
+#include "mod_status.h"
#include "apr_strings.h"
#include "apr_time.h"
{
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(00747)
"distributed scache 'socache_dc_status'");
- ap_rprintf(r, "cache type: <b>DC (Distributed Cache)</b>, "
- " target: <b>%s</b><br>", ctx->target);
+ if (!(flags & AP_STATUS_SHORT)) {
+ ap_rprintf(r, "cache type: <b>DC (Distributed Cache)</b>, "
+ " target: <b>%s</b><br>", ctx->target);
+ }
+ else {
+ ap_rputs("CacheType: DC\n", r);
+ ap_rvputs(r, "CacheTarget: ", ctx->target, "\n", NULL);
+ }
}
static apr_status_t socache_dc_iterate(ap_socache_instance_t *instance,
#include "http_request.h"
#include "http_protocol.h"
#include "http_config.h"
+#include "mod_status.h"
#include "apr.h"
#include "apr_strings.h"
header->subcache_num);
cache_pct = (100 * cache_total) / (header->subcache_data_size *
header->subcache_num);
- /* Generate HTML */
- ap_rprintf(r, "cache type: <b>SHMCB</b>, shared memory: <b>%" APR_SIZE_T_FMT "</b> "
- "bytes, current entries: <b>%d</b><br>",
- ctx->shm_size, total);
- ap_rprintf(r, "subcaches: <b>%d</b>, indexes per subcache: <b>%d</b><br>",
- header->subcache_num, header->index_num);
- if (non_empty_subcaches) {
- apr_time_t average_expiry = (apr_time_t)(expiry_total / (double)non_empty_subcaches);
- ap_rprintf(r, "time left on oldest entries' objects: ");
- if (now < average_expiry)
- ap_rprintf(r, "avg: <b>%d</b> seconds, (range: %d...%d)<br>",
- (int)apr_time_sec(average_expiry - now),
- (int)apr_time_sec(min_expiry - now),
- (int)apr_time_sec(max_expiry - now));
- else
- ap_rprintf(r, "expiry_threshold: <b>Calculation error!</b><br>");
+ /* Generate Output */
+ if (!(flags & AP_STATUS_SHORT)) {
+ ap_rprintf(r, "cache type: <b>SHMCB</b>, shared memory: <b>%" APR_SIZE_T_FMT "</b> "
+ "bytes, current entries: <b>%d</b><br>",
+ ctx->shm_size, total);
+ ap_rprintf(r, "subcaches: <b>%d</b>, indexes per subcache: <b>%d</b><br>",
+ header->subcache_num, header->index_num);
+ if (non_empty_subcaches) {
+ apr_time_t average_expiry = (apr_time_t)(expiry_total / (double)non_empty_subcaches);
+ ap_rprintf(r, "time left on oldest entries' objects: ");
+ if (now < average_expiry)
+ ap_rprintf(r, "avg: <b>%d</b> seconds, (range: %d...%d)<br>",
+ (int)apr_time_sec(average_expiry - now),
+ (int)apr_time_sec(min_expiry - now),
+ (int)apr_time_sec(max_expiry - now));
+ else
+ ap_rprintf(r, "expiry_threshold: <b>Calculation error!</b><br>");
+ }
+
+ ap_rprintf(r, "index usage: <b>%d%%</b>, cache usage: <b>%d%%</b><br>",
+ index_pct, cache_pct);
+ ap_rprintf(r, "total entries stored since starting: <b>%lu</b><br>",
+ header->stat_stores);
+ ap_rprintf(r, "total entries replaced since starting: <b>%lu</b><br>",
+ header->stat_replaced);
+ ap_rprintf(r, "total entries expired since starting: <b>%lu</b><br>",
+ header->stat_expiries);
+ ap_rprintf(r, "total (pre-expiry) entries scrolled out of the cache: "
+ "<b>%lu</b><br>", header->stat_scrolled);
+ ap_rprintf(r, "total retrieves since starting: <b>%lu</b> hit, "
+ "<b>%lu</b> miss<br>", header->stat_retrieves_hit,
+ header->stat_retrieves_miss);
+ ap_rprintf(r, "total removes since starting: <b>%lu</b> hit, "
+ "<b>%lu</b> miss<br>", header->stat_removes_hit,
+ header->stat_removes_miss);
}
+ else {
+ ap_rputs("CacheType: SHMCB\n", r);
+ ap_rprintf(r, "CacheSharedMemory: %" APR_SIZE_T_FMT "\n",
+ ctx->shm_size);
+ ap_rprintf(r, "CacheCurrentEntries: %d\n", total);
+ ap_rprintf(r, "CacheSubcaches: %d\n", header->subcache_num);
+ ap_rprintf(r, "CacheIndexesPerSubcaches: %d\n", header->index_num);
+ if (non_empty_subcaches) {
+ apr_time_t average_expiry = (apr_time_t)(expiry_total / (double)non_empty_subcaches);
+ if (now < average_expiry) {
+ ap_rprintf(r, "CacheTimeLeftOldestAvg: %d\n", (int)apr_time_sec(average_expiry - now));
+ ap_rprintf(r, "CacheTimeLeftOldestMin: %d\n", (int)apr_time_sec(min_expiry - now));
+ ap_rprintf(r, "CacheTimeLeftOldestMax: %d\n", (int)apr_time_sec(max_expiry - now));
+ }
+ }
- ap_rprintf(r, "index usage: <b>%d%%</b>, cache usage: <b>%d%%</b><br>",
- index_pct, cache_pct);
- ap_rprintf(r, "total entries stored since starting: <b>%lu</b><br>",
- header->stat_stores);
- ap_rprintf(r, "total entries replaced since starting: <b>%lu</b><br>",
- header->stat_replaced);
- ap_rprintf(r, "total entries expired since starting: <b>%lu</b><br>",
- header->stat_expiries);
- ap_rprintf(r, "total (pre-expiry) entries scrolled out of the cache: "
- "<b>%lu</b><br>", header->stat_scrolled);
- ap_rprintf(r, "total retrieves since starting: <b>%lu</b> hit, "
- "<b>%lu</b> miss<br>", header->stat_retrieves_hit,
- header->stat_retrieves_miss);
- ap_rprintf(r, "total removes since starting: <b>%lu</b> hit, "
- "<b>%lu</b> miss<br>", header->stat_removes_hit,
- header->stat_removes_miss);
+ ap_rprintf(r, "CacheIndexUsage: %d%%\n", index_pct);
+ ap_rprintf(r, "CacheUsage: %d%%\n", cache_pct);
+ ap_rprintf(r, "CacheStoreCount: %lu\n", header->stat_stores);
+ ap_rprintf(r, "CacheReplaceCount: %lu\n", header->stat_replaced);
+ ap_rprintf(r, "CacheExpireCount: %lu\n", header->stat_expiries);
+ ap_rprintf(r, "CacheDiscardCount: %lu\n", header->stat_scrolled);
+ ap_rprintf(r, "CacheRetrieveHitCount: %lu\n", header->stat_retrieves_hit);
+ ap_rprintf(r, "CacheRetrieveMissCount: %lu\n", header->stat_retrieves_miss);
+ ap_rprintf(r, "CacheRemoveHitCount: %lu\n", header->stat_removes_hit);
+ ap_rprintf(r, "CacheRemoveMissCount: %lu\n", header->stat_removes_miss);
+ }
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(00841) "leaving shmcb_status");
}
proxy_balancer *balancer = NULL;
proxy_worker **worker = NULL;
- if ((flags & AP_STATUS_SHORT) || conf->balancers->nelts == 0 ||
+ if (conf->balancers->nelts == 0 ||
conf->proxy_status == status_off)
return OK;
balancer = (proxy_balancer *)conf->balancers->elts;
for (i = 0; i < conf->balancers->nelts; i++) {
- ap_rputs("<hr />\n<h1>Proxy LoadBalancer Status for ", r);
- ap_rvputs(r, balancer->s->name, "</h1>\n\n", NULL);
- ap_rputs("\n\n<table border=\"0\"><tr>"
- "<th>SSes</th><th>Timeout</th><th>Method</th>"
- "</tr>\n<tr>", r);
- if (*balancer->s->sticky) {
- if (strcmp(balancer->s->sticky, balancer->s->sticky_path)) {
- ap_rvputs(r, "<td>", balancer->s->sticky, " | ",
- balancer->s->sticky_path, NULL);
+ if (!(flags & AP_STATUS_SHORT)) {
+ ap_rputs("<hr />\n<h1>Proxy LoadBalancer Status for ", r);
+ ap_rvputs(r, balancer->s->name, "</h1>\n\n", NULL);
+ ap_rputs("\n\n<table border=\"0\"><tr>"
+ "<th>SSes</th><th>Timeout</th><th>Method</th>"
+ "</tr>\n<tr>", r);
+ if (*balancer->s->sticky) {
+ if (strcmp(balancer->s->sticky, balancer->s->sticky_path)) {
+ ap_rvputs(r, "<td>", balancer->s->sticky, " | ",
+ balancer->s->sticky_path, NULL);
+ }
+ else {
+ ap_rvputs(r, "<td>", balancer->s->sticky, NULL);
+ }
}
else {
- ap_rvputs(r, "<td>", balancer->s->sticky, NULL);
+ ap_rputs("<td> - ", r);
}
+ ap_rprintf(r, "</td><td>%" APR_TIME_T_FMT "</td>",
+ apr_time_sec(balancer->s->timeout));
+ ap_rprintf(r, "<td>%s</td>\n",
+ balancer->lbmethod->name);
+ ap_rputs("</table>\n", r);
+ ap_rputs("\n\n<table border=\"0\"><tr>"
+ "<th>Sch</th><th>Host</th><th>Stat</th>"
+ "<th>Route</th><th>Redir</th>"
+ "<th>F</th><th>Set</th><th>Acc</th><th>Wr</th><th>Rd</th>"
+ "</tr>\n", r);
}
else {
- ap_rputs("<td> - ", r);
- }
- ap_rprintf(r, "</td><td>%" APR_TIME_T_FMT "</td>",
- apr_time_sec(balancer->s->timeout));
- ap_rprintf(r, "<td>%s</td>\n",
- balancer->lbmethod->name);
- ap_rputs("</table>\n", r);
- ap_rputs("\n\n<table border=\"0\"><tr>"
- "<th>Sch</th><th>Host</th><th>Stat</th>"
- "<th>Route</th><th>Redir</th>"
- "<th>F</th><th>Set</th><th>Acc</th><th>Wr</th><th>Rd</th>"
- "</tr>\n", r);
+ ap_rprintf(r, "ProxyBalancer[%d]Name: %s\n", i, balancer->s->name);
+ }
worker = (proxy_worker **)balancer->workers->elts;
for (n = 0; n < balancer->workers->nelts; n++) {
char fbuf[50];
- ap_rvputs(r, "<tr>\n<td>", (*worker)->s->scheme, "</td>", NULL);
- ap_rvputs(r, "<td>", (*worker)->s->hostname, "</td><td>", NULL);
- ap_rvputs(r, ap_proxy_parse_wstatus(r->pool, *worker), NULL);
- ap_rvputs(r, "</td><td>", (*worker)->s->route, NULL);
- ap_rvputs(r, "</td><td>", (*worker)->s->redirect, NULL);
- ap_rprintf(r, "</td><td>%d</td>", (*worker)->s->lbfactor);
- ap_rprintf(r, "<td>%d</td>", (*worker)->s->lbset);
- ap_rprintf(r, "<td>%" APR_SIZE_T_FMT "</td><td>", (*worker)->s->elected);
- ap_rputs(apr_strfsize((*worker)->s->transferred, fbuf), r);
- ap_rputs("</td><td>", r);
- ap_rputs(apr_strfsize((*worker)->s->read, fbuf), r);
- ap_rputs("</td>\n", r);
-
- /* TODO: Add the rest of dynamic worker data */
- ap_rputs("</tr>\n", r);
+ if (!(flags & AP_STATUS_SHORT)) {
+ ap_rvputs(r, "<tr>\n<td>", (*worker)->s->scheme, "</td>", NULL);
+ ap_rvputs(r, "<td>", (*worker)->s->hostname, "</td><td>", NULL);
+ ap_rvputs(r, ap_proxy_parse_wstatus(r->pool, *worker), NULL);
+ ap_rvputs(r, "</td><td>", (*worker)->s->route, NULL);
+ ap_rvputs(r, "</td><td>", (*worker)->s->redirect, NULL);
+ ap_rprintf(r, "</td><td>%d</td>", (*worker)->s->lbfactor);
+ ap_rprintf(r, "<td>%d</td>", (*worker)->s->lbset);
+ ap_rprintf(r, "<td>%" APR_SIZE_T_FMT "</td><td>",
+ (*worker)->s->elected);
+ ap_rputs(apr_strfsize((*worker)->s->transferred, fbuf), r);
+ ap_rputs("</td><td>", r);
+ ap_rputs(apr_strfsize((*worker)->s->read, fbuf), r);
+ ap_rputs("</td>\n", r);
+
+ /* TODO: Add the rest of dynamic worker data */
+ ap_rputs("</tr>\n", r);
+ }
+ else {
+ ap_rprintf(r, "ProxyBalancer[%d]Worker[%d]Name: %s\n",
+ i, n, (*worker)->s->name);
+ ap_rprintf(r, "ProxyBalancer[%d]Worker[%d]Status: %s\n",
+ i, n, ap_proxy_parse_wstatus(r->pool, *worker));
+ ap_rprintf(r, "ProxyBalancer[%d]Worker[%d]Elected: %"
+ APR_SIZE_T_FMT "\n",
+ i, n, (*worker)->s->elected);
+ ap_rprintf(r, "ProxyBalancer[%d]Worker[%d]Sent: %s\n",
+ i, n, apr_strfsize((*worker)->s->transferred, fbuf));
+ ap_rprintf(r, "ProxyBalancer[%d]Worker[%d]Rcvd: %s\n",
+ i, n, apr_strfsize((*worker)->s->read, fbuf));
+ /* TODO: Add the rest of dynamic worker data */
+ }
++worker;
}
- ap_rputs("</table>\n", r);
+ if (!(flags & AP_STATUS_SHORT)) {
+ ap_rputs("</table>\n", r);
+ }
++balancer;
}
- ap_rputs("<hr /><table>\n"
- "<tr><th>SSes</th><td>Sticky session name</td></tr>\n"
- "<tr><th>Timeout</th><td>Balancer Timeout</td></tr>\n"
- "<tr><th>Sch</th><td>Connection scheme</td></tr>\n"
- "<tr><th>Host</th><td>Backend Hostname</td></tr>\n"
- "<tr><th>Stat</th><td>Worker status</td></tr>\n"
- "<tr><th>Route</th><td>Session Route</td></tr>\n"
- "<tr><th>Redir</th><td>Session Route Redirection</td></tr>\n"
- "<tr><th>F</th><td>Load Balancer Factor</td></tr>\n"
- "<tr><th>Acc</th><td>Number of uses</td></tr>\n"
- "<tr><th>Wr</th><td>Number of bytes transferred</td></tr>\n"
- "<tr><th>Rd</th><td>Number of bytes read</td></tr>\n"
- "</table>", r);
+ if (!(flags & AP_STATUS_SHORT)) {
+ ap_rputs("<hr /><table>\n"
+ "<tr><th>SSes</th><td>Sticky session name</td></tr>\n"
+ "<tr><th>Timeout</th><td>Balancer Timeout</td></tr>\n"
+ "<tr><th>Sch</th><td>Connection scheme</td></tr>\n"
+ "<tr><th>Host</th><td>Backend Hostname</td></tr>\n"
+ "<tr><th>Stat</th><td>Worker status</td></tr>\n"
+ "<tr><th>Route</th><td>Session Route</td></tr>\n"
+ "<tr><th>Redir</th><td>Session Route Redirection</td></tr>\n"
+ "<tr><th>F</th><td>Load Balancer Factor</td></tr>\n"
+ "<tr><th>Acc</th><td>Number of uses</td></tr>\n"
+ "<tr><th>Wr</th><td>Number of bytes transferred</td></tr>\n"
+ "<tr><th>Rd</th><td>Number of bytes read</td></tr>\n"
+ "</table>", r);
+ }
return OK;
}
{
SSLModConfigRec *mc = myModConfig(r->server);
- if (mc == NULL || flags & AP_STATUS_SHORT || mc->sesscache == NULL)
+ if (mc == NULL || mc->sesscache == NULL)
return OK;
- ap_rputs("<hr>\n", r);
- ap_rputs("<table cellspacing=0 cellpadding=0>\n", r);
- ap_rputs("<tr><td bgcolor=\"#000000\">\n", r);
- ap_rputs("<b><font color=\"#ffffff\" face=\"Arial,Helvetica\">SSL/TLS Session Cache Status:</font></b>\r", r);
- ap_rputs("</td></tr>\n", r);
- ap_rputs("<tr><td bgcolor=\"#ffffff\">\n", r);
+ if (!(flags & AP_STATUS_SHORT)) {
+ ap_rputs("<hr>\n", r);
+ ap_rputs("<table cellspacing=0 cellpadding=0>\n", r);
+ ap_rputs("<tr><td bgcolor=\"#000000\">\n", r);
+ ap_rputs("<b><font color=\"#ffffff\" face=\"Arial,Helvetica\">SSL/TLS Session Cache Status:</font></b>\r", r);
+ ap_rputs("</td></tr>\n", r);
+ ap_rputs("<tr><td bgcolor=\"#ffffff\">\n", r);
+ }
+ else {
+ ap_rputs("TLSSessionCacheStatus\n", r);
+ }
if (mc->sesscache->flags & AP_SOCACHE_FLAG_NOTMPSAFE) {
ssl_mutex_on(r->server);
ssl_mutex_off(r->server);
}
- ap_rputs("</td></tr>\n", r);
- ap_rputs("</table>\n", r);
+ if (!(flags & AP_STATUS_SHORT)) {
+ ap_rputs("</td></tr>\n", r);
+ ap_rputs("</table>\n", r);
+ }
+
return OK;
}