Error Found in script check_disk_smb

niji.ogunbameru niji.ogunbameru at phgroup.com
Mon Jun 18 10:59:56 CEST 2012


Dear Nagios_users

The following error have been generated when using the the script 
check_disk_smb as follows

zenosssrv:/usr/local/zenoss/common/libexec # 
/usr/local/zenoss/common/libexec/check_disk_smb -H 
<ServerName>.<DomainName>.com -s fscs

ERROR::
Can't exec "//<ServerName>.<DomainName>.com/fscs": No such file or 
directory at /usr/local/zenoss/common/libexec/check_disk_smb line 166.

Use of uninitialized value $res in split at 
/usr/local/zenoss/common/libexec/check_disk_smb line 172.

Use of uninitialized value $_ in pattern match (m//) at 
/usr/local/zenoss/common/libexec/check_disk_smb line 180.
Result from smbclient not suitable


As the error has stated and on checking the script, line 166 contained 
the following

    $res = qx/$smbclient \/\/$host\/$share -U $user%$pass 
$smbclientoptions -c ls/;

but scroll down to line 61 since I was tring to find out where 
$smbclient was defined, $smbclient was defined on line 61 and line 61 
contained the following

  my $smbclient= "$utils::PATH_TO_SMBCLIENT " ;

But strangely line 61 also contained a variable $utils

$utils is not defined anywhere and I believed that because $utils is not 
defined, in effects causes $smbclient not to exist.
so in line 166 the only command that seems to be ran is


\/\/$host\/$share -U $user%$pass $smbclientoptions -c ls/;

hence forced the OS to return the error specified

*Why is $utils not defined and is there any fix for this issue. *

IS there any manual for this script?

OS in use::
SuSe Enterprise ver 11
Application:: Zenoss application



I have limited knowledge in perl, please kindly make the solution as 
clear as possible

Many thanks in anticipation.


Kind Regards
-Niji






-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.monitoring-lists.org/archive/users/attachments/20120618/89d440d3/attachment.html>
-------------- next part --------------
#! /usr/bin/perl -w
#
#
# check_disk.pl <host> <share> <user> <pass> [warn] [critical] [port]
#
# Nagios host script to get the disk usage from a SMB share
#
# Changes and Modifications
# =========================
# 7-Aug-1999 - Michael Anthon
#  Created from check_disk.pl script provided with netsaint_statd (basically
#  cause I was too lazy (or is that smart?) to write it from scratch)
# 8-Aug-1999 - Michael Anthon
#  Modified [warn] and [critical] parameters to accept format of nnn[M|G] to
#  allow setting of limits in MBytes or GBytes.  Percentage settings for large
#  drives is a pain in the butt
# 2-May-2002 - SGhosh fix for embedded perl
#
# $Id: check_disk_smb.pl 1247 2005-10-13 10:14:33Z seanius $
#

require 5.004;
use POSIX;
use strict;
use Getopt::Long;
use vars qw($opt_P $opt_V $opt_h $opt_H $opt_s $opt_W $opt_u $opt_p $opt_w $opt_c $verbose);
use vars qw($PROGNAME);
use lib "/usr/local/zenoss/common/libexec"  ;
use utils qw($TIMEOUT %ERRORS &print_revision &support &usage);

sub print_help ();
sub print_usage ();

$PROGNAME = "check_disk_smb";

$ENV{'PATH'}='';
$ENV{'BASH_ENV'}=''; 
$ENV{'ENV'}='';

Getopt::Long::Configure('bundling');
GetOptions
	("v"   => \$verbose, "verbose"    => \$verbose,
	 "P=s" => \$opt_P, "port=s"     => \$opt_P,
	 "V"   => \$opt_V, "version"    => \$opt_V,
	 "h"   => \$opt_h, "help"       => \$opt_h,
	 "w=s" => \$opt_w, "warning=s"  => \$opt_w,
	 "c=s" => \$opt_c, "critical=s" => \$opt_c,
	 "p=s" => \$opt_p, "password=s" => \$opt_p,
	 "u=s" => \$opt_u, "username=s" => \$opt_u,
	 "s=s" => \$opt_s, "share=s"    => \$opt_s,
	 "W=s" => \$opt_W, "workgroup=s" => \$opt_W,
	 "H=s" => \$opt_H, "hostname=s" => \$opt_H);

if ($opt_V) {
	print_revision($PROGNAME,'$Revision: 1247 $'); #'
	exit $ERRORS{'OK'};
}

if ($opt_h) {print_help(); exit $ERRORS{'OK'};}

my $smbclient= "$utils::PATH_TO_SMBCLIENT " ;
my $smbclientoptions= $opt_P ? "-p $opt_P " : "";


# Options checking

($opt_H) || ($opt_H = shift) || usage("Host name not specified\n");
my $host = $1 if ($opt_H =~ /^([-_.A-Za-z0-9]+\$?)$/);
($host) || usage("Invalid host: $opt_H\n");

($opt_s) || ($opt_s = shift) || usage("Share volume not specified\n");
my $share = $1 if ($opt_s =~ /^([-_.A-Za-z0-9]+\$?)$/);
($share) || usage("Invalid share: $opt_s\n");

($opt_u) || ($opt_u = shift) || ($opt_u = "guest");
my $user = $1 if ($opt_u =~ /^([-_.A-Za-z0-9\\]+)$/);
($user) || usage("Invalid user: $opt_u\n");

($opt_p) || ($opt_p = shift) || ($opt_p = "");
my $pass = $1 if ($opt_p =~ /(.*)/);

($opt_w) || ($opt_w = shift) || ($opt_w = 85);
my $warn = $1 if ($opt_w =~ /^([0-9]{1,2}\%?|100\%?|[0-9]+[kMG])$/);
($warn) || usage("Invalid warning threshold: $opt_w\n");

($opt_c) || ($opt_c = shift) || ($opt_c = 95);
my $crit = $1 if ($opt_c =~ /^([0-9]{1,2}\%?|100\%?|[0-9]+[kMG])$/);
($crit) || usage("Invalid critical threshold: $opt_c\n");

# split the type from the unit value
#Check $warn and $crit for type (%/M/G) and set up for tests
#P = Percent, K = KBytes
my $warn_type;
my $crit_type;

if ($opt_w =~ /^([0-9]+)\%?$/) {
	$warn = "$1";
	$warn_type = "P";
} elsif ($opt_w =~ /^([0-9]+)k$/) {
	$warn_type = "K";
	$warn = $1;
} elsif ($opt_w =~ /^([0-9]+)M$/) {
	$warn_type = "K";
	$warn = $1 * 1024;
} elsif ($opt_w =~ /^([0-9]+)G$/) {
	$warn_type = "K";
	$warn = $1 * 1048576;
}
if ($opt_c =~ /^([0-9]+)\%?$/) {
	$crit = "$1";
	$crit_type = "P";
} elsif ($opt_c =~ /^([0-9]+)k$/) {
	$crit_type = "K";
	$crit = $1;
} elsif ($opt_c =~ /^([0-9]+)M$/) {
	$crit_type = "K";
	$crit = $1 * 1024;
} elsif ($opt_c =~ /^([0-9]+)G$/) {
	$crit_type = "K";
	$crit = $1 * 1048576;
}

# check if both warning and critical are percentage or size
unless( ( $warn_type eq "P" && $crit_type eq "P" ) || ( $warn_type ne "P" && $crit_type ne "P" ) ){
	$opt_w =~ s/\%/\%\%/g;
	$opt_c =~ s/\%/\%\%/g;
	usage("Both warning and critical should be same type- warning: $opt_w critical: $opt_c \n");
}

# verify warning is less than critical
if ( $warn_type eq "K") {
	unless ( $warn > $crit) {
		usage("Disk size: warning ($opt_w) should be greater than critical ($opt_c) \n");
	}
}else{
	unless ( $warn < $crit) {
		$opt_w =~ s/\%/\%\%/g;
		$opt_c =~ s/\%/\%\%/g;
		usage("Percentage: warning ($opt_w) should be less than critical ($opt_c) \n");
	}
}

my $workgroup = $1 if (defined($opt_W) && $opt_W =~ /(.*)/);

# end of options checking


my $state = "OK";
my $answer = undef;
my $res = undef;
my @lines = undef;

# Just in case of problems, let's not hang Nagios
$SIG{'ALRM'} = sub { 
	print "No Answer from Client\n";
	exit $ERRORS{"UNKNOWN"};
};
alarm($TIMEOUT);

# Execute an "ls" on the share using smbclient program
# get the results into $res
if (defined($workgroup)) {
	$res = qx/$smbclient \/\/$host\/$share -W $workgroup -U $user%$pass $smbclientoptions -c ls/;
} else {
	print "$smbclient " . "\/\/$host\/$share" ." $pass -U $user $smbclientoptions -c ls\n" if ($verbose);
	$res = qx/$smbclient \/\/$host\/$share -U $user%$pass $smbclientoptions -c ls/;
}
#Turn off alarm
alarm(0);

#Split $res into an array of lines
@lines = split /\n/, $res;

#Get the last line into $_
$_ = $lines[$#lines];
#print "$_\n";

#Process the last line to get free space.  
#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 ($capper) = int(($3/$1)*100);
	my ($mountpt) = "\\\\$host\\$share";


	if (int($avail / 1024) > 0) {
		$avail = int($avail / 1024);
		if (int($avail /1024) > 0) {
			$avail = (int(($avail / 1024)*100))/100;
			$avail = $avail ."G";
		} else {
			$avail = $avail ."M";
		}
	} else {
		$avail = $avail ."K";
	}

#print ":$warn:$warn_type:\n";
#print ":$crit:$crit_type:\n";
#print ":$avail:$avail_bytes:$capper:$mountpt:\n";

	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))) {
		$state = "WARNING";
		$answer = "WARNING: Only $avail ($capper%) free on $mountpt\n";
	} else {
		$state = "CRITICAL";
		$answer = "CRITICAL: Only $avail ($capper%) free on $mountpt\n";
	}
} else {
	$answer = "Result from smbclient not suitable\n";
	$state = "UNKNOWN";
	foreach (@lines) {
		if (/(Access denied|NT_STATUS_LOGON_FAILURE)/) {
			$answer = "Access Denied\n";
			$state = "CRITICAL";
			last;
		}
		if (/(Unknown host \w*|Connection.*failed)/) {
			$answer = "$1\n";
			$state = "CRITICAL";
			last;
		}
		if (/(You specified an invalid share name|NT_STATUS_BAD_NETWORK_NAME)/) {
			$answer = "Invalid share name \\\\$host\\$share\n";
			$state = "CRITICAL";
			last;
		}
	}
}


