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>