File Coverage

blib/lib/Net/Prober.pm
Criterion Covered Total %
statement 58 63 92.0
branch 6 10 60.0
condition 8 14 57.1
subroutine 19 21 90.4
pod 2 10 20.0
total 93 118 78.8


line stmt bran cond sub pod time code
1             # ABSTRACT: Probes network hosts for downtime, latency, etc...
2              
3             package Net::Prober;
4             {
5             $Net::Prober::VERSION = '0.15';
6             }
7              
8              
9 8     8   1644214 use 5.010;
  8         31  
10 8     8   37 use strict;
  8         13  
  8         195  
11 8     8   32 use warnings;
  8         15  
  8         238  
12              
13 8     8   31 use Carp ();
  8         14  
  8         130  
14 8     8   3820 use Data::Dumper ();
  8         50080  
  8         201  
15 8     8   62 use Digest::MD5 ();
  8         11  
  8         126  
16 8     8   2419 use IO::Socket::INET ();
  8         77837  
  8         160  
17 8     8   5533 use LWPx::ParanoidAgent ();
  8         2139889  
  8         260  
18 8     8   1512409 use Net::Ping ();
  8         94977  
  8         213  
19 8     8   151 use Time::HiRes ();
  8         10  
  8         131  
20              
21 8     8   4204 use Net::Prober::Probe::Base ();
  8         22  
  8         3293  
22              
23              
24             sub port_name_to_num {
25 22     22 1 520 my ($port) = @_;
26              
27 22 100 66     176 if (defined $port and $port ne "" and $port =~ m{^\D}) {
      100        
28 6         480 $port = (getservbyname($port, "tcp"))[2];
29             }
30              
31 22         76 return $port;
32             }
33              
34             sub probe_any {
35 8     8 0 16 my ($class, $args) = @_;
36 8         14 my $full_pkg = $class;
37              
38             # Open up for != Net::Prober::* classes
39 8 50       34 if ($full_pkg !~ m{::}) {
40 8         22 $full_pkg = "Net::Prober::${full_pkg}";
41             }
42              
43 8 50       609 eval "require $full_pkg; 1" or do {
44 0         0 Carp::croak("Couldn't load $full_pkg class: $@");
45             };
46              
47 8         75 my $p = $full_pkg->new();
48 8         30 return $p->probe($args);
49             }
50              
51             sub probe_icmp {
52 1     1 0 283 return probe_any('ping', @_);
53             }
54              
55             sub probe_ping {
56 0     0 0 0 return probe_any('ping', @_);
57             }
58              
59             sub probe_imap {
60 0     0 0 0 return probe_any('imap', @_);
61             }
62              
63             sub probe_ssh {
64 1     1 0 27 return probe_any('ssh', @_);
65             }
66              
67             sub probe_smtp {
68 1     1 0 29 return probe_any('smtp', @_);
69             }
70              
71             sub probe_http {
72 2     2 0 775 return probe_any('http', @_);
73             }
74              
75             sub probe_tcp {
76 2     2 0 1140 return probe_any('tcp', @_);
77             }
78              
79              
80             sub probe {
81 1     1 1 2640 my ($probe_type) = @_;
82              
83 1 50 33     15 if (! $probe_type || ref $probe_type ne 'HASH') {
84 0         0 Carp::croak("Invalid probe data");
85             }
86              
87 1         3 my $host = $probe_type->{host};
88 1 50 33     8 if (! defined $host or $host eq "") {
89 0         0 Carp::croak("Can't probe undefined host");
90             }
91              
92 1         2 my %probe_args = %{ $probe_type };
  1         14  
93 1   50     16 my $class = lc ($probe_args{class} || 'tcp');
94              
95             # Resolve port names (http => 80)
96 1         6 $probe_args{port} = port_name_to_num($probe_args{port});
97              
98 1         6 my $result = probe_any($class, \%probe_args);
99              
100 1         12 return $result;
101             }
102              
103             1;
104              
105             __END__