aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xplugins-scripts/check_rpc.pl436
1 files changed, 271 insertions, 165 deletions
diff --git a/plugins-scripts/check_rpc.pl b/plugins-scripts/check_rpc.pl
index 2e25f414..623d6ab2 100755
--- a/plugins-scripts/check_rpc.pl
+++ b/plugins-scripts/check_rpc.pl
@@ -1,4 +1,4 @@
-#! /usr/bin/perl -wT
+#! /usr/local/bin/perl -w
#
# check_rpc plugin for nagios
#
@@ -14,22 +14,26 @@
# service[check_nfs]=NFS;24x7;3;5;5;unix-admin;60;24x7;1;1;1;;check_rpc
#
# initial version: 3 May 2000 by Truongchinh Nguyen and Karl DeBisschop
+# Modified May 2002 Subhendu Ghosh - support for ePN and patches
# current status: $Revision$
#
# Copyright Notice: GPL
+# $Id$
#
-
use strict;
-use FindBin;
-use lib "$FindBin::Bin";
+use lib utils.pm;
use utils qw($TIMEOUT %ERRORS &print_revision &support);
use vars qw($PROGNAME);
-my ($verbose,@proto,%prognum,$host,$response,$prognum,$port,$cmd);
+my ($verbose,@proto,%prognum,$host,$response,$prognum,$port,$cmd,$progver,$state);
my ($array_ref,$test,$element,@progkeys,$proto,$a,$b);
-my ($opt_V,$opt_h,$opt_C,$opt_p,$opt_H);
-$opt_V = $opt_h = $opt_C = $opt_p = $opt_H = '';
+my ($opt_V,$opt_h,$opt_C,$opt_p,$opt_H,$opt_c,$opt_u,$opt_t);
+my ($line, @progvers, $response2,$response3);
+$opt_V = $opt_h = $opt_C = $opt_p = $opt_H = $opt_c = $opt_u = $opt_t ='';
+$state = 'OK';
+$progver = $response=$response2= $response3 ='';
+$PROGNAME = "check_rpc";
sub print_help ();
sub print_usage ();
sub in ($$);
@@ -46,48 +50,196 @@ $proto[10007]='u';
use Getopt::Long;
Getopt::Long::Configure('bundling');
-GetOptions
- ("V" => \$opt_V, "version" => \$opt_V,
+GetOptions(
+ "V" => \$opt_V, "version" => \$opt_V,
"h" => \$opt_h, "help" => \$opt_h,
"C=s" => \$opt_C, "command=s" => \$opt_C,
"p=i" => \$opt_p, "port=i" => \$opt_p,
- "H=s" => \$opt_H, "hostname=s" => \$opt_H);
+ "H=s" => \$opt_H, "hostname=s" => \$opt_H,
+ "c=s" => \$opt_c, "progver=s" => \$opt_c,
+ "v+" => \$verbose, "verbose+" => \$verbose,
+ "u" => \$opt_u, "udp" => \$opt_u,
+ "t" => \$opt_t, "tcp" => \$opt_t
+ );
# -h means display verbose help screen
-if ($opt_h) { print_help(); exit 0; }
+if ($opt_h) { print_help(); exit $ERRORS{'OK'}; }
# -V means display version number
-if ($opt_V) { print_revision($PROGNAME,'$Revision$ '); exit 0; }
+if ($opt_V) {
+ print_revision($PROGNAME,'$Revision$ ');
+ exit $ERRORS{'Ok'};
+}
+
+# Hash containing all RPC program names and numbers
+# Add to the hash if support for new RPC program is required
+
+%prognum = (
+ "portmapper" => 100000 ,
+ "portmap" => 100000 ,
+ "sunrpc" => 100000 ,
+ "rpcbind" => 100000 ,
+ "rstatd" => 100001 ,
+ "rstat" => 100001 ,
+ "rup" => 100001 ,
+ "perfmeter" => 100001 ,
+ "rstat_svc" => 100001 ,
+ "rusersd" => 100002 ,
+ "rusers" => 100002 ,
+ "nfs" => 100003 ,
+ "nfsprog" => 100003 ,
+ "ypserv" => 100004 ,
+ "ypprog" => 100004 ,
+ "mountd" => 100005 ,
+ "mount" => 100005 ,
+ "showmount" => 100005 ,
+ "ypbind" => 100007 ,
+ "walld" => 100008 ,
+ "rwall" => 100008 ,
+ "shutdown" => 100008 ,
+ "yppasswdd" => 100009 ,
+ "yppasswd" => 100009 ,
+ "etherstatd" => 100010 ,
+ "etherstat" => 100010 ,
+ "rquotad" => 100011 ,
+ "rquotaprog" => 100011 ,
+ "quota" => 100011 ,
+ "rquota" => 100011 ,
+ "sprayd" => 100012 ,
+ "spray" => 100012 ,
+ "3270_mapper" => 100013 ,
+ "rje_mapper" => 100014 ,
+ "selection_svc" => 100015 ,
+ "selnsvc" => 100015 ,
+ "database_svc" => 100016 ,
+ "rexd" => 100017 ,
+ "rex" => 100017 ,
+ "alis" => 100018 ,
+ "sched" => 100019 ,
+ "llockmgr" => 100020 ,
+ "nlockmgr" => 100021 ,
+ "x25_inr" => 100022 ,
+ "statmon" => 100023 ,
+ "status" => 100024 ,
+ "bootparam" => 100026 ,
+ "ypupdated" => 100028 ,
+ "ypupdate" => 100028 ,
+ "keyserv" => 100029 ,
+ "keyserver" => 100029 ,
+ "sunlink_mapper" => 100033 ,
+ "tfsd" => 100037 ,
+ "nsed" => 100038 ,
+ "nsemntd" => 100039 ,
+ "showfhd" => 100043 ,
+ "showfh" => 100043 ,
+ "ioadmd" => 100055 ,
+ "rpc.ioadmd" => 100055 ,
+ "NETlicense" => 100062 ,
+ "sunisamd" => 100065 ,
+ "debug_svc" => 100066 ,
+ "dbsrv" => 100066 ,
+ "ypxfrd" => 100069 ,
+ "rpc.ypxfrd" => 100069 ,
+ "bugtraqd" => 100071 ,
+ "kerbd" => 100078 ,
+ "event" => 100101 ,
+ "na.event" => 100101 ,
+ "logger" => 100102 ,
+ "na.logger" => 100102 ,
+ "sync" => 100104 ,
+ "na.sync" => 100104 ,
+ "hostperf" => 100107 ,
+ "na.hostperf" => 100107 ,
+ "activity" => 100109 ,
+ "na.activity" => 100109 ,
+ "hostmem" => 100112 ,
+ "na.hostmem" => 100112 ,
+ "sample" => 100113 ,
+ "na.sample" => 100113 ,
+ "x25" => 100114 ,
+ "na.x25" => 100114 ,
+ "ping" => 100115 ,
+ "na.ping" => 100115 ,
+ "rpcnfs" => 100116 ,
+ "na.rpcnfs" => 100116 ,
+ "hostif" => 100117 ,
+ "na.hostif" => 100117 ,
+ "etherif" => 100118 ,
+ "na.etherif" => 100118 ,
+ "iproutes" => 100120 ,
+ "na.iproutes" => 100120 ,
+ "layers" => 100121 ,
+ "na.layers" => 100121 ,
+ "snmp" => 100122 ,
+ "na.snmp" => 100122 ,
+ "snmp-cmc" => 100122 ,
+ "snmp-synoptics" => 100122 ,
+ "snmp-unisys" => 100122 ,
+ "snmp-utk" => 100122 ,
+ "traffic" => 100123 ,
+ "na.traffic" => 100123 ,
+ "nfs_acl" => 100227 ,
+ "sadmind" => 100232 ,
+ "nisd" => 100300 ,
+ "rpc.nisd" => 100300 ,
+ "nispasswd" => 100303 ,
+ "rpc.nispasswdd" => 100303 ,
+ "ufsd" => 100233 ,
+ "ufsd" => 100233 ,
+ "pcnfsd" => 150001 ,
+ "pcnfs" => 150001 ,
+ "amd" => 300019 ,
+ "amq" => 300019 ,
+ "bwnfsd" => 545580417 ,
+ "fypxfrd" => 600100069 ,
+ "freebsd-ypxfrd" => 600100069 ,
+);
+
+# -v means verbose, -v-v means verbose twice = print above hash
+if (defined $verbose && ($verbose > 1) ){
+ my $key;
+ print "Supported programs:\n";
+ print " name\t=>\tnumber\n";
+ print " ===============================\n";
+ foreach $key (sort keys %prognum) {
+ print " $key \t=>\t$prognum{$key} \n";
+ }
+ print "\n\n";
+ print_usage();
+ exit $ERRORS{'OK'};
+}
# -H means host name
-$opt_H = shift unless ($opt_H);
-unless ($opt_H) { print_usage(); exit -1; }
-if($opt_H && $opt_H =~ m/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+|[a-zA-Z][-a-zA-Z0-9]+(\.[a-zA-Z][-a-zA-Z0-9]+)*)$/) {
- $host = $1;
-} else {
- print "$opt_H is not a valid host name\n";
- exit -1;
+unless ($opt_H) { print_usage(); exit $ERRORS{'UNKNOWN'}; }
+
+if (! utils::is_hostname($opt_H)){
+ print "$opt_H is not a valid host name\n";
+ print_usage();
+ exit $ERRORS{"UNKNOWN"};
+}else{
+ $host = $opt_H;
}
-while (<DATA>) {
- ($a,$b) = split;
- $prognum{$a} = $b;
+if ($opt_t && $opt_u) {
+ print "Cannot define tcp AND udp\n";
+ print_usage();
+ exit $ERRORS{'UNKNOWN'};
}
-close DATA;
+
# -C means command name or number
$opt_C = shift unless ($opt_C);
unless ($opt_C) { print_usage(); exit -1; }
@progkeys = keys %prognum;
if ($opt_C =~ m/^([0-9]+)$/){
- $response = "RPC ok: program $opt_p (version ";
+# $response = "RPC ok: program $opt_C (version ";
$prognum = $1;
} elsif ( in( \@progkeys, $opt_C)) {
- $response = "RPC ok: $opt_C (version ";
+# $response = "RPC ok: $opt_C (version ";
$prognum = $prognum{$opt_C};
} else {
print "Program $opt_C is not defined\n";
- exit -1;
+ exit $ERRORS{'UNKNOWN'};
}
# -p means port number
@@ -99,42 +251,115 @@ if($opt_p =~ /^([0-9]+)$/){
$proto = 'u';
$proto = $proto[$prognum] if ($proto[$prognum]);
-$cmd = "/usr/sbin/rpcinfo $port -" . "$proto $host $prognum 2>&1 |";
-print "$cmd\n" if ($verbose);
-open CMD, $cmd;
-
-while ( <CMD> ) {
- chomp;
- if ( /program $prognum version ([0-9]*) ready and waiting/ ) {
- $response .= "$1) is running";
- print "$response\n";
- exit 0;
- }
+$proto = 't' if ($opt_t);
+$proto = 'u' if ($opt_u);
+
+
+# Just in case of problems, let's not hang Nagios
+$SIG{'ALRM'} = sub {
+ print ("ERROR: No response from RPC server (alarm)\n");
+ exit $ERRORS{"UNKNOWN"};
+};
+alarm($TIMEOUT);
+
+# -c is progver - if we need to check multiple specified versions.
+if (defined $opt_c ) {
+ my $vers;
+ @progvers = split(/,/ ,$opt_c );
+ foreach $vers (sort @progvers) {
+ if($vers =~ /^([0-9]+)$/){
+ $progver = "$1";
+ print "Checking $opt_C version $progver proto $proto\n" if $verbose;
+ get_rpcinfo();
+ }else{
+ print "Version $vers is not an integer\n" if $verbose;
+ }
+
+ }
+}else{
+ get_rpcinfo();
+}
+
+
+## translate proto for output
+if ($proto eq "u" ){
+ $proto = "udp";
+}else{
+ $proto = "tcp";
+}
+
+if ($state eq 'OK') {
+ print "$state: RPC program $opt_C".$response." $proto running\n";
+}else{
+ if($response){
+ print "$state: RPC program $opt_C".$response2." $proto is not running,".$response." $proto is running\n";
+ }else{
+ print "$state: RPC program $opt_C $response2 $proto is not running\n";
+ }
}
+exit $ERRORS{$state};
-print "RPC CRITICAL: Program $opt_C not registered\n";
-exit 2;
+######## Subroutines ==========================
+
+sub get_rpcinfo {
+ $cmd = "$utils::PATH_TO_RPCINFO $port -" . "$proto $host $prognum $progver 2>&1 |";
+ print "$cmd\n" if ($verbose);
+ open CMD, $cmd or die "Can't fork for rpcinfo: $!\n" ;
+
+ while ( $line = <CMD> ) {
+ printf "$line " if $verbose;
+ chomp $line;
+
+ if ( $line =~ /program $prognum version ([0-9]*) ready and waiting/ ) {
+ $response .= " version $1";
+ $state = 'OK' unless $state ne 'OK';
+ print "1:$response \n" if $verbose;
+ }
+
+ if ( $line =~ /program $prognum version ([0-9]*) is not available/ ) {
+ $response2 .= " version $1";
+ $state = 'CRITICAL';
+ print "2:$response2 \n" if $verbose;
+ }
+ if ( $line =~ /program $prognum is not available/ ) {
+ $response3 = "";
+ $response3 = "tcp" if $opt_t;
+ $response3 = "udp" if $opt_u;
+ $state = 'CRITICAL';
+ print "3:$response3 \n" if $verbose;
+ }
+ }
+ close CMD;
+}
sub print_help() {
print_revision($PROGNAME,'$Revision$ ');
- print "Copyright (c) 2000 Karl DeBisschop/Truongchinh Nguyen\n";
+ print "Copyright (c) 2002 Karl DeBisschop/Truongchinh Nguyen/Subhendu Ghosh\n";
print "\n";
print "Check if a rpc service is registered and running using\n";
- print " rpcinfo -<protocol> <host> <program number>\n";
+ print " rpcinfo -H host -C rpc_command \n";
print "\n";
print_usage();
print "\n";
- print "<host> The server providing the rpc service\n";
- print "<program> The program name (or number).\n\n";
+ print " <host> The server providing the rpc service\n";
+ print " <rpc_command> The program name (or number).\n";
+ print " <program_version> The version you want to check for (one or more)\n";
+ print " Should prevent checks of unknown versions being syslogged\n";
+ print " e.g. 2,3,6 to check v2, v3, and v6\n";
+ print " [-u | -t] Test UDP or TCP\n";
+ print " [-v] Verbose \n";
+ print " [-v -v] Verbose - will print supported programs and numbers \n";
+ print "\n";
support();
}
sub print_usage () {
- print "$PROGNAME -H host -C rpc_command [-p port]\n";
- print "$PROGNAME [-h | --help]\n";
- print "$PROGNAME [-V | --version]\n";
+ print "Usage: \n";
+ print " $PROGNAME -H host -C rpc_command [-p port] [-c program_version] [-u|-t] [-v]\n";
+ print " $PROGNAME [-h | --help]\n";
+ print " $PROGNAME [-V | --version]\n";
}
sub in ($$) {
@@ -149,122 +374,3 @@ sub in ($$) {
return 0;
}
-__DATA__
-portmapper 100000
-portmap 100000
-sunrpc 100000
-rpcbind 100000
-rstatd 100001
-rstat 100001
-rup 100001
-perfmeter 100001
-rstat_svc 100001
-rusersd 100002
-rusers 100002
-nfs 100003
-nfsprog 100003
-ypserv 100004
-ypprog 100004
-mountd 100005
-mount 100005
-showmount 100005
-ypbind 100007
-walld 100008
-rwall 100008
-shutdown 100008
-yppasswdd 100009
-yppasswd 100009
-etherstatd 100010
-etherstat 100010
-rquotad 100011
-rquotaprog 100011
-quota 100011
-rquota 100011
-sprayd 100012
-spray 100012
-3270_mapper 100013
-rje_mapper 100014
-selection_svc 100015
-selnsvc 100015
-database_svc 100016
-rexd 100017
-rex 100017
-alis 100018
-sched 100019
-llockmgr 100020
-nlockmgr 100021
-x25_inr 100022
-statmon 100023
-status 100024
-bootparam 100026
-ypupdated 100028
-ypupdate 100028
-keyserv 100029
-keyserver 100029
-sunlink_mapper 100033
-tfsd 100037
-nsed 100038
-nsemntd 100039
-showfhd 100043
-showfh 100043
-ioadmd 100055
-rpc.ioadmd 100055
-NETlicense 100062
-sunisamd 100065
-debug_svc 100066
-dbsrv 100066
-ypxfrd 100069
-rpc.ypxfrd 100069
-bugtraqd 100071
-kerbd 100078
-event 100101
-na.event 100101
-logger 100102
-na.logger 100102
-sync 100104
-na.sync 100104
-hostperf 100107
-na.hostperf 100107
-activity 100109
-na.activity 100109
-hostmem 100112
-na.hostmem 100112
-sample 100113
-na.sample 100113
-x25 100114
-na.x25 100114
-ping 100115
-na.ping 100115
-rpcnfs 100116
-na.rpcnfs 100116
-hostif 100117
-na.hostif 100117
-etherif 100118
-na.etherif 100118
-iproutes 100120
-na.iproutes 100120
-layers 100121
-na.layers 100121
-snmp 100122
-na.snmp 100122
-snmp-cmc 100122
-snmp-synoptics 100122
-snmp-unisys 100122
-snmp-utk 100122
-traffic 100123
-na.traffic 100123
-nfs_acl 100227
-sadmind 100232
-nisd 100300
-rpc.nisd 100300
-nispasswd 100303
-rpc.nispasswdd 100303
-ufsd 100233
-ufsd 100233
-pcnfsd 150001
-pcnfs 150001
-amd 300019
-amq 300019
-bwnfsd 545580417
-fypxfrd 600100069
-freebsd-ypxfrd 600100069