in native/common/jk_status.c [2237:2649]
static void display_worker_lb(jk_ws_service_t *s,
status_endpoint_t *p,
lb_worker_t *lb,
lb_sub_worker_t *swr,
jk_log_context_t *l)
{
int cmd;
int mime;
int read_only = 0;
int single = 0;
unsigned int hide_members;
unsigned int hide_lb_conf;
unsigned int hide_lb_summary;
unsigned int hide_ajp_conf;
const char *arg;
time_t now = time(NULL);
unsigned int good = 0;
unsigned int degraded = 0;
unsigned int bad = 0;
int map_count;
int ms_min;
int ms_max;
unsigned int j;
int pstart = JK_FALSE;
const char *name = lb->name;
status_worker_t *w = p->worker;
JK_TRACE_ENTER(l);
status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l);
cmd = status_cmd_int(arg);
status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l);
mime = status_mime_int(arg);
hide_members = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
JK_STATUS_ARG_OPTION_NO_MEMBERS;
hide_lb_conf = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
JK_STATUS_ARG_OPTION_NO_LB_CONF;
hide_lb_summary = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
JK_STATUS_ARG_OPTION_NO_LB_SUMMARY;
hide_ajp_conf = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
JK_STATUS_ARG_OPTION_NO_AJP_CONF;
if (w->read_only) {
read_only = 1;
}
else {
read_only = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
JK_STATUS_ARG_OPTION_READ_ONLY;
}
if (cmd == JK_STATUS_CMD_SHOW) {
single = 1;
}
if (lb->sequence != lb->s->h.sequence)
jk_lb_pull(lb, JK_FALSE, l);
for (j = 0; j < lb->num_of_workers; j++) {
lb_sub_worker_t *wr = &(lb->lb_workers[j]);
int rate;
rate = status_rate(wr, w, l);
if (rate > 0)
good++;
else if (rate < 0)
bad++;
else
degraded++;
}
map_count = count_maps(s, name, l);
ms_min = lb->maintain_time - (int)difftime(now, lb->s->last_maintain_time);
ms_max = ms_min + lb->maintain_time;
if (ms_min < 0) {
ms_min = 0;
}
if (ms_max < 0) {
ms_max = 0;
}
if (mime == JK_STATUS_MIME_HTML) {
jk_puts(s, "<hr/><h3>[");
if (single) {
jk_puts(s, "S");
}
else {
status_write_uri(s, p, "S", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
name, "", 0, 0, "", l);
}
if (!read_only) {
jk_puts(s, "|");
status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, JK_STATUS_MIME_UNKNOWN,
name, "", 0, 0, "", l);
jk_puts(s, "|");
status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, JK_STATUS_MIME_UNKNOWN,
name, "", 0, 0, "", l);
}
jk_puts(s, "] ");
jk_putv(s, "Worker Status for ", name, "</h3>\n", NULL);
if (hide_lb_conf) {
pstart = JK_TRUE;
jk_puts(s, "<p>\n");
if (single) {
status_write_uri(s, p, "Show LB Configuration", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_CONF, "", l);
}
else {
status_write_uri(s, p, "Show LB Configuration", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_CONF, "", l);
}
}
if (hide_lb_summary) {
if (pstart == JK_FALSE)
jk_puts(s, "<p>\n");
else
jk_puts(s, " | ");
pstart = JK_TRUE;
if (single) {
status_write_uri(s, p, "Show LB Summary", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_SUMMARY, "", l);
}
else {
status_write_uri(s, p, "Show LB Summary", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_SUMMARY, "", l);
}
}
if (!hide_members && hide_ajp_conf) {
if (pstart == JK_FALSE)
jk_puts(s, "<p>\n");
else
jk_puts(s, " | ");
pstart = JK_TRUE;
if (single) {
status_write_uri(s, p, "Show AJP Configuration", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_AJP_CONF, "", l);
}
else {
status_write_uri(s, p, "Show AJP Configuration", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_AJP_CONF, "", l);
}
}
if (hide_members) {
if (pstart == JK_FALSE)
jk_puts(s, "<p>\n");
else
jk_puts(s, " | ");
pstart = JK_TRUE;
if (single) {
status_write_uri(s, p, "Show Balancer Members", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_MEMBERS, "", l);
}
else {
status_write_uri(s, p, "Show Balancer Members", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_MEMBERS, "", l);
}
}
if (pstart == JK_TRUE)
jk_puts(s, "</p>\n");
if (!hide_lb_conf) {
jk_puts(s, "<table>" JK_STATUS_SHOW_LB_HEAD);
jk_puts(s, "[");
status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
NULL, NULL, JK_STATUS_ARG_OPTION_NO_LB_CONF, 0, NULL, l);
jk_puts(s, "]</th></tr>");
jk_printf(s, l, JK_STATUS_SHOW_LB_ROW,
status_worker_type(JK_LB_WORKER_TYPE),
jk_get_bool(lb->sticky_session),
jk_get_bool(lb->sticky_session_force),
lb->retries,
jk_lb_get_method(lb, l),
jk_lb_get_lock(lb, l),
lb->recover_wait_time,
lb->error_escalation_time,
lb->max_reply_timeouts);
jk_puts(s, "</table>\n<br/>\n");
}
if (!hide_lb_summary) {
jk_puts(s, "<table><tr>"
"<th>Good</th><th>Degraded</th><th>Bad/Stopped</th><th>Busy</th><th>Max Busy</th><th>Next Maintenance</th><th>Last Reset</th><th>[");
status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
NULL, NULL, JK_STATUS_ARG_OPTION_NO_LB_SUMMARY, 0, NULL, l);
jk_puts(s, "]</th></tr>\n<tr>");
jk_printf(s, l, "<td>%d</td>", good);
jk_printf(s, l, "<td>%d</td>", degraded);
jk_printf(s, l, "<td>%d</td>", bad);
jk_printf(s, l, "<td>%d</td>", lb->s->busy);
jk_printf(s, l, "<td>%d</td>", lb->s->max_busy);
jk_printf(s, l, "<td>%d/%d</td>", ms_min, ms_max);
jk_printf(s, l, "<td>%d</td>", (int)difftime(now, lb->s->last_reset));
jk_puts(s, "<td></td></tr>\n</table>\n\n");
}
}
else if (mime == JK_STATUS_MIME_XML) {
jk_print_xml_start_elt(s, l, w, 2, 0, "balancer");
jk_print_xml_att_string(s, l, 4, "name", name);
jk_print_xml_att_string(s, l, 4, "type", status_worker_type(JK_LB_WORKER_TYPE));
jk_print_xml_att_string(s, l, 4, "sticky_session", jk_get_bool(lb->sticky_session));
jk_print_xml_att_string(s, l, 4, "sticky_session_force", jk_get_bool(lb->sticky_session_force));
jk_print_xml_att_int(s, l, 4, "retries", lb->retries);
jk_print_xml_att_int(s, l, 4, "recover_time", lb->recover_wait_time);
jk_print_xml_att_int(s, l, 4, "error_escalation_time", lb->error_escalation_time);
jk_print_xml_att_int(s, l, 4, "max_reply_timeouts", lb->max_reply_timeouts);
jk_print_xml_att_string(s, l, 4, "method", jk_lb_get_method(lb, l));
jk_print_xml_att_string(s, l, 4, "lock", jk_lb_get_lock(lb, l));
jk_print_xml_att_int(s, l, 4, "member_count", lb->num_of_workers);
jk_print_xml_att_int(s, l, 4, "good", good);
jk_print_xml_att_int(s, l, 4, "degraded", degraded);
jk_print_xml_att_int(s, l, 4, "bad", bad);
jk_print_xml_att_int(s, l, 4, "busy", lb->s->busy);
jk_print_xml_att_int(s, l, 4, "max_busy", lb->s->max_busy);
jk_print_xml_att_int(s, l, 4, "map_count", map_count);
jk_print_xml_att_int(s, l, 4, "time_to_maintenance_min", ms_min);
jk_print_xml_att_int(s, l, 4, "time_to_maintenance_max", ms_max);
jk_print_xml_att_long(s, l, 4, "last_reset_at", (long)lb->s->last_reset);
jk_print_xml_att_int(s, l, 4, "last_reset_ago", (int)difftime(now, lb->s->last_reset));
jk_print_xml_stop_elt(s, l, 2, 0);
}
else if (mime == JK_STATUS_MIME_TXT) {
jk_puts(s, "Balancer Worker:");
jk_printf(s, l, " name=%s", name);
jk_printf(s, l, " type=%s", status_worker_type(JK_LB_WORKER_TYPE));
jk_printf(s, l, " sticky_session=%s", jk_get_bool(lb->sticky_session));
jk_printf(s, l, " sticky_session_force=%s", jk_get_bool(lb->sticky_session_force));
jk_printf(s, l, " retries=%d", lb->retries);
jk_printf(s, l, " recover_time=%d", lb->recover_wait_time);
jk_printf(s, l, " error_escalation_time=%d", lb->error_escalation_time);
jk_printf(s, l, " max_reply_timeouts=%d", lb->max_reply_timeouts);
jk_printf(s, l, " method=%s", jk_lb_get_method(lb, l));
jk_printf(s, l, " lock=%s", jk_lb_get_lock(lb, l));
jk_printf(s, l, " member_count=%d", lb->num_of_workers);
jk_printf(s, l, " good=%d", good);
jk_printf(s, l, " degraded=%d", degraded);
jk_printf(s, l, " bad=%d", bad);
jk_printf(s, l, " busy=%d", lb->s->busy);
jk_printf(s, l, " max_busy=%d", lb->s->max_busy);
jk_printf(s, l, " map_count=%d", map_count);
jk_printf(s, l, " time_to_maintenance_min=%d", ms_min);
jk_printf(s, l, " time_to_maintenance_max=%d", ms_max);
jk_printf(s, l, " last_reset_at=%ld", (long)lb->s->last_reset);
jk_printf(s, l, " last_reset_ago=%d", (int)difftime(now, lb->s->last_reset));
jk_puts(s, "\n");
}
else if (mime == JK_STATUS_MIME_PROP) {
jk_print_prop_att_string(s, l, w, NULL, "list", name);
jk_print_prop_att_string(s, l, w, name, "type", status_worker_type(JK_LB_WORKER_TYPE));
jk_print_prop_att_string(s, l, w, name, "sticky_session", jk_get_bool(lb->sticky_session));
jk_print_prop_att_string(s, l, w, name, "sticky_session_force", jk_get_bool(lb->sticky_session_force));
jk_print_prop_att_int(s, l, w, name, "retries", lb->retries);
jk_print_prop_att_int(s, l, w, name, "recover_time", lb->recover_wait_time);
jk_print_prop_att_int(s, l, w, name, "error_escalation_time", lb->error_escalation_time);
jk_print_prop_att_int(s, l, w, name, "max_reply_timeouts", lb->max_reply_timeouts);
jk_print_prop_att_string(s, l, w, name, "method", jk_lb_get_method(lb, l));
jk_print_prop_att_string(s, l, w, name, "lock", jk_lb_get_lock(lb, l));
jk_print_prop_att_int(s, l, w, name, "member_count", lb->num_of_workers);
jk_print_prop_att_int(s, l, w, name, "good", good);
jk_print_prop_att_int(s, l, w, name, "degraded", degraded);
jk_print_prop_att_int(s, l, w, name, "bad", bad);
jk_print_prop_att_int(s, l, w, name, "busy", lb->s->busy);
jk_print_prop_att_int(s, l, w, name, "max_busy", lb->s->max_busy);
jk_print_prop_att_int(s, l, w, name, "map_count", map_count);
jk_print_prop_att_int(s, l, w, name, "time_to_maintenance_min", ms_min);
jk_print_prop_att_int(s, l, w, name, "time_to_maintenance_max", ms_max);
jk_print_prop_att_long(s, l, w, name, "last_reset_at", (long)lb->s->last_reset);
jk_print_prop_att_int(s, l, w, name, "last_reset_ago", (int)difftime(now, lb->s->last_reset));
}
if (!hide_members) {
if (mime == JK_STATUS_MIME_HTML) {
jk_puts(s, "<h4>Balancer Members [");
if (swr) {
status_write_uri(s, p, "Show All Members", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
name, "", 0, 0, "", l);
jk_puts(s, "] [");
}
if (single) {
status_write_uri(s, p, "Hide", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
NULL, NULL, JK_STATUS_ARG_OPTION_NO_MEMBERS, 0, "", l);
}
else {
status_write_uri(s, p, "Hide", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
NULL, NULL, JK_STATUS_ARG_OPTION_NO_MEMBERS, 0, "", l);
}
jk_puts(s, "]</h4>\n");
if (!hide_ajp_conf) {
jk_puts(s, "<table>" JK_STATUS_SHOW_MEMBER_CONF_HEAD);
jk_puts(s, "[");
status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
NULL, NULL, JK_STATUS_ARG_OPTION_NO_AJP_CONF, 0, NULL, l);
jk_puts(s, "]</th></tr>");
if (swr) {
jk_worker_t *jw = (jk_worker_t *)swr->worker;
ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;
display_worker_ajp_conf_details(s, p, aw, 1, jw->type, l);
}
else
for (j = 0; j < lb->num_of_workers; j++) {
lb_sub_worker_t *wr = &(lb->lb_workers[j]);
jk_worker_t *jw = (jk_worker_t *)wr->worker;
ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;
display_worker_ajp_conf_details(s, p, aw, 1, jw->type, l);
}
jk_puts(s, "</table>\n<br/>\n");
}
jk_puts(s, "<table>" JK_STATUS_SHOW_MEMBER_HEAD);
}
if (swr) {
const char *sub_name = swr->name;
ajp_worker_t *aw = (ajp_worker_t *)swr->worker->worker_private;
if (mime == JK_STATUS_MIME_HTML) {
jk_puts(s, "<tr>\n<td>[");
jk_puts(s, "S");
if (!read_only) {
jk_puts(s, "|");
status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, JK_STATUS_MIME_UNKNOWN,
name, sub_name, 0, 0, "", l);
jk_puts(s, "|");
status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, JK_STATUS_MIME_UNKNOWN,
name, sub_name, 0, 0, "", l);
if (swr->s->state == JK_LB_STATE_ERROR) {
jk_puts(s, "|");
status_write_uri(s, p, "T", JK_STATUS_CMD_RECOVER, JK_STATUS_MIME_UNKNOWN,
name, sub_name, 0, 0, "", l);
}
}
jk_puts(s, "]");
jk_puts(s, " </td>");
}
display_worker_ajp_details(s, p, aw, swr, lb, ms_min, ms_max, 0, l);
} else
for (j = 0; j < lb->num_of_workers; j++) {
lb_sub_worker_t *wr = &(lb->lb_workers[j]);
const char *sub_name = wr->name;
ajp_worker_t *aw = (ajp_worker_t *)wr->worker->worker_private;
if (mime == JK_STATUS_MIME_HTML) {
jk_puts(s, "<tr>\n<td>[");
status_write_uri(s, p, "S", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
name, sub_name, 0, 0, "", l);
if (!read_only) {
jk_puts(s, "|");
status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, JK_STATUS_MIME_UNKNOWN,
name, sub_name, 0, 0, "", l);
jk_puts(s, "|");
status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, JK_STATUS_MIME_UNKNOWN,
name, sub_name, 0, 0, "", l);
if (wr->s->state == JK_LB_STATE_ERROR) {
jk_puts(s, "|");
status_write_uri(s, p, "T", JK_STATUS_CMD_RECOVER, JK_STATUS_MIME_UNKNOWN,
name, sub_name, 0, 0, "", l);
}
}
jk_puts(s, "]");
jk_puts(s, " </td>");
}
display_worker_ajp_details(s, p, aw, wr, lb, ms_min, ms_max, 0, l);
}
if (mime == JK_STATUS_MIME_HTML) {
jk_puts(s, "</table><br/>\n");
if (!read_only) {
const char *arg;
status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l);
status_start_form(s, p, "get", JK_STATUS_CMD_EDIT, NULL, l);
jk_printf(s, l, JK_STATUS_FORM_HIDDEN_STRING, JK_STATUS_ARG_WORKER, name);
if (arg)
jk_printf(s, l, JK_STATUS_FORM_HIDDEN_STRING, JK_STATUS_ARG_FROM, arg);
jk_puts(s, "<table><tr><td><b>E</b>dit this attribute for all members:</td><td>");
jk_putv(s, "<select name=\"", JK_STATUS_ARG_ATTRIBUTE,
"\" size=\"1\">\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_ACTIVATION, "\">", JK_STATUS_ARG_LBM_TEXT_ACTIVATION, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_FACTOR, "\">", JK_STATUS_ARG_LBM_TEXT_FACTOR, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_ROUTE, "\">", JK_STATUS_ARG_LBM_TEXT_ROUTE, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_REDIRECT, "\">", JK_STATUS_ARG_LBM_TEXT_REDIRECT, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_DOMAIN, "\">", JK_STATUS_ARG_LBM_TEXT_DOMAIN, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_DISTANCE, "\">", JK_STATUS_ARG_LBM_TEXT_DISTANCE, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_CACHE_TO, "\">", JK_STATUS_ARG_AJP_TEXT_CACHE_TO, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_PING_TO, "\">", JK_STATUS_ARG_AJP_TEXT_PING_TO, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_CONNECT_TO, "\">", JK_STATUS_ARG_AJP_TEXT_CONNECT_TO, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_PREPOST_TO, "\">", JK_STATUS_ARG_AJP_TEXT_PREPOST_TO, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_REPLY_TO, "\">", JK_STATUS_ARG_AJP_TEXT_REPLY_TO, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_RETRIES, "\">", JK_STATUS_ARG_AJP_TEXT_RETRIES, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_RETRY_INT, "\">", JK_STATUS_ARG_AJP_TEXT_RETRY_INT, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_CPING_INT, "\">", JK_STATUS_ARG_AJP_TEXT_CPING_INT, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_REC_OPTS, "\">", JK_STATUS_ARG_AJP_TEXT_REC_OPTS, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_BUSY_LIMIT, "\">", JK_STATUS_ARG_AJP_TEXT_BUSY_LIMIT, "</option>\n", NULL);
jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_MAX_PK_SZ, "\">", JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ, "</option>\n", NULL);
jk_puts(s, "</select></td><td><input type=\"submit\" value=\"Go\"/></td></tr></table></form>\n");
}
}
}
if (name)
display_maps(s, p, name, l);
if (mime == JK_STATUS_MIME_XML) {
jk_print_xml_close_elt(s, l, w, 2, "balancer");
}
JK_TRACE_EXIT(l);
}