diff options
| author | makefu <github@syntax-fehler.de> | 2012-10-05 06:46:27 +0200 | 
|---|---|---|
| committer | makefu <github@syntax-fehler.de> | 2012-10-05 06:46:27 +0200 | 
| commit | 6c89839b7fc344608e61c8916ac9d9925fa98d14 (patch) | |
| tree | e316b8121f4880491659dc3cb8851de7762e58a9 /Monitoring/nagios/plugins/check_rpc | |
| parent | 957e2d7469b0e3d88e06b6a15e91478efc63cd62 (diff) | |
Monitoring/\* --> nagios/
Diffstat (limited to 'Monitoring/nagios/plugins/check_rpc')
| -rwxr-xr-x | Monitoring/nagios/plugins/check_rpc | 375 | 
1 files changed, 375 insertions, 0 deletions
| diff --git a/Monitoring/nagios/plugins/check_rpc b/Monitoring/nagios/plugins/check_rpc new file mode 100755 index 00000000..10a847ef --- /dev/null +++ b/Monitoring/nagios/plugins/check_rpc @@ -0,0 +1,375 @@ +#! /usr/bin/perl -w +# +# check_rpc plugin for nagios +# +# usage: +#    check_rpc host service +# +# Check if an rpc serice is registered and running +# using rpcinfo - $proto $host $prognum 2>&1 |"; +# +# Use these hosts.cfg entries as examples +# +# command[check_nfs]=/some/path/libexec/check_rpc $HOSTADDRESS$ nfs +# 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 +# +# Copyright Notice: GPL +# + +use strict; +use lib "/usr/lib/nagios/plugins"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); +use vars qw($PROGNAME); +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_c,$opt_u,$opt_t); +my ($line, @progvers, $response2,$response3); +$opt_V = $opt_h = $opt_C = $opt_p = $opt_H =  $opt_u = $opt_t =''; +$state = 'UNKNOWN'; +$progver = $response=$response2= $response3 =''; + +$PROGNAME = "check_rpc"; +sub print_help (); +sub print_usage (); +sub in ($$); + +$ENV{'BASH_ENV'}=''; +$ENV{'ENV'}=''; +$ENV{'PATH'}=''; +$ENV{'LC_ALL'}='C'; + +#Initialise protocol for each progname number +# 'u' for UDP, 't' for TCP +$proto[10003]='u'; +$proto[10004]='u'; +$proto[10007]='u'; + +use Getopt::Long; +Getopt::Long::Configure('bundling'); +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, + 	"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 $ERRORS{'OK'}; } + +# -V means display version number +if ($opt_V) { +	print_revision($PROGNAME,'1.4.15'); +	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 +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; +} + +if ($opt_t && $opt_u) { +	print "Cannot define tcp AND udp\n"; +	print_usage(); +	exit $ERRORS{'UNKNOWN'}; +} + + +# -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_C (version "; +    $prognum = $1; +} elsif ( in( \@progkeys, $opt_C)) { +#    $response = "RPC ok: $opt_C (version "; +    $prognum = $prognum{$opt_C}; +} else { +    print "Program $opt_C is not defined\n"; +    exit $ERRORS{'UNKNOWN'}; +} + +# -p means port number +if($opt_p =~ /^([0-9]+)$/){ +    $port = "-n $1"; +} else { +    $port = ""; +} + +$proto = 'u'; +$proto = $proto[$prognum] if ($proto[$prognum]); +$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}; + + +########  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 'UNKNOWN'; +			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,'1.4.15'); +	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 -H host -C rpc_command \n"; +	print "\n"; +	print_usage(); +	print "\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 "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 ($$) { +	$array_ref = shift; +	$test = shift; + +	while ( $element = shift @{$array_ref} ) { +		if ($test eq $element) { +	    return 1; +		} +	} +	return 0; +} + | 
