# HG changeset patch # User Heiko Schlittermann # Date 1327062109 -3600 # Node ID bdbd5e99f85ab94f6e31a48b0561580aeb4b13eb # Parent bc2f76c0908aa6631802c455c04320ef80e3f3e8 added df tests and fixed the script diff -r bc2f76c0908a -r bdbd5e99f85a Build.PL --- a/Build.PL Fri Jan 20 09:13:33 2012 +0100 +++ b/Build.PL Fri Jan 20 13:21:49 2012 +0100 @@ -11,6 +11,7 @@ }, build_requires => { "Test::More" => "0.98", + "Test::Compile" => "0", }, script_files => [ glob "bin/*" ], )->create_build_script(); diff -r bc2f76c0908a -r bdbd5e99f85a bin/checkfs --- a/bin/checkfs Fri Jan 20 09:13:33 2012 +0100 +++ b/bin/checkfs Fri Jan 20 13:21:49 2012 +0100 @@ -1,5 +1,7 @@ -#! /usr/bin/perl -use 5.10.0; +#! /usr/bin/perl + +#use 5.10.0; +use Switch 'Perl6'; use strict; use warnings; use Pod::Usage; @@ -17,18 +19,27 @@ -noperldoc => system("perldoc -V 2>/dev/null 1>&2") ); }, -) and $fs = shift // pod2usage; + ) + and defined($fs = shift) + or pod2usage; -($fs, my ($blocks, $used, $avail, undef, $mp)) = - split " " => (`df -P -B 1K $fs`)[1]; -my $msg = "$fs on $mp: left ${avail}kB of ${blocks}kB"; +my @df = $ENV{HARNESS_ACTIVE} ? : `df -P -B 1K '$fs'`; + +($fs, my ($blocks, $used, $avail, undef, $mp)) = split " " => $df[1]; -given ($avail / $blocks) { - when ($_ < 0.1) { print "FS CRIT - $msg\n"; exit Nagios::CRITICAL } - when ($_ < 0.3) { print "FS WARN - $msg\n"; exit Nagios::WARNING } - default { print "FS OK - $msg\n"; exit Nagios::OK } +if (not defined $avail or not defined $blocks or $blocks == 0) { + print "FS UNKNOWN - can't determine values for $fs\n"; + exit Nagios::UNKNOWN; } +my $ratio = int(100 * ($avail / $blocks)); +my $msg = "$fs on $mp: left ${avail}kB of ${blocks}kB ($ratio%)"; +if ($ratio > 30) { print "FS OK - $msg\n"; exit Nagios::OK } +if ($ratio > 10) { print "FS WARN - $msg\n"; exit Nagios::WARNING } + +print "FS CRIT - $msg ($ratio%)\n"; +exit Nagios::CRITICAL; + __END__ =head1 NAME diff -r bc2f76c0908a -r bdbd5e99f85a t/010-run.t --- a/t/010-run.t Fri Jan 20 09:13:33 2012 +0100 +++ b/t/010-run.t Fri Jan 20 13:21:49 2012 +0100 @@ -4,7 +4,11 @@ use Test::More; use Test::Cmd; -my $test = Test::Cmd->new(prog => "blib/script/checkfs", workdir => "", verbose => $ENV{TEST_VERBOSE} > 1); +my $test = Test::Cmd->new( + prog => "blib/script/checkfs", + workdir => "", + verbose => $ENV{TEST_VERBOSE} > 1 +); ok($test, "test environment"); # $ENV{HARNESS_ACTIVE} @@ -26,7 +30,6 @@ is($test->stderr, "", "stderr should be empty"); }; - $test->run(args => "-m"); $rc = $? >> 8; subtest "run w/ -m" => sub { @@ -36,6 +39,59 @@ }; # create a fake df +my $head = + "Filesystem 1024-blocks Used Available Capacity Mounted on"; +my @data = ( + { in => "/dev/mapper/jumper-root 7970992 6769920 801696 90% /", r => 2 }, + { in => "tmpfs 1927372 12 1927360 1% /lib/init/rw", r => 0 }, + { in => "varrun 1927372 168 1927204 1% /var/run", r => 0 }, + { in => "varlock 1927372 0 1927372 0% /var/lock", r => 0 }, + { in => "udev 1921416 256 1921160 1% /dev", r => 0 }, + { in => "tmpfs 1927372 40 1927332 1% /dev/shm", r => 0 }, + { + in => "/dev/mapper/jumper-home 30963708 27663468 1727736 95% /home", + r => 2 + }, + { in => "/dev/sda1 235021 35434 187453 16% /boot", r => 0 }, + { in => "/dev/mapper/jumper-jumper 13789092 13701780 0 100% /.o", r => 2 }, + { + in => + "/dev/mapper/jumper-squid 1108684 247408 804956 24% /var/spool/squid", + r => 0 + }, + { + in => "/dev/mapper/jumper-log 2097152 32364 2064788 2% /var/log", + r => 0 + }, + { in => "tmpfs 131072 3568 127504 3% /tmp", r => 0 }, + { + in => "/dev/mapper/jumper-src 10321208 888736 8908184 10% /usr/src", + r => 0 + }, + { in => "tmpfs 0 3568 127504 3% /tmp", r => 3 }, +); +foreach (@data) { + + my $send = $_->{in}; + my $expect = $_->{r}; + my $fs = (split " " => $send)[-1]; + + $test->run(args => $fs, stdin => "$head\n$send"); + my $rc = $? >> 8; + + subtest "filesystem $fs (expect $expect)" => sub { + + is($rc, $expect, "expected $expect") + or diag length($test->stderr) ? "STDERR: " . $test->stderr + : "" . length($test->stdout) ? "STDOUT: " . $test->stdout + : ""; + + if ($expect == 0) { like($test->stdout, qr/FS OK/, "ok $fs") } + elsif ($expect == 1) { like($test->stdout, qr/FS WARN/, "warn $fs") } + elsif ($expect == 2) { like($test->stdout, qr/FS CRIT/, "crit $fs") } + else { like($test->stdout, qr/FS UNKN/, "unknown $fs") } + }; +} done_testing;