====== servicecheck.pl ======
[[http://wiki.splitbrain.org/servicecheck.pl|Quelle]]
This script checks for the availability of services by trying to connect to their according ports. Servers, ports and portdescription are read from a config file given as parameter.
#!/usr/bin/perl
use Socket;
if(scalar(@ARGV) < 1){
help();
exit;
}
my %CFG=readConfig($ARGV[0]);
my $FULL=0;
$FULL=1 if ($ARGV[1] eq 'full');
my ($server, $services);
my ($service,$port,$name,$prot);
my ($iaddr,$dnsfail,$paddr,$connfail);
foreach $server (sort(keys(%{$CFG{server}}))){
$services = ${$CFG{server}}{$server};
# resolve servernames
$dnsfail = 0;
$iaddr = inet_aton($server) || ($dnsfail = 1);
if ($dnsfail) {
printf ("ERROR %15s - Could not resolve DNS Name\n", $server);
next;
}
# check ports
foreach $service (@{$services}){
($port,$name) = split('=',$service);
$name = trim($name);
$port =~ s/\/(.*)$//;
$prot = trim($1);
$port = trim($port);
$prot = 'tcp' unless ($prot =~ m/^udp$/i);
$connfail = 0;
$paddr = sockaddr_in($port, $iaddr);
if($prot eq 'tcp'){
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname($prot));
}else{
socket(SOCK, PF_INET, SOCK_DGRAM, getprotobyname($prot));
}
connect(SOCK, $paddr) || ($connfail = 1);
close (SOCK);
if($connfail){
printf ("ERROR %15s - %s (%s/%s) connection failed\n",
$server,$name,$port,$prot);
}elsif($FULL){
printf ("SUCCESS %15s - %s (%s/%s) connection succeded\n",
$server,$name,$port,$prot);
}
}
}
sub help(){
print <;
close (FILE);
my ($name,$value);
my %config;
my $section='';
my $sname='';
foreach my $line (@file){
$line=~ s/#.*$//;
$line=~ s/^\s*//;
$line=~ s/\s*$//;
next if ($line eq '');
if($line =~ m/<\/\Q$section\E>/i){
$section = '';
$sname = '';
next;
}
if($line =~ m/<(\w*)\s?(.*)>/i){
$section = $1;
$sname = $2;
$sname = trim($sname);
if($sname eq ''){
$config{lc($section)} = []; #prepare anonymous arrayref
}else{
${$config{lc($section)}}{$sname} = [];
}
next;
}
if($section && $sname eq ''){
push(@{$config{lc($section)}},$line);
}elsif($section && $sname ne ''){
push(@{${$config{lc($section)}}{$sname}},$line);
}else{
($name,$val) = split("=",$line);
$val=~ s/^\s*//;
$name=~ s/\s*$//;
$config{lc($name)}=$val;
}
}
return %config;
}
sub trim($){
my $string = $_[0];
$string =~s/^\s//g;
$string =~s/\s$//g;
return $string;
}
Here is an example configfile
143 = IMAP
25 = SMTP
389 = LDAP
139 = Samba
80 = Apache
2049/udp = NFS Server
515 = LPD
# 139 = Samba
6566 = Sane
631 = Cups 631
80 = Cups 80
80 = Apache