,
+ UNKNOWN if we aren't able to connect to the apache server's status page
+
+Perfdata legend:
+"_;S;R;W;K;D;C;L;G;I;.;1;2;3"
+_ : Waiting for Connection
+S : Starting up
+R : Reading Request
+W : Sending Reply
+K : Keepalive (read)
+D : DNS Lookup
+C : Closing connection
+L : Logging
+G : Gracefully finishing
+I : Idle cleanup of worker
+. : Open slot with no current process
+1 : Requests per sec
+2 : kB per sec
+3 : kB per Request
+
+EOT
+}
+
+sub check_options {
+ Getopt::Long::Configure ("bundling");
+ GetOptions(
+ 'h' => \$o_help, 'help' => \$o_help,
+ 'H:s' => \$o_host, 'hostname:s' => \$o_host,
+ 'p:i' => \$o_port, 'port:i' => \$o_port,
+ 'V' => \$o_version, 'version' => \$o_version,
+ 'w:i' => \$o_warn_level, 'warn:i' => \$o_warn_level,
+ 'c:i' => \$o_crit_level, 'critical:i' => \$o_crit_level,
+ 't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
+
+ );
+
+ if (defined ($o_help)) { help(); exit $ERRORS{"UNKNOWN"}};
+ if (defined($o_version)) { show_versioninfo(); exit $ERRORS{"UNKNOWN"}};
+ if (((defined($o_warn_level) && !defined($o_crit_level)) || (!defined($o_warn_level) && defined($o_crit_level))) || ((defined($o_warn_level) && defined($o_crit_level)) && (($o_warn_level != -1) && ($o_warn_level <= $o_crit_level)))) {
+ print "Check warn and crit!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}
+ }
+ # Check compulsory attributes
+ if (!defined($o_host)) { print_usage(); exit $ERRORS{"UNKNOWN"}};
+}
+
+########## MAIN ##########
+
+check_options();
+
+my $ua = LWP::UserAgent->new( protocols_allowed => ['http'], timeout => $o_timeout);
+my $timing0 = [gettimeofday];
+my $response = undef;
+if (!defined($o_port)) {
+ $response = $ua->get('http://' . $o_host . '/server-status');
+} else {
+ $response = $ua->get('http://' . $o_host . ':' . $o_port . '/server-status');
+}
+my $timeelapsed = tv_interval ($timing0, [gettimeofday]);
+
+my $webcontent = undef;
+if ($response->is_success) {
+ $webcontent=$response->content;
+ my @webcontentarr = split("\n", $webcontent);
+ my $i = 0;
+ my $BusyWorkers=undef;
+ my $IdleWorkers=undef;
+ # Get the amount of idle and busy workers(Apache2)/servers(Apache1)
+ while (($i < @webcontentarr) && ((!defined($BusyWorkers)) || (!defined($IdleWorkers)))) {
+ if ($webcontentarr[$i] =~ /(\d+)\s+requests\s+currently\s+being\s+processed,\s+(\d+)\s+idle\s+....ers/) {
+ ($BusyWorkers, $IdleWorkers) = ($webcontentarr[$i] =~ /(\d+)\s+requests\s+currently\s+being\s+processed,\s+(\d+)\s+idle\s+....ers/);
+ }
+ $i++;
+ }
+
+ # get requests/sec, kb/sec, kb/req
+ $i = 0;
+ my $ReqPerSec=undef;
+ my $KbPerSec=undef;
+ my $KbPerReq=undef;
+
+ my $KbRatios = {
+ g => 1048576,
+ m => 1024,
+ k => 1,
+ empty => 0.0009765625,
+ };
+
+ while (($i < @webcontentarr) && ((!defined($ReqPerSec)) || (!defined($KbPerSec)) || (!defined($KbPerReq)))) {
+ if ($webcontentarr[$i] =~ /([0-9]*\.?[0-9]+)\s+requests\/sec\s+-\s+([0-9]*\.?[0-9]+)\s+(\w)*B\/second\s+-\s+([0-9]*\.?[0-9]+)\s+(\w)*B\/request/) {
+ my ($Requests, $bPerSec, $sPerSec, $bPerReq, $sPerReq) = ($webcontentarr[$i] =~ /([0-9]*\.?[0-9]+)\s+requests\/sec\s+-\s+([0-9]*\.?[0-9]+)\s+(\w)*B\/second\s+-\s+([0-9]*\.?[0-9]+)\s+(\w)*B\/request/);
+ $ReqPerSec=$Requests;
+ if ($sPerSec) {
+ $KbPerSec = $bPerSec*$KbRatios->{lc($sPerSec)};
+ } else {
+ $KbPerSec = $bPerSec*$KbRatios->{empty};
+ }
+ if ($sPerReq) {
+ $KbPerReq = $bPerReq*$KbRatios->{lc($sPerReq)};
+ } else {
+ $KbPerReq = $bPerReq*$KbRatios->{empty};
+ }
+ }
+ $i++;
+ }
+
+ # Get the scoreboard
+ my $ScoreBoard = "";
+ $i = 0;
+ my $PosPreBegin = undef;
+ my $PosPreEnd = undef;
+ while (($i < @webcontentarr) && ((!defined($PosPreBegin)) || (!defined($PosPreEnd)))) {
+ if (!defined($PosPreBegin)) {
+ if ( $webcontentarr[$i] =~ m//i ) {
+ $PosPreBegin = $i;
+ }
+ }
+ if (defined($PosPreBegin)) {
+ if ( $webcontentarr[$i] =~ m/<\/pre>/i ) {
+ $PosPreEnd = $i;
+ }
+ }
+ $i++;
+ }
+ for ($i = $PosPreBegin; $i <= $PosPreEnd; $i++) {
+ $ScoreBoard = $ScoreBoard . $webcontentarr[$i];
+ }
+ $ScoreBoard =~ s/^.*<[Pp][Rr][Ee]>//;
+ $ScoreBoard =~ s/<\/[Pp][Rr][Ee].*>//;
+
+ my $CountOpenSlots = ($ScoreBoard =~ tr/\.//);
+ if (defined($o_crit_level) && ($o_crit_level != -1)) {
+ if (($CountOpenSlots + $IdleWorkers) <= $o_crit_level) {
+ printf("CRITICAL %f seconds response time. Idle %d, busy %d, open slots %d | 'Waiting for Connection'=%d 'Starting Up'=%d 'Reading Request'=%d 'Sending Reply'=%d 'Keepalive (read)'=%d 'DNS Lookup'=%d 'Closing Connection'=%d 'Logging'=%d 'Gracefully finishing'=%d 'Idle cleanup'=%d 'Open slot'=%d 'Requests/sec'=%0.1f 'kB per sec'=%0.1fKB 'kB per Request'=%0.1fKB\n", $timeelapsed, $IdleWorkers, $BusyWorkers, $CountOpenSlots, ($ScoreBoard =~ tr/\_//), ($ScoreBoard =~ tr/S//),($ScoreBoard =~ tr/R//),($ScoreBoard =~ tr/W//),($ScoreBoard =~ tr/K//),($ScoreBoard =~ tr/D//),($ScoreBoard =~ tr/C//),($ScoreBoard =~ tr/L//),($ScoreBoard =~ tr/G//),($ScoreBoard =~ tr/I//), $CountOpenSlots, $ReqPerSec, $KbPerSec, $KbPerReq);
+ exit $ERRORS{"CRITICAL"}
+ }
+ }
+ if (defined($o_warn_level) && ($o_warn_level != -1)) {
+ if (($CountOpenSlots + $IdleWorkers) <= $o_warn_level) {
+ printf("WARNING %f seconds response time. Idle %d, busy %d, open slots %d | 'Waiting for Connection'=%d 'Starting Up'=%d 'Reading Request'=%d 'Sending Reply'=%d 'Keepalive (read)'=%d 'DNS Lookup'=%d 'Closing Connection'=%d 'Logging'=%d 'Gracefully finishing'=%d 'Idle cleanup'=%d 'Open slot'=%d 'Requests/sec'=%0.1f 'kB per sec'=%0.1fKB 'kB per Request'=%0.1fKB\n", $timeelapsed, $IdleWorkers, $BusyWorkers, $CountOpenSlots, ($ScoreBoard =~ tr/\_//), ($ScoreBoard =~ tr/S//),($ScoreBoard =~ tr/R//),($ScoreBoard =~ tr/W//),($ScoreBoard =~ tr/K//),($ScoreBoard =~ tr/D//),($ScoreBoard =~ tr/C//),($ScoreBoard =~ tr/L//),($ScoreBoard =~ tr/G//),($ScoreBoard =~ tr/I//), $CountOpenSlots, $ReqPerSec, $KbPerSec, $KbPerReq);
+ exit $ERRORS{"WARNING"}
+ }
+ }
+ printf("OK %f seconds response time. Idle %d, busy %d, open slots %d | 'Waiting for Connection'=%d 'Starting Up'=%d 'Reading Request'=%d 'Sending Reply'=%d 'Keepalive (read)'=%d 'DNS Lookup'=%d 'Closing Connection'=%d 'Logging'=%d 'Gracefully finishing'=%d 'Idle cleanup'=%d 'Open slot'=%d 'Requests/sec'=%0.1f 'kB per sec'=%0.1fKB 'kB per Request'=%0.1fKB\n", $timeelapsed, $IdleWorkers, $BusyWorkers, $CountOpenSlots, ($ScoreBoard =~ tr/\_//), ($ScoreBoard =~ tr/S//),($ScoreBoard =~ tr/R//),($ScoreBoard =~ tr/W//),($ScoreBoard =~ tr/K//),($ScoreBoard =~ tr/D//),($ScoreBoard =~ tr/C//),($ScoreBoard =~ tr/L//),($ScoreBoard =~ tr/G//),($ScoreBoard =~ tr/I//), $CountOpenSlots, $ReqPerSec, $KbPerSec, $KbPerReq);
+ exit $ERRORS{"OK"}
+}
+else {
+ if (defined($o_warn_level) || defined($o_crit_level)) {
+ printf("UNKNOWN %s\n", $response->status_line);
+ exit $ERRORS{"UNKNOWN"}
+ } else {
+ printf("CRITICAL %s\n", $response->status_line);
+ exit $ERRORS{"CRITICAL"}
+ }
+}
diff --git a/icinga2/plugins/check_ast_chans.pl b/icinga2/plugins/check_ast_chans.pl
new file mode 100644
index 0000000..46ffe39
--- /dev/null
+++ b/icinga2/plugins/check_ast_chans.pl
@@ -0,0 +1,166 @@
+#!/usr/bin/perl
+
+# check_ast_chans.pl - Icinga plugin to check total asterisk channel usage
+#
+# Copyright (C) 2018 James Pearson LICENSE: AGPLv2
+#
+
+### All my lovely little modules
+use warnings;
+use Net::Telnet ();
+use Getopt::Long;
+
+# Nagios specific
+use lib "/usr/lib/nagios/plugins";
+our $TIMEOUT;
+our %ERRORS;
+eval 'use utils qw(%ERRORS $TIMEOUT)';
+if ($@) {
+ $TIMEOUT = 30;
+ %ERRORS = ('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
+}
+my $version='1.0';
+
+
+### Set-up some useful defaults
+$DB=0;
+$channel_warn = 0;
+$channel_crit = 0;
+$asterisk_host = "127.0.0.1";
+$asterisk_port = "5038";
+$asterisk_user = "cron";
+$asterisk_pass = "1234";
+$timeout = 3;
+$return_code = 3; # By default, our return state is unknown unless specifically set otherwise
+$return_perf_data = 0;
+$max_chan_ct=450;
+$min_chan_ct=0;
+
+sub debugoutput {
+ # I got tired of repeating this code snippet, so this gives debug output, with optional critical die
+ my $debugline = shift;
+ my $debugdie = 0;
+ $debugdie = shift;
+ if ($DB==1 and $debugdie==0) {
+ # We are just giving output, nothing more
+ print "$debugline\n";
+ } elsif ($DB==1 and $debugdie==1) {
+ # Evidently it was a critical error, so we die on output
+ die("$debugline\n");
+ }
+}
+
+sub usage {
+ print "\n\nAsterisk channel monitoring through AMI for Nagios/Icinga\n\n";
+ print "allowed run time options:\n";
+ print " [-H $asterisk_host] = Asterisk Host or IP\n";
+ print " [-U $asterisk_user] = AMI Username\n";
+ print " [-P $asterisk_pass] = AMI Password\n";
+ print " [-p $asterisk_port] = AMI port\n";
+ print " [-w $channel_warn] = Warning Level, none if not specified\n";
+ print " [-c $channel_crit] = Critical Level, none if not specified\n";
+ print " [-t $timeout] = Timeout to wait for AMI connection\n";
+ print " [-f] = Return performance data\n";
+ print " [--debug] = Debug Output for testing\n";
+ print " [--help] = This help screen\n";
+ exit $ERRORS{'UNKNOWN'};
+}
+
+Getopt::Long::Configure('bundling', 'no_ignore_case');
+GetOptions(
+ 'host|H=s' => \$asterisk_host,
+ 'user|U=s' => \$asterisk_user,
+ 'pass|P=s' => \$asterisk_pass,
+ 'port|p=i' => \$asterisk_port,
+ 'warn|w=i' => \$channel_warn,
+ 'crit|c=i' => \$channel_crit,
+ 'timeout|t=i' => \$timeout,
+ 'f' => \$return_perf_data,
+ 'debug' => \$DB,
+ 'help' => sub { &usage(); },
+);
+
+if ($channel_warn>0 or $channel_crit>0 ) {
+ if ($channel_warn==0 or $channel_crit==0) {
+ print "Warning and Critical must both be specified!\n";
+ exit $ERRORS{'UNKNOWN'};
+ }
+ if ($channel_warn > $channel_crit) {
+ print "Critical level must be higher then Warning level!\n";
+ exit $ERRORS{'UNKNOWN'};
+ }
+}
+
+if ($DB==1) {
+ print "\n\nAsterisk channel monitoring through AMI for Nagios/Icinga\n\n";
+ print "\n----- DEBUG -----\n\n";
+ print " Host: $asterisk_host\n";
+ print " User: $asterisk_user\n";
+ print " Pass: $asterisk_pass\n";
+ print " Port: $asterisk_port\n";
+ print " Time: $timeout\n";
+ if ($channel_warn>0 or $channel_crit>0) {
+ print " Warn: $channel_warn\n";
+ print " Crit: $channel_crit\n";
+ } else {
+ print " Not checking for warn/crit\n";
+ }
+ if ($return_perf_data==1) { print " Perf: Enabled\n";}
+}
+
+# Lets login
+$t = new Net::Telnet (Port => $asterisk_port,
+ Timeout => $timeout,
+ Prompt => '/.*[\$%#>] $/',
+ Output_record_separator => '',
+ Errmode => 'return' );
+#$fh = $t->dump_log("$telnetlog"); # uncomment for telnet log
+
+# Login to the AMI and get our channel list
+$t->open("$asterisk_host");
+if ($t->errmsg) { print "Could not connect to Asterisk!\n"; exit $ERRORS{'UNKNOWN'}; }
+$t->waitfor('/[0123]\n$/'); # print login
+if ($t->errmsg) { print "Login Prompt not Received!\n"; exit $ERRORS{'UNKNOWN'}; }
+$t->print("Action: Login\nUsername: $asterisk_user\nSecret: $asterisk_pass\n\n");
+if ($t->errmsg) { print "Login Information Incorrect!\n"; exit $ERRORS{'UNKNOWN'}; }
+$t->waitfor('/Authentication accepted/'); # waitfor auth accepted
+if ($t->errmsg) { print "Command not Accepted!\n"; exit $ERRORS{'UNKNOWN'};}
+@list_channels = $t->cmd(String => "Action: Status\n\n", Prompt => '/Event: StatusComplete.*/');
+$t->print("Action: Logoff\n\n");
+$t->close;
+
+# Now loop through the channel listing and figure out what we got
+$test_zap_count=0;
+$test_iax_count=0;
+$test_local_count=0;
+$test_sip_count=0;
+$active_channels = 0;
+$s=0;
+foreach(@list_channels) {
+ if ($list_channels[$s] =~ /^Channel: SIP/) {$test_sip_count++; $active_channels++; debugoutput("Found SIP Channel",0);}
+ if ($list_channels[$s] =~ /^Channel: Local/) {$test_local_count++; $active_channels++; debugoutput("Found Local Channel",0);}
+ if ($list_channels[$s] =~ /^Channel: IAX2/) {$test_iax_count++; $active_channels++; debugoutput("Found IAX Channel",0);}
+ if ($list_channels[$s] =~ /^Channel: ZAP/) {$test_zap_count++; $active_channels++; debugoutput("Found ZAP/DAHDI Channel",0);}
+ if ($list_channels[$s] =~ /^Channel: DAHDI/) {$test_zap_count++; $active_channels++; debugoutput("Found ZAP/DAHDI Channel",0);}
+ #debugoutput("Channel Line: $list_channels[$s]",0)
+ $s++;
+}
+$return_string = "Active: $active_channels , SIP: $test_sip_count , IAX: $test_iax_count , ZAP/DAH: $test_zap_count, Local: $test_local_count";
+debugoutput("Init Channel Return String: $return_string",0);
+
+# Do our crit/warning checking and perfdata processing
+if ($s>0) { $return_code=0; } # Basically, if we had any output then we got a channel listing, even if no channels
+if ($channel_warn>0 && $active_channels>$channel_warn) { $return_code=1;}
+if ($channel_crit>0 && $active_channels>$channel_crit) { $return_code=2;}
+if ($return_perf_data==1) {
+ if ($channel_warn > 0) {
+ $return_string = $return_string . " | astchannels=$active_channels;$channel_warn;$channel_crit;$min_chan_ct;$max_chan_ct";
+ } else {
+ $return_string = $return_string . " | channels=$active_channels";
+ }
+ debugoutput("Perf Channel Return String: $return_string",0);
+}
+
+if ($return_code==0) { $return_string = "OK : " . $return_string; print "$return_string\n"; exit $ERRORS{'OK'};}
+if ($return_code==1) { $return_string = "WARNING : " . $return_string; print "$return_string\n"; exit $ERRORS{'WARNING'};}
+if ($return_code==2) { $return_string = "CRITICAL : " . $return_string; print "$return_string\n"; exit $ERRORS{'CRITICAL'};}
diff --git a/icinga2/plugins/check_snmp_load.pl b/icinga2/plugins/check_snmp_load.pl
new file mode 100644
index 0000000..455d21c
--- /dev/null
+++ b/icinga2/plugins/check_snmp_load.pl
@@ -0,0 +1,794 @@
+#!/usr/bin/perl -w
+############################## check_snmp_load #################
+my $Version='1.3.3';
+# Date : Oct 12 2007
+# Author : Patrick Proy ( patrick at proy.org)
+# Help : http://nagios.manubulon.com/
+# Licence : GPL - http://www.fsf.org/licenses/gpl.txt
+# Contributors : F. Lacroix and many others !!!
+#################################################################
+# Contributor: M. Pagano
+# Date : Jan 20 2011
+# Added support for Cisco ASA 5500
+# Date : Nov 13 2012
+# Changed Perfdata to allow better use of data.
+#
+# Help : ./check_snmp_load.pl -h
+#
+
+use strict;
+use Net::SNMP;
+use Getopt::Long;
+
+# Nagios specific
+
+my $TIMEOUT = 15;
+my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
+
+# SNMP Datas
+
+# Generic with host-ressource-mib
+my $base_proc = "1.3.6.1.2.1.25.3.3.1"; # oid for all proc info
+my $proc_id = "1.3.6.1.2.1.25.3.3.1.1"; # list of processors (product ID)
+my $proc_load = "1.3.6.1.2.1.25.3.3.1.2"; # %time the proc was not idle over last minute
+
+# Linux load
+
+my $linload_table= "1.3.6.1.4.1.2021.10.1"; # net-snmp load table
+my $linload_name = "1.3.6.1.4.1.2021.10.1.2"; # text 'Load-1','Load-5', 'Load-15'
+my $linload_load = "1.3.6.1.4.1.2021.10.1.3"; # effective load table
+
+# Cisco cpu/load
+
+my $cisco_cpu_5m = "1.3.6.1.4.1.9.2.1.58.0"; # Cisco CPU load (5min %)
+my $cisco_cpu_1m = "1.3.6.1.4.1.9.2.1.57.0"; # Cisco CPU load (1min %)
+my $cisco_cpu_5s = "1.3.6.1.4.1.9.2.1.56.0"; # Cisco CPU load (5sec %)
+
+# Cisco catalyst cpu/load
+
+my $ciscocata_cpu_5m = ".1.3.6.1.4.1.9.9.109.1.1.1.1.5.9"; # Cisco CPU load (5min %)
+my $ciscocata_cpu_1m = ".1.3.6.1.4.1.9.9.109.1.1.1.1.3.9"; # Cisco CPU load (1min %)
+my $ciscocata_cpu_5s = ".1.3.6.1.4.1.9.9.109.1.1.1.1.4.9"; # Cisco CPU load (5sec %)
+
+# Cisco ASA5500 cpu/load
+
+my $ciscoasa_cpu_5m = "1.3.6.1.4.1.9.9.109.1.1.1.1.5.1"; # Cisco CPU load (5min %)
+my $ciscoasa_cpu_1m = "1.3.6.1.4.1.9.9.109.1.1.1.1.4.1"; # Cisco CPU load (1min %)
+my $ciscoasa_cpu_5s = "1.3.6.1.4.1.9.9.109.1.1.1.1.3.1"; # Cisco CPU load (5sec %)
+
+# Netscreen cpu/load
+
+my $nsc_cpu_5m = "1.3.6.1.4.1.3224.16.1.4.0"; # NS CPU load (5min %)
+my $nsc_cpu_1m = "1.3.6.1.4.1.3224.16.1.2.0"; # NS CPU load (1min %)
+my $nsc_cpu_5s = "1.3.6.1.4.1.3224.16.1.3.0"; # NS CPU load (5sec %)
+
+# AS/400 CPU
+
+my $as400_cpu = "1.3.6.1.4.1.2.6.4.5.1.0"; # AS400 CPU load (10000=100%);
+
+# Net-SNMP CPU
+
+my $ns_cpu_idle = "1.3.6.1.4.1.2021.11.11.0"; # Net-snmp cpu idle
+my $ns_cpu_user = "1.3.6.1.4.1.2021.11.9.0"; # Net-snmp user cpu usage
+my $ns_cpu_system = "1.3.6.1.4.1.2021.11.10.0"; # Net-snmp system cpu usage
+
+# Procurve CPU
+my $procurve_cpu = "1.3.6.1.4.1.11.2.14.11.5.1.9.6.1.0"; # Procurve CPU Counter
+
+# Nokia CPU
+my $nokia_cpu = "1.3.6.1.4.1.94.1.21.1.7.1.0"; # Nokia CPU % usage
+
+# Bluecoat Appliance
+my $bluecoat_cpu = "1.3.6.1.4.1.3417.2.4.1.1.1.4.1"; # Bluecoat %cpu usage.
+
+# Fortigate CPU
+my $fortigate_cpu = ".1.3.6.1.4.1.12356.1.8.0"; # Fortigate CPU % usage
+
+# Linkproof Appliance
+my $linkproof_cpu= "1.3.6.1.4.1.89.35.1.55.0"; # CPU RE (Routing Engine Tasks)
+# 1.3.6.1.4.1.89.35.1.53.0 : Ressource utilisation (%) Considers network utilization and internal CPU utilization
+# 1.3.6.1.4.1.89.35.1.54 : CPU only (%)
+# 1.3.6.1.4.1.89.35.1.55 : network only (%)
+
+# HP-UX cpu usage (thanks to krizb for the OIDs).
+my $hpux_load_1_min="1.3.6.1.4.1.11.2.3.1.1.3.0";
+my $hpux_load_5_min="1.3.6.1.4.1.11.2.3.1.1.4.0";
+my $hpux_load_15_min="1.3.6.1.4.1.11.2.3.1.1.5.0";
+
+# valid values
+my @valid_types = ("stand","netsc","netsl","as400","cisco","cata","c5500","nsc","fg","bc","nokia","hp","lp","hpux");
+# CPU OID array
+my %cpu_oid = ("netsc",$ns_cpu_idle,"as400",$as400_cpu,"bc",$bluecoat_cpu,"nokia",$nokia_cpu,"hp",$procurve_cpu,"lp",$linkproof_cpu,"fg",$fortigate_cpu);
+
+# Globals
+
+
+my $o_host = undef; # hostname
+my $o_community = undef; # community
+my $o_port = 161; # port
+my $o_help= undef; # wan't some help ?
+my $o_verb= undef; # verbose mode
+my $o_version= undef; # print version
+# check type : stand | netsc | netsl | as400 | cisco | cata | c5500 | nsc | fg | bc | nokia | hp | lp | hpux
+my $o_check_type= "stand";
+# End compatibility
+my $o_warn= undef; # warning level
+my @o_warnL= undef; # warning levels for Linux Load or Cisco CPU
+my $o_crit= undef; # critical level
+my @o_critL= undef; # critical level for Linux Load or Cisco CPU
+my $o_timeout= undef; # Timeout (Default 5)
+my $o_perf= undef; # Output performance data
+my $o_version2= undef; # use snmp v2c
+# SNMPv3 specific
+my $o_login= undef; # Login for snmpv3
+my $o_passwd= undef; # Pass for snmpv3
+my $v3protocols=undef; # V3 protocol list.
+my $o_authproto='md5'; # Auth protocol
+my $o_privproto='des'; # Priv protocol
+my $o_privpass= undef; # priv password
+
+# functions
+
+sub p_version { print "check_snmp_load version : $Version\n"; }
+
+sub print_usage {
+ print "Usage: $0 [-v] -H -C [-2] | (-l login -x passwd [-X pass -L ,]) [-p ] -w -c -T=[stand|netsl|netsc|as400|cisco|cata|c5500|nsc|fg|bc|nokia|hp|lp|hpux] [-f] [-t ] [-V]\n";
+}
+
+sub isnnum { # Return true if arg is not a number
+ my $num = shift;
+ if ( $num =~ /^(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;}
+ return 1;
+}
+
+sub help {
+ print "\nSNMP Load & CPU Monitor for Nagios version ",$Version,"\n";
+ print "GPL licence, (c)2004-2007 Patrick Proy\n\n";
+ print_usage();
+ print <,
+ : Authentication protocol (md5|sha : default md5)
+ : Priv protocole (des|aes : default des)
+-P, --port=PORT
+ SNMP port (Default 161)
+-w, --warn=INTEGER | INT,INT,INT
+ 1 value check : warning level for cpu in percent (on one minute)
+ 3 value check : comma separated level for load or cpu for 1min, 5min, 15min
+-c, --crit=INTEGER | INT,INT,INT
+ critical level for cpu in percent (on one minute)
+ 1 value check : critical level for cpu in percent (on one minute)
+ 3 value check : comma separated level for load or cpu for 1min, 5min, 15min
+-T, --type=stand|netsl|netsc|as400|cisco|cata|c5500|bc|nokia|hp|lp
+ CPU check :
+ stand : standard MIBII (works with Windows),
+ can handle multiple CPU.
+ netsl : linux load provided by Net SNMP (1,5 & 15 minutes values)
+ netsc : cpu usage given by net-snmp (100-idle)
+ as400 : as400 CPU usage
+ cisco : Cisco CPU usage
+ cata : Cisco catalyst CPU usage
+ c5500 : Cisco ASA 5500 CPU usage
+ nsc : NetScreen CPU usage
+ fg : Fortigate CPU usage
+ bc : Bluecoat CPU usage
+ nokia : Nokia CPU usage
+ hp : HP procurve switch CPU usage
+ lp : Linkproof CPU usage
+ hpux : HP-UX load (1,5 & 15 minutes values)
+-f, --perfparse
+ Perfparse compatible output
+-t, --timeout=INTEGER
+ timeout for SNMP in seconds (Default: 5)
+-V, --version
+ prints version number
+EOT
+}
+
+# For verbose output
+sub verb { my $t=shift; print $t,"\n" if defined($o_verb) ; }
+
+sub check_options {
+ Getopt::Long::Configure ("bundling");
+ GetOptions(
+ 'v' => \$o_verb, 'verbose' => \$o_verb,
+ 'h' => \$o_help, 'help' => \$o_help,
+ 'H:s' => \$o_host, 'hostname:s' => \$o_host,
+ 'p:i' => \$o_port, 'port:i' => \$o_port,
+ 'C:s' => \$o_community, 'community:s' => \$o_community,
+ 'l:s' => \$o_login, 'login:s' => \$o_login,
+ 'x:s' => \$o_passwd, 'passwd:s' => \$o_passwd,
+ 'X:s' => \$o_privpass, 'privpass:s' => \$o_privpass,
+ 'L:s' => \$v3protocols, 'protocols:s' => \$v3protocols,
+ 't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
+ 'V' => \$o_version, 'version' => \$o_version,
+ '2' => \$o_version2, 'v2c' => \$o_version2,
+ 'c:s' => \$o_crit, 'critical:s' => \$o_crit,
+ 'w:s' => \$o_warn, 'warn:s' => \$o_warn,
+ 'f' => \$o_perf, 'perfparse' => \$o_perf,
+ 'T:s' => \$o_check_type, 'type:s' => \$o_check_type
+ );
+ # check the -T option
+ my $T_option_valid=0;
+ foreach (@valid_types) { if ($_ eq $o_check_type) {$T_option_valid=1} };
+ if ( $T_option_valid == 0 )
+ {print "Invalid check type (-T)!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ # Basic checks
+ if (defined($o_timeout) && (isnnum($o_timeout) || ($o_timeout < 2) || ($o_timeout > 60)))
+ { print "Timeout must be >1 and <60 !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if (!defined($o_timeout)) {$o_timeout=5;}
+ if (defined ($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}};
+ if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}};
+ if ( ! defined($o_host) ) # check host and filter
+ { print_usage(); exit $ERRORS{"UNKNOWN"}}
+ # check snmp information
+ if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) )
+ { print "Put snmp login info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if ((defined($o_login) || defined($o_passwd)) && (defined($o_community) || defined($o_version2)) )
+ { print "Can't mix snmp v1,2c,3 protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if (defined ($v3protocols)) {
+ if (!defined($o_login)) { print "Put snmp V3 login info with protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ my @v3proto=split(/,/,$v3protocols);
+ if ((defined ($v3proto[0])) && ($v3proto[0] ne "")) {$o_authproto=$v3proto[0]; } # Auth protocol
+ if (defined ($v3proto[1])) {$o_privproto=$v3proto[1]; } # Priv protocol
+ if ((defined ($v3proto[1])) && (!defined($o_privpass))) {
+ print "Put snmp V3 priv login info with priv protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ }
+ # Check warnings and critical
+ if (!defined($o_warn) || !defined($o_crit))
+ { print "put warning and critical info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ # Get rid of % sign
+ $o_warn =~ s/\%//g;
+ $o_crit =~ s/\%//g;
+ # Check for multiple warning and crit in case of -L
+ if (($o_check_type eq "netsl") || ($o_check_type eq "cisco") || ($o_check_type eq "cata") ||
+ ($o_check_type eq "c5500") || ($o_check_type eq "nsc") || ($o_check_type eq "hpux")) {
+ @o_warnL=split(/,/ , $o_warn);
+ @o_critL=split(/,/ , $o_crit);
+ if (($#o_warnL != 2) || ($#o_critL != 2))
+ { print "3 warnings and critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
+ for (my $i=0;$i<3;$i++) {
+ if ( isnnum($o_warnL[$i]) || isnnum($o_critL[$i]))
+ { print "Numeric value for warning or critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if ($o_warnL[$i] > $o_critL[$i])
+ { print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}}
+ }
+ } else {
+ if (($o_warn =~ /,/) || ($o_crit =~ /,/)) {
+ { print "Multiple warning/critical levels not available for this check\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
+ }
+ if ( isnnum($o_warn) || isnnum($o_crit) )
+ { print "Numeric value for warning or critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if ($o_warn > $o_crit)
+ { print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}}
+ }
+}
+
+########## MAIN #######
+
+check_options();
+
+# Check gobal timeout if snmp screws up
+if (defined($TIMEOUT)) {
+ verb("Alarm at $TIMEOUT + 5");
+ alarm($TIMEOUT+5);
+} else {
+ verb("no global timeout defined : $o_timeout + 10");
+ alarm ($o_timeout+10);
+}
+
+$SIG{'ALRM'} = sub {
+ print "No answer from host\n";
+ exit $ERRORS{"UNKNOWN"};
+};
+
+# Connect to host
+my ($session,$error);
+if ( defined($o_login) && defined($o_passwd)) {
+ # SNMPv3 login
+ verb("SNMPv3 login");
+ if (!defined ($o_privpass)) {
+ verb("SNMPv3 AuthNoPriv login : $o_login, $o_authproto");
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $o_host,
+ -version => '3',
+ -username => $o_login,
+ -authpassword => $o_passwd,
+ -authprotocol => $o_authproto,
+ -timeout => $o_timeout
+ );
+ } else {
+ verb("SNMPv3 AuthPriv login : $o_login, $o_authproto, $o_privproto");
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $o_host,
+ -version => '3',
+ -username => $o_login,
+ -authpassword => $o_passwd,
+ -authprotocol => $o_authproto,
+ -privpassword => $o_privpass,
+ -privprotocol => $o_privproto,
+ -timeout => $o_timeout
+ );
+ }
+} else {
+ if (defined ($o_version2)) {
+ # SNMPv2 Login
+ verb("SNMP v2c login");
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $o_host,
+ -version => 2,
+ -community => $o_community,
+ -port => $o_port,
+ -timeout => $o_timeout
+ );
+ } else {
+ # SNMPV1 login
+ verb("SNMP v1 login");
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $o_host,
+ -community => $o_community,
+ -port => $o_port,
+ -timeout => $o_timeout
+ );
+ }
+}
+if (!defined($session)) {
+ printf("ERROR opening session: %s.\n", $error);
+ exit $ERRORS{"UNKNOWN"};
+}
+
+my $exit_val=undef;
+########### Linux load check ##############
+
+if ($o_check_type eq "netsl") {
+
+verb("Checking linux load");
+# Get load table
+my $resultat = (Net::SNMP->VERSION lt 4) ?
+ $session->get_table($linload_table)
+ : $session->get_table(Baseoid => $linload_table);
+
+if (!defined($resultat)) {
+ printf("ERROR: Description table : %s.\n", $session->error);
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+}
+$session->close;
+
+my @load = undef;
+my @iload = undef;
+my @oid=undef;
+my $exist=0;
+foreach my $key ( keys %$resultat) {
+ verb("OID : $key, Desc : $$resultat{$key}");
+ if ( $key =~ /$linload_name/ ) {
+ @oid=split (/\./,$key);
+ $iload[0]= pop(@oid) if ($$resultat{$key} eq "Load-1");
+ $iload[1]= pop(@oid) if ($$resultat{$key} eq "Load-5");
+ $iload[2]= pop(@oid) if ($$resultat{$key} eq "Load-15");
+ $exist=1
+ }
+}
+
+if ($exist == 0) {
+ print "Can't find snmp information on load : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+}
+
+for (my $i=0;$i<3;$i++) { $load[$i] = $$resultat{$linload_load . "." . $iload[$i]}};
+
+print "Load : $load[0] $load[1] $load[2] :";
+
+$exit_val=$ERRORS{"OK"};
+for (my $i=0;$i<3;$i++) {
+ if ( $load[$i] > $o_critL[$i] ) {
+ print " $load[$i] > $o_critL[$i] : CRITICAL";
+ $exit_val=$ERRORS{"CRITICAL"};
+ }
+ if ( $load[$i] > $o_warnL[$i] ) {
+ # output warn error only if no critical was found
+ if ($exit_val eq $ERRORS{"OK"}) {
+ print " $load[$i] > $o_warnL[$i] : WARNING";
+ $exit_val=$ERRORS{"WARNING"};
+ }
+ }
+}
+print " OK" if ($exit_val eq $ERRORS{"OK"});
+if (defined($o_perf)) {
+ print " | load_5_sec=$load[0];$o_warnL[0];$o_critL[0] ";
+ print "load_1_min=$load[1];$o_warnL[1];$o_critL[1] ";
+ print "load_5_min=$load[2];$o_warnL[2];$o_critL[2]\n";
+} else {
+ print "\n";
+}
+exit $exit_val;
+}
+
+############## Cisco CPU check ################
+
+if ($o_check_type eq "cisco") {
+my @oidlists = ($cisco_cpu_5m, $cisco_cpu_1m, $cisco_cpu_5s);
+my $resultat = (Net::SNMP->VERSION lt 4) ?
+ $session->get_request(@oidlists)
+ : $session->get_request(-varbindlist => \@oidlists);
+
+if (!defined($resultat)) {
+ printf("ERROR: Description table : %s.\n", $session->error);
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+}
+
+$session->close;
+
+if (!defined ($$resultat{$cisco_cpu_5s})) {
+ print "No CPU information : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+}
+
+my @load = undef;
+
+$load[0]=$$resultat{$cisco_cpu_5s};
+$load[1]=$$resultat{$cisco_cpu_1m};
+$load[2]=$$resultat{$cisco_cpu_5m};
+
+print "CPU : $load[0] $load[1] $load[2] :";
+
+$exit_val=$ERRORS{"OK"};
+for (my $i=0;$i<3;$i++) {
+ if ( $load[$i] > $o_critL[$i] ) {
+ print " $load[$i] > $o_critL[$i] : CRITICAL";
+ $exit_val=$ERRORS{"CRITICAL"};
+ }
+ if ( $load[$i] > $o_warnL[$i] ) {
+ # output warn error only if no critical was found
+ if ($exit_val eq $ERRORS{"OK"}) {
+ print " $load[$i] > $o_warnL[$i] : WARNING";
+ $exit_val=$ERRORS{"WARNING"};
+ }
+ }
+}
+print " OK" if ($exit_val eq $ERRORS{"OK"});
+if (defined($o_perf)) {
+ print " | load_5_sec=$load[0];$o_warnL[0];$o_critL[0] ";
+ print "load_1_min=$load[1];$o_warnL[1];$o_critL[1] ";
+ print "load_5_min=$load[2];$o_warnL[2];$o_critL[2]\n";
+} else {
+ print "\n";
+}
+
+exit $exit_val;
+}
+
+############## Cisco Catalyst CPU check ################
+
+if ($o_check_type eq "cata") {
+my @oidlists = ($ciscocata_cpu_5m, $ciscocata_cpu_1m, $ciscocata_cpu_5s);
+my $resultat = (Net::SNMP->VERSION lt 4) ?
+ $session->get_request(@oidlists)
+ : $session->get_request(-varbindlist => \@oidlists);
+
+if (!defined($resultat)) {
+ printf("ERROR: Description table : %s.\n", $session->error);
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+}
+
+$session->close;
+
+if (!defined ($$resultat{$ciscocata_cpu_5s})) {
+ print "No CPU information : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+}
+
+my @load = undef;
+
+$load[0]=$$resultat{$ciscocata_cpu_5s};
+$load[1]=$$resultat{$ciscocata_cpu_1m};
+$load[2]=$$resultat{$ciscocata_cpu_5m};
+
+print "CPU : $load[0] $load[1] $load[2] :";
+
+$exit_val=$ERRORS{"OK"};
+for (my $i=0;$i<3;$i++) {
+ if ( $load[$i] > $o_critL[$i] ) {
+ print " $load[$i] > $o_critL[$i] : CRITICAL";
+ $exit_val=$ERRORS{"CRITICAL"};
+ }
+ if ( $load[$i] > $o_warnL[$i] ) {
+ # output warn error only if no critical was found
+ if ($exit_val eq $ERRORS{"OK"}) {
+ print " $load[$i] > $o_warnL[$i] : WARNING";
+ $exit_val=$ERRORS{"WARNING"};
+ }
+ }
+}
+print " OK" if ($exit_val eq $ERRORS{"OK"});
+if (defined($o_perf)) {
+ print " | load_5_sec=$load[0];$o_warnL[0];$o_critL[0] ";
+ print "load_1_min=$load[1];$o_warnL[1];$o_critL[1] ";
+ print "load_5_min=$load[2];$o_warnL[2];$o_critL[2]\n";
+} else {
+ print "\n";
+}
+
+exit $exit_val;
+}
+
+############## Cisco ASA 5500 CPU check ################
+
+if ($o_check_type eq "c5500") {
+my @oidlists = ($ciscoasa_cpu_5m, $ciscoasa_cpu_1m, $ciscoasa_cpu_5s);
+my $resultat = (Net::SNMP->VERSION lt 4) ?
+ $session->get_request(@oidlists)
+ : $session->get_request(-varbindlist => \@oidlists);
+
+if (!defined($resultat)) {
+ printf("ERROR: Description table : %s.\n", $session->error);
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+}
+
+$session->close;
+
+if (!defined ($$resultat{$ciscoasa_cpu_5s})) {
+ print "No CPU information : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+}
+
+my @load = undef;
+
+$load[0]=$$resultat{$ciscoasa_cpu_5s};
+$load[1]=$$resultat{$ciscoasa_cpu_1m};
+$load[2]=$$resultat{$ciscoasa_cpu_5m};
+
+print "CPU : $load[0] $load[1] $load[2] :";
+
+$exit_val=$ERRORS{"OK"};
+for (my $i=0;$i<3;$i++) {
+ if ( $load[$i] > $o_critL[$i] ) {
+ print " $load[$i] > $o_critL[$i] : CRITICAL";
+ $exit_val=$ERRORS{"CRITICAL"};
+ }
+ if ( $load[$i] > $o_warnL[$i] ) {
+ # output warn error only if no critical was found
+ if ($exit_val eq $ERRORS{"OK"}) {
+ print " $load[$i] > $o_warnL[$i] : WARNING";
+ $exit_val=$ERRORS{"WARNING"};
+ }
+ }
+}
+print " OK" if ($exit_val eq $ERRORS{"OK"});
+if (defined($o_perf)) {
+ print " | load_5_sec=$load[0];$o_warnL[0];$o_critL[0] ";
+ print "load_1_min=$load[1];$o_warnL[1];$o_critL[1], ";
+ print "load_5_min=$load[2];$o_warnL[2];$o_critL[2]\n";
+} else {
+ print "\n";
+}
+
+exit $exit_val;
+}
+
+############## Netscreen CPU check ################
+
+if ($o_check_type eq "nsc") {
+my @oidlists = ($nsc_cpu_5m, $nsc_cpu_1m, $nsc_cpu_5s);
+my $resultat = (Net::SNMP->VERSION lt 4) ?
+ $session->get_request(@oidlists)
+ : $session->get_request(-varbindlist => \@oidlists);
+
+if (!defined($resultat)) {
+ printf("ERROR: Description table : %s.\n", $session->error);
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+}
+
+$session->close;
+
+if (!defined ($$resultat{$nsc_cpu_5s})) {
+ print "No CPU information : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+}
+
+my @load = undef;
+
+$load[0]=$$resultat{$nsc_cpu_5s};
+$load[1]=$$resultat{$nsc_cpu_1m};
+$load[2]=$$resultat{$nsc_cpu_5m};
+
+print "CPU : $load[0] $load[1] $load[2] :";
+
+$exit_val=$ERRORS{"OK"};
+for (my $i=0;$i<3;$i++) {
+ if ( $load[$i] > $o_critL[$i] ) {
+ print " $load[$i] > $o_critL[$i] : CRITICAL";
+ $exit_val=$ERRORS{"CRITICAL"};
+ }
+ if ( $load[$i] > $o_warnL[$i] ) {
+ # output warn error only if no critical was found
+ if ($exit_val eq $ERRORS{"OK"}) {
+ print " $load[$i] > $o_warnL[$i] : WARNING";
+ $exit_val=$ERRORS{"WARNING"};
+ }
+ }
+}
+print " OK" if ($exit_val eq $ERRORS{"OK"});
+if (defined($o_perf)) {
+ print " | load_5_sec=$load[0];$o_warnL[0];$o_critL[0] ";
+ print "load_1_min=$load[1];$o_warnL[1];$o_critL[1], ";
+ print "load_5_min=$load[2];$o_warnL[2];$o_critL[2]\n";
+} else {
+ print "\n";
+}
+
+exit $exit_val;
+}
+
+################## CPU for : AS/400 , Netsnmp, HP, Bluecoat, linkproof, fortigate ###########
+if ( $o_check_type =~ /netsc|as400|bc|nokia|^hp$|lp|fg/ ) {
+
+# Get load table
+my @oidlist = $cpu_oid{$o_check_type};
+verb("Checking OID : @oidlist");
+my $resultat = (Net::SNMP->VERSION lt 4) ?
+ $session->get_request(@oidlist)
+ : $session->get_request(-varbindlist => \@oidlist);
+if (!defined($resultat)) {
+ printf("ERROR: Description table : %s.\n", $session->error);
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+}
+$session->close;
+
+if (!defined ($$resultat{$cpu_oid{$o_check_type}})) {
+ print "No CPU information : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+}
+
+my $load=$$resultat{$cpu_oid{$o_check_type}};
+verb("OID returned $load");
+# for AS400, divide by 100
+if ($o_check_type eq "as400") {$load /= 100; };
+# for Net-snmp : oid returned idle time so load = 100-idle.
+if ($o_check_type eq "netsc") {$load = 100 - $load; };
+
+printf("CPU used %.1f%% (",$load);
+
+$exit_val=$ERRORS{"OK"};
+if ($load > $o_crit) {
+ print ">$o_crit) : CRITICAL";
+ $exit_val=$ERRORS{"CRITICAL"};
+} else {
+ if ($load > $o_warn) {
+ print ">$o_warn) : WARNING";
+ $exit_val=$ERRORS{"WARNING"};
+ }
+}
+print "<$o_warn) : OK" if ($exit_val eq $ERRORS{"OK"});
+(defined($o_perf)) ?
+ print " | cpu_prct_used=$load\%;$o_warn;$o_crit\n"
+ : print "\n";
+exit $exit_val;
+
+}
+
+##### Checking hpux load
+if ($o_check_type eq "hpux") {
+
+verb("Checking hpux load");
+
+my @oidlists = ($hpux_load_1_min, $hpux_load_5_min, $hpux_load_15_min);
+my $resultat = (Net::SNMP->VERSION lt 4) ?
+ $session->get_request(@oidlists)
+ : $session->get_request(-varbindlist => \@oidlists);
+
+if (!defined($resultat)) {
+ printf("ERROR: Load table : %s.\n", $session->error);
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+}
+
+$session->close;
+
+if (!defined ($$resultat{$hpux_load_1_min})) {
+ print "No Load information : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+}
+
+my @load = undef;
+
+$load[0]=$$resultat{$hpux_load_1_min}/100;
+$load[1]=$$resultat{$hpux_load_5_min}/100;
+$load[2]=$$resultat{$hpux_load_15_min}/100;
+
+print "Load : $load[0] $load[1] $load[2] :";
+
+$exit_val=$ERRORS{"OK"};
+for (my $i=0;$i<3;$i++) {
+ if ( $load[$i] > $o_critL[$i] ) {
+ print " $load[$i] > $o_critL[$i] : CRITICAL";
+ $exit_val=$ERRORS{"CRITICAL"};
+ }
+ if ( $load[$i] > $o_warnL[$i] ) {
+ # output warn error only if no critical was found
+ if ($exit_val eq $ERRORS{"OK"}) {
+ print " $load[$i] > $o_warnL[$i] : WARNING";
+ $exit_val=$ERRORS{"WARNING"};
+ }
+ }
+}
+print " OK" if ($exit_val eq $ERRORS{"OK"});
+if (defined($o_perf)) {
+ print " | load_5_sec=$load[0];$o_warnL[0];$o_critL[0] ";
+ print "load_1_min=$load[1];$o_warnL[1];$o_critL[1] ";
+ print "load_5_min=$load[2];$o_warnL[2];$o_critL[2]\n";
+} else {
+ print "\n";
+}
+
+exit $exit_val;
+}
+
+########## Standard cpu usage check ############
+# Get desctiption table
+my $resultat = (Net::SNMP->VERSION lt 4) ?
+ $session->get_table($base_proc)
+ : $session->get_table(Baseoid => $base_proc);
+
+if (!defined($resultat)) {
+ printf("ERROR: Description table : %s.\n", $session->error);
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+}
+
+$session->close;
+
+my ($cpu_used,$ncpu)=(0,0);
+foreach my $key ( keys %$resultat) {
+ verb("OID : $key, Desc : $$resultat{$key}");
+ if ( $key =~ /$proc_load/) {
+ $cpu_used += $$resultat{$key};
+ $ncpu++;
+ }
+}
+
+if ($ncpu==0) {
+ print "Can't find CPU usage information : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"};
+}
+
+$cpu_used /= $ncpu;
+
+print "$ncpu CPU, ", $ncpu==1 ? "load" : "average load";
+printf(" %.1f%%",$cpu_used);
+$exit_val=$ERRORS{"OK"};
+
+if ($cpu_used > $o_crit) {
+ print " > $o_crit% : CRITICAL";
+ $exit_val=$ERRORS{"CRITICAL"};
+} else {
+ if ($cpu_used > $o_warn) {
+ print " > $o_warn% : WARNING";
+ $exit_val=$ERRORS{"WARNING"};
+ }
+}
+print " < $o_warn% : OK" if ($exit_val eq $ERRORS{"OK"});
+(defined($o_perf)) ?
+ print " | cpu_prct_used=$cpu_used\%;$o_warn;$o_crit\n"
+ : print "\n";
+exit $exit_val;
+
diff --git a/icinga2/plugins/check_snmp_mem.pl b/icinga2/plugins/check_snmp_mem.pl
new file mode 100644
index 0000000..000b9b2
--- /dev/null
+++ b/icinga2/plugins/check_snmp_mem.pl
@@ -0,0 +1,524 @@
+#!/usr/bin/perl -w
+############################## check_snmp_mem ##############
+my $Version='1.5';
+# Date : 17 October 2007
+# Author : Patrick Proy (nagios at proy.org)
+# Help : http://nagios.manubulon.com/
+# Licence : GPL - http://www.fsf.org/licenses/gpl.txt
+# Contrib : Jan Jungmann, Patrick Griffin
+# TODO :
+#################################################################
+#
+# Help : ./check_snmp_mem.pl -h
+#
+
+use strict;
+use Net::SNMP;
+use Getopt::Long;
+
+# Nagios specific
+
+my $TIMEOUT = 15;
+my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
+
+# SNMP Datas
+
+# Net-snmp memory
+
+my $nets_ram_free = "1.3.6.1.4.1.2021.4.6.0"; # Real memory free
+my $nets_ram_total = "1.3.6.1.4.1.2021.4.5.0"; # Real memory total
+my $nets_ram_buffer = "1.3.6.1.4.1.2021.4.14.0"; # Real memory buffered
+my $nets_ram_cache = "1.3.6.1.4.1.2021.4.15.0"; # Real memory cached
+my $nets_swap_free = "1.3.6.1.4.1.2021.4.4.0"; # swap memory free
+my $nets_swap_total = "1.3.6.1.4.1.2021.4.3.0"; # Swap memory total
+my @nets_oids = ($nets_ram_free,$nets_ram_total,$nets_swap_free,$nets_swap_total,$nets_ram_cache,$nets_ram_buffer);
+
+# Cisco
+
+my $cisco_mem_pool = "1.3.6.1.4.1.9.9.48.1.1.1"; # Cisco memory pool
+my $cisco_index = "1.3.6.1.4.1.9.9.48.1.1.1.2"; # memory pool name and index
+my $cisco_valid = "1.3.6.1.4.1.9.9.48.1.1.1.4"; # Valid memory if 1
+my $cisco_used = "1.3.6.1.4.1.9.9.48.1.1.1.5"; # Used memory
+my $cisco_free = "1.3.6.1.4.1.9.9.48.1.1.1.6"; # Free memory
+# .1 : type, .2 : name, .3 : alternate, .4 : valid, .5 : used, .6 : free, .7 : max free
+
+# HP Procurve
+
+my $hp_mem_pool = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1"; # HP memory pool
+my $hp_mem_index = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1.1"; # memory slot index
+my $hp_mem_total = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1.5"; # Total Bytes
+my $hp_mem_free = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1.6"; # Free Bytes
+my $hp_mem_free_seg = "1.3.6.1.4.1.11.2.14.11.5.1.1.2.2.1.1.3"; # Free segments
+
+# AS/400
+
+# Windows NT/2K/(XP?)
+
+# check_snmp_storage.pl -C -H -m "^Virtual Memory$" -w -c
+
+
+# Globals
+
+
+my $o_host = undef; # hostname
+my $o_community = undef; # community
+my $o_port = 161; # port
+my $o_help= undef; # wan't some help ?
+my $o_verb= undef; # verbose mode
+my $o_version= undef; # print version
+my $o_netsnmp= 1; # Check with netsnmp (default)
+my $o_cisco= undef; # Check cisco router mem
+my $o_hp= undef; # Check hp procurve mem
+my $o_warn= undef; # warning level option
+my $o_warnR= undef; # warning level for Real memory
+my $o_warnS= undef; # warning levels for swap
+my $o_crit= undef; # Critical level option
+my $o_critR= undef; # critical level for Real memory
+my $o_critS= undef; # critical level for swap
+my $o_perf= undef; # Performance data option
+my $o_cache= undef; # Include cached memory as used memory
+my $o_buffer= undef; # Exclude buffered memory as used memory
+my $o_timeout= undef; # Timeout (Default 5)
+my $o_version2= undef; # use snmp v2c
+# SNMPv3 specific
+my $o_login= undef; # Login for snmpv3
+my $o_passwd= undef; # Pass for snmpv3
+my $v3protocols=undef; # V3 protocol list.
+my $o_authproto='md5'; # Auth protocol
+my $o_privproto='des'; # Priv protocol
+my $o_privpass= undef; # priv password
+
+# functions
+
+sub p_version { print "check_snmp_mem version : $Version\n"; }
+
+sub print_usage {
+ print "Usage: $0 [-v] -H -C [-2] | (-l login -x passwd [-X pass -L ,]) [-p ] -w -c [-I|-N|-E] [-f] [-m -b] [-t ] [-V]\n";
+}
+
+sub isnnum { # Return true if arg is not a number
+ my $num = shift;
+ if ( $num =~ /^(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;}
+ return 1;
+}
+
+sub round ($$) {
+ sprintf "%.$_[1]f", $_[0];
+}
+
+sub help {
+ print "\nSNMP Memory Monitor for Nagios version ",$Version,"\n";
+ print "GPL licence, (c)2004-2007 Patrick Proy\n\n";
+ print_usage();
+ print <,
+ : Authentication protocol (md5|sha : default md5)
+ : Priv protocole (des|aes : default des)
+-P, --port=PORT
+ SNMP port (Default 161)
+-w, --warn=INTEGER | INT,INT
+ warning level for memory in percent (0 for no checks)
+ Default (-N switch) : comma separated level for Real Memory and Swap
+ -I switch : warning level
+-c, --crit=INTEGER | INT,INT
+ critical level for memory in percent (0 for no checks)
+ Default (-N switch) : comma separated level for Real Memory and Swap
+ -I switch : critical level
+-N, --netsnmp (default)
+ check linux memory & swap provided by Net SNMP
+-m, --memcache
+ include cached memory in used memory (only with Net-SNMP)
+-b, --membuffer
+ exclude buffered memory in used memory (only with Net-SNMP)
+-I, --cisco
+ check cisco memory (sum of all memory pools)
+-E, --hp
+ check HP proccurve memory
+-f, --perfdata
+ Performance data output
+-t, --timeout=INTEGER
+ timeout for SNMP in seconds (Default: 5)
+-V, --version
+ prints version number
+EOT
+}
+
+# For verbose output
+sub verb { my $t=shift; print $t,"\n" if defined($o_verb) ; }
+
+# Get the alarm signal (just in case snmp timout screws up)
+$SIG{'ALRM'} = sub {
+ print ("ERROR: Alarm signal (Nagios time-out)\n");
+ exit $ERRORS{"UNKNOWN"};
+};
+
+sub check_options {
+ Getopt::Long::Configure ("bundling");
+ GetOptions(
+ 'v' => \$o_verb, 'verbose' => \$o_verb,
+ 'h' => \$o_help, 'help' => \$o_help,
+ 'H:s' => \$o_host, 'hostname:s' => \$o_host,
+ 'p:i' => \$o_port, 'port:i' => \$o_port,
+ 'C:s' => \$o_community, 'community:s' => \$o_community,
+ 'l:s' => \$o_login, 'login:s' => \$o_login,
+ 'x:s' => \$o_passwd, 'passwd:s' => \$o_passwd,
+ 'X:s' => \$o_privpass, 'privpass:s' => \$o_privpass,
+ 'L:s' => \$v3protocols, 'protocols:s' => \$v3protocols,
+ 't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
+ 'V' => \$o_version, 'version' => \$o_version,
+ 'I' => \$o_cisco, 'cisco' => \$o_cisco,
+ 'N' => \$o_netsnmp, 'netsnmp' => \$o_netsnmp,
+ 'E' => \$o_hp, 'hp' => \$o_hp,
+ '2' => \$o_version2, 'v2c' => \$o_version2,
+ 'c:s' => \$o_crit, 'critical:s' => \$o_crit,
+ 'w:s' => \$o_warn, 'warn:s' => \$o_warn,
+ 'm' => \$o_cache, 'memcache' => \$o_cache,
+ 'b' => \$o_buffer, 'membuffer' => \$o_buffer,
+ 'f' => \$o_perf, 'perfdata' => \$o_perf
+ );
+ if (defined ($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}};
+ if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}};
+ if ( ! defined($o_host) ) # check host and filter
+ { print "No host defined!\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
+ # check snmp information
+ if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) )
+ { print "Put snmp login info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if ((defined($o_login) || defined($o_passwd)) && (defined($o_community) || defined($o_version2)) )
+ { print "Can't mix snmp v1,2c,3 protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if (defined ($v3protocols)) {
+ if (!defined($o_login)) { print "Put snmp V3 login info with protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ my @v3proto=split(/,/,$v3protocols);
+ if ((defined ($v3proto[0])) && ($v3proto[0] ne "")) {$o_authproto=$v3proto[0]; } # Auth protocol
+ if (defined ($v3proto[1])) {$o_privproto=$v3proto[1]; } # Priv protocol
+ if ((defined ($v3proto[1])) && (!defined($o_privpass))) {
+ print "Put snmp V3 priv login info with priv protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ }
+ if (defined($o_timeout) && (isnnum($o_timeout) || ($o_timeout < 2) || ($o_timeout > 60)))
+ { print "Timeout must be >1 and <60 !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if (!defined($o_timeout)) {$o_timeout=5;}
+ #Check Warning and crit are present
+ if ( ! defined($o_warn) || ! defined($o_crit))
+ { print "Put warning and critical values!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ # Get rid of % sign
+ $o_warn =~ s/\%//g;
+ $o_crit =~ s/\%//g;
+ # if -N or -E switch , undef $o_netsnmp
+ if (defined($o_cisco) || defined($o_hp) ) {
+ $o_netsnmp=undef;
+ if ( isnnum($o_warn) || isnnum($o_crit))
+ { print "Numeric value for warning or critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"} }
+ if ( ($o_crit != 0) && ($o_warn > $o_crit) )
+ { print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}}
+ }
+ if (defined($o_netsnmp)) {
+ my @o_warnL=split(/,/ , $o_warn);
+ my @o_critL=split(/,/ , $o_crit);
+ if (($#o_warnL != 1) || ($#o_critL != 1))
+ { print "2 warnings and critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
+ for (my $i=0;$i<2;$i++) {
+ if ( isnnum($o_warnL[$i]) || isnnum($o_critL[$i]))
+ { print "Numeric value for warning or critical !\n";print_usage(); exit $ERRORS{"UNKNOWN"} }
+ if (($o_critL[$i]!= 0) && ($o_warnL[$i] > $o_critL[$i]))
+ { print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if ( $o_critL[$i] > 100)
+ { print "critical percent must be < 100 !\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
+ }
+ $o_warnR=$o_warnL[0];$o_warnS=$o_warnL[1];
+ $o_critR=$o_critL[0];$o_critS=$o_critL[1];
+ }
+
+}
+
+########## MAIN #######
+
+check_options();
+
+# Check gobal timeout if snmp screws up
+if (defined($TIMEOUT)) {
+ verb("Alarm at $TIMEOUT");
+ alarm($TIMEOUT);
+} else {
+ verb("no timeout defined : $o_timeout + 10");
+ alarm ($o_timeout+10);
+}
+
+# Connect to host
+my ($session,$error);
+if ( defined($o_login) && defined($o_passwd)) {
+ # SNMPv3 login
+ if (!defined ($o_privpass)) {
+ verb("SNMPv3 AuthNoPriv login : $o_login, $o_authproto");
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $o_host,
+ -version => '3',
+ -username => $o_login,
+ -authpassword => $o_passwd,
+ -authprotocol => $o_authproto,
+ -port => $o_port,
+ -timeout => $o_timeout
+ );
+ } else {
+ verb("SNMPv3 AuthPriv login : $o_login, $o_authproto, $o_privproto");
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $o_host,
+ -version => '3',
+ -username => $o_login,
+ -authpassword => $o_passwd,
+ -authprotocol => $o_authproto,
+ -privpassword => $o_privpass,
+ -privprotocol => $o_privproto,
+ -port => $o_port,
+ -timeout => $o_timeout
+ );
+ }
+} else {
+ if (defined ($o_version2)) {
+ # SNMPv2 Login
+ verb("SNMP v2c login");
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $o_host,
+ -version => 2,
+ -community => $o_community,
+ -port => $o_port,
+ -timeout => $o_timeout
+ );
+ } else {
+ # SNMPV1 login
+ verb("SNMP v1 login");
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $o_host,
+ -community => $o_community,
+ -port => $o_port,
+ -timeout => $o_timeout
+ );
+ }
+}
+if (!defined($session)) {
+ printf("ERROR opening session: %s.\n", $error);
+ exit $ERRORS{"UNKNOWN"};
+}
+
+# Global variable
+my $resultat=undef;
+
+########### Cisco memory check ############
+if (defined ($o_cisco)) {
+
+ # Get Cisco memory table
+ $resultat = $session->get_table(Baseoid => $cisco_mem_pool);
+
+ if (!defined($resultat)) {
+ printf("ERROR: Description table : %s.\n", $session->error);
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+ }
+ my (@oid,@index)=(undef,undef);
+ my $nindex=0;
+ foreach my $key ( keys %$resultat) {
+ verb("OID : $key, Desc : $$resultat{$key}");
+ if ( $key =~ /$cisco_index/ ) {
+ @oid=split (/\./,$key);
+ $index[$nindex++] = pop(@oid);
+ }
+ }
+
+ # Check if at least 1 memory pool exists
+ if ($nindex == 0) {
+ printf("ERROR: No memory pools found");
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ # Test every memory pool
+ my ($c_output,$prct_free)=(undef,undef);
+ my ($warn_s,$crit_s)=(0,0);
+ my ($used,$free)=(0,0);
+ foreach (@index) {
+ $c_output .="," if defined ($c_output);
+ if ( $$resultat{$cisco_valid . "." . $_} == 1 ) {
+ $used += $$resultat{$cisco_used . "." . $_};
+ $free += $$resultat{$cisco_free . "." . $_};
+ $prct_free=round($$resultat{$cisco_used . "." . $_}*100/($$resultat{$cisco_free . "." . $_}+$$resultat{$cisco_used . "." . $_}) ,0);
+ $c_output .= $$resultat{$cisco_index . "." . $_} . ":" . $prct_free . "%";
+ if (($o_crit!=0)&&($o_crit <= $prct_free)) {
+ $crit_s =1;
+ } elsif (($o_warn!=0)&&($o_warn <= $prct_free)) {
+ $warn_s=1;
+ }
+ } else {
+ $c_output .= $$resultat{$cisco_index . "." . $_} . ": INVALID";
+ $crit_s =1;
+ }
+ }
+ my $total=$used+$free;
+ $prct_free=round($used*100/($total),0);
+ verb("Total used : $used, free: $free, output : $c_output");
+ my $c_status="OK";
+ $c_output .=" : " . $prct_free ."% : ";
+ if ($crit_s == 1 ) {
+ $c_output .= " > " . $o_crit ;
+ $c_status="CRITICAL";
+ } else {
+ if ($warn_s == 1 ) {
+ $c_output.=" > " . $o_warn;
+ $c_status="WARNING";
+ }
+ }
+ $c_output .= " ; ".$c_status;
+ if (defined ($o_perf)) {
+ $c_output .= " | ram_used=" . $used.";";
+ $c_output .= ($o_warn ==0)? ";" : round($o_warn * $total/100,0).";";
+ $c_output .= ($o_crit ==0)? ";" : round($o_crit * $total/100,0).";";
+ $c_output .= "0;" . $total ;
+ }
+ $session->close;
+ print "$c_output \n";
+ exit $ERRORS{$c_status};
+}
+
+########### HP Procurve memory check ############
+if (defined ($o_hp)) {
+
+ # Get hp memory table
+ $resultat = $session->get_table(Baseoid => $hp_mem_pool);
+
+ if (!defined($resultat)) {
+ printf("ERROR: Description table : %s.\n", $session->error);
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+ }
+ my (@oid,@index)=(undef,undef);
+ my $nindex=0;
+ foreach my $key ( keys %$resultat) {
+ verb("OID : $key, Desc : $$resultat{$key}");
+ if ( $key =~ /$hp_mem_index/ ) {
+ @oid=split (/\./,$key);
+ $index[$nindex++] = pop(@oid);
+ }
+ }
+
+ # Check if at least 1 memory slots exists
+ if ($nindex == 0) {
+ printf("ERROR: No memory slots found");
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ # Consolidate the datas
+ my ($total,$free)=(0,0);
+ my ($c_output,$prct_free)=(undef,undef);
+ foreach (@index) {
+ $c_output .="," if defined ($c_output);
+ $total += $$resultat{$hp_mem_total . "." . $_};
+ $free += $$resultat{$hp_mem_free . "." . $_};
+ $c_output .= "Slot " . $$resultat{$hp_mem_index . "." . $_} . ":"
+ .round(
+ 100 - ($$resultat{$hp_mem_free . "." . $_} *100 /
+ $$resultat{$hp_mem_total . "." . $_}) ,0)
+ . "%";
+ }
+ my $used = $total - $free;
+ $prct_free=round($used*100/($total),0);
+ verb("Used : $used, Free: $free, Output : $c_output");
+ my $c_status="OK";
+ $c_output .=" : " . $prct_free ."% : ";
+ if (($o_crit!=0)&&($o_crit <= $prct_free)) {
+ $c_output .= " > " . $o_crit ;
+ $c_status="CRITICAL";
+ } else {
+ if (($o_warn!=0)&&($o_warn <= $prct_free)) {
+ $c_output.=" > " . $o_warn;
+ $c_status="WARNING";
+ }
+ }
+ $c_output .= " ; ".$c_status;
+ if (defined ($o_perf)) {
+ $c_output .= " | ram_used=" . $used.";";
+ $c_output .= ($o_warn ==0)? ";" : round($o_warn * $total/100,0).";";
+ $c_output .= ($o_crit ==0)? ";" : round($o_crit * $total/100,0).";";
+ $c_output .= "0;" . $total ;
+ }
+ $session->close;
+ print "$c_output \n";
+ exit $ERRORS{$c_status};
+}
+
+########### Net snmp memory check ############
+if (defined ($o_netsnmp)) {
+
+ # Get NetSNMP memory values
+ $resultat = $session->get_request(-varbindlist => \@nets_oids);
+
+ if (!defined($resultat)) {
+ printf("ERROR: netsnmp : %s.\n", $session->error);
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+ }
+
+ my ($realused,$swapused)=(undef,undef);
+ my $totalcachedbuffered = 0;
+ if (defined($o_buffer)) {
+ $totalcachedbuffered = $$resultat{$nets_ram_buffer};
+ }
+ if (!defined($o_cache)) {
+ $totalcachedbuffered = $totalcachedbuffered + $$resultat{$nets_ram_cache};
+ }
+
+ $realused = ($$resultat{$nets_ram_total}-($$resultat{$nets_ram_free}+$totalcachedbuffered)) / $$resultat{$nets_ram_total};
+
+ if($$resultat{$nets_ram_total} == 0) { $realused = 0; }
+
+ $swapused= ($$resultat{$nets_swap_total} == 0) ? 0 :
+ ($$resultat{$nets_swap_total}-$$resultat{$nets_swap_free})/$$resultat{$nets_swap_total};
+ $realused=round($realused*100,0);
+ $swapused=round($swapused*100,0);
+ verb ("Ram : $$resultat{$nets_ram_free} ($$resultat{$nets_ram_cache} cached, $$resultat{$nets_ram_buffer} buff) / $$resultat{$nets_ram_total} : $realused");
+ verb ("Swap : $$resultat{$nets_swap_free} / $$resultat{$nets_swap_total} : $swapused");
+
+ my $n_status="OK";
+ my $n_output="Ram : " . $realused . "%, Swap : " . $swapused . "% :";
+ if ((($o_critR!=0)&&($o_critR <= $realused)) || (($o_critS!=0)&&($o_critS <= $swapused))) {
+ $n_output .= " > " . $o_critR . ", " . $o_critS;
+ $n_status="CRITICAL";
+ } else {
+ if ((($o_warnR!=0)&&($o_warnR <= $realused)) || (($o_warnS!=0)&&($o_warnS <= $swapused))) {
+ $n_output.=" > " . $o_warnR . ", " . $o_warnS;
+ $n_status="WARNING";
+ }
+ }
+ $n_output .= " ; ".$n_status;
+ if (defined ($o_perf)) {
+ if (defined ($o_cache)) {
+ $n_output .= " | ram_used=" . ($$resultat{$nets_ram_total}-$$resultat{$nets_ram_free}).";";
+ }
+ else {
+ $n_output .= " | ram_used=" . ($$resultat{$nets_ram_total}-$$resultat{$nets_ram_free}-$$resultat{$nets_ram_cache}).";";
+ }
+ $n_output .= ($o_warnR ==0)? ";" : round($o_warnR * $$resultat{$nets_ram_total}/100,0).";";
+ $n_output .= ($o_critR ==0)? ";" : round($o_critR * $$resultat{$nets_ram_total}/100,0).";";
+ $n_output .= "0;" . $$resultat{$nets_ram_total}. " ";
+ $n_output .= "swap_used=" . ($$resultat{$nets_swap_total}-$$resultat{$nets_swap_free}).";";
+ $n_output .= ($o_warnS ==0)? ";" : round($o_warnS * $$resultat{$nets_swap_total}/100,0).";";
+ $n_output .= ($o_critS ==0)? ";" : round($o_critS * $$resultat{$nets_swap_total}/100,0).";";
+ $n_output .= "0;" . $$resultat{$nets_swap_total};
+ }
+ $session->close;
+ print "$n_output \n";
+ exit $ERRORS{$n_status};
+
+}
diff --git a/icinga2/plugins/check_snmp_storage.pl b/icinga2/plugins/check_snmp_storage.pl
new file mode 100644
index 0000000..b783738
--- /dev/null
+++ b/icinga2/plugins/check_snmp_storage.pl
@@ -0,0 +1,653 @@
+#!/usr/bin/perl -w
+############################## check_snmp_storage ##############
+# Version : 1.3.3
+# Date : Jun 1 2007
+# Author : Patrick Proy ( patrick at proy.org)
+# Help : http://nagios.manubulon.com
+# Licence : GPL - http://www.fsf.org/licenses/gpl.txt
+# TODO :
+# Contribs : Dimo Velev, Makina Corpus, A. Greiner-B?
+#################################################################
+#
+# help : ./check_snmp_storage -h
+
+use strict;
+use Net::SNMP;
+use Getopt::Long;
+
+# Nagios specific
+
+use lib "/usr/lib/nagios/plugins";
+use utils qw(%ERRORS $TIMEOUT);
+#my $TIMEOUT = 15;
+#my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
+
+# SNMP Datas
+my $storage_table= '1.3.6.1.2.1.25.2.3.1';
+my $storagetype_table = '1.3.6.1.2.1.25.2.3.1.2';
+my $index_table = '1.3.6.1.2.1.25.2.3.1.1';
+my $descr_table = '1.3.6.1.2.1.25.2.3.1.3';
+my $size_table = '1.3.6.1.2.1.25.2.3.1.5.';
+my $used_table = '1.3.6.1.2.1.25.2.3.1.6.';
+my $alloc_units = '1.3.6.1.2.1.25.2.3.1.4.';
+
+#Storage types definition - from /usr/share/snmp/mibs/HOST-RESOURCES-TYPES.txt
+my %hrStorage;
+$hrStorage{"Other"} = '1.3.6.1.2.1.25.2.1.1';
+$hrStorage{"1.3.6.1.2.1.25.2.1.1"} = 'Other';
+$hrStorage{"Ram"} = '1.3.6.1.2.1.25.2.1.2';
+$hrStorage{"1.3.6.1.2.1.25.2.1.2"} = 'Ram';
+$hrStorage{"VirtualMemory"} = '1.3.6.1.2.1.25.2.1.3';
+$hrStorage{"1.3.6.1.2.1.25.2.1.3"} = 'VirtualMemory';
+$hrStorage{"FixedDisk"} = '1.3.6.1.2.1.25.2.1.4';
+$hrStorage{"1.3.6.1.2.1.25.2.1.4"} = 'FixedDisk';
+$hrStorage{"RemovableDisk"} = '1.3.6.1.2.1.25.2.1.5';
+$hrStorage{"1.3.6.1.2.1.25.2.1.5"} = 'RemovableDisk';
+$hrStorage{"FloppyDisk"} = '1.3.6.1.2.1.25.2.1.6';
+$hrStorage{"1.3.6.1.2.1.25.2.1.6"} = 'FloppyDisk';
+$hrStorage{"CompactDisk"} = '1.3.6.1.2.1.25.2.1.7';
+$hrStorage{"1.3.6.1.2.1.25.2.1.7"} = 'CompactDisk';
+$hrStorage{"RamDisk"} = '1.3.6.1.2.1.25.2.1.8';
+$hrStorage{"1.3.6.1.2.1.25.2.1.8"} = 'RamDisk';
+$hrStorage{"FlashMemory"} = '1.3.6.1.2.1.25.2.1.9';
+$hrStorage{"1.3.6.1.2.1.25.2.1.9"} = 'FlashMemory';
+$hrStorage{"NetworkDisk"} = '1.3.6.1.2.1.25.2.1.10';
+$hrStorage{"1.3.6.1.2.1.25.2.1.10"} = 'NetworkDisk';
+
+# Globals
+
+my $Name='check_snmp_storage';
+my $Version='1.3.3';
+
+my $o_host = undef; # hostname
+my $o_community = undef; # community
+my $o_port = 161; # port
+my $o_version2 = undef; #use snmp v2c
+my $o_descr = undef; # description filter
+my $o_storagetype = undef; # parse storage type also
+my $o_warn = undef; # warning limit
+my $o_crit= undef; # critical limit
+my $o_help= undef; # wan't some help ?
+my $o_type= undef; # pl, pu, mbl, mbu
+my @o_typeok= ("pu","pl","bu","bl"); # valid values for o_type
+my $o_verb= undef; # verbose mode
+my $o_version= undef; # print version
+my $o_noreg= undef; # Do not use Regexp for name
+my $o_sum= undef; # add all storage before testing
+my $o_index= undef; # Parse index instead of description
+my $o_negate= undef; # Negate the regexp if set
+my $o_timeout= 5; # Default 5s Timeout
+my $o_perf= undef; # Output performance data
+my $o_short= undef; # Short output parameters
+my @o_shortL= undef; # output type,where,cut
+my $o_reserve= 0; # % reserved blocks (A. Greiner-B? patch)
+my $o_giga= undef; # output and levels in gigabytes instead of megabytes
+# SNMPv3 specific
+my $o_login= undef; # Login for snmpv3
+my $o_passwd= undef; # Pass for snmpv3
+my $v3protocols=undef; # V3 protocol list.
+my $o_authproto='md5'; # Auth protocol
+my $o_privproto='des'; # Priv protocol
+my $o_privpass= undef; # priv password
+# SNMP Message size parameter (Makina Corpus contrib)
+my $o_octetlength=undef;
+
+# functions
+
+sub p_version { print "$Name version : $Version\n"; }
+
+sub print_usage {
+ print "Usage: $Name [-v] -H -C [-2] | (-l login -x passwd [-X pass -L ,]) [-p ] -m [-q storagetype] -w -c [-t ] [-T pl|pu|bl|bu ] [-r -s -i -G] [-e] [-S 0|1[,1,]] [-o ] [-R <% reserved>]\n";
+}
+
+sub round ($$) {
+ sprintf "%.$_[1]f", $_[0];
+}
+
+sub is_pattern_valid { # Test for things like "" or "+5-i"
+ my $pat = shift;
+ if (!defined($pat)) { $pat=" ";} # Just to get rid of compilation time warnings
+ return eval { "" =~ /$pat/; 1 } || 0;
+}
+
+# Get the alarm signal (just in case snmp timout screws up)
+$SIG{'ALRM'} = sub {
+ print ("ERROR: General time-out (Alarm signal)\n");
+ exit $ERRORS{"UNKNOWN"};
+};
+
+sub isnnum { # Return true if arg is not a number
+ my $num = shift;
+ if ( $num =~ /^-?(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;}
+ return 1;
+}
+
+sub help {
+ print "\nSNMP Disk Monitor for Nagios version ",$Version,"\n";
+ print "(c)2004-2007 Patrick Proy\n\n";
+ print_usage();
+ print < warn and critical if %used > crit
+-v, --verbose
+ print extra debugging information (and lists all storages)
+-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 (implies SNMP v1)
+-2, --v2c
+ Use snmp v2c
+-l, --login=LOGIN ; -x, --passwd=PASSWD
+ Login and auth password for snmpv3 authentication
+ If no priv password exists, implies AuthNoPriv
+-X, --privpass=PASSWD
+ Priv password for snmpv3 (AuthPriv protocol)
+-L, --protocols=,
+ : Authentication protocol (md5|sha : default md5)
+ : Priv protocole (des|aes : default des)
+-x, --passwd=PASSWD
+ Password for snmpv3 authentication
+-p, --port=PORT
+ SNMP port (Default 161)
+-m, --name=NAME
+ Name in description OID (can be mounpoints '/home' or 'Swap Space'...)
+ This is treated as a regexp : -m /var will match /var , /var/log, /opt/var ...
+ Test it before, because there are known bugs (ex : trailling /)
+ No trailing slash for mountpoints !
+-q, --storagetype=[Other|Ram|VirtualMemory|FixedDisk|RemovableDisk|FloppyDisk
+ CompactDisk|RamDisk|FlashMemory|NetworkDisk]
+ Also check the storage type in addition of the name
+ It is possible to use regular expressions ( "FixedDisk|FloppyDisk" )
+-r, --noregexp
+ Do not use regexp to match NAME in description OID
+-s, --sum
+ Add all storages that match NAME (used space and total space)
+ THEN make the tests.
+-i, --index
+ Parse index table instead of description table to select storage
+-e, --exclude
+ Select all storages except the one(s) selected by -m
+ No action on storage type selection
+-T, --type=TYPE
+ pl : calculate percent left
+ pu : calculate percent used (Default)
+ bl : calculate MegaBytes left
+ bu : calculate MegaBytes used
+-w, --warn=INTEGER
+ percent / MB of disk used to generate WARNING state
+ you can add the % sign
+-c, --critical=INTEGER
+ percent / MB of disk used to generate CRITICAL state
+ you can add the % sign
+-R, --reserved=INTEGER
+ % reserved blocks for superuser
+ For ext2/3 filesystems, it is 5% by default
+-G, --gigabyte
+ output, warning & critical levels in gigabytes
+-f, --perfparse
+ Perfparse compatible output
+-S, --short=[,,]
+ : Make the output shorter :
+ 0 : only print the global result except the disk in warning or critical
+ ex: "< 80% : OK"
+ 1 : Don't print all info for every disk
+ ex : "/ : 66 %used (< 80) : OK"
+ : (optional) if = 1, put the OK/WARN/CRIT at the beginning
+ : take the first caracters or last if n<0
+-o, --octetlength=INTEGER
+ max-size of the SNMP message, usefull in case of Too Long responses.
+ Be carefull with network filters. Range 484 - 65535, default are
+ usually 1472,1452,1460 or 1440.
+-t, --timeout=INTEGER
+ timeout for SNMP in seconds (Default: 5)
+-V, --version
+ prints version number
+Note :
+ with T=pu or T=bu : OK < warn < crit
+ with T=pl ot T=bl : crit < warn < OK
+
+ If multiple storage are selected, the worse condition will be returned
+ i.e if one disk is critical, the return is critical
+
+ example :
+ Browse storage list :