NAME
Net::Prober - Probes network hosts for downtime, latency, etc...
VERSION
version 0.17
SYNOPSIS
use Net::Prober;
my $result = Net::Prober::probe({
class => 'tcp',
port => 'ssh',
host => 'localhost',
timeout => 3.5,
});
# $result = {
# ok => 1,
# time => 0.0002345,
# host => '127.0.0.1',
# port => 22,
# }
# or...
my $result = Net::Prober::probe({
protocol => 'http',
host => 'www.opera.com',
url => '/browser',
match => 'Faster',
});
DESCRIPTION
This module allows to probe hosts for downtime or latency.
You can use it if you want to know things like:
- can we connect to host
X
on port whatever? - how long it takes to connect to host
X
on port whatever? - does host
X
respond to icmp pings? - check if host
X
responds within a given timeout
Various types of probes are implemented, namely:
- tcp
-
Opens a socket, connects and closes the socket.
- udp
-
Same as TCP, but using a UDP connection.
- http
-
Makes an HTTP connection, and requests a given URL (or
/
if none given). Can check that the content of the response matches a given regular expression, or has an exact md5 hash.
NAME
Net::Prober - Probes network hosts for downtime, latency, etc...
LOGGING TO SYSLOG
It is possible to enable automatic logging to syslog. It was in fact the default before version 0.08
.
To do that, include in your script:
use Net::Prober;
$Net::Prober::Probe::Base::USE_SYSLOG = 1;
Not very pretty, I know.
MOTIVATION
There must be tons of ready-made modules that do exactly what this module tries to do. So why?
One reason is that, as ridiculous as this might sound, I couldn't find any CPAN module to do this.
For example, I looked at the nagios code, as Nagios does this (and more) but I couldn't find anything even remotely similar.
Another reason is that I need this code to be very compact and flexible enough to be wired directly to a small config file, to be able to specify the probe arguments as JSON. This is inspired by the Varnish probe config block:
# This is my config file.
# It's JSON presumably...
"backends": {
"1.2.3.4" : {
"datacenter" : "norway1",
"probe" : {
"protocol": "tcp",
"port" : "8432",
"timeout" : 1.0,
},
},
# ...
}
FUNCTIONS
port_name_to_num($port)
Converts a given port name (ex.: ssh
, or http
) to a number. Returns the number as result.
If the given port doesn't look like a port name, then you get back what you passed as argument, unchanged.
probe( \%probe_spec )
Runs a probe against a given host/port.
\%probe_spec
allows you to specify what kind of probe you want to run and against what hostname and port.
Allowed hash keys are:
protocol
-
What type of probe you want to run. Can be any of
tcp
,http
,icmp
.Default is tcp.
host
-
Hostname or IP to be probed.
port
-
Port or service to be probed. Examples:
23, 'ssh', 8432, 'http', 'echo'
timeout
-
The maximum time to wait for a result. In seconds.
Returns the results as hashref. Example:
my $result = Net::Prober::probe({
host => 'localhost',
port => 'ssh',
protocol => 'tcp',
timeout => 0.5,
});
You will get at least these keys:
$result = {
ok => 1,
time => 0.001234, # how long it took (s)
}
or in case of failure:
$result = {
ok => 0,
time => 0.001234,
reason => 'Why the probe failed',
}
http
probe
The HTTP probe support additional arguments:
match
-
Checks if the content matches a given regular expression. Example:
match => 'Not found' match => 'Log(in|out)'
md5
-
Checks if the whole content of the response matches a given MD5 hash. You can calculate the MD5 of a given URL with:
wget -q -O - http://your.url.here | md5sum
url
-
What URL to download. By default it uses
/
. up_status_re
-
By default, any HTTP response with status 2xx or 3xx (redirect) will be considered successful. However, it is also possible to specify your own custom regular expression instead. In this way, you can consider "healthy" a host that replies to your HTTP probe with a 404 (not found) or other status code.
Example:
up_status_re => '^[234]' up_status_re => '^30[12]$'
icmp
probe
Uses Net::Ping to perform ICMP
probes, that is, to send a ping packet to the given host and port.
size
of ping packets is not currently supported.
protocol
is an additional key that allows to specify whether the pings should be sent via UDP or TCP. Remember that to send ICMP UDP packets you need root privileges.
The ICMP probe code will automatically switch to TCP if the necessary privileges are not available.
AUTHOR
Cosimo Streppone <cosimo@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2017 by Cosimo Streppone.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.