This is an update to my checkhost script with some improvements,
primarily adding the ability to retry the connection at a user-specified
interval.
--
Phil Stracchino, CDK#2 DoD#299792458 ICBM: 43.5607, -71.355
[email protected] [email protected] [email protected]
Renaissance Man, Unix ronin, Perl hacker, Free Stater
It's not the years, it's the mileage.
#!/usr/bin/perl
#
# checkhost version 1.1 by Phil Stracchino
# All rights assigned to the Bacula project
# Licensed under the GPL v2, or at your option any later version
#
# Check whether a bacula client is alive and responding on the network
#
# Checkhost does not perform a Bacula connection handshake or verify
# that passwords match; it only verifies that the client is reachable
# on the network and responding, and that the Bacula client is running
# and listening on port 9103.
#
# Usage: checkhost [-r] [-v] [-i seconds] hostname|ipaddress
# Options:
# -r, --retry: Try three times to connect (default: try only once)
# -i, --interval: Specify time in seconds to wait between retries
# (default: 30 seconds)
# -v, --verbose: output verbose status messages, for interactive
# use (default: operate silently)
use strict;
use Getopt::Long;
use Socket;
use Net::Ping;
use Net::Telnet ();
# Return values:
# -1 Program error or no host specified
# 0 Success, FD found and responding
# 1 Client alive but FD not listening
# 2 Client not found on network
my $ret = -1;
my ($host, $p, %opts);
Getopt::Long::Configure ("bundling");
GetOptions(\%opts,
'interval|i=i',
'retry|r',
'verbose|v');
$host = shift || die "No host specified!\n";
if ($opts{verbose})
{
if ($host =~ /^\d+\.\d+\.\d+\.\d+$/)
{
my $ip = inet_aton($host);
printf("Host $host has name %s\n",
gethostbyaddr($ip, AF_INET));
}
else
{
printf("Client $host has address %d.%d.%d.%d\n",
unpack('C4',
(my @addrs = (gethostbyname($host))[4])[0]));
}
}
$p = Net::Ping->new();
my $retrycount = ($opts{retry} ? 3 : 1);
while ($retrycount && ($ret != 0))
{
if ($p->ping($host))
{
print "Host $host is alive\n" if ($opts{verbose});
my $t = new Net::Telnet (Timeout => 10,
Port => 9102,
Prompt => '/bash\$ $/');
if ($t->open($host))
{
print "Bacula-FD listening on port 9102\n" if ($opts{verbose});
$ret = 0;
}
else
{
print "Bacula-FD not running on host $host\n";
$ret = 1;
}
$t->close;
}
else
{
$ret = 2;
}
$retrycount--;
if ($opts{retry} && ($ret != 0))
{
printf("\tNot found on try %d",
3 - $retrycount) if ($opts{verbose});
if ($retrycount)
{
printf("; sleeping for %s seconds before retrying\n",
$opts{interval} || 30) if ($opts{verbose});
sleep($opts{interval} || 30);
}
else
{
print "\n" if ($opts{verbose});
}
}
}
$p->close();
print "Client $host not found on network\n" if ($ret == 2);
print "Returning value $ret\n" if ($opts{verbose});
exit ($ret);
------------------------------------------------------------------------------
This SF.net email is sponsored by
Make an app they can't live without
Enter the BlackBerry Developer Challenge
http://p.sf.net/sfu/RIM-dev2dev
_______________________________________________
Bacula-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bacula-devel