Annotation of embedaddon/rsync/support/rsyncstats, revision 1.1

1.1     ! misho       1: #!/usr/bin/perl
        !             2: #
        !             3: # This script parses the default logfile format produced by rsync when running
        !             4: # as a daemon with transfer logging enabled.  It also parses a slightly tweaked
        !             5: # version of the default format where %o has been replaced with %i.
        !             6: #
        !             7: # This script is derived from the xferstats script that comes with wuftpd.  See
        !             8: # the usage message at the bottom for the options it takes.
        !             9: #
        !            10: # Andrew Tridgell, October 1998
        !            11: 
        !            12: use Getopt::Long;
        !            13: 
        !            14: # You may wish to edit the next line to customize for your default log file.
        !            15: $usage_file = "/var/log/rsyncd.log";
        !            16: 
        !            17: # Edit the following lines for default report settings.
        !            18: # Entries defined here will be over-ridden by the command line.
        !            19: 
        !            20: $hourly_report = 0; 
        !            21: $domain_report = 0;
        !            22: $total_report = 0;
        !            23: $depth_limit = 9999;
        !            24: $only_section = '';
        !            25: 
        !            26: &Getopt::Long::Configure('bundling');
        !            27: &usage if !&GetOptions(
        !            28:     'hourly-report|h' => \$hourly_report,
        !            29:     'domain-report|d' => \$domain_report,
        !            30:     'domain|D:s' => \$only_domain,
        !            31:     'total-report|t' => \$total_report,
        !            32:     'depth-limit|l:i' => \$depth_limit,
        !            33:     'real|r' => \$real,
        !            34:     'anon|a' => \$anon,
        !            35:     'section|s:s' => \$only_section,
        !            36:     'file|f:s' => \$usage_file,
        !            37: );
        !            38: 
        !            39: $anon = 1 if !$real && !$anon;
        !            40: 
        !            41: open(LOG, $usage_file) || die "Error opening usage log file: $usage_file\n";
        !            42: 
        !            43: if ($only_domain) {
        !            44:     print "Transfer Totals include the '$only_domain' domain only.\n";
        !            45:     print "All other domains are filtered out for this report.\n\n";
        !            46: }
        !            47: 
        !            48: if ($only_section) {
        !            49:     print "Transfer Totals include the '$only_section' section only.\n";
        !            50:     print "All other sections are filtered out for this report.\n\n";
        !            51: }
        !            52: 
        !            53: line: while (<LOG>) {
        !            54: 
        !            55: my $syslog_prefix = '\w\w\w +\d+ \d\d:\d\d:\d\d \S+ rsyncd';
        !            56: my $rsyncd_prefix = '\d\d\d\d/\d\d/\d\d \d\d:\d\d:\d\d ';
        !            57: 
        !            58:    next unless ($day,$time,$op,$host,$module,$file,$bytes)
        !            59:       = m{^
        !            60:          ( \w\w\w\s+\d+ | \d+/\d\d/\d\d ) \s+ # day
        !            61:          (\d\d:\d\d:\d\d) \s+                 # time
        !            62:          [^[]* \[\d+\]:? \s+                  # pid (ignored)
        !            63:          (send|recv|[<>]f\S+) \s+             # op (%o or %i)
        !            64:          (\S+) \s+                            # host
        !            65:          \[\d+\.\d+\.\d+\.\d+\] \s+           # IP (ignored)
        !            66:          (\S+) \s+                            # module
        !            67:          \(\S*\) \s+                          # user (ignored)
        !            68:          (.*) \s+                             # file name
        !            69:          (\d+)                                # file length in bytes
        !            70:          $ }x;
        !            71: 
        !            72:    # TODO actually divide the data by into send/recv categories
        !            73:    if ($op =~ /^>/) {
        !            74:       $op = 'send';
        !            75:    } elsif ($op =~ /^</) {
        !            76:       $op = 'recv';
        !            77:    }
        !            78: 
        !            79:    $daytime = $day;
        !            80:    $hour = substr($time,0,2); 
        !            81: 
        !            82:    $file = $module . "/" . $file;
        !            83: 
        !            84:    $file =~ s|//|/|mg;
        !            85: 
        !            86:    @path = split(/\//, $file);
        !            87: 
        !            88:    $pathkey = "";
        !            89:    for ($i=0; $i <= $#path && $i <= $depth_limit; $i++) {
        !            90:        $pathkey = $pathkey . "/" . $path[$i];
        !            91:    }
        !            92: 
        !            93:    if ($only_section ne '') {
        !            94:        next unless (substr($pathkey,0,length($only_section)) eq $only_section);
        !            95:    }
        !            96: 
        !            97:    $host =~ tr/A-Z/a-z/;
        !            98: 
        !            99:    @address = split(/\./, $host);
        !           100: 
        !           101:    $domain = $address[$#address];
        !           102:    if ( int($address[0]) > 0 || $#address < 2 )
        !           103:       { $domain = "unresolved"; }
        !           104: 
        !           105:    if ($only_domain ne '') {
        !           106:        next unless (substr($domain,0,length($only_domain)) eq $only_domain);
        !           107:    }
        !           108: 
        !           109: 
        !           110: #   printf("c=%d day=%s bytes=%d file=%s path=%s\n", 
        !           111: #         $#line, $daytime, $bytes, $file, $pathkey);
        !           112: 
        !           113:    $xferfiles++;                                # total files sent
        !           114:    $xfertfiles++;                               # total files sent
        !           115:    $xferfiles{$daytime}++;                      # files per day
        !           116:    $groupfiles{$pathkey}++;                     # per-group accesses
        !           117:    $domainfiles{$domain}++;
        !           118: 
        !           119:    $xferbytes{$daytime}   += $bytes;          # bytes per day
        !           120:    $domainbytes{$domain}  += $bytes;           # xmit bytes to domain
        !           121:    $xferbytes             += $bytes;          # total bytes sent
        !           122:    $groupbytes{$pathkey}  += $bytes;          # per-group bytes sent
        !           123: 
        !           124:    $xfertfiles{$hour}++;                        # files per hour
        !           125:    $xfertbytes{$hour}     += $bytes;          # bytes per hour
        !           126:    $xfertbytes            += $bytes;          # total bytes sent
        !           127: }
        !           128: close LOG;
        !           129: 
        !           130: #@syslist = keys %systemfiles;
        !           131: @dates = sort datecompare keys %xferbytes;
        !           132: 
        !           133: if ($xferfiles == 0) {die "There was no data to process.\n";}
        !           134: 
        !           135: 
        !           136: print "TOTALS FOR SUMMARY PERIOD ", $dates[0], " TO ", $dates[$#dates], "\n\n";
        !           137: printf("Files Transmitted During Summary Period  %12.0f\n", $xferfiles);
        !           138: printf("Bytes Transmitted During Summary Period  %12.0f\n", $xferbytes); 
        !           139: #printf("Systems Using Archives                   %12.0f\n\n", $#syslist+1);
        !           140: 
        !           141: printf("Average Files Transmitted Daily          %12.0f\n",
        !           142:    $xferfiles / ($#dates + 1));
        !           143: printf("Average Bytes Transmitted Daily          %12.0f\n",
        !           144:    $xferbytes / ($#dates + 1));
        !           145: 
        !           146: format top1 =
        !           147: 
        !           148: Daily Transmission Statistics
        !           149: 
        !           150:                  Number Of    Number of   Percent Of  Percent Of
        !           151:      Date        Files Sent   MB  Sent    Files Sent  Bytes Sent
        !           152: ---------------  ----------  -----------  ----------  ----------
        !           153: .
        !           154: 
        !           155: format line1 =
        !           156: @<<<<<<<<<<<<<<  @>>>>>>>>>  @>>>>>>>>>>  @>>>>>>>    @>>>>>>>  
        !           157: $date,           $nfiles,    $nbytes/(1024*1024), $pctfiles,  $pctbytes
        !           158: .
        !           159: 
        !           160: $^ = top1;
        !           161: $~ = line1;
        !           162: 
        !           163: foreach $date (sort datecompare keys %xferbytes) {
        !           164: 
        !           165:    $nfiles   = $xferfiles{$date};
        !           166:    $nbytes   = $xferbytes{$date};
        !           167:    $pctfiles = sprintf("%8.2f", 100*$xferfiles{$date} / $xferfiles);
        !           168:    $pctbytes = sprintf("%8.2f", 100*$xferbytes{$date} / $xferbytes);
        !           169:    write;
        !           170: }
        !           171: 
        !           172: if ($total_report) {
        !           173: format top2 =
        !           174: 
        !           175: Total Transfers from each Archive Section (By bytes)
        !           176: 
        !           177:                                                            - Percent -
        !           178:      Archive Section                   NFiles     MB      Files   Bytes
        !           179: ------------------------------------- ------- ----------- ----- -------
        !           180: .
        !           181: 
        !           182: format line2 =
        !           183: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @>>>>>> @>>>>>>>>>> @>>>>   @>>>>
        !           184: $section,                 $files,    $bytes/(1024*1024),     $pctfiles, $pctbytes
        !           185: .
        !           186: 
        !           187: $| = 1;
        !           188: $- = 0;
        !           189: $^ = top2;
        !           190: $~ = line2;
        !           191: 
        !           192: foreach $section (sort bytecompare keys %groupfiles) {
        !           193: 
        !           194:    $files = $groupfiles{$section};
        !           195:    $bytes = $groupbytes{$section};
        !           196:    $pctbytes = sprintf("%8.2f", 100 * $groupbytes{$section} / $xferbytes);
        !           197:    $pctfiles = sprintf("%8.2f", 100 * $groupfiles{$section} / $xferfiles);
        !           198:    write;
        !           199: 
        !           200: }
        !           201: 
        !           202: if ( $xferfiles < 1 ) { $xferfiles = 1; }
        !           203: if ( $xferbytes < 1 ) { $xferbytes = 1; }
        !           204: }
        !           205: 
        !           206: if ($domain_report) {
        !           207: format top3 =
        !           208: 
        !           209: Total Transfer Amount By Domain
        !           210: 
        !           211:              Number Of    Number of    Percent Of  Percent Of
        !           212: Domain Name  Files Sent    MB Sent     Files Sent  Bytes Sent
        !           213: -----------  ----------  ------------  ----------  ----------
        !           214: .
        !           215: 
        !           216: format line3 =
        !           217: @<<<<<<<<<<  @>>>>>>>>>  @>>>>>>>>>>>  @>>>>>>>    @>>>>>>>  
        !           218: $domain,     $files,     $bytes/(1024*1024), $pctfiles,  $pctbytes
        !           219: .
        !           220: 
        !           221: $- = 0;
        !           222: $^ = top3;
        !           223: $~ = line3;
        !           224: 
        !           225: foreach $domain (sort domnamcompare keys %domainfiles) {
        !           226: 
        !           227:    if ( $domainsecs{$domain} < 1 ) { $domainsecs{$domain} = 1; }
        !           228: 
        !           229:    $files = $domainfiles{$domain};
        !           230:    $bytes = $domainbytes{$domain};
        !           231:    $pctfiles = sprintf("%8.2f", 100 * $domainfiles{$domain} / $xferfiles);
        !           232:    $pctbytes = sprintf("%8.2f", 100 * $domainbytes{$domain} / $xferbytes);
        !           233:    write;
        !           234: 
        !           235: }
        !           236: 
        !           237: }
        !           238: 
        !           239: if ($hourly_report) {
        !           240: 
        !           241: format top8 =
        !           242: 
        !           243: Hourly Transmission Statistics
        !           244: 
        !           245:                  Number Of    Number of   Percent Of  Percent Of
        !           246:      Time        Files Sent    MB  Sent   Files Sent  Bytes Sent
        !           247: ---------------  ----------  -----------  ----------  ----------
        !           248: .
        !           249: 
        !           250: format line8 =
        !           251: @<<<<<<<<<<<<<<  @>>>>>>>>>  @>>>>>>>>>>  @>>>>>>>    @>>>>>>>  
        !           252: $hour,           $nfiles,    $nbytes/(1024*1024), $pctfiles,  $pctbytes
        !           253: .
        !           254: 
        !           255: 
        !           256: $| = 1;
        !           257: $- = 0;
        !           258: $^ = top8;
        !           259: $~ = line8;
        !           260: 
        !           261: foreach $hour (sort keys %xfertbytes) {
        !           262: 
        !           263:    $nfiles   = $xfertfiles{$hour};
        !           264:    $nbytes   = $xfertbytes{$hour};
        !           265:    $pctfiles = sprintf("%8.2f", 100*$xfertfiles{$hour} / $xferfiles);
        !           266:    $pctbytes = sprintf("%8.2f", 100*$xfertbytes{$hour} / $xferbytes);
        !           267:    write;
        !           268: }
        !           269: }
        !           270: exit(0);
        !           271: 
        !           272: sub datecompare {
        !           273:     $a gt $b;
        !           274: }
        !           275: 
        !           276: sub domnamcompare {
        !           277: 
        !           278:    $sdiff = length($a) - length($b);
        !           279:    ($sdiff < 0) ? -1 : ($sdiff > 0) ? 1 : ($a lt $b) ? -1 : ($a gt $b) ? 1 : 0;
        !           280: 
        !           281: }
        !           282: 
        !           283: sub bytecompare {
        !           284: 
        !           285:    $bdiff = $groupbytes{$b} - $groupbytes{$a};
        !           286:    ($bdiff < 0) ? -1 : ($bdiff > 0) ? 1 : ($a lt $b) ? -1 : ($a gt $b) ? 1 : 0;
        !           287: 
        !           288: }
        !           289: 
        !           290: sub faccompare {
        !           291: 
        !           292:    $fdiff = $fac{$b} - $fac{$a};
        !           293:    ($fdiff < 0) ? -1 : ($fdiff > 0) ? 1 : ($a lt $b) ? -1 : ($a gt $b) ? 1 : 0;
        !           294: 
        !           295: }
        !           296: 
        !           297: sub usage
        !           298: {
        !           299:     die <<EOT;
        !           300: USAGE: rsyncstats [options]
        !           301: 
        !           302: OPTIONS:
        !           303:   -f FILENAME   Use FILENAME for the log file.
        !           304:   -h            Include report on hourly traffic.
        !           305:   -d            Include report on domain traffic.
        !           306:   -t            Report on total traffic by section.
        !           307:   -D DOMAIN     Report only on traffic from DOMAIN.
        !           308:   -l DEPTH      Set DEPTH of path detail for sections.
        !           309:   -s SECTION    Set SECTION to report on. For example, "-s /pub"
        !           310:                 will report only on paths under "/pub".
        !           311: EOT
        !           312: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>