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

📄 jk_status.c

📁 精通tomcat书籍原代码,希望大家共同学习
💻 C
📖 第 1 页 / 共 3 页
字号:

}

static void update_worker(jk_ws_service_t *s, status_worker_t *sw,
                          const char *dworker, jk_logger_t *l)
{
    int i;
    char buf[1024];
    const char *b;
    lb_worker_t *lb;
    jk_worker_t *w = wc_get_worker_for_name(dworker, l);

    if (w && w->type == JK_LB_WORKER_TYPE) {
        lb = (lb_worker_t *)w->worker_private;
        i = status_int("lr", s->query_string, lb->s->retries);
        if (i > 0)
            lb->s->retries = i;
        i = status_int("lt", s->query_string, lb->s->recover_wait_time);
        if (i > 59)
            lb->s->recover_wait_time = i;
        lb->s->sticky_session = status_bool("ls", s->query_string);
        lb->s->sticky_session_force = status_bool("lf", s->query_string);
    }
    else  {
        int n = status_int("lb", s->query_string, -1);
        worker_record_t *wr = NULL;
        ajp_worker_t *a;
        if (n >= 0 && n < (int)sw->we->num_of_workers)
            w = wc_get_worker_for_name(sw->we->worker_list[n], l);
        else {
            if (!(b = status_cmd("l", s->query_string, buf, sizeof(buf))))
                return;
            w = wc_get_worker_for_name(b, l);
        }
        if (!w || w->type != JK_LB_WORKER_TYPE)
            return;
        lb = (lb_worker_t *)w->worker_private;
        i = status_int("id", s->query_string, -1);
        if (i >= 0 && i < (int)lb->num_of_workers)
            wr = &(lb->lb_workers[i]);
        else {
            for (i = 0; i < (int)lb->num_of_workers; i++) {
                if (strcmp(dworker, lb->lb_workers[i].s->name) == 0) {
                    wr = &(lb->lb_workers[i]);
                    break;
                }
            }
        }
        if (!wr)
            return;
        a  = (ajp_worker_t *)wr->w->worker_private;

        if ((b = status_cmd("wr", s->query_string, buf, sizeof(buf))))
            strncpy(wr->s->redirect, b, JK_SHM_STR_SIZ);
        else
            memset(wr->s->redirect, 0, JK_SHM_STR_SIZ);
        if ((b = status_cmd("wc", s->query_string, buf, sizeof(buf))))
            strncpy(wr->s->domain, b, JK_SHM_STR_SIZ);
        else
            memset(wr->s->domain, 0, JK_SHM_STR_SIZ);
        wr->s->is_disabled = status_bool("wd", s->query_string);
        wr->s->is_stopped = status_bool("ws", s->query_string);
        i = status_int("wf", s->query_string, wr->s->lb_factor);
        if (i > 0)
            wr->s->lb_factor = i;
    }
}

static void reset_worker(jk_ws_service_t *s, status_worker_t *sw,
                         const char *dworker, jk_logger_t *l)
{
    unsigned int i;
    lb_worker_t *lb;
    jk_worker_t *w = wc_get_worker_for_name(dworker, l);

    if (w && w->type == JK_LB_WORKER_TYPE) {
        lb = (lb_worker_t *)w->worker_private;
        for (i = 0; i < lb->num_of_workers; i++) {
            worker_record_t *wr = &(lb->lb_workers[i]);
            wr->s->busy             = 0;
            wr->s->elected          = 0;
            wr->s->error_time       = 0;
            wr->s->errors           = 0;
            wr->s->lb_value         = 0;
            wr->s->max_busy         = 0;
            wr->s->readed           = 0;
            wr->s->transferred      = 0;
            wr->s->is_busy          = JK_FALSE;
            wr->s->in_error_state   = JK_FALSE;
            wr->s->in_recovering    = JK_FALSE;
        }
    }
}

