DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=26771>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=26771

Mod Status Enhancement

           Summary: Mod Status Enhancement
           Product: Apache httpd-1.3
           Version: 1.3.27
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: Enhancement
          Priority: Other
         Component: Other mods
        AssignedTo: [email protected]
        ReportedBy: [EMAIL PROTECTED]


Here's a patch that updates the mod_status (untouched since 1998).
Closed html tags, now validated html 4.01T, sortable table columns, ergonomics
(readability).

Some javascript comes from GNU licence v2. Anyones knows how to deal with this ?
(right to use ?)


diff -u apache_1.3.27/src/modules/standard/mod_status.c
apache_1.3.27_perso/src/modules/standard/mod_status.c
--- apache_1.3.27/src/modules/standard/mod_status.c     2002-03-13
22:05:34.000000000 +0100
+++ apache_1.3.27_perso/src/modules/standard/mod_status.c       2004-02-08
16:58:05.000000000 +0100
@@ -94,6 +94,8 @@
  *          extended STATUS is enabled) [George Burgyan/Jim J.]
  * 10.8.98  Allow for extended status info at runtime (no more STATUS)
  *          [Jim J.]
+ * 08.2.04  Fixed unclosed tags. Added stylesheet and javascript sorting 
ability
+ *          on table display. Readability enhancements [Cartegnie Francois]
  */
 
 #define CORE_PRIVATE
