File: check_disk.pl

package info (click to toggle)
netsaint-statd 2.15-9
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 156 kB
  • ctags: 29
  • sloc: perl: 1,040; sh: 53; makefile: 42
file content (131 lines) | stat: -rwxr-xr-x 2,950 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/perl
#
# See LICENSE for copyright information
#
# check_disk.pl <host> <disk> [warn] [critical] [port]
#
# NetSaint host script to get the disk usage from a client that is running
# netsaint_statd.
#

require 5.003;
BEGIN { $ENV{PATH} = '/bin' }
use Socket;
use POSIX;
use strict;

sub usage;

my $TIMEOUT = 15;

my %ERRORS = ('UNKNOWN', '-1',
		'OK', '0',
		'WARNING', '1',
		'CRITICAL', '2');

my $remote = shift || &usage(%ERRORS);
my $disk = shift || &usage(%ERRORS);
my $warn = shift || 85;
my $crit = shift || 95;
my $port = shift || 1040;

my $remoteaddr = inet_aton("$remote");
my $paddr = sockaddr_in($port, $remoteaddr) || die "Can't create info for connection: #!\n";;
my $proto = getprotobyname('tcp');
socket(Server, PF_INET, SOCK_STREAM, $proto) || die "Can't create socket: $!";
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, 1);

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

# send ourselves a SIGALRM if we cannot connect to the client
unless (connect(Server, $paddr)) {
     kill 'ALRM', $$;
}

my $state = "OK";
my $answer = undef;


select(Server);
$| = 1;

print Server "disk $disk\n";
my ($servanswer) = <Server>;
alarm(0);
close(Server);

select(STDOUT);

# 20030202/tm	added '#' to support OSF1/Tru64 "domain" devices
if ($servanswer =~ /^[\w\/\d:_\.\-\=\#]* (\d*) (\d*) ([\w\/\-]*)/)
	{
	my ($avail) = $1;
	my ($capper) = $2;
	my ($mountpt) = $3;
	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";
		}
	if ((100 - $capper) < $warn)
		{ 
		$answer = "Disk ok - $avail ($capper%) free on $mountpt\n";
		}
	elsif ((100 - $capper) < $crit)
		{
		$state = "WARNING";
		$answer = "Only $avail ($capper%) free on $mountpt\n";
		}
	else
		{
		$state = "CRITICAL";
		$answer = "Only $avail ($capper%) free on $mountpt\n";
		}
	}
# If the disk is missing:
elsif ($servanswer eq "not found")
	{
	$state = "CRITICAL";
	$answer = "Disk $disk not mounted or nonexistant\n";
	}
else
	{
	$state = "UNKNOWN";
	$answer = "Unknown status on disk $disk\n";
	}

print $answer;
exit $ERRORS{$state};

sub usage {
	print "Minimum arguments not supplied!\n";
	print "\n";
	print "Perl Check Disk plugin for NetSaint\n";
	print "Copyright (c) 1999 Charlie Cook\n";
	print "\n";
	print "Usage: $0 <host> <disk> [<warn> [<crit> [<port>]]]\n";
	print "\n";
	print "<warn> = Percent of used space at which a warning message will be generated.\n	Defaults to 85.\n";
	print "<crit> = Percent of used space at which a critical message will be generated.\n	Defaults to 95.\n";
	print "<port> = Port that the status daemon is running on <host>.\n	Defaults to 1040.\n";
	exit $ERRORS{"UNKNOWN"};
}