File Coverage

blib/lib/Monitoring/Livestatus/INET.pm
Criterion Covered Total %
statement 28 68 41.1
branch 6 26 23.0
condition 2 9 22.2
subroutine 7 9 77.7
pod 1 1 100.0
total 44 113 38.9


line stmt bran cond sub pod time code
1             package Monitoring::Livestatus::INET;
2 4     4   130380 use warnings;
  4         7  
  4         349  
3 4     4   87 use strict;
  4         10  
  4         146  
4 4     4   20 use Carp qw/confess/;
  4         19  
  4         244  
5 4     4   3006 use IO::Socket::IP ();
  4         84707  
  4         262  
6 4     4   45 use Socket qw(IPPROTO_TCP TCP_NODELAY);
  4         10  
  4         383  
7              
8 4     4   875 use parent 'Monitoring::Livestatus';
  4         434  
  4         38  
9              
10             =head1 NAME
11              
12             Monitoring::Livestatus::INET - connector with tcp sockets
13              
14             =head1 SYNOPSIS
15              
16             use Monitoring::Livestatus;
17             my $nl = Monitoring::Livestatus::INET->new( 'localhost:9999' );
18             my $hosts = $nl->selectall_arrayref("GET hosts");
19              
20             =head1 CONSTRUCTOR
21              
22             =head2 new ( [ARGS] )
23              
24             Creates an C object. C takes at least the server.
25             Arguments are the same as in C.
26             If the constructor is only passed a single argument, it is assumed to
27             be a the C specification. Use either socker OR server.
28              
29             =cut
30              
31             sub new {
32 4     4 1 191256 my($class, @args) = @_;
33 4 100       22 unshift(@args, "peer") if scalar @args == 1;
34 4         19 my(%options) = @args;
35 4 100       56 $options{'name'} = $options{'peer'} unless defined $options{'name'};
36              
37 4         16 $options{'backend'} = $class;
38 4         35 my $self = Monitoring::Livestatus->new(%options);
39 4         15 bless $self, $class;
40 4 50       31 confess('not a scalar') if ref $self->{'peer'} ne '';
41              
42 4 50 66     68 if(($self->{'peer'}//$self->{'server'}) =~ m|^tls://|mx) {
43 0         0 require IO::Socket::SSL;
44             }
45              
46 4         31 return $self;
47             }
48              
49              
50             ########################################
51              
52             =head1 METHODS
53              
54             =cut
55              
56             sub _open {
57 0     0     my $self = shift;
58 0           my $sock;
59              
60             my $options = {
61             PeerAddr => $self->{'peer'},
62             Type => IO::Socket::IP::SOCK_STREAM,
63 0           Timeout => $self->{'connect_timeout'},
64             };
65              
66 0           my $tls = 0;
67 0           my $peer_addr = $self->{'peer'};
68 0 0         if($peer_addr =~ s|tls://||mx) {
69             #$IO::Socket::SSL::DEBUG = 2 if $ENV{'THRUK_VERBOSE'} && $ENV{'THRUK_VERBOSE'} >= 2;
70             #$IO::Socket::SSL::DEBUG = 3 if $ENV{'THRUK_VERBOSE'} && $ENV{'THRUK_VERBOSE'} >= 3;
71 0           $options->{'PeerAddr'} = $peer_addr;
72 0           $options->{'SSL_cert_file'} = $self->{'cert'};
73 0           $options->{'SSL_key_file'} = $self->{'key'};
74 0           $options->{'SSL_ca_file'} = $self->{'ca_file'};
75 0 0 0       $options->{'SSL_verify_mode'} = 0 if(defined $self->{'verify'} && $self->{'verify'} == 0);
76 0           $options->{'SSL_verifycn_name'} = $self->{'verifycn_name'};
77 0           $tls = 1;
78             }
79              
80 0           eval {
81 0 0         if($tls) {
82 0           $sock = IO::Socket::SSL->new(%{$options});
  0            
83             } else {
84 0           $sock = IO::Socket::IP->new(%{$options});
  0            
85             }
86 0 0 0       if(!defined $sock || !$sock->connected()) {
87 0 0         my $msg = "failed to connect to $peer_addr: ".($tls ? IO::Socket::SSL::errstr() : $!);
88 0 0         if($self->{'errors_are_fatal'}) {
89 0           confess($msg);
90             }
91 0           $Monitoring::Livestatus::ErrorCode = 500;
92 0           $Monitoring::Livestatus::ErrorMessage = $msg;
93 0           return;
94             }
95              
96 0           setsockopt($sock, IPPROTO_TCP, TCP_NODELAY, 1);
97              
98             };
99 0           my $err = $@;
100              
101 0 0         if($err) {
102 0           $Monitoring::Livestatus::ErrorCode = 500;
103 0           $Monitoring::Livestatus::ErrorMessage = $err;
104 0           return;
105             }
106              
107 0 0         if(defined $self->{'query_timeout'}) {
108             # set timeout
109 0           $sock->timeout($self->{'query_timeout'});
110             }
111              
112 0           return($sock);
113             }
114              
115              
116             ########################################
117              
118             sub _close {
119 0     0     my $self = shift;
120 0           my $sock = shift;
121 0 0         return unless defined $sock;
122 0           return close($sock);
123             }
124              
125              
126             1;
127              
128             =head1 AUTHOR
129              
130             Sven Nierlein, 2009-present,
131              
132             =head1 COPYRIGHT AND LICENSE
133              
134             Copyright (C) by Sven Nierlein
135              
136             This library is free software; you can redistribute it and/or modify
137             it under the same terms as Perl itself.
138              
139             =cut
140              
141             __END__