static int status_cmd_type(const char *req)
{
    if (!req)
        return 0;
    else if (!strncmp(req, "cmd=list", 8))
        return 0;
    else if (!strncmp(req, "cmd=show", 8))
        return 1;
    else if (!strncmp(req, "cmd=update", 10))
        return 2;
    else if (!strncmp(req, "cmd=reset", 9))
        return 3;
    else
        return 0;
}

static int status_mime_type(const char *req)
{
    int ret = 0 ;
    if (req) {
        char mimetype[32];
        if (status_cmd("mime", req, mimetype, sizeof(mimetype)) != NULL) {
            if (!strcmp(mimetype, "xml"))
                ret = 1;
            else if (!strcmp(mimetype, "txt"))
                ret = 2;
        }
    }
    return ret ;
}

static int JK_METHOD service(jk_endpoint_t *e,
                             jk_ws_service_t *s,
                             jk_logger_t *l, int *is_recoverable_error)
{
    JK_TRACE_ENTER(l);

    if (e && e->endpoint_private && s) {
        char buf[128];
        char *worker = NULL;
        int cmd;
        int mime;
        status_endpoint_t *p = e->endpoint_private;

        *is_recoverable_error = JK_FALSE;

        /* Step 1: Process GET params and update configuration */
        cmd = status_cmd_type(s->query_string);
        mime = status_mime_type(s->query_string);
        if (cmd > 0 && (status_cmd("w", s->query_string, buf, sizeof(buf)) != NULL))
            worker = strdup(buf);
        if ((cmd == 2) && worker) {
            /* lock shared memory */
            jk_shm_lock();
            update_worker(s, p->s_worker, worker, l);
            /* update modification time to reflect the current config */
            jk_shm_set_workers_time(time(NULL));
            /* Since we updated the config no need to reload
             * on the next request
             */
            jk_shm_sync_access_time();
            /* unlock the shared memory */
            jk_shm_unlock();
        }
        else if ((cmd == 3) && worker) {
            /* lock shared memory */
            jk_shm_lock();
            reset_worker(s, p->s_worker, worker, l);
            /* update modification time to reflect the current config */
            jk_shm_set_workers_time(time(NULL));
            /* Since we updated the config no need to reload
             * on the next request
             */
            jk_shm_sync_access_time();
            /* unlock the shared memory */
            jk_shm_unlock();
        }
        if (mime == 0) {
            s->start_response(s, 200, "OK", headers_names, headers_vhtml, 3);
            s->write(s, JK_STATUS_HEAD, sizeof(JK_STATUS_HEAD) - 1);
            if (p->s_worker->css) {
                jk_putv(s, "\n<link rel=\"stylesheet\" type=\"text/css\" href=\"",
                        p->s_worker->css, "\" />\n", NULL);
            }
            s->write(s, JK_STATUS_HEND, sizeof(JK_STATUS_HEND) - 1);
            jk_puts(s, "<h1>JK Status Manager for ");
            jk_puts(s, s->server_name);
            jk_puts(s, "</h1>\n\n");
            jk_putv(s, "<dl><dt>Server Version: ",
                    s->server_software, "</dt>\n", NULL);
            jk_putv(s, "<dt>JK Version: ",
                    JK_VERSTRING, "\n</dt></dl>\n", NULL);
            /* Step 2: Display configuration */
            display_workers(s, p->s_worker, worker, l);


            s->write(s, JK_STATUS_BEND, sizeof(JK_STATUS_BEND) - 1);

        }
        else if (mime == 1) {
            s->start_response(s, 200, "OK", headers_names, headers_vxml, 3);
            s->write(s, JK_STATUS_XMLH, sizeof(JK_STATUS_XMLH) - 1);
            dump_config(s, p->s_worker, l);
            s->write(s, JK_STATUS_XMLE, sizeof(JK_STATUS_XMLE) - 1);
        }
        else {
            s->start_response(s, 200, "OK", headers_names, headers_vtxt, 3);
            s->write(s,  JK_STATUS_TEXTUPDATE_RESPONCE,
                     sizeof(JK_STATUS_TEXTUPDATE_RESPONCE) - 1);
        }
        if (worker)
            free(worker);
        JK_TRACE_EXIT(l);
        return JK_TRUE;
    }

    jk_log(l, JK_LOG_ERROR, "status: end of service with error");
    JK_TRACE_EXIT(l);
    return JK_FALSE;
}

