From d61a3056c598bf030e699a094671727f841eca8c Mon Sep 17 00:00:00 2001
From: Holger Weiss <holger@zedat.fu-berlin.de>
Date: Sat, 23 Jun 2012 10:22:08 +0200
Subject: check_disk_smb: Add performance data

(Debian #654259 - Charles-Henri Larose)

diff --git a/NEWS b/NEWS
index b138084..29ca455 100644
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,7 @@ This file documents the major additions and syntax changes between releases.
 	check_sensors now detects faulty sensors unless --ignore-fault is specified (Jan Wagner)
 	utils.sh now provides a check_range function (Alex Griffin)
 	Improved the performance of check_users (Marc Remy)
+	Add perfdata to check_disk_smb (Debian #654259 - Charles-Henri Larose)
 	Updated Nagios::Plugin perl module
 
 	FIXES
diff --git a/THANKS.in b/THANKS.in
index 943acdb..b9368a4 100644
--- a/THANKS.in
+++ b/THANKS.in
@@ -274,3 +274,4 @@ Alex Griffin
 Marc Remy
 Matej Vela
 Jason Ellison
+Charles-Henri Larose
diff --git a/plugins-scripts/check_disk_smb.pl b/plugins-scripts/check_disk_smb.pl
index 6783543..43841c3 100755
--- a/plugins-scripts/check_disk_smb.pl
+++ b/plugins-scripts/check_disk_smb.pl
@@ -166,6 +166,7 @@ my $address = $1 if (defined($opt_a) && $opt_a =~ /(.*)/);
 my $state = "OK";
 my $answer = undef;
 my $res = undef;
+my $perfdata = "";
 my @lines = undef;
 
 # Just in case of problems, let's not hang Nagios
@@ -204,11 +205,23 @@ $_ = $lines[$#lines];
 #If line does not match required regexp, return an UNKNOWN error
 if (/\s*(\d*) blocks of size (\d*)\. (\d*) blocks available/) {
 
-	my ($avail) = ($3*$2)/1024;
-	my ($avail_bytes) = $avail;
+	my ($avail_bytes) = $3 * $2;
+	my ($total_bytes) = $1 * $2;
+	my ($occupied_bytes) = $1 * $2 - $avail_bytes;
+	my ($avail) = $avail_bytes/1024;
 	my ($capper) = int(($3/$1)*100);
 	my ($mountpt) = "\\\\$host\\$share";
 
+	# TODO : why is the kB the standard unit for args ?
+	my ($warn_bytes) = $total_bytes - $warn * 1024;
+	if ($warn_type eq "P") {
+		$warn_bytes = $warn * $1 * $2 / 100;
+	}
+	my ($crit_bytes) = $total_bytes - $crit * 1024;
+	if ($crit_type eq "P") {
+		$crit_bytes = $crit * $1 * $2 / 100;
+	}
+
 
 	if (int($avail / 1024) > 0) {
 		$avail = int($avail / 1024);
@@ -225,32 +238,37 @@ if (/\s*(\d*) blocks of size (\d*)\. (\d*) blocks available/) {
 #print ":$warn:$warn_type:\n";
 #print ":$crit:$crit_type:\n";
 #print ":$avail:$avail_bytes:$capper:$mountpt:\n";
+	$perfdata = "'" . $share . "'=" . $occupied_bytes . 'B;'
+		. $warn_bytes . ';'
+		. $crit_bytes . ';'
+		. '0;'
+		. $total_bytes;
 
-	if ((($warn_type eq "P") && (100 - $capper) < $warn) || (($warn_type eq "K") && ($avail_bytes > $warn))) { 
-		$answer = "Disk ok - $avail ($capper%) free on $mountpt\n";
-	} elsif ((($crit_type eq "P") && (100 - $capper) < $crit) || (($crit_type eq "K") && ($avail_bytes > $crit))) {
+	if ($occupied_bytes > $crit_bytes) {
+		$state = "CRITICAL";
+		$answer = "CRITICAL: Only $avail ($capper%) free on $mountpt";
+	} elsif ( $occupied_bytes > $warn_bytes ) {
 		$state = "WARNING";
-		$answer = "WARNING: Only $avail ($capper%) free on $mountpt\n";
+		$answer = "WARNING: Only $avail ($capper%) free on $mountpt";
 	} else {
-		$state = "CRITICAL";
-		$answer = "CRITICAL: Only $avail ($capper%) free on $mountpt\n";
+		$answer = "Disk ok - $avail ($capper%) free on $mountpt";
 	}
 } else {
-	$answer = "Result from smbclient not suitable\n";
+	$answer = "Result from smbclient not suitable";
 	$state = "UNKNOWN";
 	foreach (@lines) {
 		if (/(Access denied|NT_STATUS_LOGON_FAILURE|NT_STATUS_ACCESS_DENIED)/) {
-			$answer = "Access Denied\n";
+			$answer = "Access Denied";
 			$state = "CRITICAL";
 			last;
 		}
 		if (/(Unknown host \w*|Connection.*failed)/) {
-			$answer = "$1\n";
+			$answer = "$1";
 			$state = "CRITICAL";
 			last;
 		}
 		if (/(You specified an invalid share name|NT_STATUS_BAD_NETWORK_NAME)/) {
-			$answer = "Invalid share name \\\\$host\\$share\n";
+			$answer = "Invalid share name \\\\$host\\$share";
 			$state = "CRITICAL";
 			last;
 		}
@@ -259,6 +277,8 @@ if (/\s*(\d*) blocks of size (\d*)\. (\d*) blocks available/) {
 
 
 print $answer;
+print " | " . $perfdata if ($perfdata);
+print "\n";
 print "$state\n" if ($verbose);
 exit $ERRORS{$state};
 
-- 
cgit v0.10-9-g596f

