xferstats
上传用户:zibowangxu
上传日期:2007-01-04
资源大小:331k
文件大小:10k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

  1. #! /usr/bin/perl
  2. #
  3. # Copyright (c) 1999 WU-FTPD Development Group.
  4. # All rights reserved.
  5. # Portions Copyright (c) 1980, 1985, 1988, 1989, 1990, 1991, 1993, 1994 
  6. #    The Regents of the University of California.  
  7. # Portions Copyright (c) 1993, 1994 Washington University in Saint Louis.  
  8. # Portions Copyright (c) 1989 Massachusetts Institute of Technology.  
  9. # Portions Copyright (c) 1998 Sendmail, Inc.
  10. # Portions Copyright (c) 1983, 1995, 1996, 1997 Eric P. Allman.  
  11. # Portions Copyright (c) 1996, 1998 Berkeley Software Design, Inc.  
  12. # Portions Copyright (C) 1991, 1992, 1993, 1994, 1995 1996, 1997 
  13. #    Free Software Foundation, Inc.  
  14. # Portions Copyright (c) 1997 Stan Barber.  
  15. # Portions Copyright (c) 1997 Kent Landfield.
  16. # Use and distribution of this software and its source code are governed by 
  17. # the terms and conditions of the WU-FTPD Software License ("LICENSE").
  18. # If you did not receive a copy of the license, it may be obtained online at
  19. # http://www.wu-ftpd.org/license.html.
  20. # $Id: xferstats,v 1.4 1999/08/27 14:07:36 wuftpd Exp $
  21. #
  22. # ---------------------------------------------------------------------------
  23. #
  24. # USAGE: xferstats <options>
  25. #
  26. # OPTIONS:
  27. #       -f <filename>   Use <filename> for the log file
  28. #       -r              include real users 
  29. #       -a              include anonymous users 
  30. #       -h include report on hourly traffic
  31. #       -d include report on domain traffic
  32. #       -t report on total traffic by section
  33. #       -D <domain>     report only on traffic from <domain>
  34. #       -l <depth>      Depth of path detail for sections
  35. #       -s <section>    Section to report on, For example: -s /pub will report
  36. # only on paths under /pub
  37. #
  38. # ---------------------------------------------------------------------------
  39. #
  40. # edit the next two lines to customize for your domain.
  41. # This will allow your domain to be seperated in the domain listing.
  42. $hostname = `hostname`;
  43. $hostname =~ y/A-Z/a-z/;
  44. @DomainName = split /./, $hostname;
  45. $mydom2 = pop(@DomainName);
  46. $mydom1 = pop(@DomainName);
  47. # edit the next line to customize for your default log file
  48. $usage_file = "/var/log/xferlog";
  49. # Edit the following lines for default report settings.
  50. # Entries defined here will be over-ridden by the command line.
  51. $opt_h = 1; 
  52. $opt_d = 0;
  53. $opt_t = 1;
  54. $opt_l = 3;
  55. require 'getopts.pl';
  56. &Getopts('f:rahdD:l:s:');
  57. if ($opt_r) { $real = 1;}
  58. if ($opt_a) { $anon = 1;}
  59. if ($real == 0 && $anon == 0) { $anon = 1; }
  60. if ($opt_f) {$usage_file = $opt_f;}
  61. open (LOG,$usage_file) || die "Error opening usage log file: $usage_filen";
  62. if ($opt_D) {print "Transfer Totals include the '$opt_D' domain only.n";
  63.      print "All other domains are filtered out for this report.nn";}
  64. if ($opt_s) {print "Transfer Totals include the '$opt_s' section only.n";
  65.      print "All other sections are filtered out for this report.nn";}
  66. line: while (<LOG>) {
  67.    @line = split;
  68.    next if ($#line <  16);
  69.    next if (!$anon && $line[12] eq "a");
  70.    next if (!$real && $line[12] eq "r");
  71.  
  72.    $daytime = substr($_, 0, 10) . substr($_, 19, 5);
  73.    $time = substr($_,11,2); 
  74.    if ($line[8] eq ".") { $line[8] = "/unreadable/filename";}
  75.    next if (substr($line[8],0,length("$opt_s")) ne "$opt_s");
  76.    $line[8] = substr($line[8],length("$opt_s"));
  77.    @path = split(///, $line[8]);
  78. #
  79. # Why was the original xferstats dropping leading 1 character path
  80. # segments???
  81. #
  82. #  while (length($path[1]) <= 1) {
  83. #     shift @path;
  84. #     next line if ($#path == -1);
  85. #  }
  86. # Things in the top-level directory are assumed to be informational files
  87.    if ($#path == 1)
  88.       { $pathkey = "Index/Informational Files"; }
  89.       else {
  90. $pathkey = "";
  91. for ($i=1; $i <= $#path-1 && $i <= $opt_l;$i++) {
  92. $pathkey = $pathkey . "/" . $path[$i];
  93. }
  94. }
  95.    $line[6] =~ tr/A-Z/a-z/;
  96.    $systemfiles{$line[6]}++;
  97.    @address = split(/./, $line[6]);
  98.    $domain = $address[$#address];
  99.    if ($domain eq "$mydom2" && $address[$#address-1] eq "$mydom1")
  100.       { $domain = $mydom1 . "." . $mydom2; }
  101.    if ( @address < 2 ||
  102.     (substr($address[0],0,1) ge "0" && substr($address[0],0,1) le "9"))
  103.       { $domain = "unresolved"; }
  104.    $count = 1;
  105.    if ($opt_D)
  106.      {if (substr($domain,0,length("$opt_D")) eq "$opt_D" ) { $count = 1;} else
  107.      {$count = 0;}
  108.      }
  109.    if ($count) {
  110.    $xferfiles++;                                # total files sent
  111.    $xfertfiles++;                               # total files sent
  112.    $xferfiles{$daytime}++;                      # files per day
  113.    $groupfiles{$pathkey}++;                     # per-group accesses
  114.    $domainfiles{$domain}++;
  115.    $xfersecs{$daytime}    += $line[5];          # xmit seconds per day
  116.    $domainsecs{$domain}   += $line[5]; # xmit seconds for domain
  117.    $xferbytes{$daytime}   += $line[7];          # bytes per day
  118.    $domainbytes{$domain}  += $line[7]; # xmit bytes to domain
  119.    $xferbytes             += $line[7];          # total bytes sent
  120.    $groupbytes{$pathkey}  += $line[7];          # per-group bytes sent
  121.    $xfertfiles{$time}++;                        # files per hour
  122.    $xfertsecs{$time}      += $line[5];          # xmit seconds per hour
  123.    $xfertbytes{$time}     += $line[7];          # bytes per hour
  124.    $xfertbytes            += $line[7];          # total bytes sent
  125.    }
  126. }
  127. close LOG;
  128. @syslist = keys(systemfiles);
  129. @dates = sort datecompare keys(xferbytes);
  130. if ($xferfiles == 0) {die "There was no data to process.n";}
  131. print "TOTALS FOR SUMMARY PERIOD ", $dates[0], " TO ", $dates[$#dates], "nn";
  132. printf ("Files Transmitted During Summary Period  %12.0fn", $xferfiles);
  133. printf ("Bytes Transmitted During Summary Period  %12.0fn", $xferbytes); 
  134. printf ("Systems Using Archives                   %12.0fnn", $#syslist+1);
  135. printf ("Average Files Transmitted Daily          %12.0fn",
  136.    $xferfiles / ($#dates + 1));
  137. printf ("Average Bytes Transmitted Daily          %12.0fn",
  138.    $xferbytes / ($#dates + 1));
  139. format top1 =
  140. Daily Transmission Statistics
  141.                  Number Of    Number of    Average    Percent Of  Percent Of
  142.      Date        Files Sent  Bytes  Sent  Xmit  Rate  Files Sent  Bytes Sent
  143. ---------------  ----------  -----------  ----------  ----------  ----------
  144. .
  145. format line1 =
  146. @<<<<<<<<<<<<<<  @>>>>>>>>>  @>>>>>>>>>>  @>>>>>>>>>  @>>>>>>>    @>>>>>>>  
  147. $date,           $nfiles,    $nbytes,     $avgrate,   $pctfiles,  $pctbytes
  148. .
  149. $^ = top1;
  150. $~ = line1;
  151. foreach $date ( sort datecompare keys(xferbytes) ) {
  152.    $nfiles   = $xferfiles{$date};
  153.    $nbytes   = $xferbytes{$date};
  154.    $avgrate  = sprintf("%5.1f KB/s", $xferbytes{$date}/$xfersecs{$date}/1000);
  155.    $pctfiles = sprintf("%8.2f", 100*$xferfiles{$date} / $xferfiles);
  156.    $pctbytes = sprintf("%8.2f", 100*$xferbytes{$date} / $xferbytes);
  157.    write;
  158. }
  159. if ($opt_t) {
  160. format top2 =
  161. Total Transfers from each Archive Section (By bytes)
  162.                                                  ---- Percent  Of ----
  163.      Archive Section      Files Sent Bytes Sent  Files Sent Bytes Sent
  164. ------------------------- ---------- ----------- ---------- ----------
  165. .
  166. format line2 =
  167. @<<<<<<<<<<<<<<<<<<<<<<<< @>>>>>>>>> @>>>>>>>>>> @>>>>>>>   @>>>>>>>
  168. $section,                 $files,    $bytes,     $pctfiles, $pctbytes
  169. .
  170. $| = 1;
  171. $- = 0;
  172. $^ = top2;
  173. $~ = line2;
  174. foreach $section ( sort bytecompare keys(groupfiles) ) {
  175.    $files = $groupfiles{$section};
  176.    $bytes = $groupbytes{$section};
  177.    $pctbytes = sprintf("%8.2f", 100 * $groupbytes{$section} / $xferbytes);
  178.    $pctfiles = sprintf("%8.2f", 100 * $groupfiles{$section} / $xferfiles);
  179.    write;
  180. }
  181. if ( $xferfiles < 1 ) { $xferfiles = 1; }
  182. if ( $xferbytes < 1 ) { $xferbytes = 1; }
  183. }
  184. if ($opt_d) {
  185. format top3 =
  186. Total Transfer Amount By Domain
  187.              Number Of    Number of     Average    Percent Of  Percent Of
  188. Domain Name  Files Sent   Bytes Sent   Xmit  Rate  Files Sent  Bytes Sent
  189. -----------  ----------  ------------  ----------  ----------  ----------
  190. .
  191. format line3 =
  192. @<<<<<<<<<<  @>>>>>>>>>  @>>>>>>>>>>>  @>>>>>>>>>  @>>>>>>>    @>>>>>>>  
  193. $domain,     $files,     $bytes,       $avgrate,   $pctfiles,  $pctbytes
  194. .
  195. $- = 0;
  196. $^ = top3;
  197. $~ = line3;
  198. foreach $domain ( sort domnamcompare keys(domainfiles) ) {
  199.    if ( $domainsecs{$domain} < 1 ) { $domainsecs{$domain} = 1; }
  200.    $files = $domainfiles{$domain};
  201.    $bytes = $domainbytes{$domain};
  202.    $avgrate  = sprintf("%5.1f KB/s",
  203.                   $domainbytes{$domain}/$domainsecs{$domain}/1000);
  204.    $pctfiles = sprintf("%8.2f", 100 * $domainfiles{$domain} / $xferfiles);
  205.    $pctbytes = sprintf("%8.2f", 100 * $domainbytes{$domain} / $xferbytes);
  206.    write;
  207. }
  208. print "n";
  209. print "These figures only reflect ANONYMOUS FTP transfers.  There are manyn";
  210. print "sites which mount the archives via NFS, and those transfers are notn";
  211. print "logged and reported by this program.nn";
  212. }
  213. if ($opt_h) {
  214. format top8 =
  215. Hourly Transmission Statistics
  216.                  Number Of    Number of    Average    Percent Of  Percent Of
  217.      Time        Files Sent  Bytes  Sent  Xmit  Rate  Files Sent  Bytes Sent
  218. ---------------  ----------  -----------  ----------  ----------  ----------
  219. .
  220. format line8 =
  221. @<<<<<<<<<<<<<<  @>>>>>>>>>  @>>>>>>>>>>  @>>>>>>>>>  @>>>>>>>    @>>>>>>>  
  222. $time,           $nfiles,    $nbytes,     $avgrate,   $pctfiles,  $pctbytes
  223. .
  224. $| = 1;
  225. $- = 0;
  226. $^ = top8;
  227. $~ = line8;
  228. foreach $time ( sort keys(xfertbytes) ) {
  229.    $nfiles   = $xfertfiles{$time};
  230.    $nbytes   = $xfertbytes{$time};
  231.    $avgrate  = sprintf("%5.1f KB/s", $xfertbytes{$time}/$xfertsecs{$time}/1000);
  232.    $pctfiles = sprintf("%8.2f", 100*$xfertfiles{$time} / $xferfiles);
  233.    $pctbytes = sprintf("%8.2f", 100*$xfertbytes{$time} / $xferbytes);
  234.    write;
  235. }
  236. }
  237. exit(0);
  238. sub datecompare {
  239.    $date1  = substr($a, 11, 4) * 4800;
  240.    $date2  = substr($b, 11, 4) * 4800;
  241.    $date1 += index("JanFebMarAprMayJunJulAugSepOctNovDec",substr($a, 4, 3))*100;
  242.    $date2 += index("JanFebMarAprMayJunJulAugSepOctNovDec",substr($b, 4, 3))*100;
  243.    $date1 += substr($a, 8, 2);
  244.    $date2 += substr($b, 8, 2);
  245.    $date1 - $date2;
  246. }
  247. sub domnamcompare {
  248.    $sdiff = length($a) - length($b);
  249.    ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a lt $b) ? -1 : ($a gt $b) ? 1 : 0;
  250. }
  251. sub bytecompare {
  252.    $bdiff = $groupbytes{$b} - $groupbytes{$a};
  253.    ($bdiff < 0) ? -1 : ($bdiff > 0) ? 1 : ($a lt $b) ? -1 : ($a gt $b) ? 1 : 0;
  254. }
  255. sub faccompare {
  256.    $fdiff = $fac{$b} - $fac{$a};
  257.    ($fdiff < 0) ? -1 : ($fdiff > 0) ? 1 : ($a lt $b) ? -1 : ($a gt $b) ? 1 : 0;
  258. }