File Coverage

blib/lib/Logfile/Base.pm
Criterion Covered Total %
statement 189 214 88.3
branch 79 102 77.4
condition 15 22 68.1
subroutine 17 22 77.2
pod 0 10 0.0
total 300 370 81.0


line stmt bran cond sub pod time code
1             # -*- Mode: Perl -*-
2             # $Basename: Base.pm $
3             # $Revision: 1.3 $
4             # Author : Ulrich Pfeifer
5             # Created On : Mon Mar 25 09:58:31 1996
6             # Last Modified By: Ulrich Pfeifer
7             # Last Modified On: Tue Apr 29 09:08:33 2003
8             # Language : Perl
9             #
10             # (C) Copyright 1996, Universität Dortmund, all rights reserved.
11             #
12              
13             package Logfile::Base;
14 8     8   40 use Carp;
  8         10  
  8         788  
15 8     8   36 use vars qw($VERSION $nextfh);
  8         11  
  8         441  
16 8     8   41 use strict;
  8         13  
  8         15753  
17              
18             # $Format: "$\VERSION = sprintf '%5.3f', ($ProjectMajorVersion$ * 100 + ($ProjectMinorVersion$-1))/1000;"$
19             $VERSION = sprintf '%5.3f', (2 * 100 + (3-1))/1000;
20              
21             $Logfile::MAXWIDTH = 40;
22             my ($HaveParseDate, $HaveGetDate, $HaveDateGetDate);
23             $nextfh = 'fh000';
24              
25             sub isafh {
26 8     8 0 19 my $f = shift;
27 8 50 33     132 ref $f eq 'GLOB'
28             or ref \$f eq 'GLOB'
29             or (ref $f) =~ /^IO::/
30             }
31              
32             sub new {
33 8     8 0 209 my $type = shift;
34 8         41 my %par = @_;
35 8         22 my $self = {};
36 8         63 my $file = $par{File};
37              
38 8 50       41 if (ref $par{Group}) {
39 8         28 $self->{Group} = $par{Group};
40             } else {
41 0         0 $self->{Group} = [$par{Group}];
42             }
43 8 50       108 if ($file) {
44 8 50       34 if (isafh $file) {
45 0         0 $self->{Fh} = $file;
46             } else {
47 8         74 *S = "${type}::".++$nextfh;
48 8         35 $self->{Fh} = *S;
49 8 50       43 if ($file =~ /\.gz$/) {
50 0 0       0 open(S, "gzip -cd $file|")
51             or die "Could not open $file: $!\n";
52             } else {
53 8 50       449 open(S, "$file")
54             or die "Could not open $file: $!\n";
55             }
56              
57             }
58             } else {
59 0         0 $self->{Fh} = *ARGV;
60             }
61 8   33     67 bless $self, $type || ref($type);
62 8         72 $self->readfile;
63 8 100       150 close S if $self->{File};
64 8         47 $self;
65             }
66              
67 0     0 0 0 sub norm { $_[2]; } # dummy
68              
69             sub group {
70 1515     1515 0 1953 my ($self, $group) = @_;
71              
72 1515 100       2670 if (ref($group)) {
73 473         539 join $;, @{$group};
  473         1473  
74             } else {
75 1042         1827 $group;
76             }
77             }
78              
79             sub key {
80 1475     1475 0 1888 my ($self, $group, $rec) = @_;
81 1475         1834 my $key = '';
82              
83 1475 100       2350 if (ref($group)) {
84 468         490 $key = join $;, map($self->norm($_, $rec->{$_}), @{$group});
  468         1637  
85             } else {
86 1007         5090 $key = $self->norm($group, $rec->{$group});
87             }
88 1475         3186 $key;
89             }
90              
91             sub readfile {
92 8     8 0 17 my $self = shift;
93 8         60 my $fh = $self->{Fh};
94 8         33 my @group = @{$self->{Group}};
  8         29  
95 8         30 my $group;
96              
97 8         210 while (!eof($fh)) {
98 406         1469 my $rec = $self->next;
99 406 100       943 last unless $rec;
100 402         749 for $group (@group) {
101 1475         3050 my $gname = $self->group($group);
102 1475         3058 my $key = $self->key($group, $rec);
103              
104 1475 100       3686 if (defined $self->{$gname}->{$key}) {
105 1089         3024 $self->{$gname}->{$key}->add($rec,$group); # !!
106             } else {
107 386         832 $self->{$gname}->{$key} = $rec->copy;
108             }
109             }
110             }
111             }
112              
113             sub report {
114 40     40 0 347 my $self = shift;
115 40         141 my %par = @_;
116 40         108 my $group = $self->group($par{Group});
117 40   66     155 my $sort = $par{Sort} || $group;
118 40   75     324 my $rever = (($sort =~ /Date|Hour/) xor $par{Reverse});
119 40         64 my $list = $par{List};
120 40         46 my ($keys, $key, $val, %keys);
121 40         58 my $mklen = length($group);
122 40 100       82 my $direction = ($rever)?'increasing':'decreasing';
123 40         46 my (@list, %absolute);
124 40         370 my @mklen = map(length($_), split($;, $group));
125              
126 40 50       155 croak "No index for $group\n" unless $self->{$group};
127              
128 40 100       88 if ($list) {
129 19 100       49 if (ref($list)) {
130 17         21 @list = @{$list};
  17         51  
131             } else {
132 2         4 @list = ($list);
133             }
134             } else {
135 21         46 @list = qw(Records);
136             }
137              
138 40         115 @absolute{@list} = (0) x @list;
139 40         189 $sort =~ s/$;.*//;
140             #print STDERR "sort = $sort\n";
141 40         60 while (($key,$val) = each %{$self->{$group}}) {
  403         1362  
142 363         973 $keys{$key} = $val->{$sort};
143 363 100       838 if ($key =~ /$;/) {
144 155         379 my @key = split $;, $key;
145 155         252 for (0 .. $#key) {
146 375 100       727 $mklen[$_] = length($key[$_])
147             if length($key[$_]) > $mklen[$_];
148             }
149 155         201 $mklen = $#mklen;
150 155         316 grep ($mklen += $_, @mklen);
151             } else {
152 208 100       484 $mklen = length($key) if length($key) > $mklen;
153             }
154 363         479 for (@list) {
155 435 50       1593 $absolute{$_} += $val->{$_} if defined $val->{$_};
156             }
157             }
158             # chop keys to $Logfile::MAXWIDTH chars maximum;
159 40 100       161 grep (($_=($_>$Logfile::MAXWIDTH)?$Logfile::MAXWIDTH:$_), @mklen);
160 40 100       148 if ($group =~ /$;/) {
161 5         23 my @key = split $;, $group;
162 5         12 for (0 .. $#key) {
163 12         65 printf "%-${mklen[$_]}s ", $key[$_];
164             }
165             } else {
166 35         167 printf ("%-${mklen}s ", $group);
167             }
168 40         76 for (@list) {
169 57         147 printf("%16s ", $_);
170             }
171 40         73 print "\n";
172 40         95 print '=' x ($mklen + (@list * 17));
173 40         103 print "\n";
174             #for $key (keys %keys) {
175             # print STDERR "** $key $keys{$key}\n";
176             #}
177 40         184 for $key (sort {&srt($rever, $keys{$a}, $keys{$b})}
  1024         1759  
178             keys %keys) {
179 301         571 my $val = $self->{$group}->{$key};
180 301 100       850 if ($key =~ /$;/) {
181 155         421 my @key = split $;, $key;
182 155         277 for (0 .. $#key) {
183 375         1454 printf "%-${mklen[$_]}s ", substr($key[$_],0,$mklen[$_]);
184             }
185             } else {
186 146         415 printf "%-${mklen}s ", $key;
187             }
188 301         471 for $list (@list) {
189 365 50       842 my $ba = (defined $val->{$list})?$val->{$list}:0;
190 365 50       640 if ($absolute{$list} > 0) {
191 365         570 my $br = $ba/$absolute{$list}*100;
192 365         6180 printf "%9d%6.2f%% ", $ba, $br;
193             } else {
194 0         0 printf "%15s ", $ba;
195             }
196             }
197 301         427 print "\n";
198 301 100 100     986 last if defined $par{Top} && --$par{Top} <= 0;
199             }
200 40         281 print "\f";
201             }
202              
203             sub srt {
204 1024     1024 0 1154 my $rev = shift;
205 1024         976 my ($y,$x);
206 1024 100       1590 if ($rev) {
207 290         489 ($x,$y) = @_;
208             } else {
209 734         1687 ($y,$x) = @_;
210             }
211              
212 1024 100 66     4921 if ($x =~ /[^\d.]|^$/o or $y =~ /[^\d.]|^$/o) {
213 383         716 lc $y cmp lc $x;
214             } else {
215 641         2026 $x <=> $y;
216             }
217             }
218              
219             sub keys {
220 0     0 0 0 my $self = shift;
221 0         0 my $group = shift;
222              
223 0         0 keys %{$self->{$group}};
  0         0  
224             }
225              
226             sub all {
227 0     0 0 0 my $self = shift;
228 0         0 my $group = shift;
229              
230 0         0 %{$self->{$group}};
  0         0  
231             }
232              
233             package Logfile::Base::Record;
234              
235             BEGIN {
236 8     8   28 eval {require GetDate;};
  8         3320  
237 8 50       56 $HaveGetDate = ($@ eq "") and import GetDate 'getdate';
238 8 50       37 unless ($HaveGetDate) {
239 8         13 eval {require Date::GetDate};
  8         2683  
240 8 50       58 $HaveDateGetDate = ($@ eq "") and import GetDate 'getdate';
241 8 50       26 unless ($HaveDateGetDate) {
242 8         11 eval {
243 8         3026 require Time::ParseDate;
244 0     0   0 sub parsedate { &Time::ParseDate::parsedate(@_) }
245             };
246 8         645 $HaveParseDate = ($@ eq "");
247             }
248             }
249             };
250              
251             unless ($HaveGetDate or $HaveDateGetDate
252             or $HaveParseDate) {
253 8 50   8   7867 eval join '', ;
  8 50   402   15688  
  8 100       7558  
  402 100       670  
  402 50       755  
  402 100       3932  
  0 100       0  
  0 100       0  
  360         1231  
  19         59  
  23         54  
  23         39  
  23         109  
  23         42  
  402         2177  
  383         939  
  402         1045  
  402         1004  
  402         18679  
  360         981  
  402         1068  
254             croak("Could not load my own date parsing: $@")
255             if length($@);
256             }
257              
258 8     8   5585 use Net::Country;
  8         20  
  8         5531  
