mturk       2005/03/13 23:52:54

  Modified:    jk/native/common jk_status.c
  Log:
  Add xml configuration dump for load balaced workers.
  Added new query param 'mime' that determines the otgoing mime type.
  
  Revision  Changes    Path
  1.28      +180 -27   jakarta-tomcat-connectors/jk/native/common/jk_status.c
  
  Index: jk_status.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_status.c,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- jk_status.c       13 Mar 2005 06:35:57 -0000      1.27
  +++ jk_status.c       14 Mar 2005 07:52:53 -0000      1.28
  @@ -43,6 +43,11 @@
   
   #define JK_STATUS_HEND "</body>\n</html>\n"
   
  +#define JK_STATUS_XMLH "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"       
   \
  +                       "<jk:manager 
xmlns:jk=\"http://jakarta.apache.org\";>\n"
  +
  +#define JK_STATUS_XMLE "</jk:manager>\n"
  +
   #define JK_STATUS_TEXTUPDATE_RESPONCE "OK - jk status worker updated\n"
   
   typedef struct status_worker status_worker_t;
  @@ -84,11 +89,21 @@
       NULL
   };
   
  -static const char *headers_vals[] = {
  +#define HEADERS_NO_CACHE "no-cache", "no-cache", NULL
  +
  +static const char *headers_vhtml[] = {
       "text/html",
  -    "no-cache",
  -    "no-cache",
  -    NULL
  +    HEADERS_NO_CACHE
  +};
  +
  +static const char *headers_vxml[] = {
  +    "text/xml",
  +    HEADERS_NO_CACHE
  +};
  +
  +static const char *headers_vtxt[] = {
  +    "text/plain",
  +    HEADERS_NO_CACHE
   };
   
   #if !defined(HAVE_VSNPRINTF) && !defined(HAVE_APR)
  @@ -348,6 +363,36 @@
       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_puts(s, "    <jk:map>\n");
  +        jk_putv(s, "      <jk:type>",
  +                status_val_match(uwr->match_type),
  +                "</jk:type>\n", NULL);
  +        jk_putv(s, "      <jk:uri>",
  +                uwr->uri,
  +                "</jk:uri>\n", NULL);
  +        jk_putv(s, "      <jk:context>",
  +                uwr->context,
  +                "</jk:context>\n", NULL);
  +
  +        if (uwr->suffix)
  +            jk_putv(s, "      <jk:suffix>",
  +                    uwr->suffix,
  +                    "</jk:suffix>\n", NULL);
  +        jk_puts(s, "    </jk:map>\n");
  +    }
  +}
  +
   
   /**
    * Command line reference:
  @@ -547,6 +592,91 @@
               "</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>\n    <jk:id>%d</jk:id>\n", i);
  +        jk_putv(s, "    <jk:name>", lb->s->name, "</jk:name>\n", NULL);
  +        jk_putv(s, "    <jk:type>", status_worker_type(w->type), 
"</jk:type>\n", NULL);
  +        jk_putv(s, "    <jk:sticky>", status_val_bool(lb->s->sticky_session),
  +                   "</jk:sticky>\n", NULL);
  +        jk_putv(s, "    <jk:stickyforce>", 
status_val_bool(lb->s->sticky_session_force),
  +                   "</jk:stickyforce>\n", NULL);
  +        jk_printf(s, "    <jk:retries>%d</jk:retries>\n", lb->s->retries);
  +        jk_printf(s, "    <jk:recover>%d</jk:recover>\n", 
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;
  +            jk_puts(s, "    <jk:member>\n");
  +            jk_putv(s, "      <jk:name>", wr->s->name, "</jk:name>\n", NULL);
  +            jk_putv(s, "      <jk:type>", status_worker_type(wr->w->type),
  +                       "</jk:type>\n", NULL);
  +
  +            jk_putv(s, "      <jk:host>", a->host, "</jk:host>\n", NULL);
  +            jk_printf(s, "      <jk:port>%d</jk:port>\n", a->port);
  +            jk_putv(s, "      <jk:address>", 
jk_dump_hinfo(&a->worker_inet_addr, buf),
  +                       "</jk:address>\n", NULL);
  +            /* TODO: descriptive status */
  +            jk_putv(s, "      <jk:status>",
  +                        status_val_status(wr->s->is_disabled,
  +                                          wr->s->in_error_state,
  +                                          wr->s->in_recovering,
  +                                          wr->s->is_busy),
  +                        "</jk:status>\n", NULL);
  +            jk_printf(s, "      <jk:lbfactor>%d</jk:lbfactor>\n", 
wr->s->lb_factor);
  +            jk_printf(s, "      <jk:lbvalue>%d</jk:lbvalue>\n", 
wr->s->lb_value);
  +            jk_printf(s, "      <jk:elected>%u</jk:elected>\n", 
wr->s->elected);
  +            jk_printf(s, "      <jk:readed>%u</jk:readed>\n", wr->s->readed);
  +            jk_printf(s, "      <jk:transferred>%u</jk:transferred>\n", 
wr->s->transferred);
  +            jk_printf(s, "      <jk:errors>%u</jk:errors>\n", wr->s->errors);
  +            jk_printf(s, "      <jk:busy>%u</jk:busy>\n", wr->s->busy);
  +            if (wr->s->redirect && *wr->s->redirect)
  +                jk_putv(s, "      <jk:redirect>", wr->s->redirect, 
"</jk:redirect>\n", NULL);
  +            if (wr->s->domain && *wr->s->domain)
  +                jk_putv(s, "      <jk:domain>", wr->s->domain, 
"</jk:domain>\n", NULL);
  +            jk_puts(s, "    </jk:member>\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");
  +
  +}
  +
   static void update_worker(jk_ws_service_t *s, status_worker_t *sw,
                             const char *dworker, jk_logger_t *l)
   {
  @@ -621,8 +751,20 @@
           return 1;
       else if (!strncmp(req, "cmd=update", 10))
           return 2;
  -    else if (!strncmp(req, "cmd=textupdate", 14))
  -        return 3;
  +    else
  +        return 0;
  +}
  +
  +static int status_mime_type(const char *req)
  +{
  +    if (!req)
  +        return 0;
  +    else if (!strncmp(req, "mime=html", 9))
  +        return 0;
  +    else if (!strncmp(req, "mime=xml", 8))
  +        return 1;
  +    else if (!strncmp(req, "mime=txt", 8))
  +        return 2;
       else
           return 0;
   }
  @@ -637,17 +779,17 @@
           char buf[128];
           char *worker = NULL;
           int cmd;
  +        int mime;
           status_endpoint_t *p = e->endpoint_private;
   
           *is_recoverable_error = JK_FALSE;
   
  -        s->start_response(s, 200, "OK", headers_names, headers_vals, 3);
  -
           /* 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) || (cmd == 3)) && worker) {
  +        if ((cmd == 2) && worker) {
               /* lock shared memory */
               jk_shm_lock();
               update_worker(s, p->s_worker, worker, l);
  @@ -660,23 +802,34 @@
               /* unlock the shared memory */
               jk_shm_unlock();
           }
  -        if(cmd == 3) {
  -             s->write(s,  JK_STATUS_TEXTUPDATE_RESPONCE, 
sizeof(JK_STATUS_TEXTUPDATE_RESPONCE) - 1);
  -        } else {
  -             s->write(s,  JK_STATUS_HEAD, sizeof(JK_STATUS_HEAD) - 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_HEND, sizeof(JK_STATUS_HEND) - 1);
  +        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);
  +
  +            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_HEND, sizeof(JK_STATUS_HEND) - 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);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to