📄 jk_status.c
字号:
}
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 + -