⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jk_status.c

📁 精通tomcat书籍原代码,希望大家共同学习
💻 C
📖 第 1 页 / 共 3 页
字号:
        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_method_type[lb->lbmethod]);
            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,"&nbsp;");
                jk_puts(s, "</td><td>\n");
                if (wr->s->domain && *wr->s->domain)
                    jk_puts(s, wr->s->domain);
                else
                    jk_puts(s,"&nbsp;");
                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/min</td></tr>\n"
            "<tr><th>Rd</th><td>Number of bytes read/min</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,
                                  wr->s->is_disabled,
                                  wr->s->in_error_state,
                                  wr->s->in_recovering,
                                  wr->s->is_busy) );

            jk_printf(s, " lbfactor=\"%d\"", wr->s->lb_factor);
            jk_printf(s, " lbvalue=\"%d\"", wr->s->lb_value);
            jk_printf(s, " elected=\"%u\"", wr->s->elected);
            jk_printf(s, " readed=\"%u\"", wr->s->readed);
            jk_printf(s, " transferred=\"%u\"", wr->s->transferred);
            jk_printf(s, " errors=\"%u\"", wr->s->errors);
            jk_printf(s, " busy=\"%u\"", wr->s->busy);
            if (wr->s->redirect && *wr->s->redirect)
                jk_printf(s, " redirect=\"%s\"", wr->s->redirect);
            if (wr->s->domain && *wr->s->domain)
                jk_printf(s, " domain=\"%s\"", wr->s->domain);
            jk_puts(s, " />\n");
        }
        dump_maps(s, sw, s->uw_map, lb->s->name, l);
        jk_puts(s, "  </jk:balancer>\n");

    }
    if (has_lb)
        jk_puts(s, "  </jk:balancers>\n");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -