stat.pl 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #!/usr/bin/perl
  2. eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
  3. if $running_under_some_shell;
  4. # this emulates #! processing on NIH machines.
  5. # (remove #! line above if indigestible)
  6. eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
  7. # process any FOO=bar switches
  8. $[ = 1; # set array base to 1
  9. $, = ' '; # set output field separator
  10. $\ = "\n"; # set output record separator
  11. $scriptname = $ENVIRON{'SCRIPT_NAME'};
  12. #for win32
  13. $isql = ".\\isqlodbc.exe sqlite ";
  14. #for unix
  15. #isql="./isqlodbc sqlite "
  16. print "Content-Type: text/html; charset=koi8-r \n\n";
  17. print "<HTML>\n<BODY>\n";
  18. # query parse
  19. $query_str = $ENVIRON{'QUERY_STRING'};
  20. $n = (@querys = split(/&/, $query_str, 9999));
  21. for ($i = 1; $i <= $n; $i++) {
  22. @data = split(/=/, $querys[$i], 9999);
  23. $qr{$data[1]} = $data[2];
  24. }
  25. printf "<FORM METHOD=PUT action=\"" . $scriptname . "?rep=1\">";
  26. printf "datefrom:<INPUT name=\"datefrom\" value=\"2004-06-01\"> ";
  27. printf "dateto:<INPUT name=\"dateto\" value=\"2004-07-30\"> <br>";
  28. printf
  29. "<INPUT type=\"radio\" name=\"userid\" value=\"username\" checked> LOGIN user <br>";
  30. printf
  31. "<INPUT type=\"radio\" name=\"userid\" value=\"userip\"> IP user <br>";
  32. printf "<INPUT type=\"hidden\" name=\"rep\" value=\"user\">";
  33. printf "<INPUT type=\"submit\" value=\"Report\">";
  34. printf '</FORM>';
  35. #printf "query_str=%s\n<br>",query_str
  36. #print qr["rep"]
  37. if ($qr{'rep'} eq 'user') {
  38. $cmd = $isql . " \"select " . $qr{'userid'} .
  39. ",sum(bytein),sum(byteout),sum(bytein+byteout) from log where ldate > '"
  40. . $qr{'datefrom'} . "' AND ldate < '" . $qr{'dateto'} . "' group by " .
  41. $qr{'userid'} . " order by sum(bytein+byteout) desc;\"";
  42. printf
  43. ' <table WIDTH=100%% BORDER=1><tr><td><b>user</b></td> <td><b>bytein</b></td> <td><b>byteout</b> </td> <td> <b>bytesum</b></td></tr>';
  44. while ((($result = &Getline3($cmd, '|'),$getline_ok)) > 0) {
  45. @rt = split(/\|/, $result, 9999);
  46. printf
  47. "<tr> <td><a href=\"%s?rep=host&datefrom=%s&dateto=%s&userid=%s&selectid=%s\"> %s <\\/a></td><td>%d</td><td>%d</td><td>%d</td></tr>",
  48. $scriptname, $qr{'datefrom'}, $qr{'dateto'}, $qr{'userid'}, $rt[1],
  49. $rt[1], $rt[2], $rt[3], $rt[4];
  50. $totalbytein = $totalbytein + $rt[2];
  51. $totalbyteout = $totalbyteout + $rt[3];
  52. $totalbytesum = $totalbytesum + $rt[4];
  53. }
  54. printf
  55. '<tr> <td><br>Total users</td> <td><br>%d</td> <td><br>%d</td> <td><br>%d</td></tr> </table> ',
  56. $totalbytein, $totalbyteout, $totalbytesum;
  57. delete $opened{$cmd} && close($cmd);
  58. }
  59. if ($qr{'rep'} eq 'host') {
  60. $cmd = $isql .
  61. "\"select sum(bytein+byteout), sum(bytein), sum(byteout),host from log where ldate > '"
  62. . $qr{'datefrom'} . "' AND ldate < '" . $qr{'dateto'} . "' AND " .
  63. $qr{'userid'} . " = '" . $qr{'selectid'} .
  64. "' group by host order by sum(bytein+byteout) desc;\"";
  65. printf '<center><b>Detail statistic for user: %s</b></center>',
  66. $qr{'selectid'};
  67. printf
  68. ' <table WIDTH=100%% BORDER=1> <tr><td><b>sum byte</b></td> <td><b>bytein</b></td> <td><b>byteout</b></td><td><b>host</b></td></tr>';
  69. while ((($result = &Getline3($cmd, '|'),$getline_ok)) > 0) {
  70. @rt = split(/\|/, $result, 9999);
  71. printf '<tr><td>%d</td><td>%d</td><td>%d</td><td>%s</td></tr>',
  72. $rt[1], $rt[2], $rt[3], $rt[4];
  73. $totalbytein = $totalbytein + $rt[1];
  74. $totalbyteout = $totalbyteout + $rt[2];
  75. $totalbytesum = $totalbytesum + $rt[3];
  76. }
  77. printf
  78. '<tr> <td><br>%d</td> <td><br>%d</td> <td><br>%d</td><td><br>Total host</td></tr> </table> ',
  79. $totalbytein, $totalbyteout, $totalbytesum;
  80. printf ' </table> ';
  81. delete $opened{$cmd} && close($cmd);
  82. }
  83. printf ' </BODY> </HTML>';
  84. # end BEGIN
  85. # decode urlencoded string
  86. sub decode {
  87. local($text, *Hex, $i, *hextab, $decoded, $len, $c, $c1, $c2, $code) = @_;
  88. @Hex = split(' ', '0 1 2 3 4 5 6 7 8 9 a b c d e f', 9999);
  89. for ($i = 0; $i < 16; $i++) {
  90. $hextab{$Hex[$i + 1]} = $i;
  91. # urldecode function from Heiner Steven
  92. # http://www.shelldorado.com/scripts/cmds/urldecode
  93. # decode %xx to ASCII char
  94. ;
  95. }
  96. $decoded = '';
  97. $i = 1;
  98. $len = length($text);
  99. while ($i <= $len) { #???
  100. $c = substr($text, $i, 1);
  101. if ($c eq '%') {
  102. if ($i + 2 <= $len) {
  103. $c1 = &tolower(substr($text, $i + 1, 1));
  104. $c2 = &tolower(substr($text, $i + 2, 1));
  105. if ($hextab{$c1} ne '' || $hextab{$c2} ne '') {
  106. if (($c1 >= 2 && ($c1 != 7 && $c2 ne 'F')) ||
  107. ($c1 == 0 && $c2 =~ '[9acd]')) {
  108. $code = 0 + $hextab{$c1} * 16 + $hextab{$c2} + 0;
  109. $c = sprintf('%c', $code);
  110. }
  111. else {
  112. $c = ' ';
  113. }
  114. $i = $i + 2;
  115. }
  116. }
  117. }
  118. elsif ($c eq '+') {
  119. # special handling: "+" means " "
  120. $c = ' ';
  121. }
  122. $decoded = $decoded . $c;
  123. ++$i;
  124. }
  125. # change linebreaks to \n
  126. $decoded =~ s/\r\n/\n/g;
  127. # remove last linebreak
  128. $decoded =~ s/[\n\r]*$//;
  129. $decoded;
  130. }
  131. sub Getline3 {
  132. &Pick('',@_);
  133. local($_);
  134. if ($getline_ok = (($_ = <$fh>) ne '')) {
  135. ;
  136. }
  137. $_;
  138. }
  139. sub Pick {
  140. local($mode,$name,$pipe) = @_;
  141. $fh = $name;
  142. open($name,$mode.$name.$pipe) unless $opened{$name}++;
  143. }