1 |
#!/usr/bin/perl -w |
2 |
# File: sap.monitor |
3 |
# Author: Dobrica Pavlinusic, dpavlin@rot13.org |
4 |
# http://www.rot13.org/~dpavlin/sysadm.html |
5 |
# Description: monitor sap servers using sapinfo from RFCSDK |
6 |
# |
7 |
# Usage: sap.monitor [-[hH] ashost only/ignore] [-[sS] sysnr only/ignore] |
8 |
# |
9 |
# e.g. sap.monitor -s 20 will scan only hosts with sysnr == 20 |
10 |
# sap.monitor -S 20 will scan only hosts with sysnr != 20 |
11 |
|
12 |
# configuration file in /usr/local/etc/sap-mon.conf describes which |
13 |
# hosts (ashost) and systems (sysnr) you want to check. |
14 |
# |
15 |
# format of line is: |
16 |
# |
17 |
# ashost [tab|space] sysnr # optional comment |
18 |
# |
19 |
# you can spacify host as hostname (sap01) or with sap routers in-between |
20 |
# to test routers too (/H/saprtr/H/sap01) |
21 |
|
22 |
use strict; |
23 |
use Getopt::Std; |
24 |
|
25 |
# change paths here if you want to |
26 |
my $CONFIG = "/usr/local/etc/sap-mon.conf"; |
27 |
my $SAPINFO = "/usr/local/bin/sapinfo"; |
28 |
# number of tries to repeat sapinfo if it fails first time |
29 |
my $repeat = 3; |
30 |
# seconds to wait between retries |
31 |
my $repeat_wait = 5; |
32 |
# sapinfo timeout |
33 |
my $sapinfo_timeout = 10; |
34 |
|
35 |
my %opts; |
36 |
getopt('h:s:H:S:', \%opts); |
37 |
|
38 |
my @config; |
39 |
open(C, $CONFIG) || die "sap-mon.conf: $!"; |
40 |
@config = <C>; |
41 |
close(C); |
42 |
|
43 |
my @failed; |
44 |
my @ok; |
45 |
my $fail_msg = ""; |
46 |
|
47 |
# sap info leaves trace files, so create dir without write permission |
48 |
# and chdir to it! |
49 |
mkdir "/tmp/sap$$",0555 || die "can't make /tmp/sap$$: $!"; |
50 |
chdir "/tmp/sap$$" || die "can't chdir in /tmp/sap$$: $!"; |
51 |
|
52 |
foreach (@config) { |
53 |
chomp; |
54 |
s/#.+$//g; # nuke comments |
55 |
s/^\s+$//g; # remove empty lines |
56 |
my ($ashost,$sysnr,undef) = split(/\s+/,$_,3); |
57 |
if ($ashost && $ashost ne "" && $sysnr && $sysnr ne "" && |
58 |
(($opts{h} && $ashost =~ m/$opts{h}/) || not $opts{h}) && |
59 |
(($opts{s} && $sysnr =~ m/$opts{s}/) || not $opts{s}) && |
60 |
(($opts{H} && $ashost !~ m/$opts{H}/) || not $opts{H}) && |
61 |
(($opts{S} && $sysnr !~ m/$opts{S}/) || not $opts{S}) ) { |
62 |
my $ret = 1; |
63 |
my $loop = 0; |
64 |
my $output; |
65 |
my $sys_id; |
66 |
for(my $i=0; $i<$repeat; $i++) { |
67 |
eval { |
68 |
local $SIG{ALRM} = sub { die "timeout\n"; }; |
69 |
alarm $sapinfo_timeout; # wait for sapinfo to finish |
70 |
$output = `$SAPINFO trace=0 ashost=$ashost sysnr=$sysnr`; |
71 |
}; |
72 |
alarm 0; # turn alarm off |
73 |
undef $sys_id; |
74 |
$output = "" if (! defined $output); |
75 |
if ($output =~ m/System\s+ID\s+(\w+)/i) { |
76 |
$sys_id = $1; |
77 |
last; |
78 |
} |
79 |
# print "$loop: $ashost $sysnr $ret\n"; |
80 |
$loop++; |
81 |
sleep $repeat_wait; |
82 |
} |
83 |
if (! $sys_id) { |
84 |
push @failed, "$ashost ($sysnr)"; |
85 |
$fail_msg .= $output; |
86 |
} else { |
87 |
push @ok, "$ashost ($sys_id)"; |
88 |
} |
89 |
} |
90 |
} |
91 |
|
92 |
my $exit = 0; |
93 |
|
94 |
if (@failed) { |
95 |
print join(", ",@failed)," FAILED\n\n"; |
96 |
print "$fail_msg\n"; |
97 |
$exit = 1; |
98 |
} |
99 |
|
100 |
print "ALL OK\nCHECKED HOSTS (which are OK): ",join(", ",@ok),"\n\n"; |
101 |
|
102 |
rmdir "/tmp/sap$$" || die "can't rmdir in /tmp/sap$$: $!"; |
103 |
|
104 |
exit $exit; |