diff --git a/centreon-plugins/Dev/.project b/centreon-plugins/Dev/.project new file mode 100644 index 000000000..bc15201e8 --- /dev/null +++ b/centreon-plugins/Dev/.project @@ -0,0 +1,11 @@ + + + Plugins + + + + + + + + diff --git a/centreon-plugins/Dev/CHANGELOG b/centreon-plugins/Dev/CHANGELOG new file mode 100644 index 000000000..2ece92566 --- /dev/null +++ b/centreon-plugins/Dev/CHANGELOG @@ -0,0 +1,22 @@ +########################## +# Oreon Plugins Change Log +########################## + +1.2.3 - 02/11/2005 +---------------- +* Enhanced Oreon Perl Package oreon.pm (wistof) +* Integration of some Manubulon plugins (wistof) +* New install script for plugins (wistof) +* Minor bug fixes + +1.2.2 - xx/08/2005 +---------------- +* Add Oreon Perl Package oreon.pm (gollum123) +* Globalization of paths in oreon.conf (gollum123) +* Management of RRDTOOL errors (wistof) +* Use Net::SNMP instead of snmpwalk and snmpget (wistof) +* Disable regex for '-H' option (wistof) +* Minor bug fixes + + + diff --git a/centreon-plugins/Dev/INSTALL b/centreon-plugins/Dev/INSTALL new file mode 100644 index 000000000..ebefe6175 --- /dev/null +++ b/centreon-plugins/Dev/INSTALL @@ -0,0 +1,8 @@ +############################ +# Oreon Plugins Installation +############################ + +- just run install.sh in src/ directory +- don't directly copy plugins in Nagios plugins directory + + diff --git a/centreon-plugins/Dev/REQUIREMENT b/centreon-plugins/Dev/REQUIREMENT new file mode 100644 index 000000000..1ba6eba1d --- /dev/null +++ b/centreon-plugins/Dev/REQUIREMENT @@ -0,0 +1,12 @@ +########################### +# Oreon Plugins Requirement +########################### + +- Perl in /usr/bin/perl - or just run 'perl script' +- Net::SNMP +- Config::IniFiles +- RRDTool installed (RRDs.pm) +- Oreon perl module (oreon.pm) +- Oreon configuration file for Oreon perl module (oreon.conf) +- file 'utils.pm' in plugin diretory (/usr/local/nagios/libexec) +- sed program for installation script \ No newline at end of file diff --git a/centreon-plugins/Dev/install.sh b/centreon-plugins/Dev/install.sh new file mode 100644 index 000000000..b952bc377 --- /dev/null +++ b/centreon-plugins/Dev/install.sh @@ -0,0 +1,228 @@ +#!/bin/sh +# +# Oreon is developped with Apache Licence 2.0 : +# http://www.apache.org/licenses/LICENSE-2.0.txt +# Developped by : Julien Mathis - Romain Le Merlus +# Christophe Coraboeuf - Mathieu Chateau + +# The Software is provided to you AS IS and WITH ALL FAULTS. +# OREON makes no representation and gives no warranty whatsoever, +# whether express or implied, and without limitation, with regard to the quality, +# safety, contents, performance, merchantability, non-infringement or suitability for +# any particular or intended purpose of the Software found on the OREON web site. +# In no event will OREON be liable for any direct, indirect, punitive, special, +# incidental or consequential damages however they may arise and even if OREON has +# been previously advised of the possibility of such damages. + +#Load install script functions +. ../functions + +## +## VARIABLES +## +## Make sure you know what you do if you modify it !! + +PWD=`pwd` + +PLUGINS_DIR="" + +LOG_FILE="../log/install_oreon.log" + +date > $LOG_FILE + +echo +echo "##########################################################################" +echo "# OREON Project (www.oreon-project.org) #" +echo "# Thanks for using OREON #" +echo "# #" +echo "# v 1.2.3 #" +echo "# #" +echo "# infos@oreon-project.org #" +echo "# #" +echo "# Make sure you have installed and configured #" +echo "# perl - sed #" +echo "# #" +echo "# #" +echo "##########################################################################" +echo "# The Team OREON #" +echo "##########################################################################" +echo "" +echo "" +$SETCOLOR_WARNING +echo " Make sure you have root permissions !" +$SETCOLOR_NORMAL +echo "" + +echo "Are you sure to continue?" +echo -n "[y/n], default to [n]:" +read temp +if [ -z $temp ];then + temp=n +fi + +if [ $temp = "n" ];then + echo "Bye bye !" + exit +fi + +test_answer() +{ + #$1 variable to fill + #$2 text typed by user + if [ ! -z $2 ];then + if [ $2 != "" ];then + eval $1=$2 + fi + fi +} + +## +## CONFIGURATION +## +if test -a $OREON_CONF ; then + echo "" + echo_success "Finding Oreon configuration file '$OREON_CONF' :" "OK" + echo "You already seem to have to install Oreon." + echo "Do you want use last Oreon install parameters ?" + echo -n "[y/n], default to [y]:" + read temp + if [ -z $temp ];then + temp=y + fi + + if [ $temp = "y" ];then + echo "" + echo_passed "Using '$OREON_CONF' :" "PASSED" + . $OREON_CONF + echo "" + else + echo "" + echo "First, let's talk about you !" + echo "-----------------------------" + echo "" + fi +fi + if [ -z $INSTALL_DIR_NAGIOS ];then + INSTALL_DIR_NAGIOS="/usr/local/nagios" + echo "Where is installed Nagios ?" + echo -n "default to [$INSTALL_DIR_NAGIOS]:" + read temp + test_answer INSTALL_DIR_NAGIOS $temp + echo "" + fi + + if [ -z $NAGIOS_ETC ];then + #nagios etc directory for oreon + NAGIOS_ETC="$INSTALL_DIR_NAGIOS/etc" + echo "Where are your nagios etc directory ?" + echo -n "default to [$NAGIOS_ETC]:" + read temp + test_answer NAGIOS_ETC $temp + echo "" + fi + + if [ -z $NAGIOS_PLUGIN ];then + #nagios plugins directory for oreon + NAGIOS_PLUGIN="$INSTALL_DIR_NAGIOS/libexec" + echo "Where are your nagios plugin / libexec directory ?" + echo -n "default to [$NAGIOS_PLUGIN]:" + read temp + test_answer NAGIOS_PLUGIN $temp + echo "" + fi + + if [ -z $INSTALL_DIR_OREON ];then + #setup directory for oreon + INSTALL_DIR_OREON="/usr/local/oreon" + echo "Where do I install Oreon ?" + echo -n "default to [$INSTALL_DIR_OREON]:" + read temp + test_answer INSTALL_DIR_OREON $temp + echo "" + fi + + if [ -z $SUDO_FILE ];then + #Configuration file for sudo + SUDO_FILE="/etc/sudoers" + echo "Where is sudo ?" + echo -n "default to [$SUDO_FILE]:" + read temp + test_answer SUDO_FILE $temp + echo "" + fi + + if [ -z $RRD_PERL ];then + #RRDTOOL perl module directory + RRD_PERL="/usr/local/rrdtool/lib/perl" + echo "Where is RRD perl modules RRDs.pm ?" + echo -n "default to [$RRD_PERL]:" + read temp + test_answer RRD_PERL $temp + echo "" + fi + +## +## FUNCTION +## + +# When exit on error + +function error() +{ + echo "ERROR" + exit 2 +} + +# install OREON PLUGIN + +function confirm_oreon() +{ + install_oreon_plugins +} + +# installation script + +#check_group_nagios +#check_user_nagios +#check_group_nagiocmd +#confirm_oreon + +## +## INSTALL +## +echo "Users Management" +echo "----------------" +# check for httpd directory +check_httpd_directory +## group apache +check_group_apache +## user apache +check_user_apache +check_group_nagios +check_user_nagios +echo "" + +echo "Other Stuff" +echo "------------" +if test -d $NAGIOS_PLUGIN ; then + echo_success "Nagios libexec directory" "OK" +else + mkdir -p $NAGIOS_PLUGIN > /dev/null + echo_success "Nagios libexec directory created" "OK" +fi + +# installation script + +confirm_oreon +#oreon_post_install + +echo "" +echo "###############################################################################" +echo "# #" +echo "# Report bugs at bugs@oreon-project.org #" +echo "# #" +echo "# Thanks for using OREON. #" +echo "# ----------------------- #" +echo "# Contact : infos@oreon-project.org #" +echo "# http://www.oreon-project.org #" +echo "###############################################################################" diff --git a/centreon-plugins/Dev/src/check_centreon_TcpConn b/centreon-plugins/Dev/src/check_centreon_TcpConn new file mode 100644 index 000000000..b21bcaebc --- /dev/null +++ b/centreon-plugins/Dev/src/check_centreon_TcpConn @@ -0,0 +1,147 @@ +#! /usr/bin/perl -w +# +# $Id: check_TcpConn.pl,v 1.2 2005/11/17 10:21:49 Sugumaran Mat $ +# +# This plugin is developped under GPL Licence: +# http://www.fsf.org/licenses/gpl.txt +# +# Developped by Merethis SARL : http://www.merethis.com +# +# The Software is provided to you AS IS and WITH ALL FAULTS. +# MERETHIS makes no representation and gives no warranty whatsoever, +# whether express or implied, and without limitation, with regard to the quality, +# safety, contents, performance, merchantability, non-infringement or suitability for +# any particular or intended purpose of the Software found on the LINAGORA web site. +# In no event will MERETHIS be liable for any direct, indirect, punitive, special, +# incidental or consequential damages however they may arise and even if MERETHIS has +# been previously advised of the possibility of such damages. + +## +## Plugin init +## + +use strict; +use Net::SNMP qw(:snmp); +use FindBin; +use lib "$FindBin::Bin"; +use lib "@NAGIOS_PLUGINS@"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); + +if (eval "require oreon" ) { + use oreon qw(get_parameters create_rrd update_rrd &is_valid_serviceid); + use vars qw($VERSION %oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} + +use vars qw($PROGNAME); +use Getopt::Long; +use vars qw($opt_h $opt_V $opt_H $opt_C $opt_v $opt_p $opt_c $opt_w); +use vars qw($snmp); + +$PROGNAME = "ckeck_TcpConn"; +sub print_help (); +sub print_usage (); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, "help" => \$opt_h, + "v=s" => \$opt_v, "snmp_version" => \$opt_v, + "V" => \$opt_V, "version" => \$opt_V, + "H=s" => \$opt_H, "Hostname" => \$opt_H, + "p=i" => \$opt_p, "port" => \$opt_p, +<<<<<<< .mine + "C=s" => \$opt_c, "Community" => \$opt_c +======= + "C=s" => \$opt_C, "Community" => \$opt_C, + "c=s" => \$opt_c, "w=s" => \$opt_w +>>>>>>> .r479 +); + +if ($opt_V) { + print_revision($PROGNAME,'$Revision: 1.0'); + exit $ERRORS{'OK'}; +} + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; +} + +$opt_H = shift unless ($opt_H); +(print_usage() && exit $ERRORS{'OK'}) unless ($opt_H); + +$opt_p = shift unless ($opt_p); +(print_usage() && exit $ERRORS{'OK'}) unless ($opt_p); + +($opt_v) || ($opt_v = shift) || ($opt_v = "v1"); +my $snmp = $1 if ($opt_v =~ /(\d)/); + +($opt_C) || ($opt_C = shift) || ($opt_C = "public"); + +my $name = $0; +$name =~ s/\.pl.*//g; +my $day = 0; + +#=== create a SNMP session ==== +# 1.3.6.1.4.1.232.1.2.2.1.1.6 + +my ($session, $error) = Net::SNMP->session(-hostname => $opt_H,-community => $opt_C, -version => $snmp); +if (!defined($session)) { + print("CRITICAL: $error"); + exit $ERRORS{'CRITICAL'}; +} + +my $OID_TCP_PORT = ".1.3.6.1.2.1.6.13.1.3"; + +my $result = $session->get_table(Baseoid => $OID_TCP_PORT); +if (!defined($result)) { + printf("ERROR: Description Table : %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; +} + +my $cpt = 0; +foreach my $key (oid_lex_sort(keys %$result)) { + if ($result->{$key} == $opt_p) { + $cpt++; + } +} + +if (!defined($opt_w)){$opt_w = 20;} +if (!defined($opt_c)){$opt_c = 30;} + +print "Number of connections on port $opt_p : $cpt |nb_conn=$cpt\n"; +if ($cpt >= $opt_w && $cpt < $opt_c){ + exit $ERRORS{'WARNING'}; +} elsif ($cpt >= $opt_c){ + exit $ERRORS{'CRITICAL'}; +} else { + exit $ERRORS{'OK'}; +} + + +sub print_usage () { + print "\nUsage:\n"; + print "$PROGNAME\n"; + print " -H (--hostname) Hostname to query - (required)\n"; + print " -p (--port) port you want to check - (required)\n"; + print " -C (--community) SNMP read community (defaults to public,\n"; + print " used with SNMP v1 and v2c\n"; + print " -v (--snmp_version) 1 for SNMP v1 (default)\n"; + print " 2 for SNMP v2c\n"; + print " -V (--version) Plugin version\n"; + print " -h (--help) usage help\n"; +} + +sub print_help () { + print "#=========================================\n"; + print "# Copyright (c) 2005 Merethis SARL =\n"; + print "# Developped by Julien Mathis =\n"; + print "# Bugs to http://www.oreon-project.org/ =\n"; + print "#=========================================\n"; + print_usage(); + print "\n"; +} diff --git a/centreon-plugins/Dev/src/check_centreon_dell_temperature b/centreon-plugins/Dev/src/check_centreon_dell_temperature new file mode 100644 index 000000000..a98d92c4c --- /dev/null +++ b/centreon-plugins/Dev/src/check_centreon_dell_temperature @@ -0,0 +1,180 @@ +#! /usr/bin/perl -w +# +# $Id: check_graph_dell_temperature,v 1.4 2005/07/27 22:22:48 wistof Exp $ +# +# Oreon's plugins are developped with GPL Licence : +# http://www.fsf.org/licenses/gpl.txt +# Developped by : Wistof +# +# Modified for Oreon Project by : Mathieu Chateau - Christophe Coraboeuf - Sugumaran Mathavarajan +# +# The Software is provided to you AS IS and WITH ALL FAULTS. +# OREON makes no representation and gives no warranty whatsoever, +# whether express or implied, and without limitation, with regard to the quality, +# safety, contents, performance, merchantability, non-infringement or suitability for +# any particular or intended purpose of the Software found on the OREON web site. +# In no event will OREON be liable for any direct, indirect, punitive, special, +# incidental or consequential damages however they may arise and even if OREON has +# been previously advised of the possibility of such damages. +## +## Plugin init +## +use strict; +use Net::SNMP qw(:snmp oid_lex_sort); +use FindBin; +use lib "$FindBin::Bin"; +use lib "@NAGIOS_PLUGINS@"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); + +if (eval "require oreon" ) { + use oreon qw(get_parameters); + use vars qw($VERSION %oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} + +use vars qw($PROGNAME $VERSION); +use Getopt::Long; +use vars qw($opt_h $opt_V $opt_H $opt_C $opt_v $opt_s $opt_t $sensor $OID $OID_DESC); + +## +## Plugin var init +## + + +$VERSION = '$Revision: 1.1 $'; +$VERSION =~ s/^\$.*:\W(.*)\W.+?$/$1/; + +$PROGNAME = $0; +sub print_help (); +sub print_usage (); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, "help" => \$opt_h, + "V" => \$opt_V, "version" => \$opt_V, + "v=s" => \$opt_v, "snmp=s" => \$opt_v, + "C=s" => \$opt_C, "community=s" => \$opt_C, + "s" => \$opt_s, "show" => \$opt_s, + "t=s" => \$opt_t, "sensor=s" => \$opt_t, + "H=s" => \$opt_H, "hostname=s" => \$opt_H); + +if ($opt_V) { + print_revision($PROGNAME,'$Revision: 1.1 $'); + exit $ERRORS{'OK'}; +} + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; +} + +$opt_H = shift unless ($opt_H); +(print_usage() && exit $ERRORS{'OK'}) unless ($opt_H); + +($opt_v) || ($opt_v = shift) || ($opt_v = "1"); +my $snmp = $1 if ($opt_v =~ /(\d)/); + +($opt_t) || ($opt_t = shift) || ($opt_t = "1"); +my $sensor = $1 if ($opt_t =~ /(\d)/); + +($opt_C) || ($opt_C = shift) || ($opt_C = "public"); + +my $start=time; +my $name = $0; +$name =~ s/\.pl.*//g; + +## +## Plugin snmp requests +## +my $OID = ".1.3.6.1.4.1.674.10892.1.700.20.1.6.1"; +my $OID_DESC = ".1.3.6.1.4.1.674.10892.1.700.20.1.8.1"; + + +# create a SNMP session +my ( $session, $error ) = Net::SNMP->session(-hostname => $opt_H,-community => $opt_C, -version => $snmp); +if ( !defined($session) ) { + print("UNKNOWN: $error"); + exit $ERRORS{'UNKNOWN'}; +} + +if ($opt_s) { + # Get desctiption table + my $result = $session->get_table( + Baseoid => $OID_DESC + ); + + if (!defined($result)) { + printf("ERROR: Description Table : %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; + } + + foreach my $key ( oid_lex_sort(keys %$result)) { + my @oid_list = split (/\./,$key); + my $index = pop (@oid_list) ; + print "Temperature Sensor $index :: $$result{$key}\n"; + } +exit $ERRORS{'OK'}; +} + + +my $result = $session->get_request( + -varbindlist => [$OID.".".$sensor, + $OID_DESC.".".$sensor] + ); +if (!defined($result)) { + printf("UNKNOWN: %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; +} + +my $return_result = $result->{$OID.".".$sensor}; +my $un = 0; +if ($return_result =~ /(\d+)/ ) { + $un = $1; +} else { + printf("UNKNOWN: Unable to parse SNMP Output :: %s", $return_result ); + $session->close; + exit $ERRORS{'UNKNOWN'}; +} + +$un = sprintf("%02.2f", $un / 10); + +## +## Plugin return code +## +if ($un || ( $un == 0) ){ + print "OK - ". $result->{$OID_DESC.".".$sensor} ." : $un\n"; + exit $ERRORS{'OK'}; +} +else{ + print "CRITICAL Host unavailable\n"; + exit $ERRORS{'CRITICAL'}; +} + + +sub print_usage () { + print "\nUsage:\n"; + print "$PROGNAME\n"; + print " -H (--hostname) Hostname to query - (required)\n"; + print " -C (--community) SNMP read community (defaults to public,\n"; + print " used with SNMP v1 and v2c\n"; + print " -v (--snmp_version) 1 for SNMP v1 (default)\n"; + print " 2 for SNMP v2c\n"; + print " -t (--sensor) Set the sensor number (1 by default)\n"; + print " -s (--show) Describes all sensors \n"; + print " -V (--version) Plugin version\n"; + print " -h (--help) usage help\n"; + +} + +sub print_help () { + print "Copyright (c) 2005 Oreon\n"; + print "Bugs to http://www.oreon.org/\n"; + print "\n"; + print_usage(); + print "\n"; +} diff --git a/centreon-plugins/Dev/src/check_centreon_http b/centreon-plugins/Dev/src/check_centreon_http new file mode 100644 index 000000000..8b15905af --- /dev/null +++ b/centreon-plugins/Dev/src/check_centreon_http @@ -0,0 +1,191 @@ +#! /usr/bin/perl -w +# +# $Id: check_graph_http,v 1.4 2005/08/01 18:03:52 gollum123 Exp $ +# +# This plugin is developped under GPL Licence: +# http://www.fsf.org/licenses/gpl.txt +# +# Modified for Oreon Project by : Sugumaran Mathavarajan - Mathieu Chateau - Christophe Coraboeuf +# +# The Software is provided to you AS IS and WITH ALL FAULTS. +# OREON makes no representation and gives no warranty whatsoever, +# whether express or implied, and without limitation, with regard to the quality, +# safety, contents, performance, merchantability, non-infringement or suitability for +# any particular or intended purpose of the Software found on the OREON web site. +# In no event will OREON be liable for any direct, indirect, punitive, special, +# incidental or consequential damages however they may arise and even if OREON has +# been previously advised of the possibility of such damages. + +## +## Plugin init +## +use strict; +use FindBin; +use lib "$FindBin::Bin"; +use lib "@NAGIOS_PLUGINS@"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); + +if (eval "require oreon" ) { + use oreon qw(get_parameters); + use vars qw($VERSION %oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} + +use Getopt::Long; +use vars qw($opt_h $opt_V $opt_g $opt_D $opt_S $opt_H $opt_I $opt_e $opt_s $opt_u $opt_p $opt_P $opt_w $opt_c + $opt_t $opt_a $opt_L $opt_f $opt_l $opt_r $opt_R $opt_z $opt_C $opt_step $step); +use vars qw($PROGNAME); + +## +## Plugin var init +## +my $pathtolibexechttp = $oreon{GLOBAL}{ NAGIOS_LIBEXEC}."check_http"; + +$PROGNAME = "$0"; +sub print_help (); +sub print_usage (); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, "help" => \$opt_h, + "V" => \$opt_V, "version" => \$opt_V, + "H=s" => \$opt_H, "hostname=s" => \$opt_H, + "I=s" => \$opt_I, "IP-address=s" => \$opt_I, + "e=s" => \$opt_e, "expect=s" => \$opt_e, + "s=s" => \$opt_s, "string=s" => \$opt_s, + "u=s" => \$opt_u, "url=s" => \$opt_u, + "p=s" => \$opt_p, "port=s" => \$opt_p, + "P=s" => \$opt_P, "post=s" => \$opt_P, + "w=s" => \$opt_w, "warning=s" => \$opt_w, + "c=s" => \$opt_c, "critical=s" => \$opt_c, + "t=s" => \$opt_t, "timeout=s" => \$opt_t, + "a=s" => \$opt_a, "authorization=s" => \$opt_a, + "L=s" => \$opt_L, "link=s" => \$opt_L, + "f=s" => \$opt_f, "onredirect=s" => \$opt_f, + "l=s" => \$opt_l, "linespan=s" => \$opt_l, + "r=s" => \$opt_r, "regex=s" => \$opt_r, + "R=s" => \$opt_R, "eregi=s" => \$opt_R, + "C=s" => \$opt_C, "certificate=s" => \$opt_C, + "z" => \$opt_R, "ssl" => \$opt_z + + ); + +if ($opt_V) { + print_revision($PROGNAME,'$Revision: 1.3 $'); + exit $ERRORS{'OK'}; +} + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; +} + +$opt_H = shift unless ($opt_H); +(print_usage() && exit $ERRORS{'OK'}) unless ($opt_H); + +($opt_step) || ($opt_step = shift) || ($opt_step = "300"); +$step = $1 if ($opt_step =~ /(\d+)/); + +my $args_check_http = ""; +if ( $opt_H ) { + $args_check_http .= " -H $opt_H"; +} +if ( $opt_I ) { + $args_check_http .= " -I $opt_I"; +} +if ( $opt_e ) { + $args_check_http .= " -e $opt_e"; +} +if ( $opt_s ) { + $args_check_http .= " -s $opt_s"; +} +if ( $opt_u ) { + $args_check_http .= " -u $opt_u"; +} +if ( $opt_p ) { + $args_check_http .= " -p $opt_p"; +} +if ( $opt_P ) { + $args_check_http .= " -P $opt_P"; +} +if ( $opt_I ) { + $args_check_http .= " -I $opt_I"; +} +if ( $opt_e ) { + $args_check_http .= " -e $opt_e"; +} +if ( $opt_w ) { + $args_check_http .= " -w $opt_w"; +} +if ( $opt_c ) { + $args_check_http .= " -c $opt_c"; +} +if ( $opt_t ) { + $args_check_http .= " -t $opt_t"; +} +if ( $opt_a ) { + $args_check_http .= " -a $opt_a"; +} +if ( $opt_L ) { + $args_check_http .= " -L $opt_L"; +} +if ( $opt_f ) { + $args_check_http .= " -f $opt_f"; +} +if ( $opt_l ) { + $args_check_http .= " -l $opt_l"; +} +if ( $opt_r ) { + $args_check_http .= " -r $opt_r"; +} +if ( $opt_R ) { + $args_check_http .= " -R $opt_R"; +} +if ( $opt_C ) { + $args_check_http .= " -C $opt_C"; +} +if ( $opt_z ) { + $args_check_http .= " --ssl"; +} + + + +my $start=time; +my $name = $0; +$name =~ s/\.pl.*//g; + +## +## Plugin requests +## +# print "args: $args_check_http \n"; +my $result = `$pathtolibexechttp $args_check_http`; +my $return_code = $? / 256; + +$_ = $result; +m/time=\s*(\d*\.\d*)/; +my $time = $1; + + +print "$result"; +exit $return_code; + +## +## Plugin return code +## +sub print_usage () { + my $screen = `$pathtolibexechttp -h`; + $screen =~ s/check_http/check_graph_http/g; + $screen =~ s/-S/-Z/; + print $screen; +} + +sub print_help () { + print "Copyright (c) 2005 LINAGORA SA\n"; + print "Bugs to http://www.linagora.com/\n"; + print "\n"; + print_usage(); + print "\n"; +} diff --git a/centreon-plugins/Dev/src/check_centreon_nt b/centreon-plugins/Dev/src/check_centreon_nt new file mode 100644 index 000000000..830a81a58 --- /dev/null +++ b/centreon-plugins/Dev/src/check_centreon_nt @@ -0,0 +1,336 @@ +#! /usr/bin/perl -w +# +# $Id: check_graph_nt.pl,v 1.4 2005/08/01 18:04:00 gollum123 Exp $ +# +# Oreon's plugins are developped with GPL Licence : +# http://www.fsf.org/licenses/gpl.txt +# Developped by : Julien Mathis - Mathieu Mettre +# +# Modified for Oreon Project by : Mathieu Chateau - Christophe Coraboeuf +# Modified for Oreon Project by : Sugumaran Mathavarajan - msugumaran@merethis.com +# +# The Software is provided to you AS IS and WITH ALL FAULTS. +# OREON makes no representation and gives no warranty whatsoever, +# whether express or implied, and without limitation, with regard to the quality, +# safety, contents, performance, merchantability, non-infringement or suitability for +# any particular or intended purpose of the Software found on the OREON web site. +# In no event will OREON be liable for any direct, indirect, punitive, special, +# incidental or consequential damages however they may arise and even if OREON has +# been previously advised of the possibility of such damages. + +## +## Plugin init +## +use strict; +use FindBin; +use lib "$FindBin::Bin"; +use lib "@NAGIOS_PLUGINS@"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); + + +if (eval "require oreon" ) { + use oreon qw(get_parameters create_rrd update_rrd &is_valid_serviceid); + use vars qw($VERSION %oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} + +use vars qw($PROGNAME); +use Getopt::Long; +use vars qw($opt_H $opt_p $opt_s $opt_v $opt_V $opt_h $opt_w $opt_c $opt_S $opt_g $opt_t $opt_l $opt_d $opt_D $opt_step $step $opt_f); + +## +## Plugin var init +## +my $pathtolibexecnt = $oreon{GLOBAL}{NAGIOS_LIBEXEC}."check_nt"; + +my($op_v, $op_d, $op_s, $op_t, $op_l, $port, @values, @test, @test2, @test3, @test4, @test5, $warning, $critical, @w, @c, $uptime); +my($warning2, $critical2, $warning3, $critical3, $warning4, $critical4, @output); +$PROGNAME = "$0"; +sub print_help (); +sub print_usage (); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, "help" => \$opt_h, + "p=s" => \$opt_p, "port=s" => \$opt_p, + "V" => \$opt_V, "version" => \$opt_V, + "s=s" => \$opt_s, "password=s" => \$opt_s, + "d=s" => \$opt_d, "showall=s" => \$opt_d, + "v=s" => \$opt_v, "variable=s" => \$opt_v, + "D=s" => \$opt_D, "directory=s" => \$opt_D, + "t=s" => \$opt_t, "timeout=s" => \$opt_t, + "l:s" => \$opt_l, "parameter:s" => \$opt_l, + "w=s" => \$opt_w, "warning=s" => \$opt_w, + "c=s" => \$opt_c, "critical=s" => \$opt_c, + "H=s" => \$opt_H, "hostname=s" => \$opt_H); + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; +} + +if ($opt_V) { + $_ = `$pathtolibexecnt -V`; + print "$_"; + exit $ERRORS{'OK'}; +} + +if ($opt_p) { + if ($opt_p =~ /([0-9]+)/){ + $port = $1; + } + else{ + print "Unknown -p number expected... or it doesn't exist, try another port - number\n"; + exit $ERRORS{'UNKNOWN'}; + } +} + +$opt_H = shift unless ($opt_H); +(print_usage() && exit $ERRORS{'OK'}) unless ($opt_H); + + +if ($opt_c) { + ($opt_c) || ($opt_c = shift); + $critical = $1 if ($opt_c =~ /([0-9]+)/); +} + +if ($opt_w) { + ($opt_w) || ($opt_w = shift); + $warning = $1 if ($opt_w =~ /([0-9]+)/); +} + +if (($critical && $warning) && ($critical <= $warning)) { + print "(--crit) must be superior to (--warn)"; + print_usage(); + exit $ERRORS{'OK'}; +} + + +if ($opt_t) { + ($opt_t) || ($opt_t = shift); + $op_t = $1 if ($opt_t =~ /([-\.,\w]+)/); +} + +if ($opt_l) { + ($opt_l) || ($opt_l = shift); + $op_l = $1 if ($opt_l =~ /(.+)/); +} + +if ($opt_s) { + ($opt_s) || ($opt_s = shift); + $op_s = $1 if ($opt_s =~ /([-.,A-Za-z0-9]+)/); +} + +if ($opt_d) { + ($opt_d) || ($opt_d = shift); + $op_d = $1 if ($opt_d =~ /([-.,A-Za-z0-9]+)/); +} + +if ($opt_v) { + ($opt_v) || ($opt_v = shift); + $op_v = $1 if ($opt_v =~ /([-.,A-Za-z0-9]+)/); +} + +($opt_step) || ($opt_step = shift) || ($opt_step = 300); +$step = $1 if ($opt_step =~ /(\d+)/); + +my $name = $0; +$name =~ s/\.pl.*//g; +my $return_code; +## +## Plugin requests +## +my $start=time; +if ($op_v) { + if ($op_v) {$op_v = "-v ".$op_v;} + if ($port) {$port = "-p ".$port;} else { $port = " ";} + if ($warning) {$warning = "-w ".$warning;} else { $warning = " ";} + if ($critical) {$critical = "-c ".$critical;} else { $critical = " ";} + if ($op_l) {$op_l = "-l \"".$op_l ."\"";} else { $op_l = " ";} + if ($op_t) {$op_t = "-t ".$op_t;} else { $op_t = " ";} + if ($op_s) {$op_s = "-s ".$op_s;} else { $op_s = " ";} + if ($op_d) {$op_d = "-d ".$op_d;} else { $op_d = " ";} +# print "$pathtolibexecnt -H $opt_H $op_v $port $warning $critical $op_l $op_t $op_s $op_d\n"; + $_ = `$pathtolibexecnt -H $opt_H $op_v $port $warning $critical $op_l $op_t $op_s $op_d 2>/dev/null`; + my $return = $_; + $return =~ s/\\//g; + $return_code = $? / 256; + + ## + ## CLIENTVERSION + ## + if ($op_v =~ /CLIENTVERSION/){ + print "CLIENTVERSION impossible to Graph!\n"; + exit $ERRORS{'UNKNOWN'}; + } + + if (($op_v =~ /CPULOAD/) && ($op_l =~ /([-\.,\w]+)/)){ ## CPULOAD + @output = split(/\|/,$_); + @values = $output[0] =~ /(\d*)\%/g ; + $start=time; + ## Print Plugins Output + $return =~ s/\n/ /g; + if (@values){ + if (defined($opt_c) && defined($opt_w)){ + print $return . "|cpu=@values;$opt_w;$opt_c\n"; + } else { + print $return . "|cpu=@values\n"; + } + } else { + print $return . "\n"; + } + exit $return_code; + } elsif ($op_v =~ /UPTIME/){ ## UPTIME + if ($_ =~ /.*[-:]+\s(\d+)\s.*$/ ) { + $uptime = $1; + } else { + print "unable to parse check_nt output: $_\n" ; + exit $ERRORS{'UNKNOWN'}; + } + $_ =~ s/\n/ /g; + if (defined($uptime)){ + print $_ . "|uptime=".$uptime."d\n"; + } else { + print $_ . "\n"; + } + exit $return_code; + } elsif (($op_v =~ /USEDDISKSPACE/) && ($op_l =~ /([-\.,\w]+)/)){ ## USEDDISKSPACE + my @test = split(/ /,$_); + if (defined($test[9]) && defined($test2[1])){ + @test2 = split(/\(/, $test[9]); + @test3 = split(/\%/, $test2[1]); + } + @c = split(/ /, $critical); + $critical = $c[1]; + @w = split(/ /, $warning); + $warning = $w[1]; + ## Print Plugins Output + $return =~ s/\n/ /g; + $return =~ s/%/ pct/g; + if (defined($test[3]) && defined($test[7]) && defined($test[12])){ + print $return . "|total=".$test[3]."Mo used=".$test[7]."Mo free=".$test[12]."Mo\n"; + } else { + print $return . "\n"; + } + exit $return_code; + } elsif ($op_v =~ /MEMUSE/){ ## MEMUSE + $start=time; + my @test = split(/ /,$_); + if (defined($test[2])){ + @test4 = split(/:/, $test[2]); + } + @c = split(/ /, $critical); + $critical = $c[1]; + @w = split(/ /, $warning); + $warning = $w[1]; + ## Print Plugins Output + $return =~ s/\n/ /g; + $return =~ s/%/ pct/g; + if ($test4[1] && $test[6] && $test[11]){ + print $return . "|total=".$test4[1]." used=".$test[6]." free=".$test[11]."\n"; + } else { + print $return . "\n"; + } + exit $return_code; + } elsif ($op_v =~ /SERVICESTATE/){## SERVICESTATE + my (@tab, $process, $nom, $etat); + @tab = split (' - ',$_); + foreach $process (@tab) { + ($nom,$etat) = split (': ', $process); + if (defined($etat)) { + $etat =~ s/\n//; + } else { + $etat = "Unknow"; + } + if ($etat =~ /Started/) + {$etat=1;} + elsif ($etat =~ /Stopped/) + {$etat=0;} + elsif ($etat =~ /Unknown/) + {$etat=-1;} + else { + print "Unable to get $nom status [$etat]: \n\t$_\n"; + exit $ERRORS{'UNKNOWN'}; + } + } + $return =~ s/%/ pct/g; + print $return; + exit $return_code; + } elsif ($op_v =~ /PROCSTATE/){## PROCSTATE + print "PROCSTATE not graphed\n"; + exit $ERRORS{'UNKNOWN'}; + } elsif (($op_v =~ /COUNTER/) && ($op_l =~ /(.+)/)) { ## COUNTER + @output = split(/\|/,$_); + @values = $output[0] =~ /([,\.\d]*)\s?\%/ ; + if (!@values) {@values = $output[0] =~ /([\d]*)/;} + $start=time; + ## Print Plugins Output + $return =~ s/\n/ /g; + $return =~ s/%/ pct/g; + print $return . "|counter=".@values."\n"; + exit $return_code; + } +} else { + print "Could not parse arguments\n"; + exit $ERRORS{'UNKNOWN'}; +} + +## +## Plugin return code +## + +sub print_usage () { + print "\nUsage:\n"; + print "$PROGNAME\n"; + print " Usage: check_graph_nt -H host -v variable [-p port] [-s password] [-w warning] [-c critical] [-l params] [-d SHOWALL] [-t timeout] \n"; + print " Options:\n"; + print " -H, --hostname=HOST\n"; + print " Name of the host to check\n"; + print " -p, --port=INTEGER\n"; + print " Optional port number (default: 1248)\n"; + print " -s \n"; + print " Password needed for the request\n"; + print " -v, --variable=STRING\n"; + print " Variable to check. Valid variables are:\n"; + print " CLIENTVERSION = Not Graphed. Get the NSClient version\n"; + print " CPULOAD = Average CPU load on last x minutes. Request a -l parameter with the following syntax:\n"; + print " -l ,,. should be less than 24*60.\n"; + print " Thresholds are percentage and up to 10 requests can be done in one shot. ie: -l 60,90,95,120,90,95\n"; + print " and 4 requests can be graphed.\n"; + print " UPTIME = Only Days are graphed. Get the uptime of the machine. No specific parameters. No warning or critical threshold.\n"; + print " USEDDISKSPACE = Size and percentage of disk use. Request a -l parameter containing the drive letter only.\n"; + print " Warning and critical thresholds can be specified with -w and -c.\n"; + print " MEMUSE = Memory use. Warning and critical thresholds can be specified with -w and -c.\n"; + print " SERVICESTATE = Check and graph the state of one service. Request a -l parameters with the following syntax:\n"; + print " -l ... You MUST specify -d SHOWALL in the input command.\n"; + print " 1: Service Started - 0: Service Stopped - -1: Service Unknown.\n"; +# print " SERVICESTATE = Not Graphed. Check the state of one or several services. Request a -l parameters with the following syntax:\n"; +# print " -l ,,,... You can specify -d SHOWALL in case you want to see working services\n"; +# print " in the returned string.\n"; + print " PROCSTATE = Not Graphed. Check if one or several process are running. Same syntax as SERVICESTATE.\n"; + print " COUNTER = Check any performance counter of Windows NT/2000. Request a -l parameters with the following syntax:\n"; + print " -l \"counter\",\"\" The parameter is optional and\n"; + print " is given to a printf output command which require a float parameters. Some examples:\n"; + print " \"Paging file usage is %.2f %%\" or \"%.f %% paging file used.\"\n"; + print " -w, --warning=INTEGER\n"; + print " Threshold which will result in a warning status\n"; + print " -c, --critical=INTEGER\n"; + print " Threshold which will result in a critical status\n"; + print " -t, --timeout=INTEGER\n"; + print " Seconds before connection attempt times out (default: 10)\n"; + print " -h, --help\n"; + print " Print this help screen\n"; + print " -V, --version\n"; + print " Print version information\n"; +} + +sub print_help () { + print "Copyright (c) 2004 OREON\n"; + print "Bugs to http://www.oreon.org/\n"; + print "\n"; + print_usage(); + print "\n"; +} diff --git a/centreon-plugins/Dev/src/check_centreon_packetErrors b/centreon-plugins/Dev/src/check_centreon_packetErrors new file mode 100644 index 000000000..572c0f686 --- /dev/null +++ b/centreon-plugins/Dev/src/check_centreon_packetErrors @@ -0,0 +1,243 @@ +#! /usr/bin/perl -w +# +# $Id: check_packetsErrors.pl,v 1.2 2005/07/27 22:21:49 Julio $ +# +# Oreon's plugins are developped with GPL Licence : +# http://www.fsf.org/licenses/gpl.txt +# Developped by : Julien Mathis - Romain Le Merlus - Sugumaran Mat +# +# Modified for Oreon Project by : Mathieu Chateau - Christophe Coraboeuf +# Modified By Julien Mathis For Merethis Company +# +# The Software is provided to you AS IS and WITH ALL FAULTS. +# OREON makes no representation and gives no warranty whatsoever, +# whether express or implied, and without limitation, with regard to the quality, +# safety, contents, performance, merchantability, non-infringement or suitability for +# any particular or intended purpose of the Software found on the OREON web site. +# In no event will OREON be liable for any direct, indirect, punitive, special, +# incidental or consequential damages however they may arise and even if OREON has +# been previously advised of the possibility of such damages. + +# +# Plugin init +# + +use strict; +use Net::SNMP qw(:snmp oid_lex_sort); +use FindBin; +use lib "$FindBin::Bin"; +use lib "@NAGIOS_PLUGINS@"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); + +if (eval "require oreon" ) { + use oreon qw(get_parameters); + use vars qw($VERSION %oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} + +use vars qw($VERSION %oreon); +use vars qw(%oreon); +$VERSION = '$Revision: 1.2 $'; +$VERSION =~ s/^\$.*:\W(.*)\W.+?$/$1/; + +use vars qw($PROGNAME); +use Getopt::Long; +use vars qw($opt_V $opt_h $opt_v $opt_C $opt_H $opt_w $opt_c); + +# +# Plugin var init +# +$PROGNAME = "$0"; + +my ($row, @flg_created, @last_check_time, @last_in_errors, @last_out_errors, $result_in, $result_out, @nb_out_errors, @nb_in_errors, $update_time, $db_file); +my $pathtolibexecnt = $oreon{NAGIOS_LIBEXEC}; + +sub print_help (); +sub print_usage (); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, "help" => \$opt_h, + "V" => \$opt_V, "version" => \$opt_V, + "v=s" => \$opt_v, "snmp=s" => \$opt_v, + "C=s" => \$opt_C, "community=s" => \$opt_C, + "w=s" => \$opt_w, "warning=s" => \$opt_w, + "c=s" => \$opt_c, "critical=s" => \$opt_c, + "H=s" => \$opt_H, "hostname=s" => \$opt_H); + +if ($opt_V) { + print_revision($PROGNAME,'$Revision: 1.2 $'); + exit $ERRORS{'OK'}; +} + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; +} + +################################################## +##### Verify Options +## + +$opt_H = shift unless ($opt_H); +(print_usage() && exit $ERRORS{'OK'}) unless ($opt_H); + +($opt_v) || ($opt_v = shift) || ($opt_v = "1"); +my $snmp = $1 if ($opt_v =~ /(\d)/); + +($opt_C) || ($opt_C = shift) || ($opt_C = "public"); +($opt_c) || ($opt_c = shift) || ($opt_c = 100); +my $critical = $1 if ($opt_c =~ /([0-9]+)/); + +($opt_w) || ($opt_w = shift) || ($opt_w = 80); +my $warning = $1 if ($opt_w =~ /([0-9]+)/); + +if ($critical <= $warning){ + print "(--crit) must be superior to (--warn)"; + print_usage(); + exit $ERRORS{'OK'}; +} + +my $start=time; + + +################################################# +##### Plugin snmp requests +## + +my $OID_IN_ERRORS = ".1.3.6.1.2.1.2.2.1.14"; +my $OID_OUT_ERRORS = ".1.3.6.1.2.1.2.2.1.20"; + + +# create a SNMP session + +my ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -community => $opt_C, -version => $snmp); +if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error"); + exit $ERRORS{'UNKNOWN'}; +} + +####### Get IN ERRORS + +$result_in = $session->get_table(Baseoid => $OID_IN_ERRORS); +if (!defined($result_in)) { + printf("ERROR: IN_ERRORS : %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; +} + +# loop for each interface +foreach my $err (oid_lex_sort(keys %$result_in)) { + $nb_in_errors[scalar(@nb_in_errors)] = $result_in->{$err}; +} +# ####### Get OUT ERRORS + +$result_out = $session->get_table(Baseoid => $OID_OUT_ERRORS); +if (!defined($result_out)) { + printf("ERROR: OUT_ERRORS : %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; +} +foreach my $err (oid_lex_sort(keys %$result_out)) { + $nb_out_errors[scalar(@nb_out_errors)] = $result_out->{$err}; +} + +# ############################################# +# ##### read and write in buffer file +# ## + +for (my $i = 0; $i < scalar(@nb_in_errors); $i++) { + if (-e "/tmp/packet_errors_if".$i."_".$opt_H.".tmp") { + open(FILE,"<"."/tmp/packet_errors_if".$i."_".$opt_H.".tmp"); + while($row = ){ + my @last_values = split(":",$row); + $last_check_time[$i] = $last_values[0]; + $last_in_errors[$i] = $last_values[1]; + $last_out_errors[$i] = $last_values[2]; + $flg_created[$i] = 1; + } + close(FILE); + } else { + $flg_created[$i] = 0; + } + + $update_time = time; + + unless (open(FILE,">"."/tmp/packet_errors_if".$i."_".$opt_H.".tmp")){ + print "Unknown - /tmp/tmp/packet_errors_if".$i."_".$opt_H.".tmp!\n"; + exit $ERRORS{"UNKNOWN"}; + } + print FILE "$update_time:$nb_in_errors[$i]:$nb_out_errors[$i]"; + close(FILE); + if ($flg_created[$i] eq 0){ + print "First execution : Buffer in creation.... \n"; + } +} + +# ############################################# +# ##### return result +# ## +my $status = "OK"; +my @msg; +my $diff_test = 0; +for (my $i = 0; $i < scalar(@nb_in_errors); $i++) { + my $interface = $i+1; + if ($flg_created[$i]) { + if (($nb_in_errors[$i] - $last_in_errors[$i] >= $critical) or ($nb_out_errors[$i] - $last_out_errors[$i] >= $critical)){ + $msg[$i] = "$interface:critical "; + $status = "CRITICAL"; + } + if(($nb_in_errors[$i] - $last_in_errors[$i] >= $warning) or ($nb_out_errors[$i] - $last_out_errors[$i] >= $warning)){ + if (!defined($msg[$i])) { + $msg[$i] = "$interface:warning "; + } + if ($status ne "CRITICAL") { + $status = "WARNING"; + } + } + $diff_test = 1; + } +} + +if (!$diff_test) { + exit($ERRORS{'UNKNOWN'}); +} +my $output = ""; +for (my $i = 0; $i < scalar (@msg); $i++) { + if (defined($msg[$i])) { + $output .= $msg[$i]; + } +} +if ($output ne ""){ + print $output."\n"; +}else { + print "Status OK on all interfaces\n"; +} +exit($ERRORS{$status}); + sub print_usage () { + print "\nUsage:\n"; + print "$PROGNAME\n"; + print " -H (--hostname) Hostname to query - (required)\n"; + print " -C (--community) SNMP read community (default to public)\n"; + print " used with SNMP v1 and v2c\n"; + print " -v (--snmp_version) 1 for SNMP v1 (default)\n"; + print " 2 for SNMP v2c\n"; + print " -w (--warn) Signal strength at which a warning message will be generated\n"; + print " (default 80)\n"; + print " -c (--crit) Signal strength at which a critical message will be generated\n"; + print " (default 100)\n"; + print " -V (--version) Plugin version\n"; + print " -h (--help) usage help\n"; + } + + sub print_help () { + print "##########################################\n"; + print "# Copyright (c) 2004-2006 Oreon #\n"; + print "# Bugs to http://www.oreon-project.org/ #\n"; + print "##########################################\n"; + print_usage(); + print "\n"; + } diff --git a/centreon-plugins/Dev/src/check_centreon_ping b/centreon-plugins/Dev/src/check_centreon_ping new file mode 100644 index 000000000..29da08658 --- /dev/null +++ b/centreon-plugins/Dev/src/check_centreon_ping @@ -0,0 +1,201 @@ +#! /usr/bin/perl -w +# +# $Id: check_oreon_ping,v 1.3 2006/04/28 10:21:49 Julien Mathis $ +# +# Oreon's plugins are developped with GPL Licence : +# http://www.fsf.org/licenses/gpl.txt +# Developped by : Julien Mathis - Mathieu Mettre - Romain Le Merlus +# +# Modified for Oreon Project by : Mathieu Chateau - Christophe Coraboeuf +# Modified By Julien Mathis - Sugumaran Mathavarajan For Merethis Company +# +# The Software is provided to you AS IS and WITH ALL FAULTS. +# OREON makes no representation and gives no warranty whatsoever, +# whether express or implied, and without limitation, with regard to the quality, +# safety, contents, performance, merchantability, non-infringement or suitability for +# any particular or intended purpose of the Software found on the OREON web site. +# In no event will OREON be liable for any direct, indirect, punitive, special, +# incidental or consequential damages however they may arise and even if OREON has +# been previously advised of the possibility of such damages. + +# +# Plugin init +# + +use strict; +use FindBin; +use lib "$FindBin::Bin"; +use lib "@NAGIOS_PLUGINS@"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); + +if (eval "require oreon" ) { + use oreon qw(get_parameters); + use vars qw($VERSION %oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} + +use vars qw($PROGNAME); +use Getopt::Long; +use vars qw($opt_V $opt_h $opt_g $opt_H $opt_D $opt_w $opt_c $opt_n $opt_f $opt_S $rta_critical $rta_warning $pl_critical $pl_warning $opt_s $opt_step $step ); + +# +# Plugin var init +# + +my $ping = `whereis -b ping`; +$ping =~ /^.*:\s(.*)$/; +$ping = $1; + +$PROGNAME = "$0"; +sub print_help (); +sub print_usage (); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, "help" => \$opt_h, + "V" => \$opt_V, "version" => \$opt_V, + "rrd_step=s" => \$opt_step,"f" => \$opt_f, + "w=s" => \$opt_w, "warning=s" => \$opt_w, + "c=s" => \$opt_c, "critical=s" => \$opt_c, + "n=s" => \$opt_n, "number=s" => \$opt_n, + "H=s" => \$opt_H, "hostname=s" => \$opt_H); + +if ($opt_V) { + print_revision($PROGNAME,'$Revision: 1.2 $'); + exit $ERRORS{'OK'}; +} + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; +} + +$opt_H = shift unless ($opt_H); +(print_usage() && exit $ERRORS{'OK'}) unless ($opt_H); + +($opt_c) || ($opt_c = shift) || ($opt_c = "500,40%"); +if ($opt_c =~ /([0-9]+),([0-9]+)%/) { + $rta_critical = $1; + $pl_critical = $2; +} + +($opt_w) || ($opt_w = shift) || ($opt_w = "200,20%"); +if ($opt_w =~ /([0-9]+),([0-9]+)%/) { + $rta_warning = $1; + $pl_warning = $2; +} +if (!$rta_warning || !$rta_critical || !$pl_warning || !$pl_critical) { + print "bad initialisation of Treshholds\n"; + exit $ERRORS{'OK'}; +} + +if ( ($rta_critical <= $rta_warning) || ($pl_critical <= $pl_warning) ) { + print "critical must be superior to warning\n"; + print_usage(); + exit $ERRORS{'OK'}; +} + +($opt_n) || ($opt_n = shift) || ($opt_n = 1); +my $NbPing; +if ($opt_n =~ /([0-9]+)/){ + $NbPing = $1; +} else{ + print "Unknown ping number\n"; + exit $ERRORS{'UNKNOWN'}; +} + +my $start=time; + +# +# RRDTools create rrd +# + +# +# Plugin requests +# + +$_ = `$ping -n -c $NbPing $opt_H 2>/dev/null`; +my $return = $? / 256; + +# +# Get Data From Ping Result +# +if (!$_) { + print "no value returned by ping\n"; + exit $ERRORS{'UNKNOWN'}; +} +my $ping_result = $_; +my @ping_result_array = split(/\n/,$ping_result); +my @ping_subresult1_array; +my @ping_subresult2_array; +my $rta = 0; +my $pl; +my $time_answer; + +if( ( $return != 0 ) || $ping_result_array[@ping_result_array -2 ] =~ /100% packet loss/) { + $rta = -1; + $time_answer = 0; +} else { + @ping_subresult1_array = split(/=/,$ping_result_array[@ping_result_array -1 ]); + @ping_subresult2_array = split(/,/,$ping_result_array[@ping_result_array -2 ]); + @ping_subresult1_array = split(/\//,$ping_subresult1_array[1]); + @ping_subresult2_array = split(/ /,$ping_subresult2_array[2]); + $rta = $ping_subresult1_array[1]; + $pl = $ping_subresult2_array[1]; + $time_answer = $ping_subresult1_array[1]; + $pl =~ /([0-9]+)\%/; + $pl = $1; +} + +# +# Plugin return code +# + +my $result_str = ""; + +if( $rta == -1 ) { + $ping_result_array[@ping_result_array -2 ] =~ s/\%/percent/g; + print "GPING CRITICAL - ".$ping_result_array[@ping_result_array -2 ]."|time=0 ok=0\n"; + exit $ERRORS{'CRITICAL'}; +} elsif ( ($pl >= $pl_critical) || ($rta >= $rta_critical) ) { + $ping_result_array[@ping_result_array -1 ] =~ s/\%/percent/g; + my @tab = split(/,/,$ping_result_array[@ping_result_array -1 ]); + print "GPING CRITICAL - ". $tab[1] ."|time=".$time_answer."ms;$pl_warning;$pl_critical;; ok=1\n"; + exit $ERRORS{'CRITICAL'}; +} elsif ( ($pl >= $pl_warning) || ($rta >= $rta_warning) ) { + $ping_result_array[@ping_result_array -1 ] =~ s/\%/percent/g; + my @tab = split(/,/,$ping_result_array[@ping_result_array -1 ]); + print "GPING WARNING - ".$tab[0]."|time=".$time_answer."ms;$pl_warning;$pl_critical;; ok=1\n"; + exit $ERRORS{'WARNING'}; +} else { + $ping_result_array[@ping_result_array -1 ] =~ s/\%/percent/g; + my @tab = split(/,/,$ping_result_array[@ping_result_array -1 ]); + print "GPING OK - ".$tab[0]."|time=".$time_answer."ms;$pl_warning;$pl_critical;; ok=1\n"; + exit $ERRORS{'OK'}; +} + +sub print_usage () { + print "Usage:\n"; + print "$PROGNAME\n"; + print " -H (--hostname) Hostname to query (Required)\n"; + print " -g (--rrdgraph) Create a rrd base if necessary and add datas into this one\n"; + print " --rrd_step Specifies the base interval in seconds with which data will be fed into the RRD (300 by default)\n"; + print " -S (--ServiceId) Oreon Service Id\n"; + print " -w (--warning) Threshold pair (Default: 200,20%)\n"; + print " -c (--critical) Threshold pair (Default: 500,40%)\n"; + print " -n (--number) number of ICMP ECHO packets to send (Default: 1)\n"; + print " -V (--version) Plugin version\n"; + print " -h (--help) usage help\n"; +} + +sub print_help () { + print "######################################################\n"; + print "# Copyright (c) 2004-2006 Oreon-project #\n"; + print "# Bugs to http://www.oreon-project.org/ #\n"; + print "######################################################\n"; + print_usage(); + print "\n"; +} diff --git a/centreon-plugins/Dev/src/check_centreon_snmp_loadaverage b/centreon-plugins/Dev/src/check_centreon_snmp_loadaverage new file mode 100644 index 000000000..36373524e --- /dev/null +++ b/centreon-plugins/Dev/src/check_centreon_snmp_loadaverage @@ -0,0 +1,203 @@ +#! /usr/bin/perl -w +################################################################### +# Oreon is developped with GPL Licence 2.0 +# +# GPL License: http://www.gnu.org/licenses/gpl.txt +# +# Developped by : Julien Mathis - Romain Le Merlus +# Mathavarajan Sugumaran +# +################################################################### +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# For information : contact@merethis.com +#################################################################### +# +# Script init +# + +use strict; +use Net::SNMP qw(:snmp); +use FindBin; +use lib "$FindBin::Bin"; +use lib "@NAGIOS_PLUGINS@"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); +if (eval "require oreon" ) { + use oreon qw(get_parameters); + use vars qw($VERSION %oreon); + %oreon = get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} +use vars qw($PROGNAME); +use Getopt::Long; +use vars qw($opt_V $opt_h $opt_v $opt_C $opt_H $opt_c $opt_w $opt_D $snmp $opt_k $opt_u $opt_p @critical @warning); + +# Plugin var init + +my($return_code); + +$PROGNAME = "$0"; +sub print_help (); +sub print_usage (); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, "help" => \$opt_h, + "u=s" => \$opt_u, "username=s" => \$opt_u, + "p=s" => \$opt_p, "password=s" => \$opt_p, + "k=s" => \$opt_k, "key=s" => \$opt_k, + "V" => \$opt_V, "version" => \$opt_V, + "v=s" => \$opt_v, "snmp=s" => \$opt_v, + "C=s" => \$opt_C, "community=s" => \$opt_C, + "w=s" => \$opt_w, "warning=s" => \$opt_w, + "c=s" => \$opt_c, "critical=s" => \$opt_c, + "H=s" => \$opt_H, "hostname=s" => \$opt_H); + +if ($opt_V) { + print_revision($PROGNAME,'$Revision: 1.2 $'); + exit $ERRORS{'OK'}; +} + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; +} + +if (!$opt_H) { + print_usage(); + exit $ERRORS{'OK'}; +} + +my $snmp = "1"; +$snmp = $opt_v if ($opt_v && $opt_v =~ /^[0-9]$/); + +@critical = ('2', '4', '6'); +if ($opt_c && $opt_c =~ /^([0-9]+),([0-9]+),([0-9]+)$/) { + @critical = ($1,$2,$3); +} else { + print "Specify three critical treshold separated with a coma\n"; + exit $ERRORS{'OK'}; +} + +@warning = ('1', '3', '5'); +if ($opt_w && $opt_w =~ /^([0-9]+),([0-9]+),([0-9]+)$/) { + @warning = ($1,$2,$3); +} else { + print "Specify three warning treshold separated with a coma\n"; + exit $ERRORS{'OK'}; +} + +for (my $i = 0; $i < scalar(@warning); $i++) { + if ($warning[$i] >= $critical[$i]) { + print "Critical tresholds must be superior to warning tresholds.\n"; + exit $ERRORS{'OK'}; + } +} + +if ($snmp eq "3") { + if (!$opt_u) { + print "Option -u (--username) is required for snmpV3\n"; + exit $ERRORS{'OK'}; + } + if (!$opt_p && !$opt_k) { + print "Option -k (--key) or -p (--password) is required for snmpV3\n"; + exit $ERRORS{'OK'}; + } elsif ($opt_p && $opt_k) { + print "Only option -k (--key) or -p (--password) is needed for snmpV3\n"; + exit $ERRORS{'OK'}; + } +} + +$opt_C = "public" if (!$opt_C); + +my $name = $0; +$name =~ s/\.pl.*//g; + +# Plugin snmp requests + +my $OID_CPULOAD_1 =$oreon{UNIX}{CPU_LOAD_1M}; +my $OID_CPULOAD_5 =$oreon{UNIX}{CPU_LOAD_5M}; +my $OID_CPULOAD_15 =$oreon{UNIX}{CPU_LOAD_15M}; + +my ($session, $error); +if ($snmp eq "1" || $snmp eq "2") { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -community => $opt_C, -version => $snmp); + if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; + } +}elsif ($opt_k) { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -version => $snmp, -username => $opt_u, -authkey => $opt_k); + if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; + } +}elsif ($opt_p) { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -version => $snmp, -username => $opt_u, -authpassword => $opt_p); + if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; + } +} + +my $result = $session->get_request( + -varbindlist => [$OID_CPULOAD_1, $OID_CPULOAD_5, $OID_CPULOAD_15 ] + ); +if (!defined($result)) { + printf("UNKNOWN: %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; +} + +my $un = $result->{$OID_CPULOAD_1}; +my $cinq = $result->{$OID_CPULOAD_5}; +my $quinze = $result->{$OID_CPULOAD_15}; + +# Plugin return code +my $status = "OK"; +if ($warning[0] <= $un || $warning[1] <= $cinq || $warning[2] <= $quinze) { + $status = "WARNING"; +} +if ($critical[0] <= $un || $critical[1] <= $cinq || $critical[2] <= $quinze) { + $status = "CRITICAL"; +} + +print "load average: ".$un.", ".$cinq.", ".$quinze.".|load1=".$un." load5=".$cinq." load15=".$quinze."\n"; +exit $ERRORS{$status}; + +sub print_usage () { + print "\nUsage:\n"; + print "$PROGNAME\n"; + print " -H (--hostname) Hostname to query - (required)\n"; + print " -C (--community) SNMP read community (defaults to public,\n"; + print " -C (--community) SNMP read community (defaults to public,\n"; + print " -c (--critical) Three critical tresholds (defaults : 2,4,6)\n"; + print " -w (--warning) Three warning tresholds (defaults : 1,3,5)\n"; + print " -v (--snmp_version) 1 for SNMP v1 (default)\n"; + print " 2 for SNMP v2c\n"; + print " -k (--key) snmp V3 key\n"; + print " -p (--password) snmp V3 password\n"; + print " -u (--username) snmp v3 username \n"; + print " -V (--version) Plugin version\n"; + print " -h (--help) usage help\n"; +} + +sub print_help () { + print "######################################################\n"; + print "# Copyright (c) 2004-2007 Oreon-project #\n"; + print "# Bugs to http://www.oreon-project.org/ #\n"; + print "######################################################\n"; + print_usage(); + print "\n"; +} + diff --git a/centreon-plugins/Dev/src/check_centreon_snmp_process b/centreon-plugins/Dev/src/check_centreon_snmp_process new file mode 100644 index 000000000..50f0b267e --- /dev/null +++ b/centreon-plugins/Dev/src/check_centreon_snmp_process @@ -0,0 +1,210 @@ +#! /usr/bin/perl -w +################################################################### +# Oreon is developped with GPL Licence 2.0 +# +# GPL License: http://www.gnu.org/licenses/gpl.txt +# +# Developped by : Julien Mathis - Romain Le Merlus +# Christophe Coraboeuf - Sugumaran Mathavarajan +# +################################################################### +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# For information : contact@merethis.com +#################################################################### +# +# Script init +# + +use strict; +use Net::SNMP qw(:snmp oid_lex_sort); +use FindBin; +use lib "$FindBin::Bin"; +use lib "@NAGIOS_PLUGINS@"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); +if (eval "require oreon" ) { + use oreon qw(get_parameters); + use vars qw($VERSION %oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} + +use vars qw($PROGNAME); +use Getopt::Long; +use vars qw($opt_V $opt_h $opt_v $opt_C $opt_p $opt_H $opt_n $opt_k $opt_u $opt_x $result @result %process_list %STATUS); + +# Plugin var init + +my($proc, $proc_run); + +$PROGNAME = $0; +sub print_help (); +sub print_usage (); + +%STATUS=(1=>'running',2=>'runnable',3=>'notRunnable',4=>'invalid'); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, "help" => \$opt_h, + "u=s" => \$opt_u, "username=s" => \$opt_u, + "x=s" => \$opt_x, "password=s" => \$opt_x, + "k=s" => \$opt_k, "key=s" => \$opt_k, + "V" => \$opt_V, "version" => \$opt_V, + "n" => \$opt_n, "number" => \$opt_n, + "v=s" => \$opt_v, "snmp=s" => \$opt_v, + "C=s" => \$opt_C, "community=s" => \$opt_C, + "p=s" => \$opt_p, "process=s" => \$opt_p, + "H=s" => \$opt_H, "hostname=s" => \$opt_H); + +if ($opt_V) { + print_revision($PROGNAME,'$Revision: 1.2 $'); + exit $ERRORS{'OK'}; +} + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; +} + +if (!$opt_H) { + print_usage(); + exit $ERRORS{'OK'}; +} +my $snmp = "1"; +$snmp = $opt_v if ($opt_v && $opt_v =~ /^[0-9]$/); + +if ($snmp eq "3") { + if (!$opt_u) { + print "Option -u (--username) is required for snmpV3\n"; + exit $ERRORS{'OK'}; + } + if (!$opt_x && !$opt_k) { + print "Option -k (--key) or -x (--password) is required for snmpV3\n"; + exit $ERRORS{'OK'}; + } elsif ($opt_x && $opt_k) { + print "Only option -k (--key) or -x (--password) is needed for snmpV3\n"; + exit $ERRORS{'OK'}; + } +} + +$opt_C = "public" if (!$opt_C); + +my $process; +if(!$opt_p) { + print_usage(); + exit $ERRORS{'OK'}; +} elsif ($opt_p !~ /([-.A-Za-z0-9]+)/){ + print_usage(); + exit $ERRORS{'OK'}; +} +$process = $opt_p; + +my $name = $0; +$name =~ s/\.pl.*//g; + +# Plugin snmp requests +my $OID_SW_RunName = $oreon{MIB2}{SW_RUNNAME}; +my $OID_SW_RunIndex =$oreon{MIB2}{SW_RUNINDEX}; +my $OID_SW_RunStatus =$oreon{MIB2}{SW_RUNSTATUS}; + +my ($session, $error); +if ($snmp eq "1" || $snmp eq "2") { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -community => $opt_C, -version => $snmp); + if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; + } +} elsif ($opt_k) { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -version => $snmp, -username => $opt_u, -authkey => $opt_k); + if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; + } +} elsif ($opt_x) { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -version => $snmp, -username => $opt_u, -authpassword => $opt_x); + if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; + } +} + +$result = $session->get_table(Baseoid => $OID_SW_RunName); +if (!defined($result)) { + printf("UNKNOWN: %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; +} + +$proc = 0; +foreach my $key (oid_lex_sort(keys %$result)) { + my @oid_list = split (/\./,$key); + $process_list{$$result{$key}} = pop (@oid_list) ; + if (defined($opt_p) && $opt_p ne ""){ + $proc++ if ($$result{$key} eq $opt_p); + } else { + $proc++; + } +} + +if (!($opt_n)) { + if ($process_list{$process}) { + $result = $session->get_request(-varbindlist => [$OID_SW_RunStatus . "." . $process_list{$process}]); + if (!defined($result)) { + printf("UNKNOWN: %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; + } + $proc_run = $result->{$OID_SW_RunStatus . "." . $process_list{$process} }; + } +} + +# Plugin return code + +if ($opt_n){ + print "Processes OK - Number of current processes: $proc|nbproc=$proc\n"; + exit $ERRORS{'OK'}; +} else { + if ($proc_run){ + print "Process OK - $process: $STATUS{$proc_run}|procstatus=$proc_run\n"; + exit $ERRORS{'OK'}; + } else { + print "Process CRITICAL - $process not in 'running' state\n"; + exit $ERRORS{'CRITICAL'}; + } +} + +sub print_usage () { + print "\nUsage:\n"; + print "$PROGNAME\n"; + print " -H (--hostname) Hostname to query - (required)\n"; + print " -C (--community) SNMP read community (defaults to public,\n"; + print " used with SNMP v1 and v2c\n"; + print " -v (--snmp_version) 1 for SNMP v1 (default)\n"; + print " 2 for SNMP v2c\n"; + print " -n (--number) Return the number of current running processes. \n"; + print " -p (--process) Set the process name ex: by default smbd\n"; + print " -k (--key) snmp V3 key\n"; + print " -x (--password) snmp V3 password\n"; + print " -u (--username) snmp v3 username \n"; + print " -V (--version) Plugin version\n"; + print " -h (--help) usage help\n"; +} + +sub print_help () { + print "######################################################\n"; + print "# Copyright (c) 2004-2007 Oreon-project #\n"; + print "# Bugs to http://www.oreon-project.org/ #\n"; + print "######################################################\n"; + print_usage(); + print "\n"; +} diff --git a/centreon-plugins/Dev/src/check_centreon_snmp_remote_storage b/centreon-plugins/Dev/src/check_centreon_snmp_remote_storage new file mode 100644 index 000000000..58b0c3f29 --- /dev/null +++ b/centreon-plugins/Dev/src/check_centreon_snmp_remote_storage @@ -0,0 +1,329 @@ +#! /usr/bin/perl -w +################################################################### +# Oreon is developped with GPL Licence 2.0 +# +# GPL License: http://www.gnu.org/licenses/gpl.txt +# +# Developped by : Julien Mathis - Romain Le Merlus +# Christophe Coraboeuf - Sugumaran Mathavarajan +# +################################################################### +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# For information : contact@merethis.com +#################################################################### +# +# Script init +# + +use strict; +use Net::SNMP qw(:snmp); +use FindBin; +use lib "$FindBin::Bin"; +use lib "@NAGIOS_PLUGINS@"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); +if (eval "require oreon" ) { + use oreon qw(get_parameters); + use vars qw(%oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} +use vars qw($PROGNAME); +use Getopt::Long; +use vars qw($opt_V $opt_h $opt_v $opt_f $opt_C $opt_d $opt_k $opt_u $opt_p $opt_n $opt_w $opt_c $opt_H $opt_s @test); + +# Plugin var init + +my ($hrStorageDescr, $hrStorageAllocationUnits, $hrStorageSize, $hrStorageUsed); +my ($AllocationUnits, $Size, $Used); +my ($tot, $used, $pourcent, $return_code); + +$PROGNAME = "$0"; +sub print_help (); +sub print_usage (); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, "help" => \$opt_h, + "u=s" => \$opt_u, "username=s" => \$opt_u, + "p=s" => \$opt_p, "password=s" => \$opt_p, + "k=s" => \$opt_k, "key=s" => \$opt_k, + "V" => \$opt_V, "version" => \$opt_V, + "s" => \$opt_s, "show" => \$opt_s, + "v=s" => \$opt_v, "snmp=s" => \$opt_v, + "C=s" => \$opt_C, "community=s" => \$opt_C, + "d=s" => \$opt_d, "disk=s" => \$opt_d, + "f" => \$opt_f, "perfparse" => \$opt_f, + "n" => \$opt_n, "name" => \$opt_n, + "w=s" => \$opt_w, "warning=s" => \$opt_w, + "c=s" => \$opt_c, "critical=s" => \$opt_c, + "H=s" => \$opt_H, "hostname=s" => \$opt_H); + + +if ($opt_V) { + print_revision($PROGNAME,'$Revision: 1.2 $'); + exit $ERRORS{'OK'}; +} + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; +} +if (!$opt_H) { + print_usage(); + exit $ERRORS{'OK'}; +} + +if ($opt_n && !$opt_d) { + print "Option -n (--name) need option -d (--disk)\n"; + exit $ERRORS{'UNKNOWN'}; +} +my $snmp = "1"; +$snmp = $opt_v if ($opt_v && $opt_v =~ /^[0-9]$/); + +if ($snmp eq "3") { + if (!$opt_u) { + print "Option -u (--username) is required for snmpV3\n"; + exit $ERRORS{'OK'}; + } + if (!$opt_p && !$opt_k) { + print "Option -k (--key) or -p (--password) is required for snmpV3\n"; + exit $ERRORS{'OK'}; + } elsif ($opt_p && $opt_k) { + print "Only option -k (--key) or -p (--password) is needed for snmpV3\n"; + exit $ERRORS{'OK'}; + } +} + +$opt_C = "public" if (!$opt_C); +$opt_d = 2 if (!$opt_d); + +($opt_d) || ($opt_d = shift) || ($opt_d = 2); + +my $partition = 0; +if ($opt_d =~ /([0-9]+)/ && !$opt_n){ + $partition = $1; +} elsif (!$opt_n){ + print "Unknown -d number expected... or it doesn't exist, try another disk - number\n"; + exit $ERRORS{'UNKNOWN'}; +} + +my $critical = 95; +if ($opt_c && $opt_c =~ /^[0-9]+$/) { + $critical = $opt_c; +} +my $warning = 90; +if ($opt_w && $opt_w =~ /^[0-9]+$/) { + $warning = $opt_w; +} + +if ($critical <= $warning){ + print "(--crit) must be superior to (--warn)"; + print_usage(); + exit $ERRORS{'OK'}; +} + + +my $name = $0; +$name =~ s/\.pl.*//g; + +# Plugin snmp requests + +my $OID_hrStorageDescr =$oreon{MIB2}{HR_STORAGE_DESCR}; +my $OID_hrStorageAllocationUnits =$oreon{MIB2}{HR_STORAGE_ALLOCATION_UNITS}; +my $OID_hrStorageSize =$oreon{MIB2}{HR_STORAGE_SIZE}; +my $OID_hrStorageUsed =$oreon{MIB2}{HR_STORAGE_USED}; + +# create a SNMP session +my ($session, $error); +if ($snmp eq "1" || $snmp eq "2") { +($session, $error) = Net::SNMP->session(-hostname => $opt_H, -community => $opt_C, -version => $snmp); +if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; +} +}elsif ($opt_k) { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -version => $snmp, -username => $opt_u, -authkey => $opt_k); +if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; +} +}elsif ($opt_p) { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -version => $snmp, -username => $opt_u, -authpassword => $opt_p); +if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; +} +} + +#getting partition using its name instead of its oid index +if ($opt_n) { + my $result = $session->get_table(Baseoid => $OID_hrStorageDescr); + if (!defined($result)) { + printf("ERROR: hrStorageDescr Table : %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; + } + my $expr = ""; + if ($opt_d =~ m/^[A-Za-z]:/) { + $opt_d =~ s/\\/\\\\/g; + $expr = "^$opt_d"; + }elsif ($opt_d =~ m/^\//) { + $expr = "$opt_d\$"; + }else { + $expr = "$opt_d"; + } + foreach my $key ( oid_lex_sort(keys %$result)) { + if ($result->{$key} =~ m/$expr/) { + my @oid_list = split (/\./,$key); + $partition = pop (@oid_list) ; + } + } +} +if ($opt_s) { + # Get description table + my $result = $session->get_table( + Baseoid => $OID_hrStorageDescr + ); + + if (!defined($result)) { + printf("ERROR: hrStorageDescr Table : %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; + } + + foreach my $key ( oid_lex_sort(keys %$result)) { + my @oid_list = split (/\./,$key); + my $index = pop (@oid_list) ; + print "hrStorage $index :: $$result{$key}\n"; + } + exit $ERRORS{'OK'}; +} + +my $result = $session->get_request( + -varbindlist => [$OID_hrStorageDescr.".".$partition , + $OID_hrStorageAllocationUnits.".".$partition , + $OID_hrStorageSize.".".$partition, + $OID_hrStorageUsed.".".$partition + ] + ); +if (!defined($result)) { + printf("ERROR: %s", $session->error); + if ($opt_n) { print(" - You must specify the disk name when option -n is used");} + print ".\n"; + $session->close; + exit $ERRORS{'UNKNOWN'}; +} +$hrStorageDescr = $result->{$OID_hrStorageDescr.".".$partition }; +$AllocationUnits = $result->{$OID_hrStorageAllocationUnits.".".$partition }; +$Size = $result->{$OID_hrStorageSize.".".$partition }; +$Used = $result->{$OID_hrStorageUsed.".".$partition }; + + +# Plugins var treatment + +if (!$Size){ + print "Disk CRITICAL - no output (-p number expected... it doesn't exist, try another disk - number\n"; + exit $ERRORS{'CRITICAL'}; +} + +if (($Size =~ /([0-9]+)/) && ($AllocationUnits =~ /([0-9]+)/)){ + if (!$Size){ + print "The number of the option -p is not a hard drive\n"; + exit $ERRORS{'CRITICAL'}; + } + $tot = 1; + $tot = $Size * $AllocationUnits; + if (!$tot){$tot = 1;} + $used = $Used * $AllocationUnits; + $pourcent = ($used * 100) / $tot; + + if (length($pourcent) > 2){ + @test = split (/\./, $pourcent); + $pourcent = $test[0]; + } + my $lastTot = $tot; + $tot = $tot / 1073741824; + $Used = ($Used * $AllocationUnits) / 1073741824; + + # Plugin return code + + if ($pourcent >= $critical){ + print "Disk CRITICAL - "; + $return_code = 2; + } elsif ($pourcent >= $warning){ + print "Disk WARNING - "; + $return_code = 1; + } else { + print "Disk OK - "; + $return_code = 0; + } + + if ($hrStorageDescr){ + print $hrStorageDescr . " TOTAL: "; + printf("%.3f", $tot); + print " Go USED: " . $pourcent . "% : "; + printf("%.3f", $Used); + print " Go"; + if ($opt_f){ + my $size_o = $Used * 1073741824; + my $warn = $opt_w * $size_o; + my $crit = $opt_c * $size_o; + print "|size=".$lastTot."o used=".$size_o.";".$warn.";".$crit; + } + print "\n"; + exit $return_code; + } else { + print "TOTAL: "; + printf("%.3f", $tot); + print " Go USED: " . $pourcent . "% : "; + printf("%.3f", $Used); + print " Go\n"; + exit $return_code; + } +} else { + print "Disk CRITICAL - no output (-d number expected... it doesn't exist, try another disk - number\n"; + exit $ERRORS{'CRITICAL'}; +} + +sub print_usage () { + print "\nUsage:\n"; + print "$PROGNAME\n"; + print " -H (--hostname) Hostname to query - (required)\n"; + print " -C (--community) SNMP read community (defaults to public,\n"; + print " used with SNMP v1 and v2c\n"; + print " -v (--snmp_version) 1 for SNMP v1 (default)\n"; + print " 2 for SNMP v2c\n"; + print " -d (--disk) Set the disk (number expected) ex: 1, 2,... (defaults to 2 )\n"; + print " -n (--name) Allows to use disk name with option -d instead of disk oid index\n"; + print " (ex: -d \"C:\" -n, -d \"E:\" -n, -d \"Swap Memory\" -n, -d \"Real Memory\" -n\n"; + print " (choose an unique expression for each disk)\n"; + print " -s (--show) Describes all disk (debug mode)\n"; + print " -w (--warn) Signal strength at which a warning message will be generated\n"; + print " (default 80)\n"; + print " -c (--crit) Signal strength at which a critical message will be generated\n"; + print " (default 95)\n"; + print " -V (--version) Plugin version\n"; + print " -h (--help) usage help\n"; + +} + +sub print_help () { + print "######################################################\n"; + print "# Copyright (c) 2004-2007 Oreon-project #\n"; + print "# Bugs to http://www.oreon-project.org/ #\n"; + print "######################################################\n"; + print_usage(); + print "\n"; +} + diff --git a/centreon-plugins/Dev/src/check_centreon_snmp_traffic b/centreon-plugins/Dev/src/check_centreon_snmp_traffic new file mode 100644 index 000000000..0b815cdc0 --- /dev/null +++ b/centreon-plugins/Dev/src/check_centreon_snmp_traffic @@ -0,0 +1,453 @@ +#! /usr/bin/perl -w +################################################################### +# Oreon is developped with GPL Licence 2.0 +# +# GPL License: http://www.gnu.org/licenses/gpl.txt +# +# Developped by : Julien Mathis - Romain Le Merlus +# Christophe Coraboeuf - Sugumaran Mathavarajan +# +################################################################### +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# For information : contact@merethis.com +#################################################################### +# +# Script init +# + +use strict; +use Net::SNMP qw(:snmp oid_lex_sort); +use FindBin; +use lib "$FindBin::Bin"; +use lib "@NAGIOS_PLUGINS@"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); +if (eval "require oreon" ) { + use oreon qw(get_parameters); + use vars qw(%oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} +use vars qw($PROGNAME); +use Getopt::Long; +use vars qw($opt_V $opt_h $opt_v $opt_C $opt_b $opt_k $opt_u $opt_p $opt_H $opt_D $opt_i $opt_n $opt_w $opt_c $opt_s $opt_T); + +# Plugin var init + +my($proc, $proc_run, @test, $row, @laste_values, $last_check_time, $last_in_bits, $last_out_bits, @last_values, $update_time, $db_file, $in_traffic, $out_traffic, $in_usage, $out_usage); + +$PROGNAME = "$0"; +sub print_help (); +sub print_usage (); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, "help" => \$opt_h, + "u=s" => \$opt_u, "username=s" => \$opt_u, + "p=s" => \$opt_p, "password=s" => \$opt_p, + "k=s" => \$opt_k, "key=s" => \$opt_k, + "s" => \$opt_s, "show" => \$opt_s, + "V" => \$opt_V, "version" => \$opt_V, + "i=s" => \$opt_i, "interface=s" => \$opt_i, + "n" => \$opt_n, "name" => \$opt_n, + "v=s" => \$opt_v, "snmp=s" => \$opt_v, + "C=s" => \$opt_C, "community=s" => \$opt_C, + "b=s" => \$opt_b, "bps=s" => \$opt_b, + "w=s" => \$opt_w, "warning=s" => \$opt_w, + "c=s" => \$opt_c, "critical=s" => \$opt_c, + "T=s" => \$opt_T, + "H=s" => \$opt_H, "hostname=s" => \$opt_H); + +if ($opt_V) { + print_revision($PROGNAME,'$Revision: 1.2 $'); + exit $ERRORS{'OK'}; +} + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; + +Getopt::Long::Configure('bundling'); +} + +################################################## +##### Verify Options +## + +if (!$opt_H) { +print_usage(); +exit $ERRORS{'OK'}; +} +my $snmp = "1"; +if ($opt_v && $opt_v =~ /^[0-9]$/) { +$snmp = $opt_v; +} + +if ($snmp eq "3") { +if (!$opt_u) { +print "Option -u (--username) is required for snmpV3\n"; +exit $ERRORS{'OK'}; +} +if (!$opt_p && !$opt_k) { +print "Option -k (--key) or -p (--password) is required for snmpV3\n"; +exit $ERRORS{'OK'}; +}elsif ($opt_p && $opt_k) { +print "Only option -k (--key) or -p (--password) is needed for snmpV3\n"; +exit $ERRORS{'OK'}; +} +} + +if ($opt_n && !$opt_i) { + print "Option -n (--name) need option -i (--interface)\n"; + exit $ERRORS{'UNKNOWN'}; +} + +if (!$opt_C) { +$opt_C = "public"; +} + +if (!$opt_i) { +$opt_i = 2; +} + +if (!$opt_b) { +$opt_b = 95; +} + +if ($opt_b =~ /([0-9]+)/) { +my $bps = $1; +} +my $critical = 95; +if ($opt_c && $opt_c =~ /[0-9]+/) { +$critical = $opt_c; +} +my $warning = 80; +if ($opt_w && $opt_w =~ /[0-9]+/) { +$warning = $opt_w; +} +my $interface = 0; +if ($opt_i =~ /([0-9]+)/ && !$opt_n){ + $interface = $1; +} elsif (!$opt_n) { + print "Unknown -i number expected... or it doesn't exist, try another interface - number\n"; + exit $ERRORS{'UNKNOWN'}; +} + +if ($critical <= $warning){ + print "(--crit) must be superior to (--warn)"; + print_usage(); + exit $ERRORS{'OK'}; +} + +################################################# +##### Plugin snmp requests +## + +my $OID_DESC =$oreon{MIB2}{IF_DESC}; + +# create a SNMP session +my ($session, $error); +if ($snmp eq "1" || $snmp eq "2") { +($session, $error) = Net::SNMP->session(-hostname => $opt_H, -community => $opt_C, -version => $snmp); +if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; +} +}elsif ($opt_k) { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -version => $snmp, -username => $opt_u, -authkey => $opt_k); +if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; +} +}elsif ($opt_p) { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -version => $snmp, -username => $opt_u, -authpassword => $opt_p); +if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; +} +} + +#getting interface using its name instead of its oid index + +if ($opt_n) { + my $result = $session->get_table(Baseoid => $OID_DESC); + if (!defined($result)) { + printf("ERROR: Description Table : %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; + } + foreach my $key ( oid_lex_sort(keys %$result)) { + if ($result->{$key} =~ m/$opt_i/) { + my @oid_list = split (/\./,$key); + $interface = pop (@oid_list) ; + } + } +} + +my $OID_IN =$oreon{MIB2}{IF_IN_OCTET}.".".$interface; +my $OID_OUT = $oreon{MIB2}{IF_OUT_OCTET}.".".$interface; +my $OID_SPEED = $oreon{MIB2}{IF_SPEED}.".".$interface; + +# Get desctiption table + +if ($opt_s) { + my $result = $session->get_table(Baseoid => $OID_DESC); + if (!defined($result)) { + printf("ERROR: Description Table : %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; + } + foreach my $key ( oid_lex_sort(keys %$result)) { + my @oid_list = split (/\./,$key); + my $index = pop (@oid_list) ; + print "Interface $index :: $$result{$key}\n"; + } + exit $ERRORS{'OK'}; +} + + +####### Get IN bytes + +my $in_bits; +my $result = $session->get_request(-varbindlist => [$OID_IN]); +if (!defined($result)) { + printf("ERROR: IN Bits : %s", $session->error); + if ($opt_n) { print " - You must specify interface name when option -n is used";} + print ".\n"; + $session->close; + exit $ERRORS{'UNKNOWN'}; +} +$in_bits = $result->{$OID_IN} * 8; + + +####### Get OUT bytes + +my $out_bits; +$result = $session->get_request(-varbindlist => [$OID_OUT]); +if (!defined($result)) { + printf("ERROR: Out Bits : %s", $session->error); + if ($opt_n) { print " - You must specify interface name when option -n is used";} + print ".\n"; + $session->close; + exit $ERRORS{'UNKNOWN'}; +} +$out_bits = $result->{$OID_OUT} * 8; + + +####### Get SPEED of interface + +my $speed_card; +$result = $session->get_request(-varbindlist => [$OID_SPEED]); +if (!defined($result)) { + printf("ERROR: Interface Speed : %s", $session->error); + if ($opt_n) { print " - You must specify interface name when option -n is used";} + print ".\n"; + $session->close; + exit $ERRORS{'UNKNOWN'}; +} + +if (defined($opt_T)){ + $speed_card = $opt_T * 1000000; +} else { + $speed_card = $result->{$OID_SPEED}; +} + +############################################# +##### Plugin return code +## + +$last_in_bits = 0; +$last_out_bits = 0; + +my $flg_created = 0; + +if (-e "/tmp/oreon_traffic_if".$interface."_".$opt_H) { + open(FILE,"<"."/tmp/oreon_traffic_if".$interface."_".$opt_H); + while($row = ){ + @last_values = split(":",$row); + $last_check_time = $last_values[0]; + $last_in_bits = $last_values[1]; + $last_out_bits = $last_values[2]; + $flg_created = 1; + } + close(FILE); +} else { + $flg_created = 0; +} + +$update_time = time(); + +unless (open(FILE,">"."/tmp/oreon_traffic_if".$interface."_".$opt_H)){ + print "Unknown - /tmp/oreon_traffic_if".$interface."_".$opt_H. " !\n"; + exit $ERRORS{"UNKNOWN"}; +} +print FILE "$update_time:$in_bits:$out_bits"; +close(FILE); + +if ($flg_created == 0){ + print "First execution : Buffer in creation.... \n"; + exit($ERRORS{"UNKNOWN"}); +} + + +## Bandwith = IN + OUT / Delta(T) = 6 Mb/s +## (100 * Bandwith) / (2(si full duplex) * Ispeed) +## Count must round at 4294967296 +## + +if (($in_bits - $last_in_bits > 0) && defined($last_in_bits)) { + my $total = 0; + if ($in_bits - $last_in_bits < 0){ + $total = 4294967296 - $last_in_bits + $in_bits; + } else { + $total = $in_bits - $last_in_bits; + } + my $diff = time() - $last_check_time; + if ($diff == 0){$diff = 1;} + my $pct_in_traffic = $in_traffic = abs($total / $diff); +} else { + $in_traffic = 0; +} + +if ($out_bits - $last_out_bits > 0 && defined($last_out_bits)) { + my $total = 0; + if ($out_bits - $last_out_bits < 0){ + $total = 4294967296 - $last_out_bits + $out_bits; + } else { + $total = $out_bits - $last_out_bits; + } + my $diff = time() - $last_check_time; + if ($diff == 0){$diff = 1;} + my $pct_out_traffic = $out_traffic = abs($total / $diff); +} else { + $out_traffic = 0; +} + +if ( $speed_card != 0 ) { + $in_usage = sprintf("%.1f",($in_traffic*100) / $speed_card); + $out_usage = sprintf("%.1f",($out_traffic*100) / $speed_card); +} + +my $in_prefix = ""; +my $out_prefix = ""; + +my $in_perfparse_traffic = $in_traffic; +my $out_perfparse_traffic = $out_traffic; + +if ($in_traffic > 1000) { + $in_traffic = $in_traffic / 1000; + $in_prefix = "k"; + if($in_traffic > 1000){ + $in_traffic = $in_traffic / 1000; + $in_prefix = "M"; + } + if($in_traffic > 1000){ + $in_traffic = $in_traffic / 1000; + $in_prefix = "G"; + } +} + +if ($out_traffic > 1000){ + $out_traffic = $out_traffic / 1000; + $out_prefix = "k"; + if ($out_traffic > 1000){ + $out_traffic = $out_traffic / 1000; + $out_prefix = "M"; + } + if ($out_traffic > 1000){ + $out_traffic = $out_traffic / 1000; + $out_prefix = "G"; + } +} + +my $in_bits_unit = ""; +$in_bits = $in_bits/1048576; +if ($in_bits > 1000){ + $in_bits = $in_bits / 1000; + $in_bits_unit = "G"; +} else { + $in_bits_unit = "M"; +} + +my $out_bits_unit = ""; +$out_bits = $out_bits/1048576; +if ($out_bits > 1000){ + $out_bits = $out_bits / 1000; + $out_bits_unit = "G"; +} else { + $out_bits_unit = "M"; +} + + +if ( $speed_card == 0 ) { + print "CRITICAL: Interface speed equal 0! Interface must be down.|traffic_in=0B/s traffic_out=0B/s\n"; + exit($ERRORS{"CRITICAL"}); +} + +##################################### +##### Display result +## + + +my $in_perfparse_traffic_str = sprintf("%.1f",abs($in_perfparse_traffic)); +my $out_perfparse_traffic_str = sprintf("%.1f",abs($out_perfparse_traffic)); + +$in_perfparse_traffic_str =~ s/\./,/g; +$out_perfparse_traffic_str =~ s/\./,/g; + +my $status = "OK"; + +if(($in_usage > $warning) or ($out_usage > $warning)){ + $status = "WARNING"; +} + +if (($in_usage > $critical) or ($out_usage > $critical)){ + $status = "CRITICAL"; +} + + +printf("Traffic In : %.2f ".$in_prefix."b/s (".$in_usage." %%), Out : %.2f ".$out_prefix."b/s (".$out_usage." %%) - ", $in_traffic, $out_traffic); +printf("Total RX Bits In : %.2f ".$in_bits_unit."B, Out : %.2f ".$out_bits_unit."b", $in_bits, $out_bits); +printf("|traffic_in=".$in_perfparse_traffic_str."Bits/s traffic_out=".$out_perfparse_traffic_str."Bits/s\n"); +exit($ERRORS{$status}); + +sub print_usage () { + print "\nUsage:\n"; + print "$PROGNAME\n"; + print " -H (--hostname) Hostname to query - (required)\n"; + print " -C (--community) SNMP read community (defaults to public,\n"; + print " used with SNMP v1 and v2c\n"; + print " -v (--snmp_version) 1 for SNMP v1 (default)\n"; + print " 2 for SNMP v2c\n"; + print " -s (--show) Describes all interfaces number (debug mode)\n"; + print " -i (--interface) Set the interface number (2 by default)\n"; + print " -n (--name) Allows to use interface name with option -d instead of interface oid index\n"; + print " (ex: -i \"eth0\" -n, -i \"VMware Virtual Ethernet Adapter for VMnet8\" -n\n"; + print " (choose an unique expression for each interface)\n"; + print " -w (--warn) Signal strength at which a warning message will be generated\n"; + print " (default 80)\n"; + print " -c (--crit) Signal strength at which a critical message will be generated\n"; + print " -T Max Banwidth\n"; + print " (default 95)\n"; + print " -V (--version) Plugin version\n"; + print " -h (--help) usage help\n"; +} + +sub print_help () { + print "######################################################\n"; + print "# Copyright (c) 2004-2007 Oreon-project #\n"; + print "# Bugs to http://www.oreon-project.org/ #\n"; + print "######################################################\n"; + print_usage(); + print "\n"; +} diff --git a/centreon-plugins/Dev/src/check_centreon_snmp_uptime b/centreon-plugins/Dev/src/check_centreon_snmp_uptime new file mode 100644 index 000000000..2adffd9f4 --- /dev/null +++ b/centreon-plugins/Dev/src/check_centreon_snmp_uptime @@ -0,0 +1,181 @@ +#! /usr/bin/perl -w +# +# $Id: check_graph_uptime.pl,v 1.3 2005/07/27 22:21:49 wistof Exp $ +# +# This plugin is developped under GPL Licence: +# http://www.fsf.org/licenses/gpl.txt + +# Developped by Linagora SA: http://www.linagora.com + +# Modified for Oreon Project by : Mathieu Chateau - Christophe Coraboeuf +# Modified For Oreon compatibility by Julien Mathis - Sugumaran mathavarajan For Merethis +# +# The Software is provided to you AS IS and WITH ALL FAULTS. +# LINAGORA makes no representation and gives no warranty whatsoever, +# whether express or implied, and without limitation, with regard to the quality, +# safety, contents, performance, merchantability, non-infringement or suitability for +# any particular or intended purpose of the Software found on the LINAGORA web site. +# In no event will LINAGORA be liable for any direct, indirect, punitive, special, +# incidental or consequential damages however they may arise and even if LINAGORA has +# been previously advised of the possibility of such damages. + +# based on "graph plugins" developped by Oreon Team. See http://www.oreon.org. +## +## Plugin init +## +use strict; +use Net::SNMP qw(:snmp); +use FindBin; +use lib "$FindBin::Bin"; +use lib "@NAGIOS_PLUGINS@"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); + +if (eval "require oreon" ) { + use oreon qw(get_parameters); + use vars qw($VERSION %oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} + +use vars qw($PROGNAME); +use Getopt::Long; +use vars qw($opt_h $opt_V $opt_H $opt_C $opt_v $opt_d $day); + +$PROGNAME = $0; +sub print_help (); +sub print_usage (); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, "help" => \$opt_h, + "V" => \$opt_V, "version" => \$opt_V, + "v=s" => \$opt_v, "snmp=s" => \$opt_v, + "C=s" => \$opt_C, "community=s" => \$opt_C, + "d" => \$opt_d, "day" => \$opt_d, + "H=s" => \$opt_H, "hostname=s" => \$opt_H); + +if ($opt_V) { + print_revision($PROGNAME,'$Revision: 1.2 $'); + exit $ERRORS{'OK'}; +} + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; +} + +$opt_H = shift unless ($opt_H); +(print_usage() && exit $ERRORS{'OK'}) unless ($opt_H); + + +($opt_v) || ($opt_v = shift) || ($opt_v = "1"); +my $snmp = $1 if ($opt_v =~ /(\d)/); + +($opt_C) || ($opt_C = shift) || ($opt_C = "public"); + +my $start=time; +my $name = $0; +$name =~ s/\.pl.*//g; +my $day = 0; + +## +## Plugin snmp requests +## + +my $OID_OBJECTID =$oreon{MIB2}{OBJECTID}; +my $OID_UPTIME_WINDOWS =$oreon{MIB2}{UPTIME_WINDOWS}; +my $OID_UPTIME_OTHER =$oreon{MIB2}{UPTIME_OTHER}; + +# create a SNMP session +my ( $session, $error ) = Net::SNMP->session(-hostname => $opt_H,-community => $opt_C, -version => $snmp); +if ( !defined($session) ) { + print("CRITICAL: $error"); + exit $ERRORS{'CRITICAL'}; +} + +my $result = $session->get_request( + -varbindlist => [$OID_OBJECTID] + ); +if (!defined($result)) { + printf("UNKNOWN: %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; +} + +my $return_result = $result->{$OID_OBJECTID}; +my $OID = ""; +if ($return_result =~ /.*Windows.*/i ) { + $OID = $OID_UPTIME_WINDOWS; +} else { + $OID = $OID_UPTIME_OTHER; +} + +$result = $session->get_request( + -varbindlist => [$OID] + ); +if (!defined($result)) { + printf("UNKNOWN: %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; +} + +my $un = 0; + +$return_result = $result->{$OID}; +if ( $return_result =~ m/(\d*) day[s]?,\s*(\d*):(\d*):(\d*).(\d*)/ ) { + $un = $5 + $4 * 100 + $3 * 100 * 60 + $2 * 100 * 60 * 60 + $1 * 100 * 60 * 60 * 24; + $day = $1; +} + +if ( $return_result =~ m/(\d*) hour.*(\d*):(\d*).(\d*)/ ) { + $un = $4 + $3 * 100 + $3 * 100 * 60 + $1 * 100 * 60 * 60 ; +} + +if ($opt_d) { + $un = $day; +} + +#print "un : $un\n"; + +## +## Plugin return code +## + +if ($un || ( $un == 0) ){ + if ($opt_d) { + print "OK - Uptime (in day): $un|uptime=".$un."hs\n"; + } else { + print "OK - Uptime (in hundredths of a second): $un|uptime=".$un."hs\n"; + } + exit $ERRORS{'OK'}; +} +else{ + print "CRITICAL Host unavailable\n"; + exit $ERRORS{'CRITICAL'}; +} + + +sub print_usage () { + print "\nUsage:\n"; + print "$PROGNAME\n"; + print " -H (--hostname) Hostname to query - (required)\n"; + print " -C (--community) SNMP read community (defaults to public,\n"; + print " used with SNMP v1 and v2c\n"; + print " -v (--snmp_version) 1 for SNMP v1 (default)\n"; + print " 2 for SNMP v2c\n"; + print " -d (--day) Uptime in day\n"; + print " -V (--version) Plugin version\n"; + print " -h (--help) usage help\n"; + +} + +sub print_help () { + print "Copyright (c) 2005 Linagora\n"; + print "Modified by Merethis \n"; + print "Bugs to http://www.linagora.com/\n"; + print "\n"; + print_usage(); + print "\n"; +} diff --git a/centreon-plugins/Dev/src/check_centreon_snmp_value b/centreon-plugins/Dev/src/check_centreon_snmp_value new file mode 100644 index 000000000..4739d34b3 --- /dev/null +++ b/centreon-plugins/Dev/src/check_centreon_snmp_value @@ -0,0 +1,204 @@ +#! /usr/bin/perl -w +################################################################### +# Oreon is developped with GPL Licence 2.0 +# +# GPL License: http://www.gnu.org/licenses/gpl.txt +# +# Developped by : Julien Mathis - Romain Le Merlus +# Christophe Coraboeuf - Sugumaran Mathavarajan +# +################################################################### +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# For information : contact@merethis.com +#################################################################### +# +# Script init +# + +use strict; +use Net::SNMP qw(:snmp); +use FindBin; +use lib "$FindBin::Bin"; +use lib "@NAGIOS_PLUGINS@"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); + +use vars qw($PROGNAME); +use Getopt::Long; +use vars qw($opt_h $opt_V $opt_H $opt_C $opt_v $opt_o $opt_c $opt_w $opt_t $opt_p $opt_k $opt_u); + +$PROGNAME = $0; +sub print_help (); +sub print_usage (); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, "help" => \$opt_h, + "u=s" => \$opt_u, "username=s" => \$opt_u, + "p=s" => \$opt_p, "password=s" => \$opt_p, + "k=s" => \$opt_k, "key=s" => \$opt_k, + "V" => \$opt_V, "version" => \$opt_V, + "v=s" => \$opt_v, "snmp=s" => \$opt_v, + "C=s" => \$opt_C, "community=s" => \$opt_C, + "o=s" => \$opt_o, "oid=s" => \$opt_o, + "t=s" => \$opt_t, "type=s" => \$opt_t, + "w=s" => \$opt_w, "warning=s" => \$opt_w, + "c=s" => \$opt_c, "critical=s" => \$opt_c, + "H=s" => \$opt_H, "hostname=s" => \$opt_H); + +if ($opt_V) { + print_revision($PROGNAME,'$Revision: 1.0'); + exit $ERRORS{'OK'}; +} + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; +} + +$opt_H = shift unless ($opt_H); +(print_usage() && exit $ERRORS{'OK'}) unless ($opt_H); + +my $snmp = "1"; +if ($opt_v && $opt_v =~ /^[0-9]$/) { +$snmp = $opt_v; +} + +if ($snmp eq "3") { +if (!$opt_u) { +print "Option -u (--username) is required for snmpV3\n"; +exit $ERRORS{'OK'}; +} +if (!$opt_p && !$opt_k) { +print "Option -k (--key) or -p (--password) is required for snmpV3\n"; +exit $ERRORS{'OK'}; +}elsif ($opt_p && $opt_k) { +print "Only option -k (--key) or -p (--password) is needed for snmpV3\n"; +exit $ERRORS{'OK'}; +} +} + +($opt_C) || ($opt_C = shift) || ($opt_C = "public"); + +my $DS_type = "GAUGE"; +($opt_t) || ($opt_t = shift) || ($opt_t = "GAUGE"); +$DS_type = $1 if ($opt_t =~ /(GAUGE)/ || $opt_t =~ /(COUNTER)/); + +if (!$opt_c || !$opt_w) { + print "You must specify -c and -w options\n"; + exit $ERRORS{'OK'}; +} + +($opt_c) || ($opt_c = shift); +my $critical = $1 if ($opt_c =~ /([0-9]+)/); + +($opt_w) || ($opt_w = shift); +my $warning = $1 if ($opt_w =~ /([0-9]+)/); +if ($critical <= $warning){ + print "(--critical) must be superior to (--warning)"; + print_usage(); + exit $ERRORS{'OK'}; +} + +if (!$opt_o) { + print "Option -o needed.\n"; + exit $ERRORS{'OK'}; +}elsif (!($opt_o =~ /^[0-9\.]+$/)) { + print "Wrong OID format\n"; + exit $ERRORS{'OK'}; +} + +my $name = $0; +$name =~ s/\.pl.*//g; +my $day = 0; + +#=== create a SNMP session ==== + +my ($session, $error); +if ($snmp eq "1" || $snmp eq "2") { +($session, $error) = Net::SNMP->session(-hostname => $opt_H, -community => $opt_C, -version => $snmp); +if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; +} +}elsif ($opt_k) { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -version => $snmp, -username => $opt_u, -authkey => $opt_k); +if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; +} +}elsif ($opt_p) { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -version => $snmp, -username => $opt_u, -authpassword => $opt_p); +if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; +} +} + +my $result = $session->get_request(-varbindlist => [$opt_o]); +if (!defined($result)) { + printf("UNKNOWN: %s.\n", $session->error); + $session->close; + exit $ERRORS{'UNKNOWN'}; +} + +my $return_result = $result->{$opt_o}; + +#=== Plugin return code ==== + +if (defined($return_result)){ + if ($return_result !~ /^[0-9]$/) { + print "Snmp return value isn't numeric.\n"; + exit $ERRORS{'OK'}; + } + if ($opt_w && $opt_c && $return_result < $opt_w){ + print "Ok value : " . $return_result . "|value=".$return_result.";".$opt_w.";".$opt_c.";;\n"; + exit $ERRORS{'OK'}; + } elsif ($opt_w && $opt_c && $return_result >= $opt_w && $return_result < $opt_c){ + print "Warning value : " . $return_result . "|value=$return_result;".$opt_w.";".$opt_c.";;\n"; + exit $ERRORS{'WARNING'}; + } elsif ($opt_w && $opt_c && $return_result >= $opt_c){ + print "Critical value : " . $return_result."|value=".$return_result.";".$opt_w.";".$opt_c.";;\n"; + exit $ERRORS{'CRITICAL'}; + } +} else { + print "CRITICAL Host unavailable\n"; + exit $ERRORS{'CRITICAL'}; +} + + +sub print_usage () { + print "\nUsage:\n"; + print "$PROGNAME\n"; + print " -H (--hostname) Hostname to query - (required)\n"; + print " -C (--community) SNMP read community (defaults to public,\n"; + print " used with SNMP v1 and v2c\n"; + print " -v (--snmp_version) 1 for SNMP v1 (default)\n"; + print " 2 for SNMP v2c\n"; + print " -t (--type) Data Source Type (GAUGE or COUNTER) (GAUGE by default)\n"; + print " -o (--oid) OID to check\n"; + print " -k (--key) snmp V3 key\n"; + print " -p (--password) snmp V3 password\n"; + print " -u (--username) snmp v3 username \n"; + print " -w (--warning) Warning level\n"; + print " -c (--critical) Critical level\n"; + print " -V (--version) Plugin version\n"; + print " -h (--help) usage help\n"; +} + +sub print_help () { + print "######################################################\n"; + print "# Copyright (c) 2004-2007 Oreon-project #\n"; + print "# Bugs to http://www.oreon-project.org/ #\n"; + print "######################################################\n"; + print_usage(); + print "\n"; +} diff --git a/centreon-plugins/Dev/src/check_meta_service b/centreon-plugins/Dev/src/check_meta_service new file mode 100644 index 000000000..368314630 --- /dev/null +++ b/centreon-plugins/Dev/src/check_meta_service @@ -0,0 +1,406 @@ +#! /usr/bin/perl -w +# +# $Id: check_meta_service.pl,v 1.2 2005/07/27 22:21:49 Julio $ +# +# Oreon's plugins are developped with GPL Licence : +# http://www.fsf.org/licenses/gpl.txt +# Developped by : Julien Mathis - Romain Le Merlus +# +# Developped by Julien Mathis for Merethis SARL +# +# The Software is provided to you AS IS and WITH ALL FAULTS. +# OREON makes no representation and gives no warranty whatsoever, +# whether express or implied, and without limitation, with regard to the quality, +# safety, contents, performance, merchantability, non-infringement or suitability for +# any particular or intended purpose of the Software found on the OREON web site. +# In no event will OREON be liable for any direct, indirect, punitive, special, +# incidental or consequential damages however they may arise and even if OREON has +# been previously advised of the possibility of such damages. + +## +## Plugin init +## + +use strict; +use DBI; +use vars qw($PROGNAME); +use Getopt::Long; +use vars qw($opt_V $opt_H $opt_h $opt_i); +use lib "@NAGIOS_PLUGINS@"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); + +## For Debug mode = 1 +my $debug = 0; + +sub print_help (); +sub print_usage (); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, + "help" => \$opt_h, + "V" => \$opt_V, + "i=s" => \$opt_i); + +########################### +## Set Database information +########################### +use vars qw($mysql_database_oreon $mysql_database_ods $mysql_host $mysql_user $mysql_passwd); +require "@CENTREON_PATH@/ODS/etc/conf.pm"; + +my $dbh = DBI->connect("DBI:mysql:database=$mysql_database_oreon;host=$mysql_host", + "$mysql_user", "$mysql_passwd", + {'RaiseError' => 1}); + +my $dbh2 = DBI->connect("DBI:mysql:database=$mysql_database_ods;host=$mysql_host", + "$mysql_user", "$mysql_passwd", + {'RaiseError' => 1}); + +if ($opt_V) { + print_revision($PROGNAME,'$Revision: 0.1 $'); + exit $ERRORS{'OK'}; +} + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; +} + +my $result; +my $warning; +my $critical; +my $metric_id; + +sub return_value($$$){ + + my $sth_output = $dbh->prepare("SELECT meta_display FROM `meta_service`"); + if (!$sth_output->execute) {die "Error:" . $sth_output->errstr . "\n";} + my $sth_output_data = $sth_output->fetchrow_hashref(); + my $output = $sth_output_data->{'meta_display'}; + if ($output) { + $output =~ s/\%d/$result/g; + } + if ($warning ne $critical){ + if ($warning < $critical){ # Bon sens + if ($result < $warning){ + if ($output) { + print $output. "|OMS=" . $result . ";".$warning.";".$critical."\n"; + }else { + print "OK result : " . $result . "|OMS=" . $result . ";".$warning.";".$critical."\n"; + } + exit $ERRORS{'OK'}; + } elsif (($result >= $warning) && ($result < $critical)){ + if ($output) { + print $output. "|OMS=" . $result . ";".$warning.";".$critical."\n"; + }else { + print "WARNING result : " . $result . "|OMS=" . $result . ";".$warning.";".$critical."\n"; + } + exit $ERRORS{'WARNING'}; + } elsif ($result >= $critical){ + if ($output) { + print $output. "|OMS=" . $result . ";".$warning.";".$critical."\n"; + }else { + print "CRITICAL result : " . $result . "|OMS=" . $result . ";".$warning.";".$critical."\n"; + } + exit $ERRORS{'CRITICAL'}; + } + } else { # sens inverse + if ($result < $critical){ + if ($output) { + print $output. "|OMS=" . $result . ";".$warning.";".$critical."\n"; + }else { + print "CRITICAL result : " . $result . "|OMS=" . $result . ";".$warning.";".$critical."\n"; + } + exit $ERRORS{'CRITICAL'}; + } elsif ($result >= $critical && $result < $warning){ + if ($output) { + print $output. "|OMS=" . $result . ";".$warning.";".$critical."\n"; + }else { + print "WARNING result : " . $result . "|OMS=" . $result . ";".$warning.";".$critical."\n"; + } + exit $ERRORS{'WARNING'}; + } elsif ($result >= $warning){ + if ($output) { + print $output. "|OMS=" . $result . ";".$warning.";".$critical."\n"; + }else { + print "OK result : " . $result . "|OMS=" . $result . ";".$warning.";".$critical."\n"; + } + exit $ERRORS{'OK'}; + } else{ + if ($output) { + print $output. "|OMS=" . $result . ";".$warning.";".$critical."\n"; + }else { + print "OK result : " . $result . "|OMS=" . $result . ";".$warning.";".$critical."\n"; + } + exit $ERRORS{'OK'}; + } + } + } else { + print "ERROR : warnig level = critical level"; + exit $ERRORS{'CRITICAL'}; + } +} + +my $ref; +my $svc_id; +my $metric; +my $host_id; + +## Get Value by metric Option + +sub get_value_in_database_metric_id($$$$){ + ## Get last entry in perfparse database for this service + my $str = "SELECT value FROM data_bin WHERE id_metric = '".$metric_id."'"; + if ($debug) {print $str . "\n";} + my $sth_deb2 = $dbh2->prepare($str); + if (!$sth_deb2->execute) {die "Error:" . $sth_deb2->errstr . "\n";} + my $sth_deb2_data = $sth_deb2->fetchrow_hashref(); + return $sth_deb2_data->{'value'}; +} + +## Get value For Regexp Options + +sub get_value_in_database($$$$$){ + + my $str; + ## Get hostname and service description for perfparse request + + $str = "SELECT host_name,service_description FROM host,host_service_relation,service WHERE host.host_id = host_service_relation.host_host_id AND +service.service_id = host_service_relation.service_service_id AND service.service_id = '".$svc_id."'"; + + if ($debug) {print $str . "\n";} + my $host_data = $dbh->prepare($str); + if (!$host_data->execute) {die "Error:" . $host_data->errstr . "\n";} + my $data = $host_data->fetchrow_hashref(); + + ## Get last entry in perfparse database for this service + my $sth_deb2 = $dbh2->prepare("SELECT value FROM metrics m, data_bin d, index_data i WHERE i.host_name = '".$data->{'host_name'}."' AND i.service_description = '".$data->{'service_description'}."' AND and m.index_id=i.id AND m.metric_id = d.id_metric AND m.metric_name = '".$metric."'"); + if (!$sth_deb2->execute) {die "Error:" . $sth_deb2->errstr . "\n";} + my $sth_deb2_data = $sth_deb2->fetchrow_hashref(); + return $sth_deb2_data->{'value'}; +} + +sub get_value_in_database_by_host($$$$$){ + + my $str; + + ## Get hostname and service description for perfparse request + + $str = "SELECT host_name,service_description FROM host,host_service_relation,service WHERE host.host_id = host_service_relation.host_host_id AND service.service_id = host_service_relation.service_service_id AND service.service_id = '".$svc_id."'"; + if ($debug) {print $str . "\n";} + my $host_data = $dbh->prepare($str); + if (!$host_data->execute) {die "Error:" . $host_data->errstr . "\n";} + my $data = $host_data->fetchrow_hashref(); + + ## Get last entry in perfparse database for this service + + my $sth_deb2 = $dbh2->prepare("SELECT value FROM metrics m, data_bin d, index_data i WHERE i.host_name = '".$data->{'host_name'}."' AND i.service_description = '".$data->{'service_description'}."' AND m.index_id=i.id AND m.metric_id = d.id_metric AND m.metric_name = '".$metric."'"); + if (!$sth_deb2->execute) {die "Error:" . $sth_deb2->errstr . "\n";} + my $sth_deb2_data = $sth_deb2->fetchrow_hashref(); + return $sth_deb2_data->{'value'}; +} + +sub get_value_in_database_by_hg($$$$$$){ + + my $str; + + ## Get hostname + + $str = "SELECT host_name FROM host WHERE host.host_id = '".$host_id."'"; + if ($debug) {print $str . "\n";} + my $hd = $dbh->prepare($str); + if (!$hd->execute) {die "Error:" . $hd->errstr . "\n";} + my $host_data = $hd->fetchrow_hashref(); + + ## Get service description + + $str = "SELECT service_description FROM service WHERE service.service_id = '".$svc_id."'"; + if ($debug) {print $str . "\n";} + my $sd = $dbh->prepare($str); + if (!$sd->execute) {die "Error:" . $sd->errstr . "\n";} + my $service_data = $sd->fetchrow_hashref(); + + ## Get last entry in perfparse database for this service + + my $sth_deb2 = $dbh2->prepare("SELECT value FROM metrics m, data_bin d, index_data i WHERE i.host_name = '".$host_data->{'host_name'}."' AND i.service_description = '".$service_data->{'service_description'}."' AND m.index_id=i.id AND m.metric_id = d.id_metric AND m.metric_name = '".$metric."'"); + if (!$sth_deb2->execute) {die "Error:" . $sth_deb2->errstr . "\n";} + my $sth_deb2_data = $sth_deb2->fetchrow_hashref(); + return $sth_deb2_data->{'value'}; +} + +my $cpt = 0; +my $total = 0; +my $max = 0; +my $min = 999999999; +my $svc; +my $value = 0; +my $svc_relation2; + +if ($opt_i){ + my $str; + + # get osl info + my $sth = $dbh->prepare("SELECT calcul_type,regexp_str,warning,critical,metric, meta_select_mode FROM meta_service WHERE meta_id = '".$opt_i."'"); + if (!$sth->execute) {die "Error:" . $sth->errstr . "\n";} + $ref = $sth->fetchrow_hashref(); + if (!defined($ref->{'calcul_type'})){ + print "Unvalidate Meta Service\n"; + exit $ERRORS{'CRITICAL'}; + } + + $warning = $ref->{'warning'}; + $critical = $ref->{'critical'}; + + # Get Service List by regexp + if ($ref->{'meta_select_mode'} eq '2'){ + + ############################################### + + $str = "SELECT service_id FROM service WHERE `service_description` LIKE '".$ref->{'regexp_str'}."' AND service_activate = '1' AND service_register = '1'"; + if ($debug) {print $str . "\n";} + $sth = $dbh->prepare($str); + if (!$sth->execute) {die "Error:" . $sth->errstr . "\n";} + while ($svc = $sth->fetchrow_hashref()){ + my $sth2 = $dbh->prepare("SELECT * FROM host_service_relation WHERE service_service_id = '".$svc->{'service_id'}."'"); + if (!$sth2->execute) {die "Error:" . $sth2->errstr . "\n";} + my $svc_relation = $sth2->fetchrow_hashref(); + if (defined($svc_relation->{'host_host_id'}) && $svc_relation->{'host_host_id'}){ + #### Par Host + if (defined($svc->{'service_id'})){$svc_id = $svc->{'service_id'};} else {$svc_id = $svc->{'svc_id'};} + if (defined($ref->{'regexp_str'})){$metric = $ref->{'metric'};} else {$metric = $svc->{'metric'};} + $value = get_value_in_database_by_host($dbh,$dbh2,$svc_id,$metric,$debug); + if ($ref->{'calcul_type'} =~ "AVE"){ + if (defined($value) && $value){$total += $value;} + if ($debug) {print "total = " . $total . " value = ".$value."\n";} + $cpt++; + $result = $total / $cpt; + } elsif ($ref->{'calcul_type'} =~ "SOM"){ + if ($value){$total += $value;} + if ($debug){print "total = " . $total . " value = ".$value."\n";} + $result = $total; + } elsif ($ref->{'calcul_type'} =~ "MIN"){ + if ($debug){print " min : " . $min . " value = ".$value."\n";} + if ($value && $value <= $min){$min = $value;} + $result = $min; + } elsif ($ref->{'calcul_type'} =~ "MAX"){ + if ($debug){print "max = " . $max . " value = ".$value."\n";} + if ($value && $value >= $max){$max = $value;} + $result = $max; + } + } elsif (defined($svc_relation->{'hostgroup_hg_id'}) && $svc_relation->{'hostgroup_hg_id'}) { + ### Par Hostgroup + my $sth3 = $dbh->prepare("SELECT host_host_id FROM hostgroup_relation WHERE hostgroup_hg_id = '".$svc_relation->{'hostgroup_hg_id'}."'"); + if (!$sth3->execute) {die "Error:" . $sth3->errstr . "\n";} + while ($svc_relation2 = $sth3->fetchrow_hashref()){ + if (defined($svc->{'service_id'})){ + $svc_id = $svc->{'service_id'}; + } else { + $svc_id = $svc->{'svc_id'}; + } + if (defined($ref->{'regexp_str'})){ + $metric = $ref->{'metric'}; + } else { + $metric = $svc->{'metric'}; + } + $host_id = $svc_relation2->{'host_host_id'}; + $value = get_value_in_database_by_hg($dbh,$dbh2,$svc_id, $host_id, $metric, $debug); + if ($ref->{'calcul_type'} =~ "AVE"){ + if (defined($value) && $value){ + $total += $value; + } + if ($debug) {print "total = " . $total . " value = ".$value."\n";} + $cpt++; + } elsif ($ref->{'calcul_type'} =~ "SOM"){ + if ($value){ + $total += $value; + } + if ($debug){print "total = " . $total . " value = ".$value."\n";} + } elsif ($ref->{'calcul_type'} =~ "MIN"){ + if ($debug){print " min : " . $min . " value = ".$value."\n";} + if ($value && $value <= $min){ + $min = $value; + } + } elsif ($ref->{'calcul_type'} =~ "MAX"){ + if ($debug){print "max = " . $max . " value = ".$value."\n";} + if ($value && $value >= $max){ + $max = $value; + } + } + } + if ($ref->{'calcul_type'} =~ "AVE"){ + $result = $total / $cpt; + } elsif ($ref->{'calcul_type'} =~ "SOM"){ + $result = $total; + } elsif ($ref->{'calcul_type'} =~ "MIN"){ + $result = $min; + } elsif ($ref->{'calcul_type'} =~ "MAX"){ + $result = $max; + } + } + } + return_value($result, $warning, $critical); + ############################################### + } else { + $sth = $dbh->prepare("SELECT metric_id FROM `meta_service_relation` WHERE meta_id = '".$opt_i."'"); + if (!$sth->execute) {die "Error:" . $sth->errstr . "\n";} + if ($ref->{'calcul_type'} =~ "AVE"){ + if (!$sth->rows) { + print "no result in table meta_service_relation for id $opt_i\n"; + exit $ERRORS{'UNKNOWN'}; + } + while ($svc = $sth->fetchrow_hashref()){ + if (defined($svc->{'metric_id'})){$metric_id = $svc->{'metric_id'};} + $value = get_value_in_database_metric_id($dbh,$dbh2,$metric_id,$debug); + if (defined($value) && $value){$total += $value;} + $cpt++; + } + $result = $total / $cpt; + } elsif ($ref->{'calcul_type'} =~ "SOM"){ + while ($svc = $sth->fetchrow_hashref()){ + if (defined($svc->{'metric_id'})){$metric_id = $svc->{'metric_id'};} + $value = get_value_in_database_metric_id($dbh,$dbh2,$metric_id,$debug); + if ($value){$total += $value;} + if ($debug){print "total = " . $total . " value = ".$value."\n";} + } + $result = $total; + } elsif ($ref->{'calcul_type'} =~ "MIN"){ + while ($svc = $sth->fetchrow_hashref()){ + if (defined($svc->{'metric_id'})){$metric_id = $svc->{'metric_id'};} + $value = get_value_in_database_metric_id($dbh,$dbh2,$metric_id,$debug); + if ($debug){print " min : " . $min . " value = ".$value."\n";} + if ($value && $value <= $min){$min = $value;} + } + $result = $min; + } elsif ($ref->{'calcul_type'} =~ "MAX"){ + while ($svc = $sth->fetchrow_hashref()){ + if (defined($svc->{'metric_id'})){$metric_id = $svc->{'metric_id'};} + $value = get_value_in_database_metric_id($dbh,$dbh2,$metric_id,$debug); + if ($debug){print "max = " . $max . " value = ".$value."\n";} + if ($value && $value >= $max){$max = $value;} + } + $result = $max; + } + return_value($result, $warning, $critical); + } +} + + +sub print_usage () { + print "Usage:\n"; + print " check_meta_service.pl\n"; + print " -i Meta Service id\n"; + print " -V (--version) Plugin version\n"; + print " -h (--help) usage help\n"; +} + +sub print_help () +{ + print "###########################################\n"; + print "# #\n"; + print "# Copyright (c) 2004-2007 Merethis #\n"; + print "# Bugs to http://www.oreon-services.com #\n"; + print "# #\n"; + print "###########################################\n"; + print_usage(); + print "\n"; +} diff --git a/centreon-plugins/Dev/src/check_nt_centreon b/centreon-plugins/Dev/src/check_nt_centreon new file mode 100644 index 000000000..9c99e77cf --- /dev/null +++ b/centreon-plugins/Dev/src/check_nt_centreon @@ -0,0 +1,344 @@ +#! /usr/bin/perl +# +# $Id: check_graph_nt.pl,v 1.3 2005/08/01 18:04:00 gollum123 Exp $ +# +# Oreon's plugins are developped with GPL Licence : +# http://www.fsf.org/licenses/gpl.txt +# Developped by : Julien Mathis - Mathieu Mettre +# Under control of Flavien Astraud, Jerome Landrieu for Epitech. +# Oreon's plugins are developped in partnership with Linagora company. +# +# Modified for Oreon Project by : Mathieu Chateau - Christophe Coraboeuf +# +# The Software is provided to you AS IS and WITH ALL FAULTS. +# OREON makes no representation and gives no warranty whatsoever, +# whether express or implied, and without limitation, with regard to the quality, +# safety, contents, performance, merchantability, non-infringement or suitability for +# any particular or intended purpose of the Software found on the OREON web site. +# In no event will OREON be liable for any direct, indirect, punitive, special, +# incidental or consequential damages however they may arise and even if OREON has +# been previously advised of the possibility of such damages. + +## Plugin init + +use strict; +use FindBin; +use lib "$FindBin::Bin"; +use lib "@NAGIOS_PLUGINS@"; +use utils qw($TIMEOUT %ERRORS &print_revision &support); + +if (eval "require oreon" ) { + use oreon qw(get_parameters create_rrd update_rrd &is_valid_serviceid); + use vars qw($VERSION %oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} + +use vars qw($PROGNAME); +use Getopt::Long; +use vars qw($opt_H $opt_p $opt_s $opt_v $opt_V $opt_h $opt_w $opt_c $opt_S $opt_g $opt_t $opt_l $opt_d $opt_D $opt_step $step $opt_f); + +## Plugin var init + +my $pathtolibexecnt = $oreon{GLOBAL}{NAGIOS_LIBEXEC}."check_nt"; +my($op_v, $op_d, $op_s, $op_t, $op_l, $port, @values, @test, @test2, @test3, @test4, @test5, $warning, $critical, @w, @c, $uptime); +my($warning2, $critical2, $warning3, $critical3, $warning4, $critical4, @output); +$PROGNAME = $0; + +sub print_help (); +sub print_usage (); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, "help" => \$opt_h, + "p=s" => \$opt_p, "port=s" => \$opt_p, + "V" => \$opt_V, "version" => \$opt_V, + "s=s" => \$opt_s, "password=s" => \$opt_s, + "d=s" => \$opt_d, "showall=s" => \$opt_d, + "v=s" => \$opt_v, "variable=s" => \$opt_v, + "D=s" => \$opt_D, "directory=s" => \$opt_D, + "t=s" => \$opt_t, "timeout=s" => \$opt_t, + "l:s" => \$opt_l, "parameter:s" => \$opt_l, + "w=s" => \$opt_w, "warning=s" => \$opt_w, + "c=s" => \$opt_c, "critical=s" => \$opt_c, + "S=s" => \$opt_S, "ServiceId=s" => \$opt_S, + "H=s" => \$opt_H, "hostname=s" => \$opt_H); + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; +} + +if ($opt_V) { + $_ = `$pathtolibexecnt -V`; + print "$_"; + exit $ERRORS{'OK'}; +} + +if ($opt_p) { + if ($opt_p =~ /([0-9]+)/){ + $port = $1; + } else { + print "Unknown -p number expected... or it doesn't exist, try another port - number\n"; + exit $ERRORS{'UNKNOWN'}; + } +} + +$opt_H = shift unless ($opt_H); +(print_usage() && exit $ERRORS{'OK'}) unless ($opt_H); + + +if ($opt_c) { + ($opt_c) || ($opt_c = shift); + $critical = $1 if ($opt_c =~ /([0-9]+)/); +} + +if ($opt_w) { + ($opt_w) || ($opt_w = shift); + $warning = $1 if ($opt_w =~ /([0-9]+)/); +} + +if (($critical && $warning) && ($critical <= $warning)) { + print "(--crit) must be superior to (--warn)"; + print_usage(); + exit $ERRORS{'OK'}; +} + +if ($opt_t) { + ($opt_t) || ($opt_t = shift); + $op_t = $1 if ($opt_t =~ /([-\.,\w]+)/); +} + +if ($opt_l) { + ($opt_l) || ($opt_l = shift); + $op_l = $1 if ($opt_l =~ /(.+)/); +} + +if ($opt_d) { + ($opt_d) || ($opt_d = shift); + $op_d = $1 if ($opt_d =~ /([-.,A-Za-z0-9]+)/); +} + +if ($opt_s) { + ($opt_s) || ($opt_s = shift); + $op_s = $1 if ($opt_s =~ /([\_\-\.\,A-Za-z0-9]+)/); +} + +if ($opt_v) { + ($opt_v) || ($opt_v = shift); + $op_v = $1 if ($opt_v =~ /([-.,A-Za-z0-9]+)/); +} + +my $name = $0; +$name =~ s/\.pl.*//g; +my $return_code; + +## Plugin requests +my $start=time; +if ($op_v) { + if ($op_v) {$op_v = "-v ".$op_v;} + if ($port) {$port = "-p ".$port;} else { $port = " ";} + if ($warning) {$warning = "-w ".$warning;} else { $warning = " ";} + if ($critical) {$critical = "-c ".$critical;} else { $critical = " ";} + if ($op_l) {$op_l = "-l \"".$op_l ."\"";} else { $op_l = " ";} + if ($op_t) {$op_t = "-t ".$op_t;} else { $op_t = " ";} + if ($op_s) {$op_s = "-s ".$op_s;} else { $op_s = " ";} + if ($op_d) {$op_d = "-d ".$op_d;} else { $op_d = " ";} +# print "$pathtolibexecnt -H $opt_H $op_v $port $warning $critical $op_l $op_t $op_s $op_d\n"; + $_ = `$pathtolibexecnt -H $opt_H $op_v $port $warning $critical $op_l $op_t $op_s $op_d `; + my $return = $_; + if (!defined($return) || $return eq "") { + print "Error in command, check your command options\n"; + exit (3); + } + $return =~ s/\\//g; + $return_code = $? / 256; + ## CLIENTVERSION + if ($op_v =~ /CLIENTVERSION/){ + print "CLIENTVERSION impossible to Graph!\n"; + exit $ERRORS{'UNKNOWN'}; + } + + if (($op_v =~ /CPULOAD/) && ($op_l =~ /([-\.,\w]+)/)){ ## CPULOAD + @output = split(/\|/,$_); + @values = $output[0] =~ /(\d*)\%/g ; + $start = time; + ## Print Plugins Output + $return =~ s/\n//g; + my @return_data = split(/\|/,$return); + if (@values){ + if (defined($opt_c) && defined($opt_w)){ + print $return_data[0] . "|cpu=@values%;$opt_w;$opt_c\n"; + } else { + print $return_data[0] . "|cpu=@values%\n"; + } + } else { + print $return . "\n"; + } + exit $return_code; + } elsif ($op_v =~ /UPTIME/){ ## UPTIME + if ($_ =~ /.*[-:]+\s(\d+)\s.*$/ ) { + $uptime = $1; + } else { + print "unable to parse check_nt output: $_\n" ; + exit $ERRORS{'UNKNOWN'}; + } + $_ =~ s/\n/ /g; + if (defined($uptime)){ + print $_ . "|uptime=".$uptime."d\n"; + } else { + print $_ . "\n"; + } + exit $return_code; + } elsif (($op_v =~ /USEDDISKSPACE/) && ($op_l =~ /([-\.,\w]+)/)){ ## USEDDISKSPACE + my @test = split(/ /,$_); + if (defined($test[9]) && defined($test2[1])){ + @test2 = split(/\(/, $test[9]); + @test3 = split(/\%/, $test2[1]); + } + @c = split(/ /, $critical); + $critical = $c[1]; + @w = split(/ /, $warning); + $warning = $w[1]; + ## Print Plugins Output + $return =~ s/\n/ /g; + my @return_part = split(/\|/, $return); + #$return =~ s/%/ pct/g; + ## Put value in octets : Mo -> o + if (defined($test[3]) && defined($test[7]) && defined($test[12])){ + $test[3] =~ s/\,/\./g; + $test[3] = eval($test[3] * 1024 * 1024 * 1024); + $test[7] =~ s/\,/\./g; + $test[7] = eval ($test[7] * 1024 * 1024 * 1024); + print $return_part[0] . "|total=".$test[3]."o used=".$test[7]."o\n"; + } else { + print $return_part[0] . "\n"; + } + exit $return_code; + } elsif ($op_v =~ /MEMUSE/){ ## MEMUSE + $start = time; + my @test = split(/ /,$_); + if (defined($test[2])){ + @test4 = split(/:/, $test[2]); + } + @c = split(/ /, $critical); + $critical = $c[1]; + @w = split(/ /, $warning); + $warning = $w[1]; + ## Print Plugins Output + my @return_data = split(/\|/,$return); + $return =~ s/\n/ /g; + #$return =~ s/%/ pct/g; + if ($test4[1] && $test[6] && $test[11]){ + ## Put value in octets : Mo -> o + $test4[1] =~ s/\,/\./g; + $test4[1] = eval($test4[1] * 1024 * 1024); + $test[6] =~ s/\,/\./g; + $test[6] = eval($test[6] * 1024 * 1024); + print $return_data[0] . "|total=".$test4[1]."o used=".$test[6]."o\n"; + } else { + print $return_data[0] . "\n"; + } + exit $return_code; + } elsif ($op_v =~ /SERVICESTATE/){## SERVICESTATE + my (@tab, $process, $nom, $etat); + @tab = split (' - ',$_); + foreach $process (@tab) { + ($nom,$etat) = split (': ', $process); + if (defined($etat)) { + $etat =~ s/\n//; + } else { + $etat = "Unknown"; + } + if ($etat =~ /Started/) + {$etat=1;} + elsif ($etat =~ /Stopped/) + {$etat=0;} + elsif ($etat =~ /Unknown/) + {$etat=-1;} + else { + print "Unable to get $nom status [$etat]: \n\t$_\n"; + exit $ERRORS{'UNKNOWN'}; + } + } + $return =~ s/%/ pct/g; + print $return; + exit $return_code; + } elsif ($op_v =~ /PROCSTATE/){## PROCSTATE + print "PROCSTATE not graphed\n"; + exit $ERRORS{'UNKNOWN'}; + } elsif (($op_v =~ /COUNTER/) && ($op_l =~ /(.+)/)) { ## COUNTER + @output = split(/\|/,$_); + @values = $output[0] =~ /([,\.\d]*)\s?\%/ ; + if (!@values) {@values = $output[0] =~ /([\d]*)/;} + $start=time; + ## Print Plugins Output + $return =~ s/\n/ /g; + $return =~ s/%/ pct/g; + #print "---".$return ."---\n"; + print $return . "|counter=".@values."\n"; + exit $return_code; + } +} else { + print "Could not parse arguments\n"; + exit $ERRORS{'UNKNOWN'}; +} + +## +## Plugin return code +## + +sub print_usage () { + print "\nUsage:\n"; + print "$PROGNAME\n"; + print " Usage: check_graph_nt -H host -v variable [-p port] [-s password] [-w warning] [-c critical] [-l params] [-d SHOWALL] [-t timeout] [-D rrd directory] -g -S ServiceID\n"; + print " Options:\n"; + print " -H, --hostname=HOST\n"; + print " Name of the host to check\n"; + print " -p, --port=INTEGER\n"; + print " Optional port number (default: 1248)\n"; + print " -s \n"; + print " Password needed for the request\n"; + print " -v, --variable=STRING\n"; + print " Variable to check. Valid variables are:\n"; + print " CLIENTVERSION = Not Graphed. Get the NSClient version\n"; + print " CPULOAD = Average CPU load on last x minutes. Request a -l parameter with the following syntax:\n"; + print " -l ,,. should be less than 24*60.\n"; + print " Thresholds are percentage and up to 10 requests can be done in one shot. ie: -l 60,90,95,120,90,95\n"; + print " and 4 requests can be graphed.\n"; + print " UPTIME = Only Days are graphed. Get the uptime of the machine. No specific parameters. No warning or critical threshold.\n"; + print " USEDDISKSPACE = Size and percentage of disk use. Request a -l parameter containing the drive letter only.\n"; + print " Warning and critical thresholds can be specified with -w and -c.\n"; + print " MEMUSE = Memory use. Warning and critical thresholds can be specified with -w and -c.\n"; + print " SERVICESTATE = Check and graph the state of one service. Request a -l parameters with the following syntax:\n"; + print " -l ... You MUST specify -d SHOWALL in the input command.\n"; + print " 1: Service Started - 0: Service Stopped - -1: Service Unknown.\n"; +# print " SERVICESTATE = Not Graphed. Check the state of one or several services. Request a -l parameters with the following syntax:\n"; +# print " -l ,,,... You can specify -d SHOWALL in case you want to see working services\n"; +# print " in the returned string.\n"; + print " PROCSTATE = Not Graphed. Check if one or several process are running. Same syntax as SERVICESTATE.\n"; + print " COUNTER = Check any performance counter of Windows NT/2000. Request a -l parameters with the following syntax:\n"; + print " -l \"counter\",\"\" The parameter is optional and\n"; + print " is given to a printf output command which require a float parameters. Some examples:\n"; + print " \"Paging file usage is %.2f %%\" or \"%.f %% paging file used.\"\n"; + print " -w, --warning=INTEGER\n"; + print " Threshold which will result in a warning status\n"; + print " -c, --critical=INTEGER\n"; + print " Threshold which will result in a critical status\n"; + print " -t, --timeout=INTEGER\n"; + print " Seconds before connection attempt times out (default: 10)\n"; + print " -h, --help\n"; + print " Print this help screen\n"; + print " -V, --version\n"; + print " Print version information\n"; +} + +sub print_help () { + print "Copyright (c) 2004 OREON\n"; + print "Bugs to http://www.oreon.org/\n"; + print "\n"; + print_usage(); + print "\n"; +} diff --git a/centreon-plugins/Dev/src/check_snmp_cpfw.pl b/centreon-plugins/Dev/src/check_snmp_cpfw.pl new file mode 100644 index 000000000..14b29fa5d --- /dev/null +++ b/centreon-plugins/Dev/src/check_snmp_cpfw.pl @@ -0,0 +1,534 @@ +#!/usr/bin/perl -w +############################## check_snmp_cpfw ############## +# Version : 0.7 +# Date : Oct 02 2004 +# Author : Patrick Proy (patrick at proy.org) +# Help : http://www.manubulon.com/nagios/ +# Licence : GPL - http://www.fsf.org/licenses/gpl.txt +# TODO : +# - check sync method +################################################################# +# +# Help : ./check_snmp_cpfw.pl -h +# + +use strict; +use Net::SNMP; +use Getopt::Long; + +# Nagios specific + +use lib "@NAGIOS_PLUGINS@"; +use utils qw(%ERRORS $TIMEOUT); +#my $TIMEOUT = 15; +#my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4); + +# Oreon specific + +if (eval "require oreon" ) { + use oreon qw(get_parameters create_rrd update_rrd &is_valid_serviceid); + use vars qw($VERSION %oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} + +my $pathtorrdbase = $oreon{GLOBAL}{DIR_RRDTOOL}; + + +########### SNMP Datas ########### + +###### FW data +my $policy_state = "1.3.6.1.4.1.2620.1.1.1.0"; # "Installed" +my $policy_name = "1.3.6.1.4.1.2620.1.1.2.0"; # Installed policy name +my $connections = "1.3.6.1.4.1.2620.1.1.25.3.0"; # number of connections +#my $connections_peak = "1.3.6.1.4.1.2620.1.1.25.4.0"; # peak number of connections +my @fw_checks = ($policy_state,$policy_name,$connections); + +###### SVN data +my $svn_status = "1.3.6.1.4.1.2620.1.6.102.0"; # "OK" svn status +my %svn_checks = ($svn_status,"OK"); +my %svn_checks_n = ($svn_status,"SVN status"); +my @svn_checks_oid = ($svn_status); + +###### HA data + +my $ha_active = "1.3.6.1.4.1.2620.1.5.5.0"; # "yes" +my $ha_state = "1.3.6.1.4.1.2620.1.5.6.0"; # "active" +my $ha_block_state = "1.3.6.1.4.1.2620.1.5.7.0"; #"OK" : ha blocking state +my $ha_status = "1.3.6.1.4.1.2620.1.5.102.0"; # "OK" : ha status + +my %ha_checks =( $ha_active,"yes",$ha_state,"active",$ha_block_state,"OK",$ha_status,"OK"); +my %ha_checks_n =( $ha_active,"HA active",$ha_state,"HA state",$ha_block_state,"HA block state",$ha_status,"ha_status"); +my @ha_checks_oid =( $ha_active,$ha_state,$ha_block_state,$ha_status); + +my $ha_mode = "1.3.6.1.4.1.2620.1.5.11.0"; # "Sync only" : ha Working mode + +my $ha_tables = "1.3.6.1.4.1.2620.1.5.13.1"; # ha status table +my $ha_tables_index = ".1"; +my $ha_tables_name = ".2"; +my $ha_tables_state = ".3"; # "OK" +my $ha_tables_prbdesc = ".6"; # Description if state is != "OK" + +#my @ha_table_check = ("Synchronization","Filter","cphad","fwd"); # process to check + +####### MGMT data + +my $mgmt_status = "1.3.6.1.4.1.2620.1.7.5.0"; # "active" : management status +my $mgmt_alive = "1.3.6.1.4.1.2620.1.7.6.0"; # 1 : management is alive if 1 +my $mgmt_stat_desc = "1.3.6.1.4.1.2620.1.7.102.0"; # Management status description +my $mgmt_stats_desc_l = "1.3.6.1.4.1.2620.1.7.103.0"; # Management status long description + +my %mgmt_checks = ($mgmt_status,"active",$mgmt_alive,"1"); +my %mgmt_checks_n = ($mgmt_status,"Mgmt status",$mgmt_alive,"Mgmt alive"); +my @mgmt_checks_oid = ($mgmt_status,$mgmt_alive); + +#################################### Globals ##############################"" + +my $Version='0.7'; + +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_warn= undef; # Warning for connections +my $o_crit= undef; # Crit for connections +my $o_svn= undef; # Check for SVN status +my $o_fw= undef; # Check for FW status +my $o_ha= undef; # Check for HA status +my $o_mgmt= undef; # Check for management status +my $o_policy= undef; # Check for policy name +my $o_conn= undef; # Check for connexions +my $o_perf= undef; # Performance data output + +# SNMPv3 specific +my $o_login= undef; # Login for snmpv3 +my $o_passwd= undef; # Pass for snmpv3 + +# Oreon specific +my $o_step= undef; +my $o_g= undef; +my $o_S= undef; +my $step= undef; +my $rrd= undef; +my $start= undef; +my $ServiceId= undef; +my @rrd_data= undef; + + +# functions + +sub p_version { print "check_snmp_cpfw version : $Version\n"; } + +sub print_usage { + print "Usage: $0 [-v] -H -C | (-l login -x passwd) [-s] [-w [-p=pol_name] [-c=warn,crit]] [-m] [-a] [-f] [-p ] [-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 Checkpoint FW-1 Monitor for Nagios version ",$Version,"\n"; + print "(c)2004 - to my cat Ratoune\n\n"; + print_usage(); + print < \$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, + 't:i' => \$TIMEOUT, 'timeout:i' => \$TIMEOUT, + 'V' => \$o_version, 'version' => \$o_version, + 's' => \$o_svn, 'svn' => \$o_svn, + 'w' => \$o_fw, 'fw' => \$o_fw, + 'a' => \$o_ha, 'ha' => \$o_ha, + 'm' => \$o_mgmt, 'mgmt' => \$o_mgmt, + 'p:s' => \$o_policy, 'policy:s' => \$o_policy, + 'c:s' => \$o_conn, 'connexions:s' => \$o_conn, + 'f' => \$o_perf, 'perfparse' => \$o_perf, + # For Oreon rrdtool graph + "rrd_step:s" => \$o_step, + "g" => \$o_g, "rrdgraph" => \$o_g, + "S=s" => \$o_S, "ServiceId=s" => \$o_S + ); + 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"}} + # Check firewall options + if ( defined($o_conn)) { + if ( ! defined($o_fw)) + { print "Cannot check connexions without checking fw\n"; print_usage(); exit $ERRORS{"UNKNOWN"}} + my @warncrit=split(/,/ , $o_conn); + if ( $#warncrit != 1 ) + { print "Put warn,crit levels with -c option\n";print_usage(); exit $ERRORS{"UNKNOWN"}} + ($o_warn,$o_crit)=@warncrit; + if ( isnnum($o_warn) || isnnum($o_crit) ) + { print "Numeric values for warning and critical in -c options\n";print_usage(); exit $ERRORS{"UNKNOWN"}} + if ($o_warn >= $o_crit) + { print "warning <= critical ! \n";print_usage(); exit $ERRORS{"UNKNOWN"}} + } + if ( defined($o_policy)) { + if (! defined($o_fw)) + { print "Cannot check policy name without checking fw\n"; print_usage(); exit $ERRORS{"UNKNOWN"}} + if ($o_policy eq "") + { print "Put a policy name !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}} + } + if (defined($o_perf) && ! defined ($o_conn)) + { print "Nothing selected for perfparse !\n";print_usage(); exit $ERRORS{"UNKNOWN"}} + if (!defined($o_fw) && !defined($o_ha) && !defined($o_mgmt) && !defined($o_svn)) + { print "Must select a product to check !\n";print_usage(); exit $ERRORS{"UNKNOWN"}} + + ###### Oreon ####### + + if (!defined($o_S)) { $o_S="1_1" } + $ServiceId = is_valid_serviceid($o_S); + + if (!defined($o_step)) { $o_step="300" } + $step = $1 if ($o_step =~ /(\d+)/); + +} + +########## MAIN ####### + +check_options(); + +$rrd = $pathtorrdbase.$ServiceId.".rrd"; +$start=time; + +# Check gobal timeout if snmp screws up +alarm($TIMEOUT+15); + +# Connect to host +my ($session,$error); +if ( defined($o_login) && defined($o_passwd)) { + # SNMPv3 login + verb("SNMPv3 login"); + ($session, $error) = Net::SNMP->session( + -hostname => $o_host, + -version => '3', + -username => $o_login, + -authpassword => $o_passwd, + -authprotocol => 'md5', + -privpassword => $o_passwd + ); +} else { + # SNMPV1 login + ($session, $error) = Net::SNMP->session( + -hostname => $o_host, + -community => $o_community, + -port => $o_port, + -timeout => $TIMEOUT + ); +} +if (!defined($session)) { + printf("ERROR opening session: %s.\n", $error); + exit $ERRORS{"UNKNOWN"}; +} + +########### Global checks ################# + +my $global_status=0; # global status : 0=OK, 1=Warn, 2=Crit +my ($resultat,$key)=(undef,undef); + +########## Check SVN status ############# +my $svn_print=""; +my $svn_state=0; + +if (defined ($o_svn)) { + +$resultat = $session->get_request( + Varbindlist => \@svn_checks_oid +); + + if (defined($resultat)) { + foreach $key ( keys %svn_checks) { + verb("$svn_checks_n{$key} : $svn_checks{$key} / $$resultat{$key}"); + if ( $$resultat{$key} ne $svn_checks{$key} ) { + $svn_print .= $svn_checks_n{$key} . ":" . $$resultat{$key} . " "; + $svn_state=2; + } + } + } else { + $svn_print .= "cannot find oids"; + #Critical state if not found because it means soft is not activated + $svn_state=2; + } + + if ($svn_state == 0) { + $svn_print="SVN : OK"; + } else { + $svn_print="SVN : " . $svn_print; + } + verb("$svn_print"); +} +########## Check mgmt status ############# +my $mgmt_state=0; +my $mgmt_print=""; + +if (defined ($o_mgmt)) { +# Check all states + $resultat=undef; + $resultat = $session->get_request( + Varbindlist => \@mgmt_checks_oid + ); + if (defined($resultat)) { + foreach $key ( keys %mgmt_checks) { + verb("$mgmt_checks_n{$key} : $mgmt_checks{$key} / $$resultat{$key}"); + if ( $$resultat{$key} ne $mgmt_checks{$key} ) { + $mgmt_print .= $mgmt_checks_n{$key} . ":" . $$resultat{$key} . " "; + $mgmt_state=2; + } + } + } else { + $mgmt_print .= "cannot find oids"; + #Critical state if not found because it means soft is not activated + $mgmt_state=2; + } + if ($mgmt_state == 0) { + $mgmt_print="MGMT : OK"; + } else { + $mgmt_print="MGMT : " . $mgmt_print; + } + verb("$svn_print"); +} + +########### Check fw status ############## + +my $fw_state=0; +my $fw_print=""; +my $perf_conn=undef; + +if (defined ($o_fw)) { + +# Check all states + + $resultat = $session->get_request( + Varbindlist => \@fw_checks + ); + if (defined($resultat)) { + verb("State : $$resultat{$policy_state}"); + verb("Name : $$resultat{$policy_name}"); + verb("connections : $$resultat{$connections}"); + + if ($$resultat{$policy_state} ne "Installed") { + $fw_state=2; + $fw_print .= "Policy:". $$resultat{$policy_state}." "; + verb("Policy state not installed"); + } + + if (defined($o_policy)) { + if ($$resultat{$policy_name} ne $o_policy) { + $fw_state=2; + $fw_print .= "Policy installed : $$resultat{$policy_name}"; + } + } + + if (defined($o_conn)) { + if ($$resultat{$connections} > $o_crit) { + $fw_state=2; + $fw_print .= "Connexions : ".$$resultat{$connections}." > ".$o_crit." "; + } else { + if ($$resultat{$connections} > $o_warn) { + $fw_state=1; + $fw_print .= "Connexions : ".$$resultat{$connections}." > ".$o_warn." "; + } + } + $perf_conn=$$resultat{$connections}; + + ## + ## RRD management + ## + + if ($o_g) { + $start=time; + if (! -e $rrd) { + create_rrd($rrd,1,$start,$step,0,"U","GAUGE"); + } + update_rrd($rrd,$start, $perf_conn); + } + } + } else { + $fw_print .= "cannot find oids"; + #Critical state if not found because it means soft is not activated + $fw_state=2; + } + + if ($fw_state==0) { + $fw_print="FW : OK"; + } else { + $fw_print="FW : " . $fw_print; + } + +} +########### Check ha status ############## + +my $ha_state_n=0; +my $ha_print=""; + +if (defined ($o_ha)) { + # Check all states + + $resultat = $session->get_request( + Varbindlist => \@ha_checks_oid + ); + + if (defined($resultat)) { + foreach $key ( keys %ha_checks) { + verb("$ha_checks_n{$key} : $ha_checks{$key} / $$resultat{$key}"); + if ( $$resultat{$key} ne $ha_checks{$key} ) { + $ha_print .= $ha_checks_n{$key} . ":" . $$resultat{$key} . " "; + $ha_state_n=2; + } + } + #my $ha_mode = "1.3.6.1.4.1.2620.1.5.11.0"; # "Sync only" : ha Working mode + } else { + $ha_print .= "cannot find oids"; + #Critical state if not found because it means soft is not activated + $ha_state_n=2; + } + + # get ha status table + $resultat = $session->get_table( + Baseoid => $ha_tables + ); + my %status; + my (@index,@oid) = (undef,undef); + my $nindex=0; + my $index_search= $ha_tables . $ha_tables_index; + + if (defined($resultat)) { + foreach $key ( keys %$resultat) { + if ( $key =~ /$index_search/) { + @oid=split (/\./,$key); + pop(@oid); + $index[$nindex]=pop(@oid); + $nindex++; + } + } + } else { + $ha_print .= "cannot find oids" if ($ha_state_n ==0); + #Critical state if not found because it means soft is not activated + $ha_state_n=2; + } + verb ("found $nindex ha softs"); + if ( $nindex == 0 ) + { + $ha_print .= " no ha soft found" if ($ha_state_n ==0); + $ha_state_n=2; + } else { + my $ha_soft_name=undef; + + for (my $i=0;$i<$nindex;$i++) { + + $key=$ha_tables . $ha_tables_name . "." . $index[$i] . ".0"; + $ha_soft_name= $$resultat{$key}; + + $key=$ha_tables . $ha_tables_state . "." . $index[$i] . ".0"; + if (($status{$ha_soft_name} = $$resultat{$key}) ne "OK") { + $key=$ha_tables . $ha_tables_prbdesc . "." . $index[$i] . ".0"; + $status{$ha_soft_name} = $$resultat{$key}; + $ha_print .= $ha_soft_name . ":" . $status{$ha_soft_name} . " "; + $ha_state_n=2 + } + verb ("$ha_soft_name : $status{$ha_soft_name}"); + } + } + + if ($ha_state_n == 0) { + $ha_print = "HA : OK"; + } else { + $ha_print = "HA : " . $ha_print; + } + +} + +$session->close; + +########## print results and exit + +my $f_print=undef; + +if (defined ($o_fw)) { $f_print = $fw_print } +if (defined ($o_svn)) { $f_print = (defined ($f_print)) ? $f_print . " / ". $svn_print : $svn_print } +if (defined ($o_ha)) { $f_print = (defined ($f_print)) ? $f_print . " / ". $ha_print : $ha_print } +if (defined ($o_mgmt)) { $f_print = (defined ($f_print)) ? $f_print . " / ". $mgmt_print : $mgmt_print } + +my $exit_status=undef; +$f_print .= " / CPFW Status : "; +if (($ha_state_n+$svn_state+$fw_state+$mgmt_state) == 0 ) { + $f_print .= "OK"; + $exit_status= $ERRORS{"OK"}; +} else { + if (($fw_state==1) || ($ha_state_n==1) || ($svn_state==1) || ($mgmt_state==1)) { + $f_print .= "WARNING"; + $exit_status= $ERRORS{"WARNING"}; + } else { + $f_print .= "CRITICAL"; + $exit_status=$ERRORS{"CRITICAL"}; + } +} + +if (defined($o_perf) && defined ($perf_conn)) { + $f_print .= " | fw_connexions=" . $perf_conn; +} + +print "$f_print\n"; +exit $exit_status; + diff --git a/centreon-plugins/Dev/src/check_snmp_load.pl b/centreon-plugins/Dev/src/check_snmp_load.pl new file mode 100644 index 000000000..714a51e6f --- /dev/null +++ b/centreon-plugins/Dev/src/check_snmp_load.pl @@ -0,0 +1,593 @@ +#!/usr/bin/perl -w +############################## check_snmp_load ################# +# Version : 1.2 / BETA +# Date : Aug 27 2005 +# Author : Patrick Proy ( patrick at proy.org) +# Help : http://www.manubulon.com/nagios/ +# Licence : GPL - http://www.fsf.org/licenses/gpl.txt +# Changelog : HP Procurve +# TODO : +################################################################# +# +# Help : ./check_snmp_load.pl -h +# + +use strict; +use Net::SNMP; +use Getopt::Long; + +# Nagios specific + +use lib "@NAGIOS_PLUGINS@"; +use utils qw(%ERRORS $TIMEOUT); +#my $TIMEOUT = 15; +#my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4); + +# Oreon specific + + +if (eval "require oreon" ) { + use oreon qw(get_parameters create_rrd update_rrd &is_valid_serviceid); + use vars qw($VERSION %oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} + +my $pathtorrdbase = $oreon{GLOBAL}{DIR_RRDTOOL}; + +# 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 %) + +# 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. + +# Linkproof Appliance +my $linkproof_cpu= "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 (%) + +# 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); + +# Globals + +my $Version='1.2'; + +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_check_type= "stand"; # check type : stand | netsc | netsl | as400 | cisco | bc | nokia | hp | lp +# For backward compatibility +my $o_linux= undef; # Check linux load instead of CPU +my $o_linuxC= undef; # Check Net-SNMP CPU +my $o_as400= undef; # Check for AS 400 load +my $o_cisco= undef; # Check for Cisco CPU +# 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= 5; # Default 5s Timeout +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 +# Oreon specific +my $o_step= undef; +my $o_g= undef; +my $o_S= undef; +my $step= undef; +my $rrd= undef; +my $start= undef; +my $ServiceId= undef; + +# 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) [-p ] -w -c -T=[stand|netsl|netsc|as400|cisco|bc|nokia|hp|lp] [-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 "(c)2004 to my cat Ratoune - Author : Patrick Proy\n\n"; + print_usage(); + print < \$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, + '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, +# For backward compatibility + 'L' => \$o_linux, 'linux' => \$o_linux, + 'A' => \$o_as400, 'as400' => \$o_as400, + 'I' => \$o_cisco, 'cisco' => \$o_cisco, + 'N' => \$o_linuxC, 'netsnmp' => \$o_linuxC, +# For Oreon rrdtool graph + "rrd_step:s" => \$o_step, + "g" => \$o_g, "rrdgraph" => \$o_g, + "S=s" => \$o_S, "ServiceId=s" => \$o_S + ); + # For backward compat + if (defined($o_linux)) { $o_check_type="netsl" } + if (defined($o_linuxC)) { $o_check_type="netsc" } + if (defined($o_as400)) { $o_check_type="as400"} + if (defined($o_cisco)) { $o_check_type="cisco"} + # TODO : check the -T option + 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"}} + # 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_warn =~ /,/) || ($o_crit =~ /,/)) { + if (($o_check_type ne "netsl") && ($o_check_type ne "cisco")) { print "Multiple warning without -L or -I switch\n";print_usage(); exit $ERRORS{"UNKNOWN"}} + @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_check_type eq "netsl") || ($o_check_type eq "cisco")) { print "Multiple warn and crit levels needed with -L or -I switch\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"}} + } + + ###### Oreon ####### + + if (!defined($o_S)) { $o_S="1_1" } + $ServiceId = is_valid_serviceid($o_S); + + if (!defined($o_step)) { $o_step="300" } + $step = $1 if ($o_step =~ /(\d+)/); + + +} + + + + + +########## MAIN ####### + +check_options(); + +$rrd = $pathtorrdbase.$ServiceId.".rrd"; +$start=time; + +# Check gobal timeout if snmp screws up +if (defined($TIMEOUT)) { + verb("Alarm at $TIMEOUT + 5"); + alarm($TIMEOUT+5); +} 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 + verb("SNMPv3 login"); + ($session, $error) = Net::SNMP->session( + -hostname => $o_host, + -version => '3', + -username => $o_login, + -authpassword => $o_passwd, + -authprotocol => 'md5', + -privpassword => $o_passwd, + -timeout => $o_timeout + ); +} else { + if (defined ($o_version2)) { + # SNMPv2 Login + ($session, $error) = Net::SNMP->session( + -hostname => $o_host, + -version => 2, + -community => $o_community, + -port => $o_port, + -timeout => $o_timeout + ); + } else { + # SNMPV1 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 < 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; +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"); + } +} + +for (my $i=0;$i<3;$i++) { $load[$i] = $$resultat{$linload_load . "." . $iload[$i]}}; + +## +## RRD management +## + +if ($o_g) { + $start=time; + if (! -e $rrd) { + create_rrd($rrd,3,$start,$step,0,"U","GAUGE"); + } + update_rrd($rrd,$start, $load[0] ,$load[1], $load[2]); +} + + +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_1_min=$load[0];$o_warnL[0];$o_critL[0],"; + print "load_5_min=$load[1];$o_warnL[1];$o_critL[1],"; + print "load_15_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 < 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}; + +## +## RRD management +## + +if ($o_g) { + $start=time; + if (! -e $rrd) { + create_rrd($rrd,3,$start,$step,0,"U","GAUGE"); + } + update_rrd($rrd,$start,$load[0] ,$load[1], $load[2]); +} + +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 ########### +if ( $o_check_type =~ /netsc|as400|bc|nokia|hp|lp/ ) { + +# Get load table +my @oidlist = $cpu_oid{$o_check_type}; +verb("Checking OID : @oidlist"); +my $resultat = (Net::SNMP->VERSION < 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; }; + +## +## RRD management +## + +if ($o_g) { + $start=time; + if (! -e $rrd) { + create_rrd($rrd,1,$start,$step,0,"U","GAUGE"); + } + update_rrd($rrd,$start,$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; + +} + +########## Standard cpu usage check ############ +# Get desctiption table +my $resultat = (Net::SNMP->VERSION < 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; + +## +## RRD management +## + +if ($o_g) { + $start=time; + if (! -e $rrd) { + create_rrd($rrd,1,$start,$step,0,"U","GAUGE"); + } + update_rrd($rrd,$start,$cpu_used); +} + +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/centreon-plugins/Dev/src/check_snmp_mem.pl b/centreon-plugins/Dev/src/check_snmp_mem.pl new file mode 100644 index 000000000..485e925d3 --- /dev/null +++ b/centreon-plugins/Dev/src/check_snmp_mem.pl @@ -0,0 +1,542 @@ +#!/usr/bin/perl -w +############################## check_snmp_mem ############## +# Version : 0.9 +# Date : Jul 20 2005 +# Author : Patrick Proy (patrick at proy.org) +# Help : http://www.manubulon.com/nagios/ +# Licence : GPL - http://www.fsf.org/licenses/gpl.txt +# TODO : snmpv3 +################################################################# +# +# Help : ./check_snmp_mem.pl -h +# + +use strict; +use Net::SNMP; +use Getopt::Long; + +# Nagios specific + +use lib "@NAGIOS_PLUGINS@"; +use utils qw(%ERRORS $TIMEOUT); +#my $TIMEOUT = 15; +#my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4); + +# Oreon specific + +if (eval "require oreon" ) { + use oreon qw(get_parameters create_rrd update_rrd &is_valid_serviceid); + use vars qw($VERSION %oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} + +my $pathtorrdbase = $oreon{GLOBAL}{DIR_RRDTOOL}; + +# 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_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); + +# 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"; # Used 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 $Version='0.9'; + +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_timeout= 5; # Default 5s Timeout +my $o_version2= undef; # use snmp v2c +# SNMPv3 specific +my $o_login= undef; # Login for snmpv3 +my $o_passwd= undef; # Pass for snmpv3 + +# Oreon specific +my $o_step= undef; +my $o_g= undef; +my $o_S= undef; +my $step= undef; +my $rrd= undef; +my $start= undef; +my $ServiceId= undef; + + +# 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) [-p ] -w -c [-I|-N|-E] [-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 round ($$) { + sprintf "%.$_[1]f", $_[0]; +} + +sub help { + print "\nSNMP Memory Monitor for Nagios version ",$Version,"\n"; + print "(c)2004 to my cat Ratoune - Author: Patrick Proy\n\n"; + print_usage(); + print < \$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, + '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, + 'f' => \$o_perf, 'perfdata' => \$o_perf, +# For Oreon rrdtool graph + "rrd_step:s" => \$o_step, + "g" => \$o_g, "rrdgraph" => \$o_g, + "S=s" => \$o_S, "ServiceId=s" => \$o_S + ); + 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"}} + #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]; + } + + ###### Oreon ####### + + if (!defined($o_S)) { $o_S="1_1" } + $ServiceId = is_valid_serviceid($o_S); + + if (!defined($o_step)) { $o_step="300" } + $step = $1 if ($o_step =~ /(\d+)/); + +} + +########## MAIN ####### + +check_options(); + +$rrd = $pathtorrdbase.$ServiceId.".rrd"; +$start=time; + +# 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 + verb("SNMPv3 login"); + ($session, $error) = Net::SNMP->session( + -hostname => $o_host, + -version => '3', + -username => $o_login, + -authpassword => $o_passwd, + -authprotocol => 'md5', + -privpassword => $o_passwd, + -timeout => $o_timeout + ); +} else { + if (defined ($o_version2)) { + # SNMPv2 Login + ($session, $error) = Net::SNMP->session( + -hostname => $o_host, + -version => 2, + -community => $o_community, + -port => $o_port, + -timeout => $o_timeout + ); + } else { + + # SNMPV1 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 = (Net::SNMP->VERSION < 4) ? + $session->get_table($cisco_mem_pool) + :$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"}; + } + + # Consolidate the datas + my ($used,$free)=(0,0); + my ($c_output,$prct_free)=(undef,undef); + foreach (@index) { + if ( $$resultat{$cisco_valid . "." . $_} == 1 ) { + $c_output .="," if defined ($c_output); + $used += $$resultat{$cisco_used . "." . $_}; + $free += $$resultat{$cisco_free . "." . $_}; + $c_output .= $$resultat{$cisco_index . "." . $_} . ":" + .round($$resultat{$cisco_used . "." . $_}*100/($$resultat{$cisco_free . "." . $_}+$$resultat{$cisco_used . "." . $_}) ,0) + . "%"; + } + } + my $total=$used+$free; + $prct_free=round($used*100/($total),0); + verb("Used : $used, Free: $free, Output : $c_output"); + + ## + ## RRD management + ## + + if ($o_g) { + $start=time; + if (! -e $rrd) { + create_rrd($rrd,1,$start,$step,0,100,"GAUGE"); + } + update_rrd($rrd,$start,$prct_free); + } + + 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}; +} + +########### HP Procurve memory check ############ +if (defined ($o_hp)) { + + # Get hp memory table + $resultat = (Net::SNMP->VERSION < 4) ? + $session->get_table($hp_mem_pool) + :$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"); + + ## + ## RRD management + ## + + if ($o_g) { + $start=time; + if (! -e $rrd) { + create_rrd($rrd,1,$start,$step,0,100,"GAUGE"); + } + update_rrd($rrd,$start,$prct_free); + } + + 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 = (Net::SNMP->VERSION < 4) ? + $session->get_request(@nets_oids) + :$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); + + $realused= ($$resultat{$nets_ram_total} == 0) ? 0 : + ($$resultat{$nets_ram_total}-$$resultat{$nets_ram_free})/$$resultat{$nets_ram_total}; + $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_total} : $realused"); + verb ("Swap : $$resultat{$nets_swap_free} / $$resultat{$nets_swap_total} : $swapused"); + + ## + ## RRD management + ## + + if ($o_g) { + $start=time; + if (! -e $rrd) { + create_rrd($rrd,2,$start,$step,0,100,"GAUGE"); + } + update_rrd($rrd,$start,$realused, $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)) { + $n_output .= " | ram_used=" . ($$resultat{$nets_ram_total}-$$resultat{$nets_ram_free}).";"; + $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/centreon-plugins/Dev/src/check_snmp_process.pl b/centreon-plugins/Dev/src/check_snmp_process.pl new file mode 100644 index 000000000..41d4bfde3 --- /dev/null +++ b/centreon-plugins/Dev/src/check_snmp_process.pl @@ -0,0 +1,602 @@ +#!/usr/bin/perl -w +############################## check_snmp_process ############## +# Version : 1.2.1 +# Date : Dec 12 2004 +# Author : Patrick Proy (patrick at proy.org) +# Help : http://www.manubulon.com/nagios/ +# Licence : GPL - http://www.fsf.org/licenses/gpl.txt +# TODO : put $o_delta as an option +############################################################### +# +# help : ./check_snmp_process -h + +############### BASE DIRECTORY FOR TEMP FILE ######## +my $o_base_dir="/tmp/tmp_Nagios_proc."; +my $file_history=200; # number of data to keep in files. +my $delta_of_time_to_make_average=300; # 5minutes by default + +use strict; +use Net::SNMP; +use Getopt::Long; + +# Nagios specific + +use lib "@NAGIOS_PLUGINS@"; +use utils qw(%ERRORS $TIMEOUT); +#my $TIMEOUT = 5; +#my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4); + +# Oreon specific + +#use lib "@NAGIOS_PLUGINS@"; +if (eval "require oreon" ) { + use oreon qw(get_parameters create_rrd update_rrd &is_valid_serviceid); + use vars qw($VERSION %oreon); + %oreon=get_parameters(); +} else { + print "Unable to load oreon perl module\n"; + exit $ERRORS{'UNKNOWN'}; +} + +my $pathtorrdbase = $oreon{GLOBAL}{DIR_RRDTOOL}; + + +# SNMP Datas +my $process_table= '1.3.6.1.2.1.25.4.2.1'; +my $index_table = '1.3.6.1.2.1.25.4.2.1.1'; +my $run_name_table = '1.3.6.1.2.1.25.4.2.1.2'; +my $run_path_table = '1.3.6.1.2.1.25.4.2.1.4'; +my $proc_mem_table = '1.3.6.1.2.1.25.5.1.1.2'; # Kbytes +my $proc_cpu_table = '1.3.6.1.2.1.25.5.1.1.1'; # Centi sec of CPU +my $proc_run_state = '1.3.6.1.2.1.25.4.2.1.7'; + +# Globals + +my $Version='1.2.1'; + +my $o_host = undef; # hostname +my $o_community =undef; # community +my $o_port = 161; # port +my $o_descr = undef; # description filter +my $o_warn = 0; # warning limit +my @o_warnL= undef; # warning limits (min,max) +my $o_crit= 0; # critical limit +my @o_critL= undef; # critical limits (min,max) +my $o_help= undef; # wan't some help ? +my $o_verb= undef; # verbose mode +my $o_version= undef; # print version +my $o_noreg= undef; # Do not use Regexp for name +my $o_path= undef; # check path instead of name +my $o_inverse= undef; # checks max instead of min number of process +my $o_timeout= 5; # Default 5s Timeout +# SNMP V3 specific +my $o_login= undef; # snmp v3 login +my $o_passwd= undef; # snmp v3 passwd +# Memory & CPU +my $o_mem= undef; # checks memory (max) +my @o_memL= undef; # warn and crit level for mem +my $o_mem_avg= undef; # cheks memory average +my $o_cpu= undef; # checks CPU usage +my @o_cpuL= undef; # warn and crit level for cpu +my $o_delta= $delta_of_time_to_make_average; # delta time for CPU check +# Oreon specific +my $o_step= undef; +my $o_g= undef; +my $o_S= undef; +my $step= undef; +my $rrd= undef; +my $start= undef; +my $ServiceId= undef; +my @rrd_data= undef; + +# functions + +sub p_version { print "check_snmp_process version : $Version\n"; } + +sub print_usage { + print "Usage: $0 [-v] -H -C | (-l login -x passwd) [-p ] -n [-w [,] -c [,max_proc] ] [-m, -a -u, ] [-t ] [-f ] [-r] [-V]\n"; +} + +sub isnotnum { # Return true if arg is not a number + my $num = shift; + if ( $num =~ /^(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;} + return 1; +} + +# 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 read_file { + # Input : File, items_number + # Returns : array of value : [line][item] + my ($traffic_file,$items_number)=@_; + my ($ligne,$n_rows)=(undef,0); + my (@last_values,@file_values,$i); + open(FILE,"<".$traffic_file) || return (1,0,0); + + while($ligne = ) + { + chomp($ligne); + @file_values = split(":",$ligne); + #verb("@file_values"); + if ($#file_values >= ($items_number-1)) { + # check if there is enough data, else ignore line + for ( $i=0 ; $i< $items_number ; $i++ ) {$last_values[$n_rows][$i]=$file_values[$i]; } + $n_rows++; + } + } + close FILE; + if ($n_rows != 0) { + return (0,$n_rows,@last_values); + } else { + return (1,0,0); + } +} + +sub write_file { + # Input : file , rows, items, array of value : [line][item] + # Returns : 0 / OK, 1 / error + my ($file_out,$rows,$item,@file_values)=@_; + my $start_line= ($rows > $file_history) ? $rows - $file_history : 0; + if ( open(FILE2,">".$file_out) ) { + for (my $i=$start_line;$i<$rows;$i++) { + for (my $j=0;$j<$item;$j++) { + print FILE2 $file_values[$i][$j]; + if ($j != ($item -1)) { print FILE2 ":" }; + } + print FILE2 "\n"; + } + close FILE2; + return 0; + } else { + return 1; + } +} + +sub help { + print "\nSNMP Process Monitor for Nagios version ",$Version,"\n"; + print "(c)2004 to my cat Ratoune - Author: Patrick Proy\n\n"; + print_usage(); + print < 100% : 100%=1 CPU +-t, --timeout=INTEGER + timeout for SNMP in seconds (Default: 5) +-V, --version + prints version number +-g (--rrdgraph) Create a rrd base if necessary and add datas into this one +--rrd_step Specifies the base interval in seconds with which data will be fed into the RRD (300 by default) +-S (--ServiceId) Oreon Service Id + +Note : + CPU usage is in % of one cpu, so maximum can be 100% * number of CPU + example : + Browse process list :