Annotation of embedaddon/rsync/support/rsyncstats, revision 1.1.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>