| 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__ |