Changeset 494

Show
Ignore:
Timestamp:
07/31/2005 01:03:32 PM (3 years ago)
Author:
jan
Message:

added sorting to output (by erik)

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/lighttpd-1.3.x/src/mod_status.c

    r408 r494  
    88#include <errno.h> 
    99#include <time.h> 
     10#include <stdio.h> 
    1011 
    1112#include "server.h" 
     
    2223        buffer *config_url; 
    2324        buffer *status_url; 
     25        int     sort; 
    2426} plugin_config; 
    2527 
     
    103105                { "status.status-url",           NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, 
    104106                { "status.config-url",           NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, 
     107        { "status.enable-sort",          NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, 
    105108                { NULL,                          NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET } 
    106109        }; 
     
    116119                s->config_url    = buffer_init(); 
    117120                s->status_url    = buffer_init(); 
     121                s->sort          = 1; 
    118122                 
    119123                cv[0].destination = s->status_url; 
    120124                cv[1].destination = s->config_url; 
     125                cv[2].destination = &(s->sort); 
    121126                 
    122127                p->config_storage[i] = s; 
     
    155160} 
    156161 
     162static int mod_status_header_append_sort(buffer *b, void *p_d, const char* key) { 
     163        plugin_data *p = p_d; 
     164         
     165        if (p->conf.sort) { 
     166                BUFFER_APPEND_STRING_CONST(b, "<th class=\"status\"><a href=\"#\" class=\"sortheader\" onclick=\"resort(this);return false;\">"); 
     167                buffer_append_string(b, key); 
     168                BUFFER_APPEND_STRING_CONST(b, "<span class=\"sortarrow\"></span></a></th>\n"); 
     169        } else { 
     170                BUFFER_APPEND_STRING_CONST(b, "<th class=\"status\">"); 
     171                buffer_append_string(b, key); 
     172                BUFFER_APPEND_STRING_CONST(b, "</th>\n"); 
     173        } 
     174         
     175        return 0; 
     176} 
     177 
     178static int mod_status_get_multiplier(double *avg, char *multiplier, int size) { 
     179        *multiplier = ' '; 
     180         
     181        if (*avg > size) { *avg /= size; *multiplier = 'k'; } 
     182        if (*avg > size) { *avg /= size; *multiplier = 'M'; } 
     183        if (*avg > size) { *avg /= size; *multiplier = 'G'; } 
     184        if (*avg > size) { *avg /= size; *multiplier = 'T'; } 
     185        if (*avg > size) { *avg /= size; *multiplier = 'P'; } 
     186        if (*avg > size) { *avg /= size; *multiplier = 'E'; } 
     187        if (*avg > size) { *avg /= size; *multiplier = 'Z'; } 
     188        if (*avg > size) { *avg /= size; *multiplier = 'Y'; } 
     189 
     190        return 0; 
     191} 
     192 
    157193static handler_t mod_status_handle_server_status_html(server *srv, connection *con, void *p_d) { 
    158194        plugin_data *p = p_d; 
     
    178214        BUFFER_APPEND_STRING_CONST(b, 
    179215                                   "  <style type=\"text/css\">\n" 
    180                                    "th.status { background-color: black; color: white; }\n" 
    181                                    "table.status { border: black solid thin; }\n" 
    182                                    "td.int { background-color: #f0f0f0; text-align: right }\n" 
    183                                    "td.string { background-color: #f0f0f0; text-align: left }\n" 
     216                                   "    table { border: black solid thin; }\n" 
     217                                   "    td.int { background-color: #f0f0f0; text-align: right }\n" 
     218                                   "    td.string { background-color: #f0f0f0; text-align: left }\n" 
     219                                   "    th.status { background-color: black; color: white; font-weight: bold; }\n" 
     220                                   "    a.sortheader { background-color: black; color: white; font-weight: bold; text-decoration: none; display: block; }\n" 
     221                                   "    span.sortarrow { color: white; text-decoration: none; }\n" 
    184222                                   "  </style>\n"); 
     223         
     224        if (p->conf.sort) { 
     225                BUFFER_APPEND_STRING_CONST(b, 
     226                                           "<script type=\"text/javascript\">\n" 
     227                                           "// <!--\n" 
     228                                           "var sort_column;\n" 
     229                                           "var prev_span = null;\n"); 
     230                 
     231                BUFFER_APPEND_STRING_CONST(b, 
     232                                           "function get_inner_text(el) {\n" 
     233                                           " if((typeof el == 'string')||(typeof el == 'undefined'))\n" 
     234                                           "  return el;\n" 
     235                                           " if(el.innerText)\n" 
     236                                           "  return el.innerText;\n" 
     237                                           " else {\n" 
     238                                           "  var str = \"\";\n" 
     239                                           "  var cs = el.childNodes;\n" 
     240                                           "  var l = cs.length;\n" 
     241                                           "  for (i=0;i<l;i++) {\n" 
     242                                           "   if (cs[i].nodeType==1) str += get_inner_text(cs[i]);\n" 
     243                                           "   else if (cs[i].nodeType==3) str += cs[i].nodeValue;\n" 
     244                                           "  }\n" 
     245                                           " }\n" 
     246                                           " return str;\n" 
     247                                           "}\n"); 
     248                 
     249                BUFFER_APPEND_STRING_CONST(b, 
     250                                           "function sortfn(a,b) {\n" 
     251                                           " var at = get_inner_text(a.cells[sort_column]);\n" 
     252                                           " var bt = get_inner_text(b.cells[sort_column]);\n" 
     253                                           " if (a.cells[sort_column].className == 'int') {\n" 
     254                                           "  return parseInt(at)-parseInt(bt);\n" 
     255                                           " } else {\n" 
     256                                           "  aa = at.toLowerCase();\n" 
     257                                           "  bb = bt.toLowerCase();\n" 
     258                                           "  if (aa==bb) return 0;\n" 
     259                                           "  else if (aa<bb) return -1;\n" 
     260                                           "  else return 1;\n" 
     261                                           " }\n" 
     262                                           "}\n"); 
     263                 
     264                BUFFER_APPEND_STRING_CONST(b, 
     265                                           "function resort(lnk) {\n" 
     266                                           " var span = lnk.childNodes[1];\n" 
     267                                           " var table = lnk.parentNode.parentNode.parentNode.parentNode;\n" 
     268                                           " var rows = new Array();\n" 
     269                                           " for (j=1;j<table.rows.length;j++)\n" 
     270                                           "  rows[j-1] = table.rows[j];\n" 
     271                                           " sort_column = lnk.parentNode.cellIndex;\n" 
     272                                           " rows.sort(sortfn);\n"); 
     273                 
     274                BUFFER_APPEND_STRING_CONST(b, 
     275                                           " if (prev_span != null) prev_span.innerHTML = '';\n" 
     276                                           " if (span.getAttribute('sortdir')=='down') {\n" 
     277                                           "  span.innerHTML = '&uarr;';\n" 
     278                                           "  span.setAttribute('sortdir','up');\n" 
     279                                           "  rows.reverse();\n" 
     280                                           " } else {\n" 
     281                                           "  span.innerHTML = '&darr;';\n" 
     282                                           "  span.setAttribute('sortdir','down');\n" 
     283                                           " }\n" 
     284                                           " for (i=0;i<rows.length;i++)\n" 
     285                                           "  table.tBodies[0].appendChild(rows[i]);\n" 
     286                                           " prev_span = span;\n" 
     287                                           "}\n" 
     288                                           "// -->\n" 
     289                                           "</script>\n"); 
     290        } 
    185291         
    186292        BUFFER_APPEND_STRING_CONST(b,  
     
    246352        BUFFER_APPEND_STRING_CONST(b, "<tr><td>Requests</td><td class=\"string\">"); 
    247353        avg = p->abs_requests; 
    248         multiplier = '\0'; 
    249         if (avg > 10000) { avg /= 1000; multiplier = 'k'; } 
    250         if (avg > 10000) { avg /= 1000; multiplier = 'M'; } 
    251         if (avg > 10000) { avg /= 1000; multiplier = 'G'; } 
    252         if (avg > 10000) { avg /= 1000; multiplier = 'T'; } 
    253         if (avg > 10000) { avg /= 1000; multiplier = 'P'; } 
    254         if (avg > 10000) { avg /= 1000; multiplier = 'E'; } 
    255         if (avg > 10000) { avg /= 1000; multiplier = 'Z'; } 
    256         if (avg > 10000) { avg /= 1000; multiplier = 'Y'; } 
     354 
     355        mod_status_get_multiplier(&avg, &multiplier, 1000); 
     356         
    257357        buffer_append_long(b, avg); 
    258358        BUFFER_APPEND_STRING_CONST(b, " "); 
     
    262362        BUFFER_APPEND_STRING_CONST(b, "<tr><td>Traffic</td><td class=\"string\">"); 
    263363        avg = p->abs_traffic_out; 
    264         multiplier = '\0'; 
    265  
    266         if (avg > 10240) { avg /= 1024; multiplier = 'k'; } 
    267         if (avg > 10240) { avg /= 1024; multiplier = 'M'; } 
    268         if (avg > 10240) { avg /= 1024; multiplier = 'G'; } 
    269         if (avg > 10240) { avg /= 1024; multiplier = 'T'; } 
    270         if (avg > 10240) { avg /= 1024; multiplier = 'P'; } 
    271         if (avg > 10240) { avg /= 1024; multiplier = 'E'; } 
    272         if (avg > 10240) { avg /= 1024; multiplier = 'Z'; } 
    273         if (avg > 10240) { avg /= 1024; multiplier = 'Y'; } 
     364 
     365        mod_status_get_multiplier(&avg, &multiplier, 1024); 
     366 
     367        sprintf(buf, "%.2f", avg); 
     368        buffer_append_string(b, buf); 
     369        BUFFER_APPEND_STRING_CONST(b, " "); 
     370        if (multiplier) buffer_append_string_len(b, &multiplier, 1); 
     371        BUFFER_APPEND_STRING_CONST(b, "byte</td></tr>\n"); 
     372 
     373 
     374 
     375        BUFFER_APPEND_STRING_CONST(b, "<tr><th colspan=\"2\">average (since start)</th></tr>\n"); 
     376         
     377        BUFFER_APPEND_STRING_CONST(b, "<tr><td>Requests</td><td class=\"string\">"); 
     378        avg = p->abs_requests / (srv->cur_ts - srv->startup_ts); 
     379 
     380        mod_status_get_multiplier(&avg, &multiplier, 1000); 
    274381 
    275382        buffer_append_long(b, avg); 
    276383        BUFFER_APPEND_STRING_CONST(b, " "); 
    277384        if (multiplier) buffer_append_string_len(b, &multiplier, 1); 
    278         BUFFER_APPEND_STRING_CONST(b, "byte</td></tr>\n"); 
     385        BUFFER_APPEND_STRING_CONST(b, "req/s</td></tr>\n"); 
     386         
     387        BUFFER_APPEND_STRING_CONST(b, "<tr><td>Traffic</td><td class=\"string\">"); 
     388        avg = p->abs_traffic_out / (srv->cur_ts - srv->startup_ts); 
     389 
     390        mod_status_get_multiplier(&avg, &multiplier, 1024); 
     391 
     392        sprintf(buf, "%.2f", avg); 
     393        buffer_append_string(b, buf); 
     394        BUFFER_APPEND_STRING_CONST(b, " "); 
     395        if (multiplier) buffer_append_string_len(b, &multiplier, 1); 
     396        BUFFER_APPEND_STRING_CONST(b, "byte/s</td></tr>\n"); 
     397 
    279398         
    280399         
     
    287406         
    288407        BUFFER_APPEND_STRING_CONST(b, "<tr><td>Requests</td><td class=\"string\">"); 
    289         multiplier = '\0'; 
    290  
    291         if (avg > 10000) { avg /= 1000; multiplier = 'k'; } 
    292         if (avg > 10000) { avg /= 1000; multiplier = 'M'; } 
    293         if (avg > 10000) { avg /= 1000; multiplier = 'G'; } 
    294         if (avg > 10000) { avg /= 1000; multiplier = 'T'; } 
    295         if (avg > 10000) { avg /= 1000; multiplier = 'P'; } 
    296         if (avg > 10000) { avg /= 1000; multiplier = 'E'; } 
    297         if (avg > 10000) { avg /= 1000; multiplier = 'Z'; } 
    298         if (avg > 10000) { avg /= 1000; multiplier = 'Y'; } 
     408 
     409        mod_status_get_multiplier(&avg, &multiplier, 1000); 
    299410 
    300411        buffer_append_long(b, avg); 
     
    311422         
    312423        BUFFER_APPEND_STRING_CONST(b, "<tr><td>Traffic</td><td class=\"string\">"); 
    313         multiplier = '\0'; 
    314  
    315         if (avg > 10240) { avg /= 1024; multiplier = 'k'; } 
    316         if (avg > 10240) { avg /= 1024; multiplier = 'M'; } 
    317         if (avg > 10240) { avg /= 1024; multiplier = 'G'; } 
    318         if (avg > 10240) { avg /= 1024; multiplier = 'T'; } 
    319         if (avg > 10240) { avg /= 1024; multiplier = 'P'; } 
    320         if (avg > 10240) { avg /= 1024; multiplier = 'E'; } 
    321         if (avg > 10240) { avg /= 1024; multiplier = 'Z'; } 
    322         if (avg > 10240) { avg /= 1024; multiplier = 'Y'; } 
    323  
    324         buffer_append_long(b, avg); 
     424 
     425        mod_status_get_multiplier(&avg, &multiplier, 1024); 
     426 
     427        sprintf(buf, "%.2f", avg); 
     428        buffer_append_string(b, buf); 
    325429        BUFFER_APPEND_STRING_CONST(b, " "); 
    326430        if (multiplier) buffer_append_string_len(b, &multiplier, 1); 
     
    355459        BUFFER_APPEND_STRING_CONST(b, "<table class=\"status\">\n"); 
    356460        BUFFER_APPEND_STRING_CONST(b, "<tr>"); 
    357         BUFFER_APPEND_STRING_CONST(b, "<th class=\"status\">Client IP</th>"); 
    358         BUFFER_APPEND_STRING_CONST(b, "<th class=\"status\">Read</th>"); 
    359         BUFFER_APPEND_STRING_CONST(b, "<th class=\"status\">Written</th>"); 
    360         BUFFER_APPEND_STRING_CONST(b, "<th class=\"status\">State</th>"); 
    361         BUFFER_APPEND_STRING_CONST(b, "<th class=\"status\">Time</th>"); 
    362         BUFFER_APPEND_STRING_CONST(b, "<th class=\"status\">Host</th>"); 
    363         BUFFER_APPEND_STRING_CONST(b, "<th class=\"status\">URI</th>"); 
    364         BUFFER_APPEND_STRING_CONST(b, "<th class=\"status\">File</th>"); 
     461        mod_status_header_append_sort(b, p_d, "Client IP"); 
     462        mod_status_header_append_sort(b, p_d, "Read"); 
     463        mod_status_header_append_sort(b, p_d, "Written"); 
     464        mod_status_header_append_sort(b, p_d, "State"); 
     465        mod_status_header_append_sort(b, p_d, "Time"); 
     466        mod_status_header_append_sort(b, p_d, "Host"); 
     467        mod_status_header_append_sort(b, p_d, "URI"); 
     468        mod_status_header_append_sort(b, p_d, "File"); 
    365469        BUFFER_APPEND_STRING_CONST(b, "</tr>\n"); 
    366470         
     
    590694                        } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("status.config-url"))) { 
    591695                                PATCH(config_url); 
     696                        } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("status.enable-sort"))) { 
     697                                PATCH(sort); 
    592698                        }  
    593699                } 
     
    604710        PATCH(status_url); 
    605711        PATCH(config_url); 
     712        PATCH(sort); 
    606713         
    607714        return 0;