added df tests and fixed the script
authorHeiko Schlittermann <hs@schlittermann.de>
Fri, 20 Jan 2012 13:21:49 +0100
changeset 3 bdbd5e99f85a
parent 2 bc2f76c0908a
child 4 a29ba54493af
added df tests and fixed the script
Build.PL
bin/checkfs
t/010-run.t
--- 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();
--- 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} ? <STDIN> : `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
--- 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;