From e2e8cc8e79ecca7d7d551362982974ba93bc57ad Mon Sep 17 00:00:00 2001 From: Joe Orton Date: Tue, 25 Nov 2003 16:59:10 +0000 Subject: [PATCH] Extend mod_status output to include SSL session cache status information: * modules/ssl/mod_ssl.c (ssl_hook_pre_config): Call ssl_scache_status_register. * modules/ssl/ssl_scache.c (ssl_scache_status): Removed function. (ssl_ext_status_hook): Renamed from ssl_ext_ms_display: switch to 2.1's mod_status "status_hook" API. (ssl_scache_status_register): Register optional hook. * modules/ssl/ssl_scache_dbm.c (ssl_scache_dbm_status): Adjust to use new API. * modules/ssl/ssl_scache_shmcb.c (ssl_scache_shmcb_status): Adjust to use new API. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@101889 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 3 ++ modules/ssl/mod_ssl.c | 5 +-- modules/ssl/mod_ssl.h | 8 ++-- modules/ssl/ssl_scache.c | 58 ++++++++++------------------- modules/ssl/ssl_scache_dbm.c | 18 ++++----- modules/ssl/ssl_scache_shmcb.c | 67 ++++++++++++++++------------------ 6 files changed, 68 insertions(+), 91 deletions(-) diff --git a/CHANGES b/CHANGES index 9fa02c9a7e..a73f1f07c4 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,9 @@ Changes with Apache 2.1.0-dev [Remove entries to the current 2.0 section below, when backported] + *) mod_ssl/mod_status: Re-enable support for output of SSL session + cache information in server-status page. [Joe Orton] + *) mod_ssl: Remove the shmht session cache, shmcb should be used instead. [Joe Orton] diff --git a/modules/ssl/mod_ssl.c b/modules/ssl/mod_ssl.c index 361937e5ee..677cb9eb0a 100644 --- a/modules/ssl/mod_ssl.c +++ b/modules/ssl/mod_ssl.c @@ -298,10 +298,9 @@ static int ssl_hook_pre_config(apr_pool_t *pconf, /* Register us to handle mod_log_config %c/%x variables */ ssl_var_log_config_register(pconf); -#if 0 /* XXX */ - /* XXX: Register us to handle mod_status extensions that don't exist yet */ + + /* Register to handle mod_status status page generation */ ssl_scache_status_register(pconf); -#endif /* -0- */ return OK; } diff --git a/modules/ssl/mod_ssl.h b/modules/ssl/mod_ssl.h index 8d8519072f..4aa926ac38 100644 --- a/modules/ssl/mod_ssl.h +++ b/modules/ssl/mod_ssl.h @@ -578,15 +578,13 @@ void ssl_callback_LogTracingState(MODSSL_INFO_CB_ARG_TYPE, int, int); /* Session Cache Support */ void ssl_scache_init(server_rec *, apr_pool_t *); -#if 0 /* XXX */ void ssl_scache_status_register(apr_pool_t *p); -#endif void ssl_scache_kill(server_rec *); BOOL ssl_scache_store(server_rec *, UCHAR *, int, time_t, SSL_SESSION *); SSL_SESSION *ssl_scache_retrieve(server_rec *, UCHAR *, int); void ssl_scache_remove(server_rec *, UCHAR *, int); void ssl_scache_expire(server_rec *); -void ssl_scache_status(server_rec *, apr_pool_t *, void (*)(char *, void *), void *); + char *ssl_scache_id2sz(UCHAR *, int); void ssl_scache_dbm_init(server_rec *, apr_pool_t *); void ssl_scache_dbm_kill(server_rec *); @@ -594,7 +592,7 @@ BOOL ssl_scache_dbm_store(server_rec *, UCHAR *, int, time_t, SSL_SESSIO SSL_SESSION *ssl_scache_dbm_retrieve(server_rec *, UCHAR *, int); void ssl_scache_dbm_remove(server_rec *, UCHAR *, int); void ssl_scache_dbm_expire(server_rec *); -void ssl_scache_dbm_status(server_rec *, apr_pool_t *, void (*)(char *, void *), void *); +void ssl_scache_dbm_status(request_rec *r, int flags, apr_pool_t *pool); void ssl_scache_shmht_init(server_rec *, apr_pool_t *); void ssl_scache_shmht_kill(server_rec *); @@ -610,7 +608,7 @@ BOOL ssl_scache_shmcb_store(server_rec *, UCHAR *, int, time_t, SSL_SESS SSL_SESSION *ssl_scache_shmcb_retrieve(server_rec *, UCHAR *, int); void ssl_scache_shmcb_remove(server_rec *, UCHAR *, int); void ssl_scache_shmcb_expire(server_rec *); -void ssl_scache_shmcb_status(server_rec *, apr_pool_t *, void (*)(char *, void *), void *); +void ssl_scache_shmcb_status(request_rec *r, int flags, apr_pool_t *pool); /* Pass Phrase Support */ void ssl_pphrase_Handle(server_rec *, apr_pool_t *); diff --git a/modules/ssl/ssl_scache.c b/modules/ssl/ssl_scache.c index 61c4a2cc9a..7dab001a41 100644 --- a/modules/ssl/ssl_scache.c +++ b/modules/ssl/ssl_scache.c @@ -62,6 +62,7 @@ yourself in the foot for free.'' -- Unknown */ #include "mod_ssl.h" +#include "mod_status.h" /* _________________________________________________________________ ** @@ -147,17 +148,6 @@ void ssl_scache_remove(server_rec *s, UCHAR *id, int idlen) return; } -void ssl_scache_status(server_rec *s, apr_pool_t *p, void (*func)(char *, void *), void *arg) -{ - SSLModConfigRec *mc = myModConfig(s); - - if (mc->nSessionCacheMode == SSL_SCMODE_DBM) - ssl_scache_dbm_status(s, p, func, arg); - else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) - ssl_scache_shmcb_status(s, p, func, arg); - return; -} - void ssl_scache_expire(server_rec *s) { SSLModConfigRec *mc = myModConfig(s); @@ -174,43 +164,33 @@ void ssl_scache_expire(server_rec *s) ** SSL Extension to mod_status ** _________________________________________________________________ */ -#if 0 /* NOT YET */ -static void ssl_ext_ms_display(request_rec *, int, int); - -void ssl_scache_status_register(apr_pool_t *p) -{ - /* XXX point mod_status to this update, when it grows the opt fn */ -#if 0 - ap_hook_register("ap::mod_status::display", ssl_ext_ms_display, AP_HOOK_NOCTX); -#endif - return; -} - -static void ssl_ext_ms_display_cb(char *str, void *_r) -{ - request_rec *r = (request_rec *)_r; - if (str != NULL) - ap_rputs(str, r); - return; -} - -static void ssl_ext_ms_display(request_rec *r, int no_table_report, int short_report) +static int ssl_ext_status_hook(request_rec *r, int flags) { SSLSrvConfigRec *sc = mySrvConfig(r->server); - if (sc == NULL) - return; - if (short_report) - return; + if (sc == NULL || flags & AP_STATUS_SHORT) + return OK; + ap_rputs("
\n", r); ap_rputs("\n", r); ap_rputs("\n", r); ap_rputs("\n", r); ap_rputs("
\n", r); ap_rputs("SSL/TLS Session Cache Status:\r", r); ap_rputs("
\n", r); - ssl_scache_status(r->server, r->pool, ssl_ext_ms_display_cb, r); + + if (sc->mc->nSessionCacheMode == SSL_SCMODE_DBM) + ssl_scache_dbm_status(r, flags, r->pool); + else if (sc->mc->nSessionCacheMode == SSL_SCMODE_SHMCB) + ssl_scache_shmcb_status(r, flags, r->pool); + ap_rputs("
\n", r); - return; + return OK; } -#endif + +void ssl_scache_status_register(apr_pool_t *p) +{ + APR_OPTIONAL_HOOK(ap, status_hook, ssl_ext_status_hook, NULL, NULL, + APR_HOOK_MIDDLE); +} + diff --git a/modules/ssl/ssl_scache_dbm.c b/modules/ssl/ssl_scache_dbm.c index 6ec20037c2..126185a66a 100644 --- a/modules/ssl/ssl_scache_dbm.c +++ b/modules/ssl/ssl_scache_dbm.c @@ -441,9 +441,9 @@ void ssl_scache_dbm_expire(server_rec *s) return; } -void ssl_scache_dbm_status(server_rec *s, apr_pool_t *p, void (*func)(char *, void *), void *arg) +void ssl_scache_dbm_status(request_rec *r, int flags, apr_pool_t *p) { - SSLModConfigRec *mc = myModConfig(s); + SSLModConfigRec *mc = myModConfig(r->server); apr_dbm_t *dbm; apr_datum_t dbmkey; apr_datum_t dbmval; @@ -454,18 +454,18 @@ void ssl_scache_dbm_status(server_rec *s, apr_pool_t *p, void (*func)(char *, vo nElem = 0; nSize = 0; - ssl_mutex_on(s); + ssl_mutex_on(r->server); /* * XXX - Check what pool is to be used - TBD */ if ((rv = apr_dbm_open(&dbm, mc->szSessionCacheDataFile, APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, mc->pPool)) != APR_SUCCESS) { - ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "Cannot open SSLSessionCache DBM file `%s' for status " "retrival", mc->szSessionCacheDataFile); - ssl_mutex_off(s); + ssl_mutex_off(r->server); return; } /* @@ -480,14 +480,14 @@ void ssl_scache_dbm_status(server_rec *s, apr_pool_t *p, void (*func)(char *, vo nSize += dbmval.dsize; } apr_dbm_close(dbm); - ssl_mutex_off(s); + ssl_mutex_off(r->server); if (nSize > 0 && nElem > 0) nAverage = nSize / nElem; else nAverage = 0; - func(apr_psprintf(p, "cache type: DBM, maximum size: unlimited
"), arg); - func(apr_psprintf(p, "current sessions: %d, current size: %d bytes
", nElem, nSize), arg); - func(apr_psprintf(p, "average session size: %d bytes
", nAverage), arg); + ap_rprintf(r, "cache type: DBM, maximum size: unlimited
"); + ap_rprintf(r, "current sessions: %d, current size: %d bytes
", nElem, nSize); + ap_rprintf(r, "average session size: %d bytes
", nAverage); return; } diff --git a/modules/ssl/ssl_scache_shmcb.c b/modules/ssl/ssl_scache_shmcb.c index 8d058fea64..a17676cd29 100644 --- a/modules/ssl/ssl_scache_shmcb.c +++ b/modules/ssl/ssl_scache_shmcb.c @@ -474,10 +474,9 @@ void ssl_scache_shmcb_expire(server_rec *s) return; } -void ssl_scache_shmcb_status(server_rec *s, apr_pool_t *p, - void (*func) (char *, void *), void *arg) +void ssl_scache_shmcb_status(request_rec *r, int flags, apr_pool_t *p) { - SSLModConfigRec *mc = myModConfig(s); + SSLModConfigRec *mc = myModConfig(r->server); SHMCBHeader *header; SHMCBQueue queue; SHMCBCache cache; @@ -487,8 +486,7 @@ void ssl_scache_shmcb_status(server_rec *s, apr_pool_t *p, double expiry_total; time_t average_expiry, now, max_expiry, min_expiry, idxexpiry; - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "inside ssl_scache_shmcb_status"); + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "inside shmcb_status"); /* Get the header structure. */ shmcb_get_header(mc->tSessionCacheDataTable, &header); @@ -502,7 +500,7 @@ void ssl_scache_shmcb_status(server_rec *s, apr_pool_t *p, now = time(NULL); for (loop = 0; loop <= header->division_mask; loop++) { if (shmcb_get_division(header, &queue, &cache, loop)) { - shmcb_expire_division(s, &queue, &cache); + shmcb_expire_division(r->server, &queue, &cache); total += shmcb_get_safe_uint(queue.pos_count); cache_total += shmcb_get_safe_uint(cache.pos_count); if (shmcb_get_safe_uint(queue.pos_count) > 0) { @@ -523,40 +521,39 @@ void ssl_scache_shmcb_status(server_rec *s, apr_pool_t *p, } index_pct = (100 * total) / (header->index_num * (header->division_mask + 1)); cache_pct = (100 * cache_total) / (header->cache_data_size * (header->division_mask + 1)); - func(apr_psprintf(p, "cache type: SHMCB, shared memory: %d " - "bytes, current sessions: %d
", - mc->nSessionCacheDataSize, total), arg); - func(apr_psprintf(p, "sub-caches: %d, indexes per sub-cache: " - "%d
", (int) header->division_mask + 1, - (int) header->index_num), arg); + ap_rprintf(r, "cache type: SHMCB, shared memory: %d " + "bytes, current sessions: %d
", + mc->nSessionCacheDataSize, total); + ap_rprintf(r, "sub-caches: %d, indexes per sub-cache: " + "%d
", (int) header->division_mask + 1, + (int) header->index_num); if (non_empty_divisions != 0) { average_expiry = (time_t)(expiry_total / (double)non_empty_divisions); - func(apr_psprintf(p, "time left on oldest entries' SSL sessions: "), arg); + ap_rprintf(r, "time left on oldest entries' SSL sessions: "); if (now < average_expiry) - func(apr_psprintf(p, "avg: %d seconds, (range: %d...%d)
", - (int)(average_expiry - now), (int) (min_expiry - now), - (int)(max_expiry - now)), arg); + ap_rprintf(r, "avg: %d seconds, (range: %d...%d)
", + (int)(average_expiry - now), (int) (min_expiry - now), + (int)(max_expiry - now)); else - func(apr_psprintf(p, "expiry threshold: Calculation Error!" - "
"), arg); - + ap_rprintf(r, "expiry threshold: Calculation Error!" + "
"); + } - func(apr_psprintf(p, "index usage: %d%%, cache usage: %d%%" - "
", index_pct, cache_pct), arg); - func(apr_psprintf(p, "total sessions stored since starting: %lu
", - header->num_stores), arg); - func(apr_psprintf(p,"total sessions expired since starting: %lu
", - header->num_expiries), arg); - func(apr_psprintf(p, "total (pre-expiry) sessions scrolled out of the " - "cache: %lu
", header->num_scrolled), arg); - func(apr_psprintf(p, "total retrieves since starting: %lu hit, " - "%lu miss
", header->num_retrieves_hit, - header->num_retrieves_miss), arg); - func(apr_psprintf(p, "total removes since starting: %lu hit, " - "%lu miss
", header->num_removes_hit, - header->num_removes_miss), arg); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, - "leaving shmcb_status"); + ap_rprintf(r, "index usage: %d%%, cache usage: %d%%" + "
", index_pct, cache_pct); + ap_rprintf(r, "total sessions stored since starting: %lu
", + header->num_stores); + ap_rprintf(r, "total sessions expired since starting: %lu
", + header->num_expiries); + ap_rprintf(r, "total (pre-expiry) sessions scrolled out of the " + "cache: %lu
", header->num_scrolled); + ap_rprintf(r, "total retrieves since starting: %lu hit, " + "%lu miss
", header->num_retrieves_hit, + header->num_retrieves_miss); + ap_rprintf(r, "total removes since starting: %lu hit, " + "%lu miss
", header->num_removes_hit, + header->num_removes_miss); + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "leaving shmcb_status"); return; } -- 2.50.1