From c78779cce3c557109f70710ea0455ba658895edd Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Fri, 18 Feb 2005 17:58:03 +0000 Subject: [PATCH] - Fixed a few bugs and compile warnings. - Use the long-option parser for better option handling. - Output a usage message if the options are wrong. - Improved the option-variable names. - Parse the new default daemon log-file format. - Handle filenames that have spaces in them. --- support/rsyncstats | 149 +++++++++++++++++++++++---------------------- 1 file changed, 77 insertions(+), 72 deletions(-) diff --git a/support/rsyncstats b/support/rsyncstats index 7e428e9e..f172f60e 100755 --- a/support/rsyncstats +++ b/support/rsyncstats @@ -1,72 +1,59 @@ -#! /usr/bin/perl -# --------------------------------------------------------------------------- -# -# USAGE: rsyncstats -# -# OPTIONS: -# -f Use for the log file -# -h include report on hourly traffic -# -d include report on domain traffic -# -t report on total traffic by section -# -D report only on traffic from -# -l Depth of path detail for sections -# -s
Section to report on, For example: -s /pub will report -# only on paths under /pub +#!/usr/bin/perl # # This script parses the default logfile format produced by rsync when running # as a daemon with transfer logging enabled. It is derived from the xferstats -# script that comes with wuftpd +# script that comes with wuftpd. See the usage message at the bottom for the +# options it takes. # # Andrew Tridgell, October 1998 -# rsync-bugs@samba.org -# -# --------------------------------------------------------------------------- -# edit the next line to customize for your default log file +use Getopt::Long; + +# You may wish to edit the next line to customize for your default log file. $usage_file = "/var/adm/rsyncd.log"; # 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 = 2; - -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_file\n"; - -if ($opt_D) {print "Transfer Totals include the '$opt_D' domain only.\n"; - print "All other domains are filtered out for this report.\n\n";} +$hourly_report = 0; +$domain_report = 0; +$total_report = 0; +$depth_limit = 9999; +$only_section = ''; + +&Getopt::Long::Configure('bundling'); +&usage if !&GetOptions( + 'hourly-report|h' => \$hourly_report, + 'domain-report|d' => \$domain_report, + 'domain|D:s' => \$only_domain, + 'total-report|t' => \$total_report, + 'depth-limit|l:i' => \$depth_limit, + 'real|r' => \$real, + 'anon|a' => \$anon, + 'section|s:s' => \$only_section, + 'file|f:s' => \$usage_file, +); + +$anon = 1 if !$real && !$anon; + +open(LOG, $usage_file) || die "Error opening usage log file: $usage_file\n"; + +if ($only_domain) { + print "Transfer Totals include the '$only_domain' domain only.\n"; + print "All other domains are filtered out for this report.\n\n"; +} -if ($opt_s) {print "Transfer Totals include the '$opt_s' section only.\n"; - print "All other sections are filtered out for this report.\n\n";} +if ($only_section) { + print "Transfer Totals include the '$only_section' section only.\n"; + print "All other sections are filtered out for this report.\n\n"; +} line: while () { - @line = split; - - $day = $line[0]; - $time = $line[1]; - $pid = $line[2]; - $op = $line[3]; - $host = $line[4]; - $ip = $line[5]; - $module = $line[6]; - $user = $line[7]; - $file = $line[8]; - $bytes = $line[9]; + ($day,$time,$pid,$op,$host,$ip,$module,$user,$bytes,$file) = split(' ', $_, 10); + next unless defined $file; - next if ($#line != 9); - - next if ($op != "send" && $op != "recv"); + next if $op ne 'send' && $op ne 'recv'; $daytime = $day; $hour = substr($time,0,2); @@ -78,11 +65,13 @@ line: while () { @path = split(/\//, $file); $pathkey = ""; - for ($i=0; $i <= $#path && $i <= $opt_l;$i++) { + for ($i=0; $i <= $#path && $i <= $depth_limit; $i++) { $pathkey = $pathkey . "/" . $path[$i]; } - next if (substr($pathkey,0,length("$opt_s")) ne "$opt_s"); + if ($only_section ne '') { + next unless (substr($pathkey,0,length($only_section)) eq $only_section); + } $host =~ tr/A-Z/a-z/; @@ -92,12 +81,12 @@ line: while () { if ( int($address[0]) > 0 || $#address < 2 ) { $domain = "unresolved"; } - if ($opt_D) { - next unless (substr($domain,0,length("$opt_D")) eq "$opt_D"); + if ($only_domain ne '') { + next unless (substr($domain,0,length($only_domain)) eq $only_domain); } -# printf ("c=%d day=%s bytes=%d file=%s path=%s\n", +# printf("c=%d day=%s bytes=%d file=%s path=%s\n", # $#line, $daytime, $bytes, $file, $pathkey); $xferfiles++; # total files sent @@ -117,20 +106,20 @@ line: while () { } close LOG; -@syslist = keys(systemfiles); -@dates = sort datecompare keys(xferbytes); +#@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], "\n\n"; -printf ("Files Transmitted During Summary Period %12.0f\n", $xferfiles); -printf ("Bytes Transmitted During Summary Period %12.0f\n", $xferbytes); -printf ("Systems Using Archives %12.0f\n\n", $#syslist+1); +printf("Files Transmitted During Summary Period %12.0f\n", $xferfiles); +printf("Bytes Transmitted During Summary Period %12.0f\n", $xferbytes); +#printf("Systems Using Archives %12.0f\n\n", $#syslist+1); -printf ("Average Files Transmitted Daily %12.0f\n", +printf("Average Files Transmitted Daily %12.0f\n", $xferfiles / ($#dates + 1)); -printf ("Average Bytes Transmitted Daily %12.0f\n", +printf("Average Bytes Transmitted Daily %12.0f\n", $xferbytes / ($#dates + 1)); format top1 = @@ -150,7 +139,7 @@ $date, $nfiles, $nbytes/(1024*1024), $pctfiles, $pctbytes $^ = top1; $~ = line1; -foreach $date ( sort datecompare keys(xferbytes) ) { +foreach $date (sort datecompare keys %xferbytes) { $nfiles = $xferfiles{$date}; $nbytes = $xferbytes{$date}; @@ -159,7 +148,7 @@ foreach $date ( sort datecompare keys(xferbytes) ) { write; } -if ($opt_t) { +if ($total_report) { format top2 = Total Transfers from each Archive Section (By bytes) @@ -179,7 +168,7 @@ $- = 0; $^ = top2; $~ = line2; -foreach $section ( sort bytecompare keys(groupfiles) ) { +foreach $section (sort bytecompare keys %groupfiles) { $files = $groupfiles{$section}; $bytes = $groupbytes{$section}; @@ -193,7 +182,7 @@ if ( $xferfiles < 1 ) { $xferfiles = 1; } if ( $xferbytes < 1 ) { $xferbytes = 1; } } -if ($opt_d) { +if ($domain_report) { format top3 = Total Transfer Amount By Domain @@ -212,7 +201,7 @@ $- = 0; $^ = top3; $~ = line3; -foreach $domain ( sort domnamcompare keys(domainfiles) ) { +foreach $domain (sort domnamcompare keys %domainfiles) { if ( $domainsecs{$domain} < 1 ) { $domainsecs{$domain} = 1; } @@ -226,7 +215,7 @@ foreach $domain ( sort domnamcompare keys(domainfiles) ) { } -if ($opt_h) { +if ($hourly_report) { format top8 = @@ -248,7 +237,7 @@ $- = 0; $^ = top8; $~ = line8; -foreach $hour ( sort keys(xfertbytes) ) { +foreach $hour (sort keys %xfertbytes) { $nfiles = $xfertfiles{$hour}; $nbytes = $xfertbytes{$hour}; @@ -284,3 +273,19 @@ sub faccompare { } +sub usage +{ + die <