xferstats
上传用户:zibowangxu
上传日期:2007-01-04
资源大小:331k
文件大小:10k
- #! /usr/bin/perl
- #
- # Copyright (c) 1999 WU-FTPD Development Group.
- # All rights reserved.
- #
- # Portions Copyright (c) 1980, 1985, 1988, 1989, 1990, 1991, 1993, 1994
- # The Regents of the University of California.
- # Portions Copyright (c) 1993, 1994 Washington University in Saint Louis.
- # Portions Copyright (c) 1989 Massachusetts Institute of Technology.
- # Portions Copyright (c) 1998 Sendmail, Inc.
- # Portions Copyright (c) 1983, 1995, 1996, 1997 Eric P. Allman.
- # Portions Copyright (c) 1996, 1998 Berkeley Software Design, Inc.
- # Portions Copyright (C) 1991, 1992, 1993, 1994, 1995 1996, 1997
- # Free Software Foundation, Inc.
- # Portions Copyright (c) 1997 Stan Barber.
- # Portions Copyright (c) 1997 Kent Landfield.
- #
- # Use and distribution of this software and its source code are governed by
- # the terms and conditions of the WU-FTPD Software License ("LICENSE").
- #
- # If you did not receive a copy of the license, it may be obtained online at
- # http://www.wu-ftpd.org/license.html.
- #
- # $Id: xferstats,v 1.4 1999/08/27 14:07:36 wuftpd Exp $
- #
- # ---------------------------------------------------------------------------
- #
- # USAGE: xferstats <options>
- #
- # OPTIONS:
- # -f <filename> Use <filename> for the log file
- # -r include real users
- # -a include anonymous users
- # -h include report on hourly traffic
- # -d include report on domain traffic
- # -t report on total traffic by section
- # -D <domain> report only on traffic from <domain>
- # -l <depth> Depth of path detail for sections
- # -s <section> Section to report on, For example: -s /pub will report
- # only on paths under /pub
- #
- # ---------------------------------------------------------------------------
- #
- # edit the next two lines to customize for your domain.
- # This will allow your domain to be seperated in the domain listing.
- $hostname = `hostname`;
- $hostname =~ y/A-Z/a-z/;
- @DomainName = split /./, $hostname;
- $mydom2 = pop(@DomainName);
- $mydom1 = pop(@DomainName);
- # edit the next line to customize for your default log file
- $usage_file = "/var/log/xferlog";
- # Edit the following lines for default report settings.
- # Entries defined here will be over-ridden by the command line.
- $opt_h = 1;
- $opt_d = 0;
- $opt_t = 1;
- $opt_l = 3;
- require 'getopts.pl';
- &Getopts('f:rahdD:l:s:');
- if ($opt_r) { $real = 1;}
- if ($opt_a) { $anon = 1;}
- if ($real == 0 && $anon == 0) { $anon = 1; }
- if ($opt_f) {$usage_file = $opt_f;}
- open (LOG,$usage_file) || die "Error opening usage log file: $usage_filen";
- if ($opt_D) {print "Transfer Totals include the '$opt_D' domain only.n";
- print "All other domains are filtered out for this report.nn";}
- if ($opt_s) {print "Transfer Totals include the '$opt_s' section only.n";
- print "All other sections are filtered out for this report.nn";}
- line: while (<LOG>) {
- @line = split;
- next if ($#line < 16);
- next if (!$anon && $line[12] eq "a");
- next if (!$real && $line[12] eq "r");
-
- $daytime = substr($_, 0, 10) . substr($_, 19, 5);
- $time = substr($_,11,2);
- if ($line[8] eq ".") { $line[8] = "/unreadable/filename";}
- next if (substr($line[8],0,length("$opt_s")) ne "$opt_s");
- $line[8] = substr($line[8],length("$opt_s"));
- @path = split(///, $line[8]);
- #
- # Why was the original xferstats dropping leading 1 character path
- # segments???
- #
- # while (length($path[1]) <= 1) {
- # shift @path;
- # next line if ($#path == -1);
- # }
- # Things in the top-level directory are assumed to be informational files
- if ($#path == 1)
- { $pathkey = "Index/Informational Files"; }
- else {
- $pathkey = "";
- for ($i=1; $i <= $#path-1 && $i <= $opt_l;$i++) {
- $pathkey = $pathkey . "/" . $path[$i];
- }
- }
- $line[6] =~ tr/A-Z/a-z/;
- $systemfiles{$line[6]}++;
- @address = split(/./, $line[6]);
- $domain = $address[$#address];
- if ($domain eq "$mydom2" && $address[$#address-1] eq "$mydom1")
- { $domain = $mydom1 . "." . $mydom2; }
- if ( @address < 2 ||
- (substr($address[0],0,1) ge "0" && substr($address[0],0,1) le "9"))
- { $domain = "unresolved"; }
- $count = 1;
- if ($opt_D)
- {if (substr($domain,0,length("$opt_D")) eq "$opt_D" ) { $count = 1;} else
- {$count = 0;}
- }
- if ($count) {
- $xferfiles++; # total files sent
- $xfertfiles++; # total files sent
- $xferfiles{$daytime}++; # files per day
- $groupfiles{$pathkey}++; # per-group accesses
- $domainfiles{$domain}++;
- $xfersecs{$daytime} += $line[5]; # xmit seconds per day
- $domainsecs{$domain} += $line[5]; # xmit seconds for domain
- $xferbytes{$daytime} += $line[7]; # bytes per day
- $domainbytes{$domain} += $line[7]; # xmit bytes to domain
- $xferbytes += $line[7]; # total bytes sent
- $groupbytes{$pathkey} += $line[7]; # per-group bytes sent
- $xfertfiles{$time}++; # files per hour
- $xfertsecs{$time} += $line[5]; # xmit seconds per hour
- $xfertbytes{$time} += $line[7]; # bytes per hour
- $xfertbytes += $line[7]; # total bytes sent
- }
- }
- close LOG;
- @syslist = keys(systemfiles);
- @dates = sort datecompare keys(xferbytes);
- if ($xferfiles == 0) {die "There was no data to process.n";}
- print "TOTALS FOR SUMMARY PERIOD ", $dates[0], " TO ", $dates[$#dates], "nn";
- printf ("Files Transmitted During Summary Period %12.0fn", $xferfiles);
- printf ("Bytes Transmitted During Summary Period %12.0fn", $xferbytes);
- printf ("Systems Using Archives %12.0fnn", $#syslist+1);
- printf ("Average Files Transmitted Daily %12.0fn",
- $xferfiles / ($#dates + 1));
- printf ("Average Bytes Transmitted Daily %12.0fn",
- $xferbytes / ($#dates + 1));
- format top1 =
- Daily Transmission Statistics
- Number Of Number of Average Percent Of Percent Of
- Date Files Sent Bytes Sent Xmit Rate Files Sent Bytes Sent
- --------------- ---------- ----------- ---------- ---------- ----------
- .
- format line1 =
- @<<<<<<<<<<<<<< @>>>>>>>>> @>>>>>>>>>> @>>>>>>>>> @>>>>>>> @>>>>>>>
- $date, $nfiles, $nbytes, $avgrate, $pctfiles, $pctbytes
- .
- $^ = top1;
- $~ = line1;
- foreach $date ( sort datecompare keys(xferbytes) ) {
- $nfiles = $xferfiles{$date};
- $nbytes = $xferbytes{$date};
- $avgrate = sprintf("%5.1f KB/s", $xferbytes{$date}/$xfersecs{$date}/1000);
- $pctfiles = sprintf("%8.2f", 100*$xferfiles{$date} / $xferfiles);
- $pctbytes = sprintf("%8.2f", 100*$xferbytes{$date} / $xferbytes);
- write;
- }
- if ($opt_t) {
- format top2 =
- Total Transfers from each Archive Section (By bytes)
- ---- Percent Of ----
- Archive Section Files Sent Bytes Sent Files Sent Bytes Sent
- ------------------------- ---------- ----------- ---------- ----------
- .
- format line2 =
- @<<<<<<<<<<<<<<<<<<<<<<<< @>>>>>>>>> @>>>>>>>>>> @>>>>>>> @>>>>>>>
- $section, $files, $bytes, $pctfiles, $pctbytes
- .
- $| = 1;
- $- = 0;
- $^ = top2;
- $~ = line2;
- foreach $section ( sort bytecompare keys(groupfiles) ) {
- $files = $groupfiles{$section};
- $bytes = $groupbytes{$section};
- $pctbytes = sprintf("%8.2f", 100 * $groupbytes{$section} / $xferbytes);
- $pctfiles = sprintf("%8.2f", 100 * $groupfiles{$section} / $xferfiles);
- write;
- }
- if ( $xferfiles < 1 ) { $xferfiles = 1; }
- if ( $xferbytes < 1 ) { $xferbytes = 1; }
- }
- if ($opt_d) {
- format top3 =
- Total Transfer Amount By Domain
- Number Of Number of Average Percent Of Percent Of
- Domain Name Files Sent Bytes Sent Xmit Rate Files Sent Bytes Sent
- ----------- ---------- ------------ ---------- ---------- ----------
- .
- format line3 =
- @<<<<<<<<<< @>>>>>>>>> @>>>>>>>>>>> @>>>>>>>>> @>>>>>>> @>>>>>>>
- $domain, $files, $bytes, $avgrate, $pctfiles, $pctbytes
- .
- $- = 0;
- $^ = top3;
- $~ = line3;
- foreach $domain ( sort domnamcompare keys(domainfiles) ) {
- if ( $domainsecs{$domain} < 1 ) { $domainsecs{$domain} = 1; }
- $files = $domainfiles{$domain};
- $bytes = $domainbytes{$domain};
- $avgrate = sprintf("%5.1f KB/s",
- $domainbytes{$domain}/$domainsecs{$domain}/1000);
- $pctfiles = sprintf("%8.2f", 100 * $domainfiles{$domain} / $xferfiles);
- $pctbytes = sprintf("%8.2f", 100 * $domainbytes{$domain} / $xferbytes);
- write;
- }
- print "n";
- print "These figures only reflect ANONYMOUS FTP transfers. There are manyn";
- print "sites which mount the archives via NFS, and those transfers are notn";
- print "logged and reported by this program.nn";
- }
- if ($opt_h) {
- format top8 =
- Hourly Transmission Statistics
- Number Of Number of Average Percent Of Percent Of
- Time Files Sent Bytes Sent Xmit Rate Files Sent Bytes Sent
- --------------- ---------- ----------- ---------- ---------- ----------
- .
- format line8 =
- @<<<<<<<<<<<<<< @>>>>>>>>> @>>>>>>>>>> @>>>>>>>>> @>>>>>>> @>>>>>>>
- $time, $nfiles, $nbytes, $avgrate, $pctfiles, $pctbytes
- .
- $| = 1;
- $- = 0;
- $^ = top8;
- $~ = line8;
- foreach $time ( sort keys(xfertbytes) ) {
- $nfiles = $xfertfiles{$time};
- $nbytes = $xfertbytes{$time};
- $avgrate = sprintf("%5.1f KB/s", $xfertbytes{$time}/$xfertsecs{$time}/1000);
- $pctfiles = sprintf("%8.2f", 100*$xfertfiles{$time} / $xferfiles);
- $pctbytes = sprintf("%8.2f", 100*$xfertbytes{$time} / $xferbytes);
- write;
- }
- }
- exit(0);
- sub datecompare {
- $date1 = substr($a, 11, 4) * 4800;
- $date2 = substr($b, 11, 4) * 4800;
- $date1 += index("JanFebMarAprMayJunJulAugSepOctNovDec",substr($a, 4, 3))*100;
- $date2 += index("JanFebMarAprMayJunJulAugSepOctNovDec",substr($b, 4, 3))*100;
- $date1 += substr($a, 8, 2);
- $date2 += substr($b, 8, 2);
- $date1 - $date2;
- }
- sub domnamcompare {
- $sdiff = length($a) - length($b);
- ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a lt $b) ? -1 : ($a gt $b) ? 1 : 0;
- }
- sub bytecompare {
- $bdiff = $groupbytes{$b} - $groupbytes{$a};
- ($bdiff < 0) ? -1 : ($bdiff > 0) ? 1 : ($a lt $b) ? -1 : ($a gt $b) ? 1 : 0;
- }
- sub faccompare {
- $fdiff = $fac{$b} - $fac{$a};
- ($fdiff < 0) ? -1 : ($fdiff > 0) ? 1 : ($a lt $b) ? -1 : ($a gt $b) ? 1 : 0;
- }