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