File Coverage

blib/lib/SyslogScan/Summary.pm
Criterion Covered Total %
statement 10 13 76.9
branch n/a
condition n/a
subroutine 4 5 80.0
pod n/a
total 14 18 77.7


line stmt bran cond sub pod time code
1             package SyslogScan::Summary;
2              
3             $VERSION = 0.20;
4 0     0     sub Version { $VERSION };
5              
6 3     3   2229 use SyslogScan::Usage;
  3         8  
  3         77  
7 3     3   19 use SyslogScan::Volume;
  3         4  
  3         56  
8 3     3   1896 use SyslogScan::Delivery;
  3         19  
  3         80  
9 3     3   1874 use SyslogScan::DeliveryIterator;
  0            
  0            
10             use SyslogScan::FilterUser;
11             use Carp;
12             use strict;
13              
14             my $HEADER = "Summary v1";
15             my $EMPTY_FILTER = new SyslogScan::FilterUser();
16              
17             sub new
18             {
19             my $type = shift;
20             my @iterList = @_;
21            
22             my $self = {};
23             bless ($self,$type);
24              
25             $self -> registerAllInIterators('','',
26             @iterList);
27              
28             return $self;
29             }
30              
31             sub registerAllInIterators
32             {
33             my $self = shift;
34             my $selfPattern = shift;
35             my $otherPattern = shift;
36             my @iterList = @_;
37              
38             # check for developer error, since this is counter-intuitive usage.
39             defined($otherPattern)
40             or die "bad usage of registerAllInIterators function";
41              
42             my $iter;
43             foreach $iter (@iterList)
44             {
45             my $delivery;
46             while ($delivery = $iter -> next)
47             {
48             $self -> registerDelivery($delivery,$selfPattern, $otherPattern);
49             }
50             }
51             }
52              
53             sub registerDelivery
54             {
55             my $self = shift;
56             my $delivery = shift;
57             my $selfPattern = shift; # undefined means match everything
58             my $otherPattern = shift; # undefined means match everything
59              
60             my $filter;
61             if (defined $selfPattern)
62             {
63             $filter = new SyslogScan::FilterUser($selfPattern, $otherPattern);
64             }
65             else
66             {
67             # let everything through
68             $filter = $EMPTY_FILTER;
69             }
70              
71             my $size = $$delivery{Size};
72             my $sender = $$delivery{Sender};
73             my $paReceiverList = $$delivery{ReceiverList};
74             ref($paReceiverList) eq 'ARRAY' or die "$paReceiverList not array ref";
75              
76             my $gotThroughFilter = 0;
77             my $receiver;
78             foreach $receiver (@$paReceiverList)
79             {
80             if ($filter -> matchesFilter($sender,$receiver))
81             {
82             $gotThroughFilter++;
83             $self -> _registerUsage($sender,"Sender",$size);
84             }
85             if ($filter -> matchesFilter($receiver,$sender))
86             {
87             $self -> _registerUsage($receiver,"Receive",$size);
88             }
89             }
90              
91             $gotThroughFilter and $$delivery{Instance} eq 1 and
92             $self -> _registerUsage($sender,"Broadcast",$size);
93             }
94              
95             sub persist
96             {
97             my $self = shift;
98             my $outFH = shift;
99              
100             print $outFH "$HEADER start\n";
101             my $address;
102             foreach $address (keys %$self)
103             {
104             next unless defined $$self{$address}; # skip deleted
105              
106             $address =~ /\n/ and
107             die "address $address contains embedded newline, cannot persist";
108             print $outFH "address=$address\n";
109             $$self{$address} -> persist($outFH);
110             }
111             print $outFH "$HEADER end\n";
112             }
113              
114             sub restore
115             {
116             my $type = shift;
117             my $inFH = shift;
118              
119             defined $inFH or croak "filehandle not defined";
120              
121             my $line = <$inFH>;
122             if ($line ne "$HEADER start\n")
123             {
124             $line or return undef; # at eof
125              
126             # not at eof; something is fishy
127             die "expected $HEADER start, got $line";
128             }
129              
130             my $self = {};
131             bless ($self, $type);
132              
133             my $headerLine;
134             while (defined($headerLine = <$inFH>))
135             {
136             if (! ($headerLine =~ /^address\=(.*)/))
137             {
138             return $self if $headerLine eq "$HEADER end\n";
139             die "expected address= or $HEADER end, got $headerLine";
140             }
141             my $address = $1;
142              
143             defined($$self{$address}) and
144             die "address $address seen multiple times, stopped";
145             $$self{$address} = SyslogScan::Usage -> restore($inFH);
146             }
147             die "never saw $HEADER end line";
148             }
149              
150             sub dump
151             {
152             my $self = shift;
153             my $retString;
154              
155             my $address;
156             foreach $address (sort keys %$self)
157             {
158             $retString .= "$address:\n";
159             $retString .= $$self{$address} -> dump();
160             }
161             return $retString;
162             }
163              
164             sub _registerUsage
165             {
166             my $self = shift;
167              
168             my $address = shift;
169             my $role = shift;
170             my $size = shift;
171              
172             defined $$self{$address} or
173             $$self{$address} = new SyslogScan::Usage;
174              
175             if ($role eq 'Receive')
176             {
177             $$self{$address} -> registerReceive($size);
178             }
179             elsif ($role eq 'Sender')
180             {
181             $$self{$address} -> registerSend($size);
182             }
183             elsif ($role eq 'Broadcast')
184             {
185             $$self{$address} -> registerBroadcast($size);
186             }
187             else
188             {
189             die "illegal role: $role";
190             }
191             return 0;
192             }
193              
194             sub addSummary
195             {
196             my $self = shift;
197             my $other = shift;
198              
199             my $address;
200             foreach $address (keys %$other)
201             {
202             if (! $$self{$address})
203             {
204             $$self{$address} = new SyslogScan::Usage();
205             }
206             $$self{$address} -> addUsage($$other{$address});
207             }
208             }
209              
210             __END__