#!/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);