File Coverage

blib/lib/Log/Syslog/Fast/PP.pm
Criterion Covered Total %
statement 127 131 96.9
branch 32 34 94.1
condition 5 9 55.5
subroutine 36 38 94.7
pod 0 18 0.0
total 200 230 86.9


line stmt bran cond sub pod time code
1             package Log::Syslog::Fast::PP;
2              
3 8     8   10512 use 5.006002;
  8         21  
  8         227  
4 8     8   23 use strict;
  8         7  
  8         166  
5 8     8   23 use warnings;
  8         10  
  8         160  
6              
7 8     8   1848 use Log::Syslog::Fast::Constants ':all';
  8         10  
  8         2108  
8             require Exporter;
9             our @ISA = qw(Exporter);
10             our @EXPORT = qw();
11             our %EXPORT_TAGS = %Log::Syslog::Fast::Constants::EXPORT_TAGS;
12             our @EXPORT_OK = @Log::Syslog::Fast::Constants::EXPORT_OK;
13              
14 8     8   55 use Carp;
  8         9  
  8         349  
15 8     8   3202 use POSIX 'strftime';
  8         33451  
  8         38  
16 8     8   9782 use IO::Socket::IP;
  8         166089  
  8         46  
17 8     8   3544 use IO::Socket::UNIX;
  8         20  
  8         56  
18 8     8   4762 use Socket;
  8         12  
  8         3601  
19              
20 0     0   0 sub DESTROY { }
21              
22 8     8   32 use constant PRIORITY => 0;
  8         13  
  8         373  
23 8     8   26 use constant SENDER => 1;
  8         9  
  8         235  
24 8     8   24 use constant NAME => 2;
  8         8  
  8         222  
25 8     8   54 use constant PID => 3;
  8         9  
  8         234  
26 8     8   23 use constant SOCK => 4;
  8         11  
  8         228  
27 8     8   32 use constant LAST_TIME => 5;
  8         9  
  8         247  
28 8     8   28 use constant PREFIX => 6;
  8         10  
  8         237  
29 8     8   24 use constant PREFIX_LEN => 7;
  8         9  
  8         265  
30 8     8   30 use constant FORMAT => 8;
  8         7  
  8         7053  