print $answer;
print "$state\n" if ($verbose);
exit $ERRORS{$state};

sub print_usage () {
	print "Usage: $PROGNAME -H <host> -s <share> -u <user> -p <password> 
      -w <warn> -c <crit> [-W <workgroup>] [-P <port>]\n";
}

sub print_help () {
	print_revision($PROGNAME,'$Revision: 1247 $');
	print "Copyright (c) 2000 Michael Anthon/Karl DeBisschop

Perl Check SMB Disk plugin for Nagios

";
	print_usage();
	print "
-H, --hostname=HOST
   NetBIOS name of the server
-s, --share=STRING
   Share name to be tested
-W, --workgroup=STRING
   Workgroup or Domain used (Defaults to \"WORKGROUP\")
-u, --user=STRING
   Username to log in to server. (Defaults to \"guest\")
-p, --password=STRING
   Password to log in to server. (Defaults to an empty password)
-w, --warning=INTEGER or INTEGER[kMG]
   Percent of used space at which a warning will be generated (Default: 85%)
      
-c, --critical=INTEGER or INTEGER[kMG]
   Percent of used space at which a critical will be generated (Defaults: 95%)
-P, --port=INTEGER
   Port to be used to connect to. Some Windows boxes use 139, others 445 (Defaults to smbclient default)
   
   If thresholds are followed by either a k, M, or G then check to see if that
   much disk space is available (kilobytes, Megabytes, Gigabytes)

   Warning percentage should be less than critical
   Warning (remaining) disk space should be greater than critical.

";
	support();
}
-------------- next part --------------
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
-------------- next part --------------
_______________________________________________
Nagios-users mailing list
Nagios-users at lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nagios-users
::: Please include Nagios version, plugin version (-v) and OS when reporting any issue. 
::: Messages without supporting info will risk being sent to /dev/null


More information about the Users mailing list