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 %}