31              
32             sub new {
33 34     34 0 111602 my $ref = shift;
34 34 100       95 $ref = __PACKAGE__ unless defined $ref;
35 34   33     142 my $class = ref $ref || $ref;
36              
37 34         54 my ($proto, $hostname, $port, $facility, $severity, $sender, $name) = @_;
38              
39 34 100       226 croak "hostname required" unless defined $hostname;
40 33 100       153 croak "sender required" unless defined $sender;
41 32 100       151 croak "name required" unless defined $name;
42              
43 31         154 my $self = bless [
44             ($facility << 3) | $severity, # prio
45             $sender, # sender
46             $name, # name
47             $$, # pid
48             undef, # sock
49             undef, # last_time
50             undef, # prefix
51             undef, # prefix_len
52             LOG_RFC3164, # format
53             ], $class;
54              
55 31         103 $self->update_prefix(time());
56              
57 31         35 eval { $self->set_receiver($proto, $hostname, $port) };
  31         63  
58 31 100       97 die "Error in ->new: $@" if $@;
59 22         59 return $self;
60             }
61              
62             sub update_prefix {
63 73     73 0 72 my $self = shift;
64 73         60 my $t = shift;
65              
66 73         98 $self->[LAST_TIME] = $t;
67              
68 73         2475 my $timestr = strftime("%h %e %T", localtime $t);
69 73 100       193 if ($self->[FORMAT] == LOG_RFC5424) {
70 4         65 $timestr = strftime("%Y-%m-%dT%H:%M:%S%z", localtime $t);
71 4         27 $timestr =~ s/(\d{2})$/:$1/; # see http://tools.ietf.org/html/rfc3339#section-5.6 time-numoffset
72             }
73              
74 73         296 $self->[PREFIX] = sprintf "<%d>%s %s %s[%d]: ",
75             $self->[PRIORITY], $timestr, $self->[SENDER], $self->[NAME], $self->[PID];
76 73 100       179 if ($self->[FORMAT] == LOG_RFC5424) {
77 4         16 $self->[PREFIX] = sprintf "<%d>1 %s %s %s %d - - ",
78             $self->[PRIORITY], $timestr, $self->[SENDER], $self->[NAME], $self->[PID];
79             }
80             }
81              
82             sub set_receiver {
83 140     140 0 11129 my $self = shift;
84 140 100       310 croak("hostname required") unless defined $_[1];
85              
86 139         166 my ($proto, $hostname, $port) = @_;
87              
88 139 100       234 if ($proto == LOG_TCP) {
    100          
    50          
89 109         406 $self->[SOCK] = IO::Socket::IP->new(
90             Proto => 'tcp',
91             PeerHost => $hostname,
92             PeerPort => $port,
93             );
94             }
95             elsif ($proto == LOG_UDP) {
96 12         70 $self->[SOCK] = IO::Socket::IP->new(
97             Proto => 'udp',
98             PeerHost => $hostname,
99             PeerPort => $port,
100             );
101             }
102             elsif ($proto == LOG_UNIX) {
103 18         14 eval {
104 18         82 $self->[SOCK] = IO::Socket::UNIX->new(
105             Type => SOCK_STREAM,
106             Peer => $hostname,
107             );
108             };
109 18 100 66     2195 if ($@ || !$self->[SOCK]) {
110 12         47 $self->[SOCK] = IO::Socket::UNIX->new(
111             Type => SOCK_DGRAM,
112             Peer => $hostname,
113             );
114             }
115             }
116              
117 139 100       46649 die "Error in ->set_receiver: $!" unless $self->[SOCK];
118             }
119              
120             sub set_priority {
121 11     11 0 1671 my $self = shift;
122 11         16 my ($facility, $severity) = @_;
123 11         27 $self->[PRIORITY] = ($facility << 3) | $severity;
124 11         25 $self->update_prefix(time);
125             }
126              
127             sub set_facility {
128 1     1 0 10 my $self = shift;
129 1         3 $self->set_priority(shift, $self->get_severity);
130             }
131              
132             sub set_severity {
133 1     1 0 187 my $self = shift;
134 1         3 $self->set_priority($self->get_facility, shift);
135             }
136              
137             sub set_sender {
138 10     10 0 1903 my $self = shift;
139 10 100       99 croak("sender required") unless defined $_[0];
140 9         20 $self->[SENDER] = shift;
141 9         23 $self->update_prefix(time);
142             }
143              
144             sub set_name {
145 10     10 0 2068 my $self = shift;
146 10 100       114 croak("name required") unless defined $_[0];
147 9         14 $self->[NAME] = shift;
148 9         20 $self->update_prefix(time);
149             }
150              
151             sub set_pid {
152 9     9 0 1631 my $self = shift;
153 9         14 $self->[PID] = shift;
154 9         25 $self->update_prefix(time);
155             }
156              
157             sub set_format {
158 4     4 0 644 my $self = shift;
159 4         6 $self->[FORMAT] = shift;
160 4         9 $self->update_prefix(time);
161             }
162              
163             sub send {
164 25   66 25 0 11907 my $now = $_[2] || time;
165              
166             # update the prefix if seconds have rolled over
167 25 50       61 if ($now != $_[0][LAST_TIME]) {
168 0         0 $_[0]->update_prefix($now);
169             }
170              
171 25 100       590 send($_[0][SOCK], $_[0][PREFIX] . $_[1], 0) || die "Error while sending: $!";
172             }
173              
174             #no warnings 'redefine';
175              
176             sub get_priority {
177 3     3 0 184 my $self = shift;
178 3         14 return $self->[PRIORITY];
179             }
180              
181             sub get_facility {
182 3     3 0 213 my $self = shift;
183 3         9 return $self->[PRIORITY] >> 3;
184             }
185              
186             sub get_severity {
187 3     3 0 4 my $self = shift;
188 3         11 return $self->[PRIORITY] & 7;
189             }
190              
191             sub get_sender {
192 2     2 0 4 my $self = shift;
193 2         7 return $self->[SENDER];
194             }
195              
196             sub get_name {
197 2     2 0 3 my $self = shift;
198 2         8 return $self->[NAME];
199             }
200              
201             sub get_pid {
202 2     2 0 4 my $self = shift;
203 2         5 return $self->[PID];
204             }
205              
206             sub get_format {
207 0     0 0 0 my $self = shift;
208 0         0 return $self->[FORMAT];
209             }
210              
211             sub _get_sock {
212 2     2   102 my $self = shift;
213 2         5 return $self->[SOCK]->fileno;
214             }
215              
216             1;
217             __END__