--- sap.monitor 2002/07/09 14:06:45 1.1.1.1 +++ sap.monitor 2002/11/05 08:53:26 1.12 @@ -1,9 +1,40 @@ #!/usr/bin/perl -w +# File: sap.monitor +# Author: Dobrica Pavlinusic, dpavlin@rot13.org +# http://www.rot13.org/~dpavlin/sysadm.html +# Description: monitor sap servers using sapinfo from RFCSDK +# +# Usage: sap.monitor [-[hH] ashost only/ignore] [-[sS] sysnr only/ignore] +# +# e.g. sap.monitor -s 20 will scan only hosts with sysnr == 20 +# sap.monitor -S 20 will scan only hosts with sysnr != 20 + +# configuration file in /usr/local/etc/sap-mon.conf describes which +# hosts (ashost) and systems (sysnr) you want to check. +# +# format of line is: +# +# ashost [tab|space] sysnr # optional comment +# +# you can spacify host as hostname (sap01) or with sap routers in-between +# to test routers too (/H/saprtr/H/sap01) use strict; +use Getopt::Std; + +# change paths here if you want to +my $CONFIG = "/usr/local/etc/sap-mon.conf"; +my $SAPINFO = "/usr/local/bin/sapinfo"; +# number of tries to repeat sapinfo if it fails first time +my $repeat = 3; +# seconds to wait between retries +my $repeat_wait = 5; + +my %opts; +getopt('h:s:H:S:', \%opts); my @config; -open(C,"/usr/local/etc/sap-mon.conf") || die "sap-mon.conf: $!"; +open(C, $CONFIG) || die "sap-mon.conf: $!"; @config = ; close(C); @@ -20,12 +51,34 @@ chomp; s/#.+$//g; # nuke comments s/^\s+$//g; # remove empty lines - my ($ashost,$sysnr) = split(/\t+/,$_,2); - if ($ashost && $ashost ne "" && $sysnr && $sysnr ne "") { - my $output = `/usr/local/bin/sapinfo trace=0 ashost=$ashost sysnr=$sysnr`; - $output =~ m/System ID\s+(\w+)/; - my $sys_id = $1 || ""; - if ($? != 0) { + my ($ashost,$sysnr,undef) = split(/\s+/,$_,3); + if ($ashost && $ashost ne "" && $sysnr && $sysnr ne "" && + (($opts{h} && $ashost =~ m/$opts{h}/) || not $opts{h}) && + (($opts{s} && $sysnr =~ m/$opts{s}/) || not $opts{s}) && + (($opts{H} && $ashost !~ m/$opts{H}/) || not $opts{H}) && + (($opts{S} && $sysnr !~ m/$opts{S}/) || not $opts{S}) ) { + my $ret = 1; + my $loop = 0; + my $output; + my $sys_id; + for(my $i=0; $i<$repeat; $i++) { + eval { + local $SIG{ALRM} = sub { die "timeout\n"; }; + alarm 30; # wait for sapinfo to finish + $output = `$SAPINFO trace=0 ashost=$ashost sysnr=$sysnr`; + }; + alarm 0; # turn alarm off + undef $sys_id; + $output = "" if (! defined $output); + if ($output =~ m/System\s+ID\s+(\w+)/i) { + $sys_id = $1; + last; + } +# print "$loop: $ashost $sysnr $ret\n"; + $loop++; + sleep $repeat_wait; + } + if (! $sys_id) { push @failed, "$ashost ($sysnr)"; $fail_msg .= $output; } else { @@ -37,12 +90,12 @@ my $exit = 0; if (@failed) { - print "FAILED HOSTS: ",join(", ",@failed),"\n\n"; + print join(", ",@failed)," FAILED\n\n"; print "$fail_msg\n"; $exit = 1; } -print "CHECKED HOSTS (which are OK): ",join(", ",@ok),"\n\n"; +print "ALL OK\nCHECKED HOSTS (which are OK): ",join(", ",@ok),"\n\n"; rmdir "/tmp/sap$$" || die "can't rmdir in /tmp/sap$$: $!";