add basic network monitoring
diff --git a/metadata/service/client/network.yml b/metadata/service/client/network.yml
new file mode 100644
index 0000000..188b764
--- /dev/null
+++ b/metadata/service/client/network.yml
@@ -0,0 +1,6 @@
+parameters:
+ sensu:
+ client:
+ plugin:
+ network_monitoring:
+ enabled: true
diff --git a/sensu/client.sls b/sensu/client.sls
index 65bec97..25dbe33 100644
--- a/sensu/client.sls
+++ b/sensu/client.sls
@@ -41,6 +41,14 @@
{%- endif %}
+{%- if plugin_name == 'network_monitoring' %}
+
+sensu_monitoring_network_packages:
+ pkg.installed:
+ - name: libnet-snmp-perl
+
+{%- endif %}
+
{%- endif %}
{%- endfor %}
diff --git a/sensu/files/checks/check_snmp_int.pl b/sensu/files/checks/check_snmp_int.pl
new file mode 100644
index 0000000..09739a2
--- /dev/null
+++ b/sensu/files/checks/check_snmp_int.pl
@@ -0,0 +1,835 @@
+#!/usr/bin/perl -w
+############################## check_snmp_int ##############
+my $Version='1.24';
+# Date : Oct 10 2007
+# Author : Patrick Proy ( patrick at proy.org )
+# Help : http://nagios.manubulon.com
+# Licence : GPL - http://www.fsf.org/licenses/gpl.txt
+# Contrib : J. Jungmann, S. Probst, R. Leroy, M. Berger
+# TODO :
+# Maybe put base directory for performance as an option
+#################################################################
+#
+# Help : ./check_snmp_int.pl -h
+#
+use strict;
+use Net::SNMP;
+use Getopt::Long;
+
+############### BASE DIRECTORY FOR TEMP FILE ########
+my $o_base_dir="/tmp/tmp_Nagios_int.";
+my $file_history=200; # number of data to keep in files.
+
+# Nagios specific
+
+my $TIMEOUT = 15;
+my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
+
+# SNMP Datas
+
+my $inter_table= '.1.3.6.1.2.1.2.2.1';
+my $index_table = '1.3.6.1.2.1.2.2.1.1';
+my $descr_table = '1.3.6.1.2.1.2.2.1.2';
+my $oper_table = '1.3.6.1.2.1.2.2.1.8.';
+my $admin_table = '1.3.6.1.2.1.2.2.1.7.';
+my $speed_table = '1.3.6.1.2.1.2.2.1.5.';
+my $speed_table_64 = '1.3.6.1.2.1.31.1.1.1.15.';
+my $in_octet_table = '1.3.6.1.2.1.2.2.1.10.';
+my $in_octet_table_64 = '1.3.6.1.2.1.31.1.1.1.6.';
+my $in_error_table = '1.3.6.1.2.1.2.2.1.14.';
+my $in_discard_table = '1.3.6.1.2.1.2.2.1.13.';
+my $out_octet_table = '1.3.6.1.2.1.2.2.1.16.';
+my $out_octet_table_64 = '1.3.6.1.2.1.31.1.1.1.10.';
+my $out_error_table = '1.3.6.1.2.1.2.2.1.20.';
+my $out_discard_table = '1.3.6.1.2.1.2.2.1.19.';
+
+my %status=(1=>'UP',2=>'DOWN',3=>'TESTING',4=>'UNKNOWN',5=>'DORMANT',6=>'NotPresent',7=>'lowerLayerDown');
+
+# Globals
+
+
+# Standard options
+my $o_host = undef; # hostname
+my $o_port = 161; # port
+my $o_descr = undef; # description filter
+my $o_help= undef; # wan't some help ?
+my $o_admin= undef; # admin status instead of oper
+my $o_inverse= undef; # Critical when up
+my $o_dormant= undef; # Dormant state is OK
+my $o_verb= undef; # verbose mode
+my $o_version= undef; # print version
+my $o_noreg= undef; # Do not use Regexp for name
+my $o_short= undef; # set maximum of n chars to be displayed
+my $o_label= undef; # add label before speed (in, out, etc...).
+# Performance data options
+my $o_perf= undef; # Output performance data
+my $o_perfe= undef; # Output discard/error also in perf data
+my $o_perfs= undef; # include speed in performance output (-S)
+my $o_perfp= undef; # output performance data in % of max speed (-y)
+my $o_perfr= undef; # output performance data in bits/s or Bytes/s (-Y)
+# Speed/error checks
+my $o_checkperf= undef; # checks in/out/err/disc values
+my $o_delta= 300; # delta of time of perfcheck (default 5min)
+my $o_ext_checkperf= undef; # extended perf checks (+error+discard)
+my $o_warn_opt= undef; # warning options
+my $o_crit_opt= undef; # critical options
+my $o_kbits= undef; # Warn and critical in Kbits instead of KBytes
+my @o_warn= undef; # warning levels of perfcheck
+my @o_crit= undef; # critical levels of perfcheck
+my $o_highperf= undef; # Use 64 bits counters
+my $o_meg= undef; # output in MBytes or Mbits (-M)
+my $o_gig= undef; # output in GBytes or Gbits (-G)
+my $o_prct= undef; # output in % of max speed (-u)
+
+my $o_timeout= undef; # Timeout (Default 5)
+# SNMP Message size parameter (Makina Corpus contrib)
+my $o_octetlength=undef;
+# Login options specific
+my $o_community = undef; # community
+my $o_version2 = undef; #use snmp v2c
+my $o_login= undef; # Login for snmpv3
+my $o_passwd= undef; # Pass for snmpv3
+my $v3protocols=undef; # V3 protocol list.
+my $o_authproto='md5'; # Auth protocol
+my $o_privproto='des'; # Priv protocol
+my $o_privpass= undef; # priv password
+
+# Readable names for counters (M. Berger contrib)
+my @countername = ( "in=" , "out=" , "errors-in=" , "errors-out=" , "discard-in=" , "discard-out=" );
+my $checkperf_out_desc;
+
+# functions
+
+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 = <FILE>)
+ {
+ 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 p_version { print "check_snmp_int version : $Version\n"; }
+
+sub print_usage {
+ print "Usage: $0 [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd [-X pass -L <authp>,<privp>) [-p <port>] -n <name in desc_oid> [-i -a -D] [-r] [-f[eSyY]] [-k[qBMGu] -g -w<warn levels> -c<crit levels> -d<delta>] [-o <octet_length>] [-t <timeout>] [-s] --label [-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 Network Interface Monitor for Nagios version ",$Version,"\n";
+ print "GPL licence, (c)2004-2007 Patrick Proy\n\n";
+ print_usage();
+ print <<EOT;
+-v, --verbose
+ print extra debugging information (including interface list on the system)
+-h, --help
+ print this help message
+-H, --hostname=HOST
+ name or IP address of host to check
+-C, --community=COMMUNITY NAME
+ community name for the host's SNMP agent (implies v1 protocol)
+-l, --login=LOGIN ; -x, --passwd=PASSWD, -2, --v2c
+ Login and auth password for snmpv3 authentication
+ If no priv password exists, implies AuthNoPriv
+ -2 : use snmp v2c
+-X, --privpass=PASSWD
+ Priv password for snmpv3 (AuthPriv protocol)
+-L, --protocols=<authproto>,<privproto>
+ <authproto> : Authentication protocol (md5|sha : default md5)
+ <privproto> : Priv protocole (des|aes : default des)
+-P, --port=PORT
+ SNMP port (Default 161)
+-n, --name=NAME
+ Name in description OID (eth0, ppp0 ...).
+ This is treated as a regexp : -n eth will match eth0,eth1,...
+ Test it before, because there are known bugs (ex : trailling /)
+-r, --noregexp
+ Do not use regexp to match NAME in description OID
+-i, --inverse
+ Make critical when up
+-a, --admin
+ Use administrative status instead of operational
+-D, --dormant
+ Dormant state is an OK state
+-o, --octetlength=INTEGER
+ max-size of the SNMP message, usefull in case of Too Long responses.
+ Be carefull with network filters. Range 484 - 65535, default are
+ usually 1472,1452,1460 or 1440.
+-f, --perfparse
+ Perfparse compatible output (no output when interface is down).
+-e, --error
+ Add error & discard to Perfparse output
+-S, --intspeed
+ Include speed in performance output in bits/s
+-y, --perfprct ; -Y, --perfspeed
+ -y : output performance data in % of max speed
+ -Y : output performance data in bits/s or Bytes/s (depending on -B)
+-k, --perfcheck ; -q, --extperfcheck
+ -k check the input/ouput bandwidth of the interface
+ -q also check the error and discard input/output
+--label
+ Add label before speed in output : in=, out=, errors-out=, etc...
+-g, --64bits
+ Use 64 bits counters instead of the standard counters when checking
+ bandwidth & performance data for interface >= 1Gbps.
+ You must use snmp v2c or v3 to get 64 bits counters.
+-d, --delta=seconds
+ make an average of <delta> seconds (default 300=5min)
+-B, --kbits
+ Make the warning and critical levels in K|M|G Bits/s instead of K|M|G Bytes/s
+-G, --giga ; -M, --mega ; -u, --prct
+ -G : Make the warning and critical levels in Gbps (with -B) or GBps
+ -M : Make the warning and critical levels in Mbps (with -B) or MBps
+ -u : Make the warning and critical levels in % of reported interface speed.
+-w, --warning=input,output[,error in,error out,discard in,discard out]
+ warning level for input / output bandwidth (0 for no warning)
+ unit depends on B,M,G,u options
+ warning for error & discard input / output in error/min (need -q)
+-c, --critical=input,output[,error in,error out,discard in,discard out]
+ critical level for input / output bandwidth (0 for no critical)
+ unit depends on B,M,G,u options
+ critical for error & discard input / output in error/min (need -q)
+-s, --short=int
+ Make the output shorter : only the first <n> chars of the interface(s)
+ If the number is negative, then get the <n> LAST caracters.
+-t, --timeout=INTEGER
+ timeout for SNMP in seconds (Default: 5)
+-V, --version
+ prints version number
+Note : when multiple interface are selected with regexp,
+ all be must be up (or down with -i) to get an OK result.
+EOT
+}
+
+# For verbose output
+sub verb { my $t=shift; print $t,"\n" if defined($o_verb) ; }
+
+sub check_options {
+ Getopt::Long::Configure ("bundling");
+ GetOptions(
+ 'v' => \$o_verb, 'verbose' => \$o_verb,
+ 'h' => \$o_help, 'help' => \$o_help,
+ 'H:s' => \$o_host, 'hostname:s' => \$o_host,
+ 'p:i' => \$o_port, 'port:i' => \$o_port,
+ 'n:s' => \$o_descr, 'name:s' => \$o_descr,
+ 'C:s' => \$o_community, 'community:s' => \$o_community,
+ '2' => \$o_version2, 'v2c' => \$o_version2,
+ 'l:s' => \$o_login, 'login:s' => \$o_login,
+ 'x:s' => \$o_passwd, 'passwd:s' => \$o_passwd,
+ 'X:s' => \$o_privpass, 'privpass:s' => \$o_privpass,
+ 'L:s' => \$v3protocols, 'protocols:s' => \$v3protocols,
+ 't:i' => \$o_timeout, 'timeout:i' => \$o_timeout,
+ 'i' => \$o_inverse, 'inverse' => \$o_inverse,
+ 'a' => \$o_admin, 'admin' => \$o_admin,
+ 'r' => \$o_noreg, 'noregexp' => \$o_noreg,
+ 'V' => \$o_version, 'version' => \$o_version,
+ 'f' => \$o_perf, 'perfparse' => \$o_perf,
+ 'e' => \$o_perfe, 'error' => \$o_perfe,
+ 'k' => \$o_checkperf, 'perfcheck' => \$o_checkperf,
+ 'q' => \$o_ext_checkperf, 'extperfcheck' => \$o_ext_checkperf,
+ 'w:s' => \$o_warn_opt, 'warning:s' => \$o_warn_opt,
+ 'c:s' => \$o_crit_opt, 'critical:s' => \$o_crit_opt,
+ 'B' => \$o_kbits, 'kbits' => \$o_kbits,
+ 's:i' => \$o_short, 'short:i' => \$o_short,
+ 'g' => \$o_highperf, '64bits' => \$o_highperf,
+ 'S' => \$o_perfs, 'intspeed' => \$o_perfs,
+ 'y' => \$o_perfp, 'perfprct' => \$o_perfp,
+ 'Y' => \$o_perfr, 'perfspeed' => \$o_perfr,
+ 'M' => \$o_meg, 'mega' => \$o_meg,
+ 'G' => \$o_gig, 'giga' => \$o_gig,
+ 'u' => \$o_prct, 'prct' => \$o_prct,
+ 'o:i' => \$o_octetlength, 'octetlength:i' => \$o_octetlength,
+ 'label' => \$o_label,
+ 'd:i' => \$o_delta, 'delta:i' => \$o_delta,
+ 'D' => \$o_dormant, 'dormant' => \$o_dormant
+ );
+ if (defined ($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}};
+ if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}};
+ if ( ! defined($o_descr) || ! defined($o_host) ) # check host and filter
+ { print_usage(); exit $ERRORS{"UNKNOWN"}}
+ # check snmp information
+ if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) )
+ { print "Put snmp login info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if ((defined($o_login) || defined($o_passwd)) && (defined($o_community) || defined($o_version2)) )
+ { print "Can't mix snmp v1,2c,3 protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if (defined ($v3protocols)) {
+ if (!defined($o_login)) { print "Put snmp V3 login info with protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ my @v3proto=split(/,/,$v3protocols);
+ if ((defined ($v3proto[0])) && ($v3proto[0] ne "")) {$o_authproto=$v3proto[0]; } # Auth protocol
+ if (defined ($v3proto[1])) {$o_privproto=$v3proto[1]; } # Priv protocol
+ if ((defined ($v3proto[1])) && (!defined($o_privpass))) {
+ print "Put snmp V3 priv login info with priv protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ }
+ if (defined($o_timeout) && (isnnum($o_timeout) || ($o_timeout < 2) || ($o_timeout > 60)))
+ { print "Timeout must be >1 and <60 !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if (!defined($o_timeout)) {$o_timeout=5;}
+ # Check snmpv2c or v3 with 64 bit counters
+ if ( defined ($o_highperf) && (!defined($o_version2) && defined($o_community)))
+ { print "Can't get 64 bit counters with snmp version 1\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if (defined ($o_highperf)) {
+ if (eval "require bigint") {
+ use bigint;
+ } else { print "Need bigint module for 64 bit counters\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ }
+
+ # check if -e without -f
+ if ( defined($o_perfe) && !defined($o_perf))
+ { print "Cannot output error without -f option!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if (defined ($o_perfr) && defined($o_perfp) ) {
+ print "-Y and -y options are exclusives\n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if ((defined ($o_perfr) || defined($o_perfp) ) && !defined($o_checkperf)) {
+ print "Cannot put -Y or -y options without perf check option (-k) \n"; print_usage(); exit $ERRORS{"UNKNOWN"}}
+ if (defined ($o_short)) {
+ #TODO maybe some basic tests ? caracters return empty string
+ }
+ if (defined ($o_checkperf)) {
+ @o_warn=split(/,/,$o_warn_opt);
+ if (defined($o_ext_checkperf) && ($#o_warn != 5)) {
+ print "6 warning levels for extended checks \n"; print_usage(); exit $ERRORS{"UNKNOWN"}
+ }
+ if (!defined($o_ext_checkperf) &&($#o_warn !=1 )){
+ print "2 warning levels for bandwidth checks \n"; print_usage(); exit $ERRORS{"UNKNOWN"}
+ }
+ @o_crit=split(/,/,$o_crit_opt);
+ #verb(" $o_crit_opt :: $#o_crit : @o_crit");
+ if (defined($o_ext_checkperf) && ($#o_crit != 5)) {
+ print "6 critical levels for extended checks \n"; print_usage(); exit $ERRORS{"UNKNOWN"}
+ }
+ if (!defined($o_ext_checkperf) && ($#o_crit !=1 )) {
+ print "2 critical levels for bandwidth checks \n"; print_usage(); exit $ERRORS{"UNKNOWN"}
+ }
+ for (my $i=0;$i<=$#o_warn;$i++) {
+ if (($o_crit[$i]!=0)&&($o_warn[$i] > $o_crit[$i])) {
+ print "Warning must be < Critical level \n"; print_usage(); exit $ERRORS{"UNKNOWN"}
+ }
+ }
+ if ((defined ($o_meg) && defined($o_gig) ) || (defined ($o_meg) && defined($o_prct) )|| (defined ($o_gig) && defined($o_prct) )) {
+ print "-M -G and -u options are exclusives\n"; print_usage(); exit $ERRORS{"UNKNOWN"}
+ }
+ }
+ #### octet length checks
+ if (defined ($o_octetlength) && (isnnum($o_octetlength) || $o_octetlength > 65535 || $o_octetlength < 484 )) {
+ print "octet lenght must be < 65535 and > 484\n";print_usage(); exit $ERRORS{"UNKNOWN"};
+ }
+}
+
+########## MAIN #######
+
+check_options();
+
+# Check gobal timeout if snmp screws up
+if (defined($TIMEOUT)) {
+ verb("Alarm at $TIMEOUT + 5");
+ alarm($TIMEOUT+5);
+} else {
+ verb("no timeout defined : $o_timeout + 10");
+ alarm ($o_timeout+10);
+}
+
+$SIG{'ALRM'} = sub {
+ print "No answer from host\n";
+ exit $ERRORS{"UNKNOWN"};
+};
+
+# Connect to host
+my ($session,$error);
+if ( defined($o_login) && defined($o_passwd)) {
+ # SNMPv3 login
+ if (!defined ($o_privpass)) {
+ verb("SNMPv3 AuthNoPriv login : $o_login, $o_authproto");
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $o_host,
+ -version => '3',
+ -port => $o_port,
+ -username => $o_login,
+ -authpassword => $o_passwd,
+ -authprotocol => $o_authproto,
+ -timeout => $o_timeout
+ );
+ } else {
+ verb("SNMPv3 AuthPriv login : $o_login, $o_authproto, $o_privproto");
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $o_host,
+ -version => '3',
+ -username => $o_login,
+ -port => $o_port,
+ -authpassword => $o_passwd,
+ -authprotocol => $o_authproto,
+ -privpassword => $o_privpass,
+ -privprotocol => $o_privproto,
+ -timeout => $o_timeout
+ );
+ }
+} else {
+ if (defined ($o_version2)) {
+ # SNMPv2c Login
+ verb("SNMP v2c login");
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $o_host,
+ -version => 2,
+ -community => $o_community,
+ -port => $o_port,
+ -timeout => $o_timeout
+ );
+ } else {
+ # SNMPV1 login
+ verb("SNMP v1 login");
+ ($session, $error) = Net::SNMP->session(
+ -hostname => $o_host,
+ -community => $o_community,
+ -port => $o_port,
+ -timeout => $o_timeout
+ );
+ }
+}
+if (!defined($session)) {
+ printf("ERROR opening session: %s.\n", $error);
+ exit $ERRORS{"UNKNOWN"};
+}
+
+if (defined($o_octetlength)) {
+ my $oct_resultat=undef;
+ my $oct_test= $session->max_msg_size();
+ verb(" actual max octets:: $oct_test");
+ $oct_resultat = $session->max_msg_size($o_octetlength);
+ if (!defined($oct_resultat)) {
+ printf("ERROR: Session settings : %s.\n", $session->error);
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+ }
+ $oct_test= $session->max_msg_size();
+ verb(" new max octets:: $oct_test");
+}
+
+# Get desctiption table
+my $resultat = $session->get_table(
+ Baseoid => $descr_table
+);
+
+if (!defined($resultat)) {
+ printf("ERROR: Description table : %s.\n", $session->error);
+ $session->close;
+ exit $ERRORS{"UNKNOWN"};
+}
+my @tindex = undef;
+my @oids = undef;
+my @descr = undef;
+my (@oid_perf,@oid_perf_outoct,@oid_perf_inoct,@oid_perf_inerr,@oid_perf_outerr,@oid_perf_indisc,@oid_perf_outdisc)=
+ (undef,undef,undef,undef,undef,undef,undef);
+my @oid_speed=undef;
+my @oid_speed_high=undef;
+my $num_int = 0;
+
+# Change to 64 bit counters if option is set :
+if (defined($o_highperf)) {
+ $out_octet_table=$out_octet_table_64;
+ $in_octet_table=$in_octet_table_64;
+}
+
+
+# Select interface by regexp of exact match
+# and put the oid to query in an array
+
+verb("Filter : $o_descr");
+foreach my $key ( keys %$resultat) {
+ verb("OID : $key, Desc : $$resultat{$key}");
+ # test by regexp or exact match
+ my $test = defined($o_noreg)
+ ? $$resultat{$key} eq $o_descr
+ : $$resultat{$key} =~ /$o_descr/;
+ if ($test) {
+ # get the index number of the interface
+ my @oid_list = split (/\./,$key);
+ $tindex[$num_int] = pop (@oid_list);
+ # get the full description
+ $descr[$num_int]=$$resultat{$key};
+ # Get rid of special caracters (specially for Windows)
+ $descr[$num_int] =~ s/[[:cntrl:]]//g;
+ # put the admin or oper oid in an array
+ $oids[$num_int]= defined ($o_admin) ? $admin_table . $tindex[$num_int]
+ : $oper_table . $tindex[$num_int] ;
+ # Put the performance oid
+ if (defined($o_perf) || defined($o_checkperf)) {
+ $oid_perf_inoct[$num_int]= $in_octet_table . $tindex[$num_int];
+ $oid_perf_outoct[$num_int]= $out_octet_table . $tindex[$num_int];
+ $oid_speed[$num_int]=$speed_table . $tindex[$num_int];
+ $oid_speed_high[$num_int]=$speed_table_64 . $tindex[$num_int];
+ if (defined($o_ext_checkperf) || defined($o_perfe)) {
+ $oid_perf_indisc[$num_int]= $in_discard_table . $tindex[$num_int];
+ $oid_perf_outdisc[$num_int]= $out_discard_table . $tindex[$num_int];
+ $oid_perf_inerr[$num_int]= $in_error_table . $tindex[$num_int];
+ $oid_perf_outerr[$num_int]= $out_error_table . $tindex[$num_int];
+ }
+ }
+ verb("Name : $descr[$num_int], Index : $tindex[$num_int]");
+ $num_int++;
+ }
+}
+# No interface found -> error
+if ( $num_int == 0 ) { print "ERROR : Unknown interface $o_descr\n" ; exit $ERRORS{"UNKNOWN"};}
+
+my $result=undef;
+# Add performance oids if requested
+if (defined($o_perf)||defined($o_checkperf)) {
+ @oids=(@oids,@oid_perf_outoct,@oid_perf_inoct,@oid_speed);
+ if (defined($o_highperf)) {
+ @oids=(@oids,@oid_speed_high);
+ }
+ if (defined ($o_ext_checkperf) || defined($o_perfe)) {
+ @oids=(@oids,@oid_perf_inerr,@oid_perf_outerr,@oid_perf_indisc,@oid_perf_outdisc);
+ }
+}
+
+# Get the requested oid values
+$result = $session->get_request(
+ Varbindlist => \@oids
+);
+if (!defined($result)) { printf("ERROR: Status/statistics table : %s.\n", $session->error); $session->close;
+ exit $ERRORS{"UNKNOWN"};
+}
+
+$session->close;
+
+my $num_ok=0;
+my @checkperf_out=undef;
+my @checkperf_out_raw=undef;
+### Bandwidth test variables
+my $temp_file_name;
+my ($return,@file_values)=(undef,undef);
+my $n_rows=0;
+my $n_items_check=(defined($o_ext_checkperf))?7:3;
+my $timenow=time;
+my $trigger=$timenow - ($o_delta - ($o_delta/10));
+my $trigger_low=$timenow - 3*$o_delta;
+my ($old_value,$old_time)=undef;
+my $speed_unit=undef;
+my $speed_real=undef; # speed of interface using either standard or highperf mib.
+
+# define the OK value depending on -i option
+my $ok_val= defined ($o_inverse) ? 2 : 1;
+my $final_status = 0;
+my ($print_out,$perf_out)=(undef,undef);
+
+# make all checks and output for all interfaces
+for (my $i=0;$i < $num_int; $i++) {
+ $print_out.=", " if (defined($print_out));
+ $perf_out .= " " if (defined ($perf_out)) ;
+ my $usable_data=1;
+ # Get the status of the current interface
+ my $int_status= defined ($o_admin) ? $$result{$admin_table . $tindex[$i]}
+ : $$result{ $oper_table . $tindex[$i] };
+
+ # Make the bandwith & error checks if necessary
+ if (defined ($o_checkperf) && $int_status==1) {
+ $temp_file_name=$descr[$i];
+ $temp_file_name =~ s/[ ;\/]/_/g;
+ $temp_file_name = $o_base_dir . $o_host ."." . $temp_file_name;
+ # First, read entire file
+ my @ret_array=read_file($temp_file_name,$n_items_check);
+ $return = shift(@ret_array);
+ $n_rows = shift(@ret_array);
+ if ($n_rows != 0) { @file_values = @ret_array };
+ verb ("File read returns : $return with $n_rows rows");
+ # Get the speed in normal or highperf speed counters
+ if ($$result{$oid_speed[$i]} == 4294967295) { # Too high for this counter (cf IF-MIB)
+ if (! defined($o_highperf) && (defined($o_prct) || defined ($o_perfs) || defined ($o_perfp))) {
+ print "Cannot get interface speed with standard MIB, use highperf mib (-g) : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"}
+ }
+ if (defined ($$result{$oid_speed_high[$i]}) && $$result{$oid_speed_high[$i]} != 0) {
+ $speed_real=$$result{$oid_speed_high[$i]} * 1000000;
+ } else {
+ print "Cannot get interface speed using highperf mib : UNKNOWN\n";
+ exit $ERRORS{"UNKNOWN"}
+ }
+ } else {
+ $speed_real=$$result{$oid_speed[$i]};
+ }
+ verb ("Interface speed : $speed_real");
+ #make the checks if the file is OK
+ if ($return ==0) {
+ my $j=$n_rows-1;
+ @checkperf_out=undef;
+ @checkperf_out_raw=undef;
+ do {
+ if ($file_values[$j][0] < $trigger) {
+ if ($file_values[$j][0] > $trigger_low) {
+ # Define the speed metric ( K | M | G ) (Bits|Bytes) or %
+ my $speed_metric=undef;
+ if (defined($o_prct)) { # in % of speed
+ # Speed is in bits/s, calculated speed is in Bytes/s
+ $speed_metric=$speed_real/800;
+ $speed_unit="%";
+ } else {
+ if (defined($o_kbits)) { # metric in bits
+ if (defined($o_meg)) { # in Mbit/s = 1000000 bit/s
+ $speed_metric=125000; # (1000/8) * 1000
+ $speed_unit="Mbps";
+ } elsif (defined($o_gig)) { # in Gbit/s = 1000000000 bit/s
+ $speed_metric=125000000; # (1000/8) * 1000 * 1000
+ $speed_unit="Gbps";
+ } else { # in Kbits
+ $speed_metric=125; # ( 1000/8 )
+ $speed_unit="Kbps";
+ }
+ } else { # metric in byte
+ if (defined($o_meg)) { # in Mbits
+ $speed_metric=1048576; # 1024^2
+ $speed_unit="MBps";
+ } elsif (defined($o_gig)) { # in Mbits
+ $speed_metric=1073741824; # 1024^3
+ $speed_unit="GBps";
+ } else {
+ $speed_metric=1024; # 1024^3
+ $speed_unit="KBps";
+ }
+ }
+ }
+ # check if the counter is back to 0 after 2^32 / 2^64.
+ # First set the modulus depending on highperf counters or not
+ my $overfl_mod = defined ($o_highperf) ? 18446744073709551616 : 4294967296;
+ # Check counter (s)
+ my $overfl = ($$result{$oid_perf_inoct[$i]} >= $file_values[$j][1] ) ? 0 : $overfl_mod;
+ $checkperf_out_raw[0] = ( ($overfl + $$result{$oid_perf_inoct[$i]} - $file_values[$j][1])/
+ ($timenow - $file_values[$j][0] ));
+ $checkperf_out[0] = $checkperf_out_raw[0] / $speed_metric;
+
+ $overfl = ($$result{$oid_perf_outoct[$i]} >= $file_values[$j][2] ) ? 0 : $overfl_mod;
+ $checkperf_out_raw[1] = ( ($overfl + $$result{$oid_perf_outoct[$i]} - $file_values[$j][2])/
+ ($timenow - $file_values[$j][0] ));
+ $checkperf_out[1] = $checkperf_out_raw[1] / $speed_metric;
+
+ if (defined($o_ext_checkperf)) {
+ $checkperf_out[2] = ( ($$result{$oid_perf_inerr[$i]} - $file_values[$j][3])/
+ ($timenow - $file_values[$j][0] ))*60;
+ $checkperf_out[3] = ( ($$result{$oid_perf_outerr[$i]} - $file_values[$j][4])/
+ ($timenow - $file_values[$j][0] ))*60;
+ $checkperf_out[4] = ( ($$result{$oid_perf_indisc[$i]} - $file_values[$j][5])/
+ ($timenow - $file_values[$j][0] ))*60;
+ $checkperf_out[5] = ( ($$result{$oid_perf_outdisc[$i]} - $file_values[$j][6])/
+ ($timenow - $file_values[$j][0] ))*60;
+ }
+ }
+ }
+ $j--;
+ } while ( ($j>=0) && (!defined($checkperf_out[0])) );
+ }
+ # Put the new values in the array and write the file
+ $file_values[$n_rows][0]=$timenow;
+ $file_values[$n_rows][1]=$$result{$oid_perf_inoct[$i]};
+ $file_values[$n_rows][2]=$$result{$oid_perf_outoct[$i]};
+ if (defined($o_ext_checkperf)) { # Add other values (error & disc)
+ $file_values[$n_rows][3]=$$result{$oid_perf_inerr[$i]};
+ $file_values[$n_rows][4]=$$result{$oid_perf_outerr[$i]};
+ $file_values[$n_rows][5]=$$result{$oid_perf_indisc[$i]};
+ $file_values[$n_rows][6]=$$result{$oid_perf_outdisc[$i]};
+ }
+ $n_rows++;
+ $return=write_file($temp_file_name,$n_rows,$n_items_check,@file_values);
+ verb ("Write file returned : $return");
+ # Print the basic status
+ if (defined ($o_short)) {
+ my $short_desc=undef;
+ if ($o_short < 0) {$short_desc=substr($descr[$i],$o_short);}
+ else {$short_desc=substr($descr[$i],0,$o_short);}
+ $print_out.=sprintf("%s:%s",$short_desc, $status{$int_status} );
+ } else {
+ $print_out.=sprintf("%s:%s",$descr[$i], $status{$int_status} );
+ }
+ if ($return !=0) { # On error writing, return Unknown status
+ $final_status=3;
+ $print_out.= " !!Unable to write file ".$temp_file_name." !! ";
+ }
+ # print the other checks if it was calculated
+ if (defined($checkperf_out[0])) {
+ $print_out.= " (";
+ # check 2 or 6 values depending on ext_check_perf
+ my $num_checkperf=(defined($o_ext_checkperf))?6:2;
+ for (my $l=0;$l < $num_checkperf;$l++) {
+ # Set labels if needed
+ $checkperf_out_desc= (defined($o_label)) ? $countername[$l] : "";
+ verb("Interface $i, check $l : $checkperf_out[$l]");
+ if ($l!=0) {$print_out.="/";}
+ if (($o_crit[$l]!=0) && ($checkperf_out[$l]>$o_crit[$l])) {
+ $final_status=2;
+ $print_out.= sprintf("CRIT %s%.1f",$checkperf_out_desc,$checkperf_out[$l]);
+ } elsif (($o_warn[$l]!=0) && ($checkperf_out[$l]>$o_warn[$l])) {
+ $final_status=($final_status==2)?2:1;
+ $print_out.= sprintf("WARN %s%.1f",$checkperf_out_desc,$checkperf_out[$l]);
+ } else {
+ $print_out.= sprintf("%s%.1f",$checkperf_out_desc,$checkperf_out[$l]);
+ }
+ if ( $l==0 || $l == 1) { $print_out.= $speed_unit; }
+ }
+ $print_out .= ")";
+ } else { # Return unknown when no data
+ $print_out.= " No usable data on file (".$n_rows." rows) ";
+ $final_status=3;$usable_data=0;
+ }
+ } else {
+ if (defined ($o_short)) {
+ my $short_desc=undef;
+ if ($o_short < 0) {$short_desc=substr($descr[$i],$o_short);}
+ else {$short_desc=substr($descr[$i],0,$o_short);}
+ $print_out.=sprintf("%s:%s",$short_desc, $status{$int_status} );
+ } else {
+ $print_out.=sprintf("%s:%s",$descr[$i], $status{$int_status} );
+ }
+ }
+ # Get rid of special caracters for performance in description
+ $descr[$i] =~ s/'\/\(\)/_/g;
+ if (( $int_status == $ok_val)||(defined($o_dormant) && $int_status == 5)) {
+ $num_ok++;
+ }
+ if (( $int_status == 1 ) && defined ($o_perf)) {
+ if (defined ($o_perfp)) { # output in % of speed
+ if ($usable_data==1) {
+ my $warn_factor=1;
+ if (!defined($o_prct)) { # warn&crit in K|M|G B|bps -> put warn_factor to make %
+ $warn_factor = (defined($o_meg)) ? 1000000 : (defined($o_gig)) ? 1000000000 : 1000;
+ if (!defined($o_kbits)) { $warn_factor*=8;}
+ $warn_factor/=$speed_real;
+ $warn_factor*=100; # now turn into displayed % : 0,1 = 10%
+ }
+ $perf_out .= "'" . $descr[$i] ."_in_prct'=";
+ $perf_out .= sprintf("%.0f",$checkperf_out_raw[0] * 800 / $speed_real) ."%;";
+ $perf_out .= ($o_warn[0]!=0) ? sprintf("%.0f",$o_warn[0]*$warn_factor) . ";" : ";";
+ $perf_out .= ($o_crit[0]!=0) ? sprintf("%.0f",$o_crit[0]*$warn_factor) . ";" : ";";
+ $perf_out .= "0;100 ";
+ $perf_out .= "'" . $descr[$i] ."_out_prct'=";
+ $perf_out .= sprintf("%.0f",$checkperf_out_raw[1] * 800 / $speed_real) ."%;";
+ $perf_out .= ($o_warn[1]!=0) ? sprintf("%.0f",$o_warn[1]*$warn_factor) . ";" : ";";
+ $perf_out .= ($o_crit[1]!=0) ? sprintf("%.0f",$o_crit[1]*$warn_factor) . ";" : ";";
+ $perf_out .= "0;100 ";
+ }
+ } elsif (defined ($o_perfr)) { # output in bites or Bytes /s
+ if ($usable_data==1) {
+ if (defined($o_kbits)) { # bps
+ # put warning and critical levels into bps or Bps
+ my $warn_factor;
+ if (defined($o_prct)) { # warn&crit in % -> put warn_factor to 1% of speed in bps
+ $warn_factor=$speed_real/100;
+ } else { # just convert from K|M|G bps
+ $warn_factor = (defined($o_meg)) ? 1000000 : (defined($o_gig)) ? 1000000000 : 1000;
+ }
+ $perf_out .= "'" . $descr[$i] ."_in_bps'=";
+ $perf_out .= sprintf("%.0f",$checkperf_out_raw[0] * 8) .";";
+ $perf_out .= ($o_warn[0]!=0) ? $o_warn[0]*$warn_factor . ";" : ";";
+ $perf_out .= ($o_crit[0]!=0) ? $o_crit[0]*$warn_factor . ";" : ";";
+ $perf_out .= "0;". $speed_real ." ";
+ $perf_out .= "'" . $descr[$i] ."_out_bps'=";
+ $perf_out .= sprintf("%.0f",$checkperf_out_raw[1] * 8) .";";
+ $perf_out .= ($o_warn[1]!=0) ? $o_warn[1]*$warn_factor . ";" : ";";
+ $perf_out .= ($o_crit[1]!=0) ? $o_crit[1]*$warn_factor . ";" : ";";
+ $perf_out .= "0;". $speed_real ." ";
+ } else { # Bps
+ my $warn_factor;
+ if (defined($o_prct)) { # warn&crit in % -> put warn_factor to 1% of speed in Bps
+ $warn_factor=$speed_real/800;
+ } else { # just convert from K|M|G bps
+ $warn_factor = (defined($o_meg)) ? 1048576 : (defined($o_gig)) ? 1073741824 : 1024;
+ }
+ $perf_out .= "'" . $descr[$i] ."_in_Bps'=" . sprintf("%.0f",$checkperf_out_raw[0]) .";";
+ $perf_out .= ($o_warn[0]!=0) ? $o_warn[0]*$warn_factor . ";" : ";";
+ $perf_out .= ($o_crit[0]!=0) ? $o_crit[0]*$warn_factor . ";" : ";";
+ $perf_out .= "0;". $speed_real / 8 ." ";
+ $perf_out .= "'" . $descr[$i] ."_out_Bps'=" . sprintf("%.0f",$checkperf_out_raw[1]) .";" ;
+ $perf_out .= ($o_warn[1]!=0) ? $o_warn[1]*$warn_factor . ";" : ";";
+ $perf_out .= ($o_crit[1]!=0) ? $o_crit[1]*$warn_factor . ";" : ";";
+ $perf_out .= "0;". $speed_real / 8 ." ";
+ }
+ }
+ } else { # output in octet counter
+ $perf_out .= "'" . $descr[$i] ."_in_octet'=". $$result{$oid_perf_inoct[$i]} ."c ";
+ $perf_out .= "'" . $descr[$i] ."_out_octet'=". $$result{$oid_perf_outoct[$i]} ."c ";
+ }
+ if (defined ($o_perfe)) {
+ $perf_out .= "'" . $descr[$i] ."_in_error'=". $$result{$oid_perf_inerr[$i]} ."c ";
+ $perf_out .= "'" . $descr[$i] ."_in_discard'=". $$result{$oid_perf_indisc[$i]} ."c ";
+ $perf_out .= "'" . $descr[$i] ."_out_error'=". $$result{$oid_perf_outerr[$i]} ."c ";
+ $perf_out .= "'" . $descr[$i] ."_out_discard'=". $$result{$oid_perf_outdisc[$i]} ."c ";
+ }
+ if (defined ($o_perfs)) {
+ $perf_out .= "'" . $descr[$i] ."_speed_bps'=".$speed_real;
+ }
+ }
+}
+
+# Only a few ms left...
+alarm(0);
+
+# Check if all interface are OK
+if ($num_ok == $num_int) {
+ if ($final_status==0) {
+ print $print_out,":", $num_ok, " UP: OK";
+ if (defined ($o_perf)) { print " | ",$perf_out; }
+ print "\n";
+ exit $ERRORS{"OK"};
+ } elsif ($final_status==1) {
+ print $print_out,":(", $num_ok, " UP): WARNING";
+ if (defined ($o_perf)) { print " | ",$perf_out; }
+ print "\n";
+ exit $ERRORS{"WARNING"};
+ } elsif ($final_status==2) {
+ print $print_out,":(", $num_ok, " UP): CRITICAL";
+ if (defined ($o_perf)) { print " | ",$perf_out; }
+ print "\n";
+ exit $ERRORS{"CRITICAL"};
+ } else {
+ print $print_out,":(", $num_ok, " UP): UNKNOWN";
+ if (defined ($perf_out)) { print " | ",$perf_out; }
+ print "\n";
+ exit $ERRORS{"UNKNOWN"};
+ }
+}
+
+# else print the not OK interface number and exit (return is always critical if at least one int is down).
+
+print $print_out,": ", $num_int-$num_ok, " int NOK : CRITICAL";
+if (defined ($perf_out)) { print " | ",$perf_out; }
+print "\n";
+exit $ERRORS{"CRITICAL"};
diff --git a/sensu/files/sensu.conf b/sensu/files/sensu.conf
index d9ce274..6a1bfe1 100644
--- a/sensu/files/sensu.conf
+++ b/sensu/files/sensu.conf
@@ -22,4 +22,16 @@
interval: 60
occurrences: 1
subscribers:
- - local-sensu-dashboard
\ No newline at end of file
+ - local-sensu-dashboard
+{%- if client.get('plugin', {}).network_monitoring is defined %}
+{%- for device_name, device in client.network_device.iteritems() %}
+{%- for interface_name, interface in device.interface.iteritems() %}
+remote_{{ device_name }}_{{ interface_name }}_interface_up:
+ command: "/etc/sensu/plugins/check_snmp_int.pl -H {{ device.management.address }} -C test -n ^{{ interface_name }}$"
+ interval: 60
+ occurrences: 1
+ subscribers:
+ - remote-network
+{%- endfor %}
+{%- endfor %}
+{%- endif %}