| | 162 | static 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 | |
| | 178 | static 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 | |
| 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" |
| | 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 = '↑';\n" |
| | 278 | " span.setAttribute('sortdir','up');\n" |
| | 279 | " rows.reverse();\n" |
| | 280 | " } else {\n" |
| | 281 | " span.innerHTML = '↓';\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 | } |
| 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 | |
| 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); |
| 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 | |
| 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); |
| 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); |
| 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"); |