xferstats.holger-preiss
上传用户:pycemail
上传日期:2007-01-04
资源大小:329k
文件大小:11k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

  1. #! /usr/bin/perl
  2. # ---------------------------------------------------------------------------
  3. #
  4. # USAGE: xferstats <options>
  5. #
  6. # OPTIONS:
  7. #       -f <filename>   Use <filename> for the log file
  8. #       -r              include real users 
  9. #       -a              include anonymous users 
  10. #       -h include report on hourly traffic
  11. #       -d include report on domain traffic
  12. #       -t report on total traffic by section
  13. # -i  report incomming traffic only (uploads)
  14. # -o report outgoing traffic only (download)
  15. #       -D <domain>     report only on traffic from <domain>
  16. # this option leads to problems with the local
  17. # domain: e.g. test.com is counted under test
  18. # and not recognized under com, -D com will give
  19. # you only statistics about com excluding
  20. # test.com! use -A com for correct results.
  21. #       -A <address>    report only on traffic from addresses ends matching
  22. # <address> e.g. -A test.domain.com will report
  23. # only on addresses ending with test.domain.com
  24. #       -l <depth>      Depth of path detail for sections
  25. #       -s <section>    Section to report on, For example: -s /pub will report
  26. # only on paths under /pub
  27. #
  28. # ---------------------------------------------------------------------------
  29. # 30.09.98: changes by Jan Menzel (jan.menzel@gmx.net):
  30. #  -documented problems with option -D
  31. #  -fixed same problems with spaces in the filenames (lines which are not
  32. #     exactly 16 elements long are skipped in earlier versions)
  33. #  -added option A which compares the addresses end with a given pattern
  34. #  -added option i and o which reports either incoming or outgoing traffic only
  35. @mydom = split(/./, `dnsdomainname`);
  36. $mydom2 = pop(@mydom); chop($mydom2);
  37. $mydom1 = pop(@mydom);
  38. # If you want to specify $mydom1 and $mydom2 manually you should edit the
  39. # next two lines to customize for your domain. This will allow your domain
  40. # to be separated in the domain listing.
  41. # $mydom1 = "debian";
  42. # $mydom2 = "org";
  43. # edit the next line to customize for your default log file
  44. $usage_file = "/var/log/xferlog";
  45. # Edit the following lines for default report settings.
  46. # Entries defined here will be over-ridden by the command line.
  47. $opt_h = 0; 
  48. $opt_d = 0;
  49. $opt_t = 1;
  50. $opt_l = 3;
  51. require 'getopts.pl';
  52. &Getopts('f:rahdD:l:s:A:io');
  53. if ($opt_r) { $real = 1;}
  54. if ($opt_a) { $anon = 1;}
  55. if ($real == 0 && $anon == 0) { $anon = 1; }
  56. if ($opt_f) {$usage_file = $opt_f;}
  57. if ($opt_i) {$opt_i = 1;}
  58. if ($opt_o) {$opt_o = 1;}
  59. open (LOG,$usage_file) || die "Error opening usage log file: $usage_filen";
  60. if ($opt_o) {
  61.    print "Transfer Totals include outgoing traffic only.nn";
  62. }
  63. if ($opt_i) {
  64.    print "Transfer Totals include incoming traffic only.nn";
  65. }
  66. if ($opt_D) {
  67.    $opt_D =~ tr/A-Z/a-z/;
  68.    print "Transfer Totals include the '$opt_D' domain only.n";
  69.    print "All other domains are filtered out for this report.nn";
  70. }
  71. if ($opt_A) {
  72.    $opt_A =~ tr/A-Z/a-z/;
  73.    print "Transfer Totals include the addresses ending in '$opt_A' only.n";
  74.    print "All other addresses are filtered out for this report.nn";
  75. }
  76. if ($opt_s) {
  77.    print "Transfer Totals include the '$opt_s' section only.n";
  78.    print "All other sections are filtered out for this report.nn";
  79. }
  80. line: while (<LOG>) {
  81.    @line = split;
  82.    # is the first entry week day abbreviation?
  83.    next if (length("$line[0]") != 3);
  84.    # check whether there is a valid 'username'
  85.    if ($line[$#line-7] eq "a" or $line[$#line-7] eq "b") {
  86.       # yes, there i
  87.       # offset points to the first element just behind the filename
  88.       $offset = $#line - 7;
  89.    } elsif ($line[$#line-6] eq "a" or $line[$#line-6] eq "b") {
  90.       $offset = $#line - 6
  91.    } else {
  92.       next;
  93.    }
  94.    next if (!$anon && $line[$offset+3] eq "a");
  95.    next if (!$real && $line[$offset+3] eq "r");
  96.    next if ($opt_i && $line[$offset+2] ne "i");
  97.    next if ($opt_o && $line[$offset+2] ne "o");
  98.    $daytime = substr($_, 0, 10) . substr($_, 19, 5);
  99.    $time = substr($_,11,2); 
  100.    if ($line[8] eq ".") { $line[8] = "/unreadable/filename";}
  101.    next if (substr($line[8],0,length("$opt_s")) ne "$opt_s");
  102.    $line[8] = substr($line[8],length("$opt_s"));
  103.    @path = split(///, $line[8]);
  104. #
  105. # Why was the original xferstats dropping leading 1 character path
  106. # segments???
  107. #
  108. #  while (length($path[1]) <= 1) {
  109. #     shift @path;
  110. #     next line if ($#path == -1);
  111. #  }
  112. # Things in the top-level directory are assumed to be informational files
  113.    if ($#path == 1)
  114.       { $pathkey = "Index/Informational Files"; }
  115.       else {
  116. $pathkey = "";
  117. for ($i=1; $i <= $#path-1 && $i <= $opt_l;$i++) {
  118. $pathkey = $pathkey . "/" . $path[$i];
  119. }
  120. }
  121.    $line[6] =~ tr/A-Z/a-z/;
  122.    @address = split(/./, $line[6]);
  123.    $domain = $address[$#address];
  124.    if ($domain eq "$mydom2" && $address[$#address-1] eq "$mydom1")
  125.       { $domain = $mydom1 . "." . $mydom2; }
  126.    if ( int($address[0]) > 0 || $#address < 2 )
  127.       { $domain = "unresolved"; }
  128.    $count = 1;
  129.    if ($opt_D and substr($domain,0,length("$opt_D")) ne "$opt_D" ) {
  130.       $count = 0;
  131.    }
  132.    if ($opt_A and substr($line[6],length("$line[6]")-length("$opt_A")) ne "$opt_A" ) {
  133.       $count = 0;
  134.    }
  135.    if ($count) {
  136.    $systemfiles{$line[6]}++;                    # Systems Accessing the Arc
  137.    $xferfiles++;                                # total files sent
  138.    $xfertfiles++;                               # total files sent
  139.    $xferfiles{$daytime}++;                      # files per day
  140.    $groupfiles{$pathkey}++;                     # per-group accesses
  141.    $domainfiles{$domain}++;
  142.    $xfersecs{$daytime}    += $line[5];          # xmit seconds per day
  143.    $domainsecs{$domain}   += $line[5]; # xmit seconds for domain
  144.    $xferbytes{$daytime}   += $line[7];          # bytes per day
  145.    $domainbytes{$domain}  += $line[7]; # xmit bytes to domain
  146.    $xferbytes             += $line[7];          # total bytes sent
  147.    $groupbytes{$pathkey}  += $line[7];          # per-group bytes sent
  148.    $xfertfiles{$time}++;                        # files per hour
  149.    $xfertsecs{$time}      += $line[5];          # xmit seconds per hour
  150.    $xfertbytes{$time}     += $line[7];          # bytes per hour
  151.    $xfertbytes            += $line[7];          # total bytes sent
  152.    }
  153. }
  154. close LOG;
  155. @syslist = keys(systemfiles);
  156. @dates = sort datecompare keys(xferbytes);
  157. if ($xferfiles == 0) {die "There was no data to process.n";}
  158. print "TOTALS FOR SUMMARY PERIOD ", $dates[0], " TO ", $dates[$#dates], "nn";
  159. printf ("Files Transmitted During Summary Period  %12.0fn", $xferfiles);
  160. printf ("Bytes Transmitted During Summary Period  %12.0fn", $xferbytes); 
  161. printf ("Systems Using Archives                   %12.0fnn", $#syslist+1);
  162. printf ("Average Files Transmitted Daily          %12.0fn",
  163.    $xferfiles / ($#dates + 1));
  164. printf ("Average Bytes Transmitted Daily          %12.0fn",
  165.    $xferbytes / ($#dates + 1));
  166. format top1 =
  167. Daily Transmission Statistics
  168.                  Number Of    Number of    Average    Percent Of  Percent Of
  169.      Date        Files Sent  Bytes  Sent  Xmit  Rate  Files Sent  Bytes Sent
  170. ---------------  ----------  -----------  ----------  ----------  ----------
  171. .
  172. format line1 =
  173. @<<<<<<<<<<<<<<  @>>>>>>>>>  @>>>>>>>>>>  @>>>>>>>>>  @>>>>>>>    @>>>>>>>  
  174. $date,           $nfiles,    $nbytes,     $avgrate,   $pctfiles,  $pctbytes
  175. .
  176. $^ = top1;
  177. $~ = line1;
  178. # sort daily traffic by bytes sendt
  179. #foreach $date ( sort datecompare keys(nbytes) ) {
  180. foreach $date ( sort datecompare keys(xferbytes) ) {
  181.    $nfiles = $xferfiles{$date};
  182.    $nbytes = $xferbytes{$date};
  183.    if ($xfersecs{$date}) {
  184.       $avgrate = sprintf("%5.1f KB/s", $xferbytes{$date}/$xfersecs{$date}/1024);
  185.    } else {
  186.       $avgrate = sprintf("undefined");
  187.    }
  188.    $pctfiles = sprintf("%8.2f", 100*$xferfiles{$date}/$xferfiles);
  189.    $pctbytes = sprintf("%8.2f", 100*$xferbytes{$date}/$xferbytes);
  190.    write;
  191. }
  192. if ($opt_t) {
  193. format top2 =
  194. Total Transfers from each Archive Section (By bytes)
  195.                                                  ---- Percent  Of ----
  196.      Archive Section      Files Sent Bytes Sent  Files Sent Bytes Sent
  197. ------------------------- ---------- ----------- ---------- ----------
  198. .
  199. format line2 =
  200. @<<<<<<<<<<<<<<<<<<<<<<<< @>>>>>>>>> @>>>>>>>>>> @>>>>>>>   @>>>>>>>
  201. $section,                 $files,    $bytes,     $pctfiles, $pctbytes
  202. .
  203. $| = 1;
  204. $- = 0;
  205. $^ = top2;
  206. $~ = line2;
  207. # sort total transfer for each archive by # files transfered
  208. foreach $section ( sort bytecompare keys(groupfiles) ) {
  209.    $files = $groupfiles{$section};
  210.    $bytes = $groupbytes{$section};
  211.    $pctbytes = sprintf("%8.2f", 100 * $groupbytes{$section} / $xferbytes);
  212.    $pctfiles = sprintf("%8.2f", 100 * $groupfiles{$section} / $xferfiles);
  213.    write;
  214. }
  215. }
  216. if ($opt_d) {
  217. format top3 =
  218. Total Transfer Amount By Domain
  219.              Number Of    Number of     Average    Percent Of  Percent Of
  220. Domain Name  Files Sent   Bytes Sent   Xmit  Rate  Files Sent  Bytes Sent
  221. -----------  ----------  ------------  ----------  ----------  ----------
  222. .
  223. format line3 =
  224. @<<<<<<<<<<  @>>>>>>>>>  @>>>>>>>>>>>  @>>>>>>>>>  @>>>>>>>    @>>>>>>>  
  225. $domain,     $files,     $bytes,       $avgrate,   $pctfiles,  $pctbytes
  226. .
  227. $- = 0;
  228. $^ = top3;
  229. $~ = line3;
  230. # sort amount per domain by files
  231. foreach $domain ( sort domnamcompare keys(domainfiles) ) {
  232.    $files = $domainfiles{$domain};
  233.    $bytes = $domainbytes{$domain};
  234.    if ($domainsecs{$domain}) {
  235.       $avgrate = sprintf("%5.1f KB/s", $domainbytes{$domain}/$domainsecs{$domain}/1024);
  236.    } else {
  237.       $avgrate = sprintf("undefined");
  238.    }
  239.    $pctfiles = sprintf("%8.2f", 100 * $domainfiles{$domain} / $xferfiles);
  240.    $pctbytes = sprintf("%8.2f", 100 * $domainbytes{$domain} / $xferbytes);
  241.    write;
  242. }
  243. print "n";
  244. }
  245. if ($opt_h) {
  246. format top8 =
  247. Hourly Transmission Statistics
  248.                  Number Of    Number of    Average    Percent Of  Percent Of
  249.      Time        Files Sent  Bytes  Sent  Xmit  Rate  Files Sent  Bytes Sent
  250. ---------------  ----------  -----------  ----------  ----------  ----------
  251. .
  252. format line8 =
  253. @<<<<<<<<<<<<<<  @>>>>>>>>>  @>>>>>>>>>>  @>>>>>>>>>  @>>>>>>>    @>>>>>>>  
  254. $time,           $nfiles,    $nbytes,     $avgrate,   $pctfiles,  $pctbytes
  255. .
  256. $| = 1;
  257. $- = 0;
  258. $^ = top8;
  259. $~ = line8;
  260. # sort hourly transmission by sent bytes
  261. foreach $time ( sort keys(xfertbytes) ) {
  262.    $nfiles   = $xfertfiles{$time};
  263.    $nbytes   = $xfertbytes{$time};
  264.    if ($xfertsecs{$time}) {
  265.       $avgrate  = sprintf("%5.1f KB/s", $xfertbytes{$time}/$xfertsecs{$time}/1024);
  266.    } else {
  267.       $avgrate  = sprintf("undefined");
  268.    }
  269.    $pctfiles = sprintf("%8.2f", 100*$xfertfiles{$time} / $xferfiles);
  270.    $pctbytes = sprintf("%8.2f", 100*$xfertbytes{$time} / $xferbytes);
  271.    write;
  272. }
  273. }
  274. exit(0);
  275. sub datecompare {
  276.    $date1  = substr($a, 11, 4) * 4800;
  277.    $date2  = substr($b, 11, 4) * 4800;
  278.    $date1 += index("JanFebMarAprMayJunJulAugSepOctNovDec",substr($a, 4, 3)) / 3 * 400;
  279.    $date2 += index("JanFebMarAprMayJunJulAugSepOctNovDec",substr($b, 4, 3)) / 3 * 400;
  280.    $date1 += substr($a, 8, 2);
  281.    $date2 += substr($b, 8, 2);
  282.    $date1 - $date2;
  283. }
  284. sub domnamcompare {
  285.    $sdiff = length($a) - length($b);
  286.    ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a lt $b) ? -1 : ($a gt $b) ? 1 : 0;
  287. }
  288. sub bytecompare {
  289.    $bdiff = $groupbytes{$b} - $groupbytes{$a};
  290.    ($bdiff < 0) ? -1 : ($bdiff > 0) ? 1 : ($a lt $b) ? -1 : ($a gt $b) ? 1 : 0;
  291. }
  292. sub faccompare {
  293.    $fdiff = $fac{$b} - $fac{$a};
  294.    ($fdiff < 0) ? -1 : ($fdiff > 0) ? 1 : ($a lt $b) ? -1 : ($a gt $b) ? 1 : 0;
  295. }