259              
260             sub new {
261 402     402   518 my $type = shift;
262 402         1685 my %par = @_;
263 402         581 my $self = {};
264 402         457 my ($sec,$min,$hours,$mday,$mon,$year, $time);
265              
266 402         812 %{$self} = %par;
  402         1424  
267              
268 402 50       1076 if ($par{Date}) {
269             #print "$par{Date} => ";
270 402 50       1029 if ($HaveGetDate) {
    50          
    50          
271 0         0 $par{Date} =~ s!(\d\d\d\d):!$1 !o;
272 0         0 $par{Date} =~ s!/! !go;
273 0         0 $time = getdate($par{Date});
274             } elsif ($HaveDateGetDate) {
275 0         0 $par{Date} =~ s!(\d\d\d\d):!$1 !o;
276 0         0 $par{Date} =~ s!/! !go;
277 0         0 $time = Date::GetDate::getdate($par{Date});
278             } elsif ($HaveParseDate) {
279              
280 0         0 $time = parsedate($par{Date},
281             FUZZY => 1,
282             NO_RELATIVE => 1);
283             } else {
284 402         10631 $time = &Time::String::to_time($par{Date});
285             }
286 402         8953 ($sec,$min,$hours,$mday,$mon,$year) = localtime($time);
287             #print "$par{Date} => (s>$sec,m>$min,h>$hours,m>$mday,m>$mon,y>$year)\n";
288 402   100     2786 $self->{Hour} = sprintf "%02d", $self->{Hour}||$hours;
289 402         1371 $self->{Date} = sprintf("%02d%02d%02d", $year%100, $mon+1, $mday);
290             }
291 402 100       897 if ($par{Host}) {
292 380         878 my $host = $self->{Host} = lc($par{Host});
293 380 100       1164 if ($host =~ /[^\d.]/) {
294 335 100       794 if ($host =~ /\./) {
295 206         1010 $self->{Domain} = Net::Country::Name((split /\./, $host)[-1]);
296             } else {
297 129         263 $self->{Domain} = 'Local';
298             }
299             } else {
300 45         90 $self->{Domain} = 'Unresolved';
301             }
302             }
303 402         882 $self->{Records} = 1;
304              
305 402         2224 bless $self, $type;
306             }
307              
308             sub add {
309 1089     1089   1237 my $self = shift;
310 1089         1081 my $other = shift;
311 1089         1093 my $ignore = shift;
312              
313 1089         1050 for (keys %{$other}) {
  1089         3433  
314 8797 100       15798 next if $_ eq $ignore;
315 8021 100       18368 next unless defined $other->{$_};
316 7994 100       14441 next unless length($other->{$_});
317 7607 100       19169 next if $other->{$_} =~ /\D/;
318 3813         6837 $self->{$_} += $other->{$_};
319             }
320              
321 1089         4770 $self;
322             }
323              
324             sub copy {
325 386     386   463 my $self = shift;
326 386         382 my %new = %{$self};
  386         2882  
327              
328 386         2918 bless \%new, ref($self);
329             }
330              
331 0     0     sub requests {$_[0]->{Records};}
332              
333             1;
334              
335             __DATA__