aboutsummaryrefslogtreecommitdiff
path: root/contrib/check_snmp_process_monitor.pl
diff options
context:
space:
mode:
authorGravatar Holger Weiss <holger@zedat.fu-berlin.de> 2013-09-02 13:16:24 +0200
committerGravatar Holger Weiss <holger@zedat.fu-berlin.de> 2013-09-02 13:16:24 +0200
commitb15adb7762b6caaecaa83637abfcf5fdb4802092 (patch)
tree64eddbe2aa1a7f98a140be0f7973f05d7a781ae0 /contrib/check_snmp_process_monitor.pl
parentc4d5882b9e1d07c7b61091062b7d085fa5f00284 (diff)
downloadmonitoring-plugins-b15adb7762b6caaecaa83637abfcf5fdb4802092.tar.gz
Remove "contrib" plugins
These days, sites such as "Nagios Exchange" are a much better place for publishing plugins not maintained by the Plugins Development Team.
Diffstat (limited to 'contrib/check_snmp_process_monitor.pl')
-rw-r--r--contrib/check_snmp_process_monitor.pl331
1 files changed, 0 insertions, 331 deletions
diff --git a/contrib/check_snmp_process_monitor.pl b/contrib/check_snmp_process_monitor.pl
deleted file mode 100644
index 0f445970..00000000
--- a/contrib/check_snmp_process_monitor.pl
+++ /dev/null
@@ -1,331 +0,0 @@
-#!/usr/local/bin/perl
-# author: Al Tobey <albert.tobey@priority-health.com>
-# what: monitor a process using the host-resources mib
-# license: GPL - http://www.fsf.org/licenses/gpl.txt
-#
-# Todo:
-# * implement memory and cpu utilization checks
-# * maybe cache pids in DBM files if snmp agents get overworked
-###############################################################################
-# to get a list of processes over snmp try this command:
-# snmptable -v2c -c public hostname hrSWRunTable
-# for just a list of valid arguments for the '-e' option:
-# snmpwalk -v2c -c public hostname hrSWRunName |perl -pe 's:.*/::'
-###############################################################################
-
-use strict;
-require 5.6.0;
-use lib qw( /opt/nagios/libexec /usr/local/libexec );
-use utils qw(%ERRORS $TIMEOUT &print_revision &support &usage);
-use SNMP 5.0;
-use Getopt::Long;
-use Storable;
-use vars qw( $exit $opt_version $opt_timeout $opt_help $opt_command $opt_host $opt_community $opt_verbose $opt_warning $opt_critical $opt_memory $opt_cpu $opt_port $opt_regex $opt_stats $opt_cache $opt_nocache $cache_exp $interpreters $snmp_session $PROGNAME $TIMEOUT );
-
-$PROGNAME = "snmp_process_monitor.pl";
-$opt_verbose = undef;
-$opt_host = undef;
-$opt_community = 'public';
-$opt_command = undef;
-$opt_warning = [ 1, -1 ];
-$opt_critical = [ 1, -1 ];
-$opt_memory = undef;
-$opt_cpu = undef;
-$opt_port = 161;
-$opt_cache = 1;
-$opt_nocache = undef;
-$cache_exp = 600;
-$exit = $ERRORS{OK};
-$interpreters = '(perl|/bin/sh|/usr/bin/sh|/bin/bash|/bin/ksh|python)';
-our $cachefile = '/var/opt/nagios/tmp/'; # completed later
-our %processes = ();
-
-sub process_options {
- my( $opt_crit, $opt_warn ) = ();
- Getopt::Long::Configure( 'bundling' );
- GetOptions(
- 'V' => \$opt_version, 'version' => \$opt_version,
- 'v' => \$opt_verbose, 'verbose' => \$opt_verbose,
- 'h' => \$opt_help, 'help' => \$opt_help,
- 's' => \$opt_stats, 'statistics' => \$opt_stats,
- 'nocache' => \$opt_nocache,
- 'H:s' => \$opt_host, 'hostname:s' => \$opt_host,
- 'p:i' => \$opt_port, 'port:i' => \$opt_port,
- 'C:s' => \$opt_community, 'community:s' => \$opt_community,
- 'c:s' => \$opt_crit, 'critical:s' => \$opt_crit,
- 'w:s' => \$opt_warn, 'warning:s' => \$opt_warn,
- 't:i' => \$TIMEOUT, 'timeout:i' => \$TIMEOUT,
- 'e:s' => \$opt_command, 'command:s' => \$opt_command,
- 'r:s' => \$opt_regex, 'regex:s' => \$opt_regex,
- 'cpu:i' => \$opt_cpu, 'memory:i' => \$opt_memory,
- );
- if ( defined($opt_version) ) { local_print_revision(); }
- if ( defined($opt_verbose) ) { $SNMP::debugging = 1; }
- if ( !defined($opt_host) || defined($opt_help) || (!defined($opt_command) && !defined($opt_regex)) ) {
- print_help();
- exit $ERRORS{UNKNOWN};
- }
-
- if ( defined($opt_crit) ) {
- if ( $opt_crit =~ /,/ ) {
- $opt_critical = [ split(',', $opt_crit) ];
- }
- else {
- $opt_critical = [ $opt_crit, -1 ];
- }
- }
- if ( defined($opt_warn) ) {
- if ( $opt_warn =~ /,/ ) {
- $opt_warning = [ split(',', $opt_warn) ];
- }
- else {
- $opt_warning = [ $opt_crit, -1 ];
- }
- }
- if ( defined($opt_memory) ) { $opt_memory = 0 }
- if ( defined($opt_cpu) ) { $opt_cpu = 0 }
- if ( defined($opt_nocache)) { $opt_cache = 0 }
-
- # complete the cachefile's name
- $cachefile .= $opt_host . '.proc';
-}
-
-sub local_print_revision {
- print_revision( $PROGNAME, '$Revision: 84 $ ' )
-}
-
-sub print_usage {
- print "Usage: $PROGNAME -H <host> -C <snmp_community> -e <command> [-w <low>,<high>] [-c <low>,<high>] [-t <timeout>] [-s|--statistics] [--memory] [--cpu] [--nocache]\n";
-}
-
-sub print_help {
- local_print_revision();
- print "Copyright (c) 2002 Al Tobey <albert.tobey\@priority-health.com>\n\n",
- "SNMP Process Monitor plugin for Nagios\n\n";
- print_usage();
- print <<EOT;
--v, --verbose
- print extra debugging information
--h, --help
- print this help message
--H, --hostname=HOST
- name or IP address of host to check
--C, --community=COMMUNITY NAME
- community name for the host's SNMP agent
--e, --command=COMMAND NAME (ps -e style)
- what command should be monitored?
--r, --regex=Perl RE
- use a perl regular expression to find your process
--w, --warning=INTEGER[,INTEGER]
- minimum and maximum number of processes before a warning is issued (Default 1,-1)
--c, --critical=INTEGER[,INTEGER]
- minimum and maximum number of processes before a critical is issued (Default 1,-1)
---memory
- combined with '-s', will print the number of bytes of real memory used by process
---cpu
- combined with '-s', will print the number of seconds of cpu time consumed by process
-EOT
-}
-
-sub verbose (@) {
- return if ( !defined($opt_verbose) );
- print @_;
-}
-
-sub check_for_errors {
- if ( $snmp_session->{ErrorNum} ) {
- %processes = ();
- print "UNKNOWN - error retrieving SNMP data: $snmp_session->{ErrorStr}\n";
- exit $ERRORS{UNKNOWN};
- }
-}
-
-sub init_cache {
- if ( !defined($opt_cache) ) {
- %processes = ();
- return;
- }
- if ( -r $cachefile ) {
- eval {
- verbose "loading cache from $cachefile\n";
- %processes = %{ retrieve( $cachefile ) };
- };
- if ( $@ ) {
- verbose "cache loading failed - using blank cache: $@\n";
- %processes = ()
- }
- }
- else {
- %processes = ();
- }
-}
-
-sub snmpget {
- my $tmpvar = SNMP::Varbind->new( shift );
- $snmp_session->get( $tmpvar );
- check_for_errors();
- return $tmpvar->val;
-}
-
-sub update_cache {
- # expire the cache after $cache_exp seconds
- if ( $opt_cache != 0 && exists($processes{__last_update})
- && $processes{__last_update} >= time - $cache_exp ) {
- verbose "cache file is recent enough - using it\n";
- return 1;
- }
-
- verbose "retrieving full listing of processes from $opt_host\n";
- my $process_count = snmpget( ['hrSystemProcesses', 0] );
-
- # retrieve the data from the remote host
- my ($names) = $snmp_session->bulkwalk( 0, $process_count + 1, [['hrSWRunName']] );
- check_for_errors();
-
- # make sure the number of processes from the bulkwalk is close to hrSystemProcesses
- if ( scalar(@$names) + 10 < $process_count ) {
- print "UNKNOWN - only ", scalar(@$names), " of ",$process_count, " processes returned\n";;
- exit $ERRORS{UNKNOWN};
- }
-
- # sort through the process names and create a nice hash of processes
- foreach my $row ( @$names ) {
- my %hash = {};
- $hash{name} = $row->val;
- $hash{abs_name} = $row->val;
- $hash{name} =~ s#.*/##; # strip path
-
- if ( defined($opt_regex) ||
- ($row->val =~ m#$interpreters$#
- && $opt_command !~ m#$interpreters$#) ) {
-
- # fetch the runtime parameters of the process
- my $parameters = snmpget( ['hrSWRunParameters', $row->iid] );
-
- # only strip if we're looking for a specific command
- if ( defined($opt_command) ) {
- verbose "process ",$row->iid," uses $1 as an interpreter - getting parameters\n";
- $hash{name} = $parameters;
- $hash{name} =~ s#.*/##; # strip path name off the front
- $hash{name} =~ s/\s+.*$//; # strip everything from the first space to the end
- }
- else {
- # use the full 'ps -efl' style listing for regular expression matching
- my $path = snmpget( ['hrSWRunPath', $row->iid] );
- $hash{name} = "$path $parameters";
- }
- }
- # store in the global hash
- $processes{$row->iid} = \%hash;
- }
-
- # update the timestamp so the cache can expire
- $processes{__last_update} = time;
- return 0;
-}
-
-# process the %processes hash and see if there any matches for our command or regex
-sub check_for_matches {
- my $ret_match = 0;
- foreach my $key ( keys(%processes) ) {
- next if ( $key eq '__last_update' );
- my $match = 0;
-
- # static matches are letter-for-letter (-e)
- if ( defined($opt_command) && $processes{$key}->{name} eq $opt_command ) { $match++; }
- # use /o to make sure the user-supplied regex (-r) is only compiled once
- elsif ( defined($opt_regex) && $processes{$key}->{name} =~ /$opt_regex/o ) { $match++; }
-
- # verify the cache's entry by doing an snmpget
- if ( $match > 0 && $opt_cache != 0 ) {
- my $proc = snmpget( ['hrSWRunName', $key] );
- --$match if ( !$proc || $proc ne $processes{$key}->{abs_name} );
- }
- # get the process memory usage if requested
- if ( $match > 0 && defined($opt_memory) ) {
- $opt_memory += snmpget( ['hrSWRunPerfMem', $key] );
- }
- # get the process cpu usage if requested
- if ( $match > 0 && defined($opt_cpu) ) {
- $opt_cpu += snmpget( ['hrSWRunPerfCPU', $key] );
- }
-
- verbose "process '$processes{$key}->{name}' has pid $processes{$key}->{pid} and index $key\n"
- if ( $match > 0 );
-
- $ret_match += $match;
- }
- return $ret_match;
-}
-# =========================================================================== #
-# =====> MAIN
-# =========================================================================== #
-process_options();
-
-alarm( $TIMEOUT ); # make sure we don't hang Nagios
-
-# intialize the cache, if it's enabled
-init_cache();
-
-# create a session for conversing with the remote SNMP agent
-$snmp_session = new SNMP::Session(
- DestHost => $opt_host,
- Community => $opt_community,
- RemotePort => $opt_port,
- Version => '2c'
-);
-
-my $usage = update_cache();
-my $count = check_for_matches();
-
-# always try twice if caching is enabled - once with cache and once without
-if ( $usage != 0 && $opt_cache != 0 && $count <= 0 ) {
- verbose "did not find process in cache - trying a refresh\n";
- %processes = ();
- update_cache();
- $count = check_for_matches();
-}
-
-
-# the default, OK message
-my $message = "OK - $count process(es) found resembling '". ($opt_command || $opt_regex);
-
-# warning, critical
-if ( ($opt_warning->[0] > 0 && $opt_warning->[0] > $count)
- || ($opt_warning->[1] > 0 && $opt_warning->[1] <= $count) ) {
- $message = "WARNING - no processes found resembling '". ($opt_command || $opt_regex);
- $exit = $ERRORS{WARNING};
-}
-if ( ($opt_critical->[0] > 0 && $opt_critical->[0] > $count)
- || ($opt_critical->[1] > 0 && $opt_critical->[1] <= $count) ) {
- $message = "CRITICAL - no processes found resembling '". ($opt_command || $opt_regex);
- $exit = $ERRORS{CRITICAL};
-}
-
-# output the status message
-print $message, "'";
-
-# print the number of processes if statistics are requested
-if ( defined($opt_stats) ) {
- print "|count=$count";
- if ( defined($opt_memory) ) {
- print ":memory=", $opt_memory;
- }
- if ( defined($opt_cpu) ) {
- $opt_cpu = $opt_cpu / 100;
- printf ":cpu=%.2f", $opt_cpu;
- }
-}
-
-# store a copy of the %processes hash if we're using caching
-if ( $exit == $ERRORS{OK} && $opt_cache != 0 ) {
- eval {
- unlink( $cachefile ) if ( -e $cachefile );
- store( \%processes, $cachefile );
- };
-}
-
-print "\n";
-exit $exit;
-
-