@@ -343,10 +345,95 @@
     ap_hard_timeout("send status info", r);
 
     if (!short_report) {
-       ap_rputs(DOCTYPE_HTML_3_2
-                "<HTML><HEAD>\n<TITLE>Apache Status</TITLE>\n</HEAD><BODY>\n",
+       ap_rputs(DOCTYPE_HTML_4_0T
+                "<HTML><HEAD>\n<TITLE>Apache Status</TITLE>\n",
                 r);
-       ap_rputs("<H1>Apache Server Status for ", r);
+
+    if (!no_table_report) {
+       ap_rputs("<STYLE TYPE=\"text/css\"><!--\n\
+               BODY,TD,TH,P{font-family: Verdana, Arial, Helvetica, 
sans-serif;font-size:
10pt;}\n\
+               TD {background:#FFFFFF; padding:2px;}\n\
+               PRE {font-family: Courier, Courier New; letter-spacing:2pt;}\n\
+               TD.tab {text-align:center; text-decoration: underline; 
font-weight:
bold;border:none;}\n\
+               TD.tab:hover {text-decoration: none; cursor:pointer;}\n\
+               TABLE.stats {background:#F0F0F0; text-decoration: none; 
width:100%;}\n\
+               TD.numeric {text-align:right;}
+               TD.centered {text-align:center;}
+               //--></STYLE>\n",r);
+               
+
+               ap_rputs("<script type=\"text/javascript\"><!--\n\
+               var _tabLast=null;\n\
+               function _rObj (s,ar) {\n\
+                this.s = s;\n\
+                this.ar = ar;\n\
+               }\n\
+               function _tabCreateArray(obj,st){\n\
+                       var tb=obj.parentNode.parentNode;\n\
+                       var rw=obj.parentNode.parentNode.rows;\n\
+                       var _nRows=rw.length;\n\
+                       var _tabS=new Array(_nRows-1);\n\
+                       var _nCells = rw.item(0).cells.length;\n\
+                       for(var i=1;i<_nRows;i++){\n\
+                               var _raw = 
rw.item(i).cells.item(obj.cellIndex).innerHTML;\n\
+                                               if (st==1) {\n\
+                                       _raw = _raw.replace((new 
RegExp('\\\\\\(','gi')), '');\n\
+                                  if (_raw.indexOf(\":\") != -1) { _raw = 
_raw.substring(2,99); }\n\
+                                if (_raw.search(new RegExp(\"[TGMk]\",\"i\"))) 
{\n\
+                                 if (_raw.indexOf(\"T\") != -1) { _raw = 
parseFloat(_raw) * 1024 * 1024 *
1024 * 1024; } \n\
+                                 else {\n\
+                                       if (_raw.indexOf(\"G\") != -1) { _raw = 
parseFloat(_raw) * 1024 * 1024 *
1024; } \n\
+                                       else {\n\
+                                                if (_raw.indexOf(\"M\") != -1) 
{ _raw = parseFloat(_raw) * 1024 * 1024;
} \n\
+                                                else {\n\
+                                                       if (_raw.indexOf(\"k\") 
!= -1) { _raw = parseFloat(_raw) * 1024; }\n\
+                                                }\n\
+                                       }\n\
+                             }\n\
+                               }}\n\
+                                       _tabS[i-1]= new 
_rObj(_raw,rw.item(i).cloneNode(true));\n\
+                       }\n\
+                       if (st==1) { _tabS.sort(_cmpFloat); }\n\
+                       else { _tabS.sort(_cmpTxt); }\n\
+                       if (!_tabMode) {_tabS.reverse()}                        
\n\
+                       for(var i=0;i<_nRows-1;i++){\n\
+                                       var tr = _tabS[i].ar.cloneNode(true);\n\
+                                       var oChild=tb.rows.item(i+1);\n\
+                                       if (i % 2 == 0) { tr.className = 
'dl-1'; } \n\
+                                              else { tr.className = 'dl-2'; 
}\n\
+                                       tb.replaceChild(tr,oChild);\n\
+                       }\n\
+               \n\
+               }\n\
+               function _cmpTxt(a,b) {\n\
+                       if (_tabMode) {\n\
+                               if (a.s==\"\") { if (b.s !=\"\") { return 1;} 
}\n\
+                               if (b.s==\"\") { if (a.s !=\"\") { return -1;} 
}\n\
+                       }\n\
+                       if (a.s.toUpperCase() < b.s.toUpperCase()) {return 
-1;}\n\
+                       if (a.s.toUpperCase() > b.s.toUpperCase()) {return 
1;}\n\
+                       return 0;\n\
+               }\n\
+               function _cmpFloat(a,b) {\n\
+                       if (!_tabMode) {\n\
+                               if (a.s==\"\") { if (b.s !=\"\") { return -1;} 
}\n\
+                               if (b.s==\"\") { if (a.s !=\"\") { return 1;} 
}\n\
+                       }\n\
+                       if (isNaN(parseFloat(a.s))) {return 1;}\n\
+                       if (isNaN(parseFloat(b.s))) {return -1;}\n\
+                       return (parseFloat(b.s) - parseFloat(a.s));\n\
+               }\n\
+               function _tabSort(obj,st){\n\
+                       if (_tabLast==obj) {_tabMode=!(_tabMode);} \n\
+                       else {_tabMode=true;}\n\
+                       _tabCreateArray(obj,st);\n\
+                       _tabLast=obj;\n\
+                       return _tabMode;\n\
+               }\n\
+               //--></script>\n", r);
+    }
+        
+       ap_rputs("</HEAD><BODY>\n<H1>Apache Server Status for ", r);
        ap_rvputs(r, ap_get_server_name(r), "</H1>\n\n", NULL);
        ap_rvputs(r, "Server Version: ",
          ap_get_server_version(), "<br>\n", NULL);
@@ -448,7 +535,7 @@
        ap_rputs("\n", r);
     else {
        ap_rputs("</PRE>\n", r);
-       ap_rputs("Scoreboard Key: <br>\n", r);
+       ap_rputs("<P>Scoreboard Key: <br>\n", r);
        ap_rputs("\"<B><code>_</code></B>\" Waiting for Connection, \n", r);
        ap_rputs("\"<B><code>S</code></B>\" Starting up, \n", r);
        ap_rputs("\"<B><code>R</code></B>\" Reading Request,<BR>\n", r);
@@ -457,8 +544,8 @@
        ap_rputs("\"<B><code>D</code></B>\" DNS Lookup,<BR>\n", r);
        ap_rputs("\"<B><code>L</code></B>\" Logging, \n", r);
        ap_rputs("\"<B><code>G</code></B>\" Gracefully finishing, \n", r);
-       ap_rputs("\"<B><code>.</code></B>\" Open slot with no current 
process<P>\n", r);
-       ap_rputs("<P>\n", r);
+       ap_rputs("\"<B><code>.</code></B>\" Open slot with no current 
process\n", r);
+       ap_rputs("</P>\n", r);
        if (!ap_extended_status) {
            int j = 0;
            ap_rputs("PID Key: <br>\n", r);
@@ -482,13 +569,13 @@
     if (ap_extended_status) {
        if (!short_report) {
            if (no_table_report)
-               ap_rputs("<p><hr><h2>Server Details</h2>\n\n", r);
+               ap_rputs("<p><hr><h2>Server Details</h2>\n\n</p>", r);
            else
 #ifdef NO_TIMES
                /* Allow for OS/2 not having CPU stats */
-               ap_rputs("<p>\n\n<table
border=0><tr><th>Srv<th>PID<th>Acc<th>M\n<th>SS<th>Req<th>Conn<th>Child<th>Slot<th>Client<th>VHost<th>Request</tr>\n\n",
r);
+               ap_rputs("<p>\n\n<table class=\"stats\"><tr><td class=\"tab\"
onClick=\"_tabSort(this,0);\">Srv</td><td class=\"tab\"
onClick=\"_tabSort(this,1);\">PID</td><td class=\"tab\"
onClick=\"_tabSort(this,0);\">Acc</td><td class=\"tab\"
onClick=\"_tabSort(this,0);\">M\n</td><td class=\"tab\"
onClick=\"_tabSort(this,1);\">SS</td><td class=\"tab\"
onClick=\"_tabSort(this,1);\">Req</td><td class=\"tab\"
onClick=\"_tabSort(this,1);\">Conn</td><td class=\"tab\"
onClick=\"_tabSort(this,1);\">Child</td><td class=\"tab\"
onClick=\"_tabSort(this,1);\">Slot</td><td class=\"tab\"
onClick=\"_tabSort(this,0);\">Client</td><td class=\"tab\"
onClick=\"_tabSort(this,0);\">VHost</td><td class=\"tab\"
onClick=\"_tabSort(this,0);\">Request</td></tr>\n\n", r);
 #else
-               ap_rputs("<p>\n\n<table
border=0><tr><th>Srv<th>PID<th>Acc<th>M<th>CPU\n<th>SS<th>Req<th>Conn<th>Child<th>Slot<th>Client<th>VHost<th>Request</tr>\n\n",
r);
+               ap_rputs("<p>\n\n<table class=\"stats\"><tr><td class=\"tab\"
onClick=\"_tabSort(this,0);\">Srv</td><td class=\"tab\"
onClick=\"_tabSort(this,1);\">PID</td><td class=\"tab\"
onClick=\"_tabSort(this,0);\">Acc</td><td class=\"tab\"
onClick=\"_tabSort(this,0);\">M</td><td class=\"tab\"
onClick=\"_tabSort(this,1);\">CPU\n</td><td class=\"tab\"
onClick=\"_tabSort(this,1);\">SS</td><td class=\"tab\"
onClick=\"_tabSort(this,1);\">Req</td><td class=\"tab\"
onClick=\"_tabSort(this,1);\">Conn</td><td class=\"tab\"
onClick=\"_tabSort(this,1);\">Child</td><td class=\"tab\"
onClick=\"_tabSort(this,1);\">Slot</td><td class=\"tab\"
onClick=\"_tabSort(this,0);\">Client</td><td class=\"tab\"
onClick=\"_tabSort(this,0);\">VHost</td><td class=\"tab\"
onClick=\"_tabSort(this,0);\">Request</td></tr>\n\n", r);
 #endif
        }
 
@@ -609,53 +696,53 @@
                    else {              /* !no_table_report */
                        if (score_record.status == SERVER_DEAD)
                            ap_rprintf(r,
-                               "<tr><td><b>%d-%d</b><td>-<td>%d/%lu/%lu",
+                               "<tr><td class=\"numeric\"><b>%d-%d</b></td><td 
class=\"numeric\">-</td><td
class=\"numeric\">%d/%lu/%lu</td>",
                                i, (int) ps_record.generation,
                                (int) conn_lres, my_lres, lres);
                        else
                            ap_rprintf(r,
-                               "<tr><td><b>%d-%d</b><td>%d<td>%d/%lu/%lu",
+                               "<tr><td class=\"numeric\"><b>%d-%d</b></td><td
class=\"numeric\">%d</td><td class=\"numeric\">%d/%lu/%lu</td>",
                                i, (int) ps_record.generation,
                                (int) ps_record.pid, (int) conn_lres,
                                my_lres, lres);
 
                        switch (score_record.status) {
                        case SERVER_READY:
-                           ap_rputs("<td>_", r);
+                           ap_rputs("<td class=\"centered\">_</td>", r);
                            break;
                        case SERVER_STARTING:
-                           ap_rputs("<td><b>S</b>", r);
+                           ap_rputs("<td class=\"centered\"><b>S</b></td>", r);
                            break;
                        case SERVER_BUSY_READ:
-                           ap_rputs("<td><b>R</b>", r);
+                           ap_rputs("<td class=\"centered\"><b>R</b></td>", r);
                            break;
                        case SERVER_BUSY_WRITE:
-                           ap_rputs("<td><b>W</b>", r);
+                           ap_rputs("<td class=\"centered\"><b>W</b></td>", r);
                            break;
                        case SERVER_BUSY_KEEPALIVE:
-                           ap_rputs("<td><b>K</b>", r);
+                           ap_rputs("<td class=\"centered\"><b>K</b></td>", r);
                            break;
                        case SERVER_BUSY_LOG:
-                           ap_rputs("<td><b>L</b>", r);
+                           ap_rputs("<td class=\"centered\"><b>L</b></td>", r);
                            break;
                        case SERVER_BUSY_DNS:
-                           ap_rputs("<td><b>D</b>", r);
+                           ap_rputs("<td class=\"centered\"><b>D</b></td>", r);
                            break;
                        case SERVER_DEAD:
-                           ap_rputs("<td>.", r);
+                           ap_rputs("<td class=\"centered\">.</td>", r);
                            break;
                        case SERVER_GRACEFUL:
-                           ap_rputs("<td>G", r);
+                           ap_rputs("<td class=\"centered\">G</td>", r);
                            break;
                        default:
-                           ap_rputs("<td>?", r);
+                           ap_rputs("<td class=\"centered\">?</td>", r);
                            break;
                        }
 #ifdef NO_TIMES
                        /* Allow for OS/2 not having CPU stats */
-                       ap_rprintf(r, "\n<td>%.0f<td>%ld",
+                       ap_rprintf(r, "\n<td class=\"numeric\">%.0f</td><td 
class=\"numeric\">%ld</td>",
 #else
-                       ap_rprintf(r, "\n<td>%.2f<td>%.0f<td>%ld",
+                       ap_rprintf(r, "\n<td class=\"numeric\">%.2f</td><td
class=\"numeric\">%.0f</td><td class=\"numeric\">%ld</td>",
                            (score_record.times.tms_utime +
                             score_record.times.tms_stime +
                             score_record.times.tms_cutime +
@@ -667,15 +754,15 @@
                            difftime(nowtime, score_record.last_used),
 #endif
                            (long) req_time);
-                       ap_rprintf(r, "<td>%-1.1f<td>%-2.2f<td>%-2.2f\n",
+                       ap_rprintf(r, "<td class=\"numeric\">%-1.1f</td><td
class=\"numeric\">%-2.2f</td><td class=\"numeric\">%-2.2f</td>\n",
                           (float) conn_bytes / KBYTE, (float) my_bytes / MBYTE,
                            (float) bytes / MBYTE);
                        if (score_record.status == SERVER_BUSY_READ)
                            ap_rprintf(r,
-                            "<td>?<td nowrap>?<td nowrap>..reading.. 
</tr>\n\n");
+                            "<td class=\"centered\">?</td><td 
class=\"centered\" nowrap>?</td><td
nowrap>..reading.. </td></tr>\n\n");
                        else
                            ap_rprintf(r,
-                            "<td>%s<td nowrap>%s<td nowrap>%s</tr>\n\n",
+                            "<td class=\"centered\">%s</td><td 
class=\"centered\" nowrap>%s</td><td
nowrap>%s</td></tr>\n\n",
                             ap_escape_html(r->pool, score_record.client),
                             vhost ? ap_escape_html(r->pool, 
                                vhost->server_hostname) : "(unavailable)",
@@ -687,33 +774,33 @@
 
        if (!(short_report || no_table_report)) {
 #ifdef NO_TIMES
-           ap_rputs("</table>\n \
+           ap_rputs("</table></p>\n \
 <hr> \
 <table>\n \
-<tr><th>Srv<td>Child Server number - generation\n \
-<tr><th>PID<td>OS process ID\n \
-<tr><th>Acc<td>Number of accesses this connection / this child / this slot\n \
-<tr><th>M<td>Mode of operation\n \
-<tr><th>SS<td>Seconds since beginning of most recent request\n \
-<tr><th>Req<td>Milliseconds required to process most recent request\n \
-<tr><th>Conn<td>Kilobytes transferred this connection\n \
-<tr><th>Child<td>Megabytes transferred this child\n \
-<tr><th>Slot<td>Total megabytes transferred this slot\n \
+<tr><th>Srv</th><td>Child Server number - generation</td></tr>\n \
+<tr><th>PID</th><td>OS process ID</td></tr>\n \
+<tr><th>Acc</th><td>Number of accesses this connection / this child / this
slot</td></tr>\n \
+<tr><th>M</th><td>Mode of operation</td></tr>\n \
+<tr><th>SS</th><td>Seconds since beginning of most recent request</td></tr>\n \
+<tr><th>Req</th><td>Milliseconds required to process most recent
request</td></tr>\n \
+<tr><th>Conn</th><td>Kilobytes transferred this connection</td></tr>\n \
+<tr><th>Child</th><td>Megabytes transferred this child</td></tr>\n \
+<tr><th>Slot</th><td>Total megabytes transferred this slot</td></tr>\n \
 </table>\n", r);
 #else
            ap_rputs("</table>\n \
 <hr> \
 <table>\n \
-<tr><th>Srv<td>Child Server number - generation\n \
-<tr><th>PID<td>OS process ID\n \
-<tr><th>Acc<td>Number of accesses this connection / this child / this slot\n \
-<tr><th>M<td>Mode of operation\n \
-<tr><th>CPU<td>CPU usage, number of seconds\n \
-<tr><th>SS<td>Seconds since beginning of most recent request\n \
-<tr><th>Req<td>Milliseconds required to process most recent request\n \
-<tr><th>Conn<td>Kilobytes transferred this connection\n \
-<tr><th>Child<td>Megabytes transferred this child\n \
-<tr><th>Slot<td>Total megabytes transferred this slot\n \
+<tr><th>Srv</th><td>Child Server number - generation</td></tr>\n \
+<tr><th>PID</th><td>OS process ID</td></tr>\n \
+<tr><th>Acc</th><td>Number of accesses this connection / this child / this
slot</td></tr>\n \
+<tr><th>M</th><td>Mode of operation</td></tr>\n \
+<tr><th>CPU</th><td>CPU usage, number of seconds</td></tr>\n \
+<tr><th>SS</th><td>Seconds since beginning of most recent request</td></tr>\n \
+<tr><th>Req</th><td>Milliseconds required to process most recent
request</td></tr>\n \
+<tr><th>Conn</th><td>Kilobytes transferred this connection</td></tr>\n \
+<tr><th>Child</th><td>Megabytes transferred this child</td></tr>\n \
+<tr><th>Slot</th><td>Total megabytes transferred this slot</td></tr>\n \
 </table>\n", r);
 #endif
        }

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

Reply via email to