static int JK_METHOD done(jk_endpoint_t **e, jk_logger_t *l)
{
    JK_TRACE_ENTER(l);

    if (e && *e && (*e)->endpoint_private) {
        *e = NULL;
        JK_TRACE_EXIT(l);
        return JK_TRUE;
    }

    JK_LOG_NULL_PARAMS(l);
    JK_TRACE_EXIT(l);
    return JK_FALSE;
}

static int JK_METHOD validate(jk_worker_t *pThis,
                              jk_map_t *props,
                              jk_worker_env_t *we, jk_logger_t *l)
{
    JK_TRACE_ENTER(l);

    if (pThis && pThis->worker_private) {
        JK_TRACE_EXIT(l);
        return JK_TRUE;
    }

    JK_LOG_NULL_PARAMS(l);
    JK_TRACE_EXIT(l);
    return JK_FALSE;
}

static int JK_METHOD init(jk_worker_t *pThis,
                          jk_map_t *props,
                          jk_worker_env_t *we, jk_logger_t *log)
{
    JK_TRACE_ENTER(log);
    if (pThis && pThis->worker_private) {
        status_worker_t *p = pThis->worker_private;
        p->we = we;
        if (!jk_get_worker_str_prop(props, p->name, "css", &(p->css)))
            p->css = NULL;
    }
    JK_TRACE_EXIT(log);
    return JK_TRUE;
}

static int JK_METHOD get_endpoint(jk_worker_t *pThis,
                                  jk_endpoint_t **pend, jk_logger_t *l)
{
    JK_TRACE_ENTER(l);

    if (pThis && pThis->worker_private && pend) {
        status_worker_t *p = (status_worker_t *)pThis->worker_private;
        *pend = p->ep.e;
        JK_TRACE_EXIT(l);
        return JK_TRUE;
    }
    else {
        JK_LOG_NULL_PARAMS(l);
    }

    JK_TRACE_EXIT(l);
    return JK_FALSE;
}

static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l)
{
    JK_TRACE_ENTER(l);

    if (pThis && *pThis && (*pThis)->worker_private) {
        status_worker_t *private_data = (*pThis)->worker_private;

        jk_close_pool(&private_data->p);
        free(private_data);

        JK_TRACE_EXIT(l);
        return JK_TRUE;
    }

    JK_LOG_NULL_PARAMS(l);
    JK_TRACE_EXIT(l);
    return JK_FALSE;
}

int JK_METHOD status_worker_factory(jk_worker_t **w,
                                    const char *name, jk_logger_t *l)
{
    JK_TRACE_ENTER(l);

    if (NULL != name && NULL != w) {
        status_worker_t *private_data =
            (status_worker_t *) calloc(1, sizeof(status_worker_t));

        jk_open_pool(&private_data->p,
                        private_data->buf,
                        sizeof(jk_pool_atom_t) * TINY_POOL_SIZE);

        private_data->name = name;

        private_data->worker.worker_private = private_data;
        private_data->worker.validate = validate;
        private_data->worker.init = init;
        private_data->worker.get_endpoint = get_endpoint;
        private_data->worker.destroy = destroy;
        private_data->worker.retries = 1;

        /* Status worker has single static endpoint. */
        private_data->ep.endpoint.done = done;
        private_data->ep.endpoint.service = service;
        private_data->ep.endpoint.endpoint_private = &private_data->ep;
        private_data->ep.e = &(private_data->ep.endpoint);
        private_data->ep.s_worker = private_data;
        *w = &private_data->worker;
        JK_TRACE_EXIT(l);
        return JK_STATUS_WORKER_TYPE;
    }
    else {
        JK_LOG_NULL_PARAMS(l);
    }

    JK_TRACE_EXIT(l);
    return 0;
}

⌨️ 快捷键说明

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