📄 jk_status.c
字号:
static int status_bool(const char *param, const char *req){ const char *v; char buf[32]; int rv = 0; if ((v = status_cmd(param, req, buf, sizeof(buf)))) { if (strcasecmp(v, "on") == 0 || strcasecmp(v, "true") == 0) rv = 1; } return rv;}static void display_maps(jk_ws_service_t *s, status_worker_t *sw, jk_uri_worker_map_t *uwmap, const char *worker, jk_logger_t *l){ unsigned int i; jk_puts(s, "<br/>Uri Mappings:\n"); jk_puts(s, "<table>\n<tr><th>Match Type</th><th>Uri</th>" "<th>Context</th></tr>\n"); for (i = 0; i < uwmap->size; i++) { uri_worker_record_t *uwr = uwmap->maps[i]; if (strcmp(uwr->worker_name, worker)) { continue; } jk_putv(s, "<tr><td>", status_val_match(uwr->match_type), "</td><td>", NULL); jk_puts(s, uwr->uri); jk_putv(s, "</td><td>", uwr->context, NULL); jk_puts(s, "</td></tr>\n"); } jk_puts(s, "</table>\n");}static void dump_maps(jk_ws_service_t *s, status_worker_t *sw, jk_uri_worker_map_t *uwmap, const char *worker, jk_logger_t *l){ unsigned int i; for (i = 0; i < uwmap->size; i++) { uri_worker_record_t *uwr = uwmap->maps[i]; if (strcmp(uwr->worker_name, worker)) { continue; } jk_printf(s, " <jk:map type=\"%s\" uri=\"%s\" context=\"%s\" />\n", status_val_match(uwr->match_type), uwr->uri, uwr->context) ; }}/** * Command line reference: * cmd=list (default) display configuration * cmd=show display detailed configuration * cmd=update update configuration * cmd=add add new uri map. * w=worker display detailed configuration for worker * * Worker parameters: * r=string redirect route name * */static void display_workers(jk_ws_service_t *s, status_worker_t *sw, const char *dworker, jk_logger_t *l){ unsigned int i; char buf[32]; for (i = 0; i < sw->we->num_of_workers; i++) { jk_worker_t *w = wc_get_worker_for_name(sw->we->worker_list[i], l); ajp_worker_t *aw = NULL; lb_worker_t *lb = NULL; if (w == NULL) continue; if (w->type == JK_LB_WORKER_TYPE) { lb = (lb_worker_t *)w->worker_private; } else if (w->type == JK_AJP13_WORKER_TYPE || w->type == JK_AJP14_WORKER_TYPE) { aw = (ajp_worker_t *)w->worker_private; } else { /* Skip status, jni and ajp12 worker */ continue; } jk_puts(s, "<hr/>\n<h3>Worker Status for "); if (dworker && strcmp(dworker, sw->we->worker_list[i]) == 0) { /* Next click will colapse the editor */ jk_putv(s, "<a href=\"", s->req_uri, "?cmd=show\">", NULL); } else jk_putv(s, "<a href=\"", s->req_uri, "?cmd=show&w=", sw->we->worker_list[i], "\">", NULL); jk_putv(s, sw->we->worker_list[i], "</a></h3>\n", NULL); if (lb != NULL) { unsigned int j; int selected = -1; jk_puts(s, "<table><tr>" "<th>Type</th><th>Sticky session</th>" "<th>Force Sticky session</th>" "<th>Retries</th>" "<th>Method</th>" "<th>Lock</th>" "</tr>\n<tr>"); jk_putv(s, "<td>", status_worker_type(w->type), "</td>", NULL); jk_putv(s, "<td>", status_val_bool(lb->s->sticky_session), "</td>", NULL); jk_putv(s, "<td>", status_val_bool(lb->s->sticky_session_force), "</td>", NULL); jk_printf(s, "<td>%d</td>", lb->s->retries); jk_printf(s, "<td>%s</td>", lb->lbmethod == JK_LB_BYREQUESTS ? JK_LB_METHOD_REQUESTS : JK_LB_METHOD_TRAFFIC); jk_printf(s, "<td>%s</td>", lb->lblock == JK_LB_LOCK_DEFAULT ? JK_LB_LM_DEFAULT : JK_LB_LM_PESSIMISTIC); jk_puts(s, "</tr>\n</table>\n<br/>\n"); jk_puts(s, "<table><tr>" "<th>Name</th><th>Type</th><th>Host</th><th>Addr</th>" "<th>Stat</th><th>F</th><th>V</th><th>Acc</th><th>Err</th>" "<th>Wr</th><th>Rd</th><th>Busy</th><th>Max</th><th>RR</th><th>Cd</th></tr>\n"); for (j = 0; j < lb->num_of_workers; j++) { worker_record_t *wr = &(lb->lb_workers[j]); ajp_worker_t *a = (ajp_worker_t *)wr->w->worker_private; jk_putv(s, "<tr>\n<td><a href=\"", s->req_uri, "?cmd=show&w=", wr->s->name, "\">", wr->s->name, "</a></td>", NULL); if (dworker && strcmp(dworker, wr->s->name) == 0) selected = j; jk_putv(s, "<td>", status_worker_type(wr->w->type), "</td>", NULL); jk_printf(s, "<td>%s:%d</td>", a->host, a->port); jk_putv(s, "<td>", jk_dump_hinfo(&a->worker_inet_addr, buf), "</td>", NULL); /* TODO: descriptive status */ jk_putv(s, "<td>", status_val_status(wr->s->is_stopped, wr->s->is_disabled, wr->s->in_error_state, wr->s->in_recovering, wr->s->is_busy), "</td>", NULL); jk_printf(s, "<td>%d</td>", wr->s->lb_factor); jk_printf(s, "<td>%d</td>", wr->s->lb_value); jk_printf(s, "<td>%u</td>", wr->s->elected); jk_printf(s, "<td>%u</td>", wr->s->errors); jk_putv(s, "<td>", status_strfsize(wr->s->transferred, buf), "</td>", NULL); jk_putv(s, "<td>", status_strfsize(wr->s->readed, buf), "</td>", NULL); jk_printf(s, "<td>%u</td>", wr->s->busy); jk_printf(s, "<td>%u</td><td>", wr->s->max_busy); if (wr->s->redirect && *wr->s->redirect) jk_puts(s, wr->s->redirect); else jk_puts(s," "); jk_puts(s, "</td><td>\n"); if (wr->s->domain && *wr->s->domain) jk_puts(s, wr->s->domain); else jk_puts(s," "); jk_puts(s, "</td>\n</tr>\n"); } jk_puts(s, "</table><br/>\n"); if (selected >= 0) { worker_record_t *wr = &(lb->lb_workers[selected]); jk_putv(s, "<hr/><h3>Edit worker settings for ", wr->s->name, "</h3>\n", NULL); jk_putv(s, "<form method=\"GET\" action=\"", s->req_uri, "\">\n", NULL); jk_puts(s, "<table>\n<input type=\"hidden\" name=\"cmd\" "); jk_puts(s, "value=\"update\">\n"); jk_puts(s, "<input type=\"hidden\" name=\"w\" "); jk_putv(s, "value=\"", wr->s->name, "\">\n", NULL); jk_puts(s, "<input type=\"hidden\" name=\"id\" "); jk_printf(s, "value=\"%u\">\n</table>\n", selected); jk_puts(s, "<input type=\"hidden\" name=\"lb\" "); jk_printf(s, "value=\"%u\">\n</table>\n", i); jk_puts(s, "<table>\n<tr><td>Load factor:</td><td><input name=\"wf\" type=\"text\" "); jk_printf(s, "value=\"%d\"/></td><tr>\n", wr->s->lb_factor); jk_puts(s, "<tr><td>Route Redirect:</td><td><input name=\"wr\" type=\"text\" "); jk_putv(s, "value=\"", wr->s->redirect, NULL); jk_puts(s, "\"/></td></tr>\n"); jk_puts(s, "<tr><td>Cluster Domain:</td><td><input name=\"wc\" type=\"text\" "); jk_putv(s, "value=\"", wr->s->domain, NULL); jk_puts(s, "\"/></td></tr>\n"); jk_puts(s, "<tr><td>Disabled:</td><td><input name=\"wd\" type=\"checkbox\""); if (wr->s->is_disabled) jk_puts(s, " checked=\"checked\""); jk_puts(s, "/></td></tr>\n"); jk_puts(s, "<tr><td>Stopped:</td><td><input name=\"ws\" type=\"checkbox\""); if (wr->s->is_stopped) jk_puts(s, " checked=\"checked\""); jk_puts(s, "/></td></tr>\n"); jk_puts(s, "</td></tr>\n</table>\n"); jk_puts(s, "<br/><input type=\"submit\" value=\"Update Worker\"/>\n</form>\n"); } else if (dworker && strcmp(dworker, sw->we->worker_list[i]) == 0) { /* Edit Load balancer settings */ jk_putv(s, "<hr/><h3>Edit Load balancer settings for ", dworker, "</h3>\n", NULL); jk_putv(s, "<form method=\"GET\" action=\"", s->req_uri, "\">\n", NULL); jk_puts(s, "<table>\n<input type=\"hidden\" name=\"cmd\" "); jk_puts(s, "value=\"update\"/>\n"); jk_puts(s, "<input type=\"hidden\" name=\"w\" "); jk_putv(s, "value=\"", dworker, "\"/>\n", NULL); jk_puts(s, "<input type=\"hidden\" name=\"id\" "); jk_printf(s, "value=\"%u\"/>\n</table>\n", i); jk_puts(s, "<table>\n<tr><td>Retries:</td><td><input name=\"lr\" type=\"text\" "); jk_printf(s, "value=\"%d\"/></td></tr>\n", lb->s->retries); jk_puts(s, "<tr><td>Recover time:</td><td><input name=\"lt\" type=\"text\" "); jk_printf(s, "value=\"%d\"/></td></tr>\n", lb->s->recover_wait_time); jk_puts(s, "<tr><td>Sticky session:</td><td><input name=\"ls\" type=\"checkbox\""); if (lb->s->sticky_session) jk_puts(s, " checked=\"checked\""); jk_puts(s, "/></td></tr>\n"); jk_puts(s, "<tr><td>Force Sticky session:</td><td><input name=\"lf\" type=\"checkbox\""); if (lb->s->sticky_session_force) jk_puts(s, " checked=\"checked\""); jk_puts(s, "/></td></tr>\n"); jk_puts(s, "</table>\n"); display_maps(s, sw, s->uw_map, dworker, l); jk_puts(s, "<br/><input type=\"submit\" value=\"Update Balancer\"/></form>\n"); } } else { jk_puts(s, "\n\n<table><tr>" "<th>Type</th><th>Host</th><th>Addr</th>" "</tr>\n<tr>"); jk_putv(s, "<td>", status_worker_type(w->type), "</td>", NULL); jk_puts(s, "</tr>\n</table>\n"); jk_printf(s, "<td>%s:%d</td>", aw->host, aw->port); jk_putv(s, "<td>", jk_dump_hinfo(&aw->worker_inet_addr, buf), "</td>\n</tr>\n", NULL); jk_puts(s, "</table>\n"); } } /* Display legend */ jk_puts(s, "<hr/><table>\n" "<tr><th>Name</th><td>Worker route name</td></tr>\n" "<tr><th>Type</th><td>Worker type</td></tr>\n" "<tr><th>Addr</th><td>Backend Address info</td></tr>\n" "<tr><th>Stat</th><td>Worker status</td></tr>\n" "<tr><th>F</th><td>Load Balancer Factor</td></tr>\n" "<tr><th>V</th><td>Load Balancer Value</td></tr>\n" "<tr><th>Acc</th><td>Number of requests</td></tr>\n" "<tr><th>Err</th><td>Number of failed requests</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" "<tr><th>Busy</th><td>Current number of busy connections</td></tr>\n" "<tr><th>Max</th><td>Maximum number of busy connections</td></tr>\n" "<tr><th>RR</th><td>Route redirect</td></tr>\n" "<tr><th>Cd</th><td>Cluster domain</td></tr>\n" "</table>");}static void dump_config(jk_ws_service_t *s, status_worker_t *sw, jk_logger_t *l){ unsigned int i; char buf[32]; int has_lb = 0; for (i = 0; i < sw->we->num_of_workers; i++) { jk_worker_t *w = wc_get_worker_for_name(sw->we->worker_list[i], l); if (w == NULL) continue; if (w->type == JK_LB_WORKER_TYPE) { has_lb = 1; break; } } jk_printf(s, " <jk:server name=\"%s\" port=\"%d\" software=\"%s\" version=\"%s\" />\n", s->server_name, s->server_port, s->server_software, JK_VERSTRING); if (has_lb) jk_puts(s, " <jk:balancers>\n"); for (i = 0; i < sw->we->num_of_workers; i++) { jk_worker_t *w = wc_get_worker_for_name(sw->we->worker_list[i], l); lb_worker_t *lb = NULL; unsigned int j; if (w == NULL) continue; if (w->type == JK_LB_WORKER_TYPE) { lb = (lb_worker_t *)w->worker_private; } else { /* Skip non lb workers */ continue; } jk_printf(s, " <jk:balancer id=\"%d\" name=\"%s\" type=\"%s\" sticky=\"%s\" stickyforce=\"%s\" retries=\"%d\" recover=\"%d\" >\n", i, lb->s->name, status_worker_type(w->type), status_val_bool(lb->s->sticky_session), status_val_bool(lb->s->sticky_session_force), lb->s->retries, lb->s->recover_wait_time); for (j = 0; j < lb->num_of_workers; j++) { worker_record_t *wr = &(lb->lb_workers[j]); ajp_worker_t *a = (ajp_worker_t *)wr->w->worker_private; /* TODO: descriptive status */ jk_printf(s, " <jk:member id=\"%d\" name=\"%s\" type=\"%s\" host=\"%s\" port=\"%d\" address=\"%s\" status=\"%s\"", j, wr->s->name, status_worker_type(wr->w->type), a->host, a->port, jk_dump_hinfo(&a->worker_inet_addr, buf), status_val_status(wr->s->is_stopped,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -