[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 #! /usr/bin/perl -w 2 # 3 # 4 # check_disk.pl <host> <share> <user> <pass> [warn] [critical] [port] 5 # 6 # Nagios host script to get the disk usage from a SMB share 7 # 8 # Changes and Modifications 9 # ========================= 10 # 7-Aug-1999 - Michael Anthon 11 # Created from check_disk.pl script provided with netsaint_statd (basically 12 # cause I was too lazy (or is that smart?) to write it from scratch) 13 # 8-Aug-1999 - Michael Anthon 14 # Modified [warn] and [critical] parameters to accept format of nnn[M|G] to 15 # allow setting of limits in MBytes or GBytes. Percentage settings for large 16 # drives is a pain in the butt 17 # 2-May-2002 - SGhosh fix for embedded perl 18 # 19 # $Id: check_disk_smb.pl,v 1.10 2003/09/15 14:26:54 tonvoon Exp $ 20 # 21 22 require 5.004; 23 use POSIX; 24 use strict; 25 use Getopt::Long; 26 use vars qw($opt_P $opt_V $opt_h $opt_H $opt_s $opt_W $opt_u $opt_p $opt_w $opt_c $verbose); 27 use vars qw($PROGNAME); 28 use lib "/usr/lib/nagios/plugins" ; 29 use utils qw($TIMEOUT %ERRORS &print_revision &support &usage); 30 31 sub print_help (); 32 sub print_usage (); 33 34 $PROGNAME = "check_disk_smb"; 35 36 $ENV{'PATH'}=''; 37 $ENV{'BASH_ENV'}=''; 38 $ENV{'ENV'}=''; 39 40 Getopt::Long::Configure('bundling'); 41 GetOptions 42 ("v" => \$verbose, "verbose" => \$verbose, 43 "P=s" => \$opt_P, "port=s" => \$opt_P, 44 "V" => \$opt_V, "version" => \$opt_V, 45 "h" => \$opt_h, "help" => \$opt_h, 46 "w=s" => \$opt_w, "warning=s" => \$opt_w, 47 "c=s" => \$opt_c, "critical=s" => \$opt_c, 48 "p=s" => \$opt_p, "password=s" => \$opt_p, 49 "u=s" => \$opt_u, "username=s" => \$opt_u, 50 "s=s" => \$opt_s, "share=s" => \$opt_s, 51 "W=s" => \$opt_W, "workgroup=s" => \$opt_W, 52 "H=s" => \$opt_H, "hostname=s" => \$opt_H); 53 54 if ($opt_V) { 55 print_revision($PROGNAME,'$Revision: 1.10 $'); #' 56 exit $ERRORS{'OK'}; 57 } 58 59 if ($opt_h) {print_help(); exit $ERRORS{'OK'};} 60 61 my $smbclient= "$utils::PATH_TO_SMBCLIENT " ; 62 my $smbclientoptions= $opt_P ? "-p $opt_P " : ""; 63 64 65 # Options checking 66 67 ($opt_H) || ($opt_H = shift) || usage("Host name not specified\n"); 68 my $host = $1 if ($opt_H =~ /^([-_.A-Za-z0-9]+\$?)$/); 69 ($host) || usage("Invalid host: $opt_H\n"); 70 71 ($opt_s) || ($opt_s = shift) || usage("Share volume not specified\n"); 72 my $share = $1 if ($opt_s =~ /^([-_.A-Za-z0-9]+\$?)$/); 73 ($share) || usage("Invalid share: $opt_s\n"); 74 75 ($opt_u) || ($opt_u = shift) || ($opt_u = "guest"); 76 my $user = $1 if ($opt_u =~ /^([-_.A-Za-z0-9\\]+)$/); 77 ($user) || usage("Invalid user: $opt_u\n"); 78 79 ($opt_p) || ($opt_p = shift) || ($opt_p = "guest"); 80 my $pass = $1 if ($opt_p =~ /(.*)/); 81 82 ($opt_w) || ($opt_w = shift) || ($opt_w = 85); 83 my $warn = $1 if ($opt_w =~ /^([0-9]{1,2}\%?|100\%?|[0-9]+[kMG])$/); 84 ($warn) || usage("Invalid warning threshold: $opt_w\n"); 85 86 ($opt_c) || ($opt_c = shift) || ($opt_c = 95); 87 my $crit = $1 if ($opt_c =~ /^([0-9]{1,2}\%?|100\%?|[0-9]+[kMG])$/); 88 ($crit) || usage("Invalid critical threshold: $opt_c\n"); 89 90 # check if both warning and critical are percentage or size 91 unless( ( ($opt_w =~ /([0-9]){1,2}$/ ) && ($opt_c =~ /([0-9]){1,2}$/ ) )|| (( $opt_w =~ /[kMG]/ ) && ($opt_c =~ /[kMG]/) ) ){ 92 usage("Both warning and critical should be same type- warning: $opt_w critical: $opt_c \n"); 93 } 94 95 # verify warning is less than critical 96 if ( $opt_w =~ /[kMG]/) { 97 unless ( $warn > $crit) { 98 usage("Disk size: warning ($opt_w) should be greater than critical ($opt_c) \n"); 99 } 100 }else{ 101 unless ( $warn < $crit) { 102 usage("Percentage: warning ($opt_w) should be less than critical ($opt_c) \n"); 103 } 104 } 105 106 my $workgroup = $1 if (defined($opt_W) && $opt_W =~ /(.*)/); 107 108 # end of options checking 109 110 111 my $state = "OK"; 112 my $answer = undef; 113 my $res = undef; 114 my @lines = undef; 115 116 # Just in case of problems, let's not hang Nagios 117 $SIG{'ALRM'} = sub { 118 print "No Answer from Client\n"; 119 exit $ERRORS{"UNKNOWN"}; 120 }; 121 alarm($TIMEOUT); 122 123 # Execute an "ls" on the share using smbclient program 124 # get the results into $res 125 if (defined($workgroup)) { 126 $res = qx/$smbclient \/\/$host\/$share $pass -W $workgroup -U $user $smbclientoptions -c ls/; 127 } else { 128 print "$smbclient " . "\/\/$host\/$share" ." $pass -U $user $smbclientoptions -c ls\n" if ($verbose); 129 $res = qx/$smbclient \/\/$host\/$share $pass -U $user $smbclientoptions -c ls/; 130 } 131 #Turn off alarm 132 alarm(0); 133 134 #Split $res into an array of lines 135 @lines = split /\n/, $res; 136 137 #Get the last line into $_ 138 $_ = $lines[$#lines]; 139 #print "$_\n"; 140 141 #Process the last line to get free space. 142 #If line does not match required regexp, return an UNKNOWN error 143 if (/\s*(\d*) blocks of size (\d*)\. (\d*) blocks available/) { 144 145 my ($avail) = ($3*$2)/1024; 146 my ($avail_bytes) = $avail; 147 my ($capper) = int(($3/$1)*100); 148 my ($mountpt) = "\\\\$host\\$share"; 149 150 #Check $warn and $crit for type (%/M/G) and set up for tests 151 #P = Percent, K = KBytes 152 my $warn_type; 153 my $crit_type; 154 155 if ($opt_w =~ /^([0-9]+$)/) { 156 $warn_type = "P"; 157 } elsif ($opt_w =~ /^([0-9]+)k$/) { 158 $warn_type = "K"; 159 $warn = $1; 160 } elsif ($opt_w =~ /^([0-9]+)M$/) { 161 $warn_type = "K"; 162 $warn = $1 * 1024; 163 } elsif ($opt_w =~ /^([0-9]+)G$/) { 164 $warn_type = "K"; 165 $warn = $1 * 1048576; 166 } 167 if ($opt_c =~ /^([0-9]+$)/) { 168 $crit_type = "P"; 169 } elsif ($opt_c =~ /^([0-9]+)k$/) { 170 $crit_type = "K"; 171 $crit = $1; 172 } elsif ($opt_c =~ /^([0-9]+)M$/) { 173 $crit_type = "K"; 174 $crit = $1 * 1024; 175 } elsif ($opt_c =~ /^([0-9]+)G$/) { 176 $crit_type = "K"; 177 $crit = $1 * 1048576; 178 } 179 180 if (int($avail / 1024) > 0) { 181 $avail = int($avail / 1024); 182 if (int($avail /1024) > 0) { 183 $avail = (int(($avail / 1024)*100))/100; 184 $avail = $avail ."G"; 185 } else { 186 $avail = $avail ."M"; 187 } 188 } else { 189 $avail = $avail ."K"; 190 } 191 192 #print ":$warn:$warn_type:\n"; 193 #print ":$crit:$crit_type:\n"; 194 #print ":$avail:$avail_bytes:$capper:$mountpt:\n"; 195 196 if ((($warn_type eq "P") && (100 - $capper) < $warn) || (($warn_type eq "K") && ($avail_bytes > $warn))) { 197 $answer = "Disk ok - $avail ($capper%) free on $mountpt\n"; 198 } elsif ((($crit_type eq "P") && (100 - $capper) < $crit) || (($crit_type eq "K") && ($avail_bytes > $crit))) { 199 $state = "WARNING"; 200 $answer = "WARNING: Only $avail ($capper%) free on $mountpt\n"; 201 } else { 202 $state = "CRITICAL"; 203 $answer = "CRITICAL: Only $avail ($capper%) free on $mountpt\n"; 204 } 205 } else { 206 $answer = "Result from smbclient not suitable\n"; 207 $state = "UNKNOWN"; 208 foreach (@lines) { 209 if (/(Access denied|NT_STATUS_LOGON_FAILURE)/) { 210 $answer = "Access Denied\n"; 211 $state = "CRITICAL"; 212 last; 213 } 214 if (/(Unknown host \w*|Connection.*failed)/) { 215 $answer = "$1\n"; 216 $state = "CRITICAL"; 217 last; 218 } 219 if (/(You specified an invalid share name|NT_STATUS_BAD_NETWORK_NAME)/) { 220 $answer = "Invalid share name \\\\$host\\$share\n"; 221 $state = "CRITICAL"; 222 last; 223 } 224 } 225 } 226 227 228 print $answer; 229 print "$state\n" if ($verbose); 230 exit $ERRORS{$state}; 231 232 sub print_usage () { 233 print "Usage: $PROGNAME -H <host> -s <share> -u <user> -p <password> 234 -w <warn> -c <crit> [-W <workgroup>] [-P <port>]\n"; 235 } 236 237 sub print_help () { 238 print_revision($PROGNAME,'$Revision: 1.10 $'); 239 print "Copyright (c) 2000 Michael Anthon/Karl DeBisschop 240 241 Perl Check SMB Disk plugin for Nagios 242 243 "; 244 print_usage(); 245 print " 246 -H, --hostname=HOST 247 NetBIOS name of the server 248 -s, --share=STRING 249 Share name to be tested 250 -W, --workgroup=STRING 251 Workgroup or Domain used (Defaults to \"WORKGROUP\") 252 -u, --user=STRING 253 Username to log in to server. (Defaults to \"guest\") 254 -p, --password=STRING 255 Password to log in to server. (Defaults to \"guest\") 256 -w, --warning=INTEGER or INTEGER[kMG] 257 Percent of used space at which a warning will be generated (Default: 85%) 258 259 -c, --critical=INTEGER or INTEGER[kMG] 260 Percent of used space at which a critical will be generated (Defaults: 95%) 261 -P, --port=INTEGER 262 Port to be used to connect to. Some Windows boxes use 139, others 445 (Defaults to smbclient default) 263 264 If thresholds are followed by either a k, M, or G then check to see if that 265 much disk space is available (kilobytes, Megabytes, Gigabytes) 266 267 Warning percentage should be less than critical 268 Warning (remaining) disk space should be greater than critical. 269 270 "; 271 support(); 272 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Tue Mar 17 22:47:18 2015 | Cross-referenced by PHPXref 0.7.1 |