diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index 1efe95c..5276cac 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -2242,14 +2242,7 @@ static int proxy_status_hook(request_rec *r, int flags) char fbuf[50]; ap_rvputs(r, "\n", worker->scheme, "", NULL); ap_rvputs(r, "", worker->hostname, "", NULL); - if (worker->s->status & PROXY_WORKER_DISABLED) - ap_rputs("Dis", r); - else if (worker->s->status & PROXY_WORKER_IN_ERROR) - ap_rputs("Err", r); - else if (worker->s->status & PROXY_WORKER_INITIALIZED) - ap_rputs("Ok", r); - else - ap_rputs("-", r); + ap_rvputs(r, ap_proxy_parse_wstatus(r->pool, worker), NULL); ap_rvputs(r, "", worker->s->route, NULL); ap_rvputs(r, "", worker->s->redirect, NULL); ap_rprintf(r, "%d", worker->s->lbfactor); diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 4a4bf17..1b4ba6d 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -274,6 +274,16 @@ struct proxy_conn_pool { #define PROXY_WORKER_IN_ERROR 0x0080 #define PROXY_WORKER_HOT_STANDBY 0x0100 +/* worker status flags */ +#define PROXY_WORKER_INITIALIZED_FLAG 'O' +#define PROXY_WORKER_IGNORE_ERRORS_FLAG 'I' +#define PROXY_WORKER_IN_SHUTDOWN_FLAG 'U' +#define PROXY_WORKER_DISABLED_FLAG 'D' +#define PROXY_WORKER_STOPPED_FLAG 'S' +#define PROXY_WORKER_IN_ERROR_FLAG 'E' +#define PROXY_WORKER_HOT_STANDBY_FLAG 'H' +#define PROXY_WORKER_FREE_FLAG 'F' + #define PROXY_WORKER_NOT_USABLE_BITMAP ( PROXY_WORKER_IN_SHUTDOWN | \ PROXY_WORKER_DISABLED | PROXY_WORKER_STOPPED | PROXY_WORKER_IN_ERROR ) @@ -776,6 +786,23 @@ PROXY_DECLARE(apr_status_t) ap_proxy_buckets_lifetime_transform(request_rec *r, apr_bucket_brigade *from, apr_bucket_brigade *to); +/** + * Set/unset the worker status bitfield depending on flag + * @param c flag + * @param set set or unset bit + * @param w worker to use + * @return APR_SUCCESS if valid flag + */ +PROXY_DECLARE(apr_status_t) ap_proxy_set_wstatus(char c, int set, proxy_worker *w); + +/** + * Create readable representation of worker status bitfield + * @param p pool + * @param w worker to use + * @return string representation of status + */ +PROXY_DECLARE(char *) ap_proxy_parse_wstatus(apr_pool_t *p, proxy_worker *w); + #define PROXY_LBMETHOD "proxylbmethod" /* The number of dynamic workers that can be added when reconfiguring. diff --git a/modules/proxy/mod_proxy_balancer.c b/modules/proxy/mod_proxy_balancer.c index 90f3d08..e58503f 100644 --- a/modules/proxy/mod_proxy_balancer.c +++ b/modules/proxy/mod_proxy_balancer.c @@ -675,6 +675,18 @@ static int balancer_init(apr_pool_t *p, apr_pool_t *plog, return OK; } +static void create_radio(const char *name, unsigned int flag, proxy_worker *w, + request_rec *r) +{ + ap_rvputs(r, "Set s->status & flag) + ap_rputs(" checked", r); + ap_rvputs(r, ">
Clear s->status & flag)) + ap_rputs(" checked", r); + ap_rputs(">\n", r); +} + /* Manages the loadfactors and member status */ static int balancer_handler(request_rec *r) @@ -770,11 +782,17 @@ static int balancer_handler(request_rec *r) else *wsel->s->redirect = '\0'; } - if ((val = apr_table_get(params, "dw"))) { - if (!strcasecmp(val, "Disable")) - wsel->s->status |= PROXY_WORKER_DISABLED; - else if (!strcasecmp(val, "Enable")) - wsel->s->status &= ~PROXY_WORKER_DISABLED; + if ((val = apr_table_get(params, "status_I"))) { + ap_proxy_set_wstatus('I', atoi(val), wsel); + } + if ((val = apr_table_get(params, "status_N"))) { + ap_proxy_set_wstatus('N', atoi(val), wsel); + } + if ((val = apr_table_get(params, "status_D"))) { + ap_proxy_set_wstatus('D', atoi(val), wsel); + } + if ((val = apr_table_get(params, "status_H"))) { + ap_proxy_set_wstatus('H', atoi(val), wsel); } if ((val = apr_table_get(params, "ls"))) { int ival = atoi(val); @@ -784,10 +802,11 @@ static int balancer_handler(request_rec *r) } } + if (apr_table_get(params, "xml")) { ap_set_content_type(r, "text/xml"); - ap_rputs("\n", r); - ap_rputs("\n", r); + ap_rputs("\n", r); + ap_rputs("\n", r); ap_rputs(" \n", r); balancer = (proxy_balancer *)conf->balancers->elts; for (i = 0; i < conf->balancers->nelts; i++) { @@ -865,18 +884,7 @@ static int balancer_handler(request_rec *r) ap_escape_html(r->pool, worker->s->redirect), NULL); ap_rprintf(r, "%d", worker->s->lbfactor); ap_rprintf(r, "%d", worker->s->lbset); - if (worker->s->status & PROXY_WORKER_DISABLED) - ap_rputs("Dis ", r); - if (worker->s->status & PROXY_WORKER_IN_ERROR) - ap_rputs("Err ", r); - if (worker->s->status & PROXY_WORKER_STOPPED) - ap_rputs("Stop ", r); - if (worker->s->status & PROXY_WORKER_HOT_STANDBY) - ap_rputs("Stby ", r); - if (PROXY_WORKER_IS_USABLE(worker)) - ap_rputs("Ok", r); - if (!PROXY_WORKER_IS_INITIALIZED(worker)) - ap_rputs("-", r); + ap_rvputs(r, ap_proxy_parse_wstatus(r->pool, worker), NULL); ap_rputs("", r); ap_rprintf(r, "%" APR_SIZE_T_FMT "", worker->s->elected); ap_rputs(apr_strfsize(worker->s->transferred, fbuf), r); @@ -907,21 +915,20 @@ static int balancer_handler(request_rec *r) ap_rvputs(r, "value=\"", ap_escape_html(r->pool, wsel->s->redirect), NULL); ap_rputs("\">\n", r); - ap_rputs("Status:Disabled: s->status & PROXY_WORKER_DISABLED) - ap_rputs(" checked", r); - ap_rputs("> | Enabled: s->status & PROXY_WORKER_DISABLED)) - ap_rputs(" checked", r); - ap_rputs(">\n", r); - ap_rputs("\n", r); - ap_rvputs(r, "\npool, wsel->name), "\">\n", NULL); - ap_rvputs(r, "name + sizeof("balancer://") - 1, - "\">\n", NULL); - ap_rvputs(r, "\n", NULL); + ap_rputs("Status:", r); + ap_rputs("\n", r); + create_radio("status_I", PROXY_WORKER_IGNORE_ERRORS, wsel, r); + create_radio("status_D", PROXY_WORKER_DISABLED, wsel, r); + create_radio("status_H", PROXY_WORKER_HOT_STANDBY, wsel, r); + ap_rputs("
IgnDisStby
\n", r); + ap_rputs("\n", r); + ap_rvputs(r, "\n\n", NULL); + ap_rvputs(r, "\n", NULL); + ap_rvputs(r, "\n", NULL); ap_rvputs(r, "\n", NULL); ap_rputs("
\n", r); } diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 95f4a78..58f630b 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -2678,3 +2678,69 @@ ap_proxy_buckets_lifetime_transform(request_rec *r, apr_bucket_brigade *from, } return rv; } + +PROXY_DECLARE(apr_status_t) ap_proxy_set_wstatus(const char c, int set, proxy_worker *w) +{ + char bit = toupper(c); + switch (bit) { + case PROXY_WORKER_DISABLED_FLAG : + if (set) + w->s->status |= PROXY_WORKER_DISABLED; + else + w->s->status &= ~PROXY_WORKER_DISABLED; + break; + case PROXY_WORKER_STOPPED_FLAG : + if (set) + w->s->status |= PROXY_WORKER_STOPPED; + else + w->s->status &= ~PROXY_WORKER_STOPPED; + break; + case PROXY_WORKER_IN_ERROR_FLAG : + if (set) + w->s->status |= PROXY_WORKER_IN_ERROR; + else + w->s->status &= ~PROXY_WORKER_IN_ERROR; + break; + case PROXY_WORKER_HOT_STANDBY_FLAG : + if (set) + w->s->status |= PROXY_WORKER_HOT_STANDBY; + else + w->s->status &= ~PROXY_WORKER_HOT_STANDBY; + break; + case PROXY_WORKER_IGNORE_ERRORS_FLAG : + if (set) + w->s->status |= PROXY_WORKER_IGNORE_ERRORS; + else + w->s->status &= ~PROXY_WORKER_IGNORE_ERRORS; + break; + default: + return APR_EINVAL; + break; + } + return APR_SUCCESS; +} + +PROXY_DECLARE(char *) ap_proxy_parse_wstatus(apr_pool_t *p, proxy_worker *w) +{ + char *ret = NULL; + unsigned int status = w->s->status; + if (status & PROXY_WORKER_INITIALIZED) + ret = apr_pstrcat(p, "Init ", NULL); + else + ret = apr_pstrcat(p, "!Init ", NULL); + if (status & PROXY_WORKER_IGNORE_ERRORS) + ret = apr_pstrcat(p, ret, "Ign ", NULL); + if (status & PROXY_WORKER_IN_SHUTDOWN) + ret = apr_pstrcat(p, ret, "Shut ", NULL); + if (status & PROXY_WORKER_DISABLED) + ret = apr_pstrcat(p, ret, "Dis ", NULL); + if (status & PROXY_WORKER_STOPPED) + ret = apr_pstrcat(p, ret, "Stop ", NULL); + if (status & PROXY_WORKER_IN_ERROR) + ret = apr_pstrcat(p, ret, "Err ", NULL); + if (status & PROXY_WORKER_HOT_STANDBY) + ret = apr_pstrcat(p, ret, "Stby ", NULL); + if (PROXY_WORKER_IS_USABLE(w)) + ret = apr_pstrcat(p, ret, "Ok ", NULL); + return ret; +}