testing added
I've added some testing. It can be a starting point. Currently
is more ore less useless, I'm afraid. But you should get the point if
you read the t/00-basic.t file.
--- a/Build.PL Thu Jan 23 23:31:08 2014 +0100
+++ b/Build.PL Sat Jan 25 23:08:21 2014 +0100
@@ -6,33 +6,34 @@
use Module::Build;
my $builder = Module::Build->new(
- dist_name => 'nagios-plugin-amanda-client',
+ dist_name => 'nagios-plugin-amanda-client',
dist_version_from => 'plugins/check_amanda-client',
- dist_abstract => 'nagios check for amanda clients',
+ dist_abstract => 'nagios check for amanda clients',
+
# new type 'plugins'
#
# where to find the sources -> where to put them under blib
checks_files => {
- 'plugins/check_amanda-client' => 'nagios/plugins/ius/check_amanda-client',
+ 'plugins/check_amanda-client' =>
+ 'nagios/plugins/ius/check_amanda-client',
},
- license => 'perl',
- requires => {
- perl => 5.010,
- },
+ license => 'perl',
+ requires => { perl => 5.014, },
+ test_requires => { 'Test::Exception' => 0, },
);
-
+# some magic to install it to the proper location}
if (not defined $builder->install_path('nagios')) {
my $base = do {
- if ($builder->installdirs eq 'vendor') { '/usr/lib' }
- elsif (defined $builder->install_base) { $builder->install_base }
- else { '/usr/local/lib' }
+ if ($builder->installdirs eq 'vendor') { '/usr/lib' }
+ elsif (defined $builder->install_base) { $builder->install_base }
+ else { '/usr/local/lib' }
};
$builder->install_path('nagios' => $base . '/nagios');
}
-$builder->bindoc_dirs([@{$builder->bindoc_dirs}, 'blib/nagios/plugins/ius']);
+$builder->bindoc_dirs([@{ $builder->bindoc_dirs }, 'blib/nagios/plugins/ius']);
$builder->add_build_element('checks');
$builder->create_build_script;
--- a/plugins/check_amanda-client Thu Jan 23 23:31:08 2014 +0100
+++ b/plugins/check_amanda-client Sat Jan 25 23:08:21 2014 +0100
@@ -1,7 +1,7 @@
#! /usr/bin/perl
# source: https://ssl.schlittermann.de/hg/ius/nagios/nagios-plugin-amanda-client
-use 5.010;
+use 5.014;
use strict;
use warnings;
use Getopt::Long;
@@ -13,8 +13,6 @@
use Pod::Usage;
use Const::Fast;
-our $VERSION = '0.0.2';
-
const my $NAME => 'AMANDA-CLIENT';
const my $USER => 'backup';
const my $CFDIR => '/etc/amanda';
@@ -30,28 +28,30 @@
sub main;
-sub ok;
-sub warning;
-sub critical;
-sub unknown;
+sub OK;
+sub WARNING;
+sub CRITICAL;
+sub UNKNOWN;
sub verbose;
sub unique { my %h; @h{@_} = (); keys %h }
-$SIG{__DIE__} = sub { unknown @_ unless $^S };
+$SIG{__DIE__} = sub { UNKNOWN @_ unless $^S };
-exit main @ARGV;
+exit main @ARGV if not caller;
#----
sub main {
- my @opt_ignore;
+ my @opt_exclude;
+ my @opt_include;
my $opt_verbose = 0;
GetOptions(
- 'i|ignore=s@' => \@opt_ignore,
- 'h|help' => sub { pod2usage(-verbose => 1, -exit => 0) },
- 'm|man' => sub { pod2usage(-verbose => 2, -exit => 0) },
- 'v|verbose' => \$opt_verbose,
+ 'e|x|exclude=s@' => \@opt_exclude,
+ 'i|include=s@' => \@opt_include,
+ 'h|help' => sub { pod2usage(-verbose => 1, -exit => 0) },
+ 'm|man' => sub { pod2usage(-verbose => 2, -exit => 0) },
+ 'v|verbose' => \$opt_verbose,
) or pod2usage;
*::verbose = $opt_verbose ? sub { say '# ', @_ } : sub { };
@@ -64,7 +64,7 @@
# by the backup user/group
verbose q{checking permissions for `amservice'};
eval { check_perms find_tool('amservice'), 04750, 'root', $) }
- or unknown $@;
+ or UNKNOWN $@;
# find the backup sets we know about
# here we suppose that it's possible to find strings like
@@ -72,13 +72,18 @@
verbose qq{find config names from $CFDIR};
my @confs = sort +unique eval { config_names $CFDIR }
- or unknown $@;
+ or UNKNOWN $@;
- eval { amchecks @confs } or critical $@;
+ eval { amchecks @confs } or CRITICAL $@;
- my @dles = eval { compare_lists confs => \@confs, ignore => \@opt_ignore }
- or critical $@;
- ok 'config: ' . join(', ', @confs), @dles;
+ my @dles = eval {
+ compare_lists
+ confs => \@confs,
+ exclude => \@opt_exclude,
+ include => \@opt_include;
+ }
+ or CRITICAL $@;
+ OK 'config: ' . join(', ', @confs), @dles;
# never reached
return 0;
@@ -154,7 +159,8 @@
find(
sub {
-f and /^amanda-client\.conf$/ or return;
- open(my $fh, '<', $_) or die "Can't open $File::Find::name: $!\n";
+ open(my $fh, '<', $_)
+ or die "Can't open $File::Find::name: $!\n";
push @configs, map { /^conf\s+"(.+?)"/ ? $1 : () } <$fh>;
},
$dir
@@ -212,27 +218,30 @@
}
sub compare_lists {
- my %arg = @_;
- my @confs = @{ $arg{confs} } or croak 'missing list of confs';
- my @ignore = @{ $arg{ignore} };
+ my %arg = @_;
+ my @confs = @{ $arg{confs} } or croak 'missing list of confs';
+ my @exclude = @{ $arg{exclude} };
+ my @include = @{ $arg{include} };
- warning
- "ignored filesystem(s) @$_ does not exist, update the config please!\n"
- if @ignore and @$_ = grep { not -e } unique map { /^.*?:(.*)/ } @ignore;
+ WARNING
+ "excluded filesystem(s) @$_ does not exist, update the config please!\n"
+ if @exclude
+ and @$_ = grep { not -e } unique map { /^.*?:(.*)/ } @exclude;
- my @candidates = get_devices;
+ my @candidates = (get_devices, @include);
my %missing;
foreach my $conf (@confs) {
my @dles = _amlist $conf;
foreach my $candidate (@candidates) {
+ next if not $candidate =~ m{^/|\Q$conf\E:};
# we're satisfied if either the name of the device is in
# the disklist, or the device id is found
$candidate->[0] ~~ [map { $_->[0] } @dles] and next;
$candidate->[1] ~~ [map { $_->[1] } @dles] and next;
push @{ $missing{$conf} }, $candidate->[0]
- if not "$conf:$candidate->[0]" ~~ @ignore;
+ if not "$conf:$candidate->[0]" ~~ @exclude;
}
}
die map { "$_ missing: " . join(', ' => @{ $missing{$_} }) . "\n" }
@@ -242,10 +251,12 @@
return map { $_->[0] } @candidates;
}
-sub ok { say "$NAME OK\n", join "\n" => @_; exit 0 }
-sub warning { print "$NAME WARNING\n", join "\n" => @_; exit 1 }
-sub critical { print "$NAME CRITICAL\n", join "\n" => @_; exit 2 }
-sub unknown { print "$NAME UNKNOWN\n", join "\n" => @_; exit 3 }
+sub OK { say "$NAME OK\n", join "\n" => @_; exit 0 }
+sub WARNING { print "$NAME WARNING\n", join "\n" => @_; exit 1 }
+sub CRITICAL { print "$NAME CRITICAL\n", join "\n" => @_; exit 2 }
+sub UNKNOWN { print "$NAME UNKNOWN\n", join "\n" => @_; exit 3 }
+
+1;
__END__
@@ -268,11 +279,23 @@
=over
-=item B<-i>|B<--ignore> I<config:filesystem>
+=item B<-x>|B<--exclude> [I<config:>]I<filesystem>
+
+The name of a filesystem to be excluded.
+No config means all configs.
+
+ check_amanda-client --exclude weekly:/var/spool/squid --exclude /boot
+
-The name of a filesystem to be ignored. Example:
+=item B<-i>|B<--include> [I<config>:]I<filesystem>
+
+Which filesystems/directories we additionally want to check.
+No config means all configs.
- check_amanda-client --ignore weekly:/var/spool/squid --ignore daily:/boot
+ check_amanda-client --include weekly:/etc
+
+If the directory is contained already in another directory/filesystem,
+the test is satisfied.
=item B<-h>|B<--help>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/t/00-basic.t Sat Jan 25 23:08:21 2014 +0100
@@ -0,0 +1,58 @@
+
+use 5.014;
+no strict 'subs';
+use Test::More;
+use Test::Exception;
+use English qw(-no_match_vars);
+
+package FOO;
+::require_ok 'blib/nagios/plugins/ius/check_amanda-client';
+
+package main;
+
+subtest 'find_tool' => sub {
+ is FOO::find_tool('sh'), '/bin/sh' => 'found /bin/sh';
+ dies_ok { FOO: find_tool('abc123xyz-unknown-tool') }
+ 'dies for unknown tool';
+};
+
+subtest 'check_perms' => sub {
+ my ($mode, $owner, $group) = (stat $EXECUTABLE_NAME)[2, 4, 5];
+ $mode &= 07777;
+
+ ok FOO::check_perms($EXECUTABLE_NAME, $mode, $owner, $group),
+ "perms of $EXECUTABLE_NAME 1";
+ ok FOO::check_perms(
+ $EXECUTABLE_NAME, $mode,
+ scalar(getpwuid $owner),
+ scalar(getgrgid $group)
+ ),
+ "perms of $EXECUTABLE_NAME 2";
+ dies_ok { FOO::check_perms($EXECUTABLE_NAME, $mode, $owner + 1, $group) }
+ 'dies on wrong perms';
+};
+
+subtest 'config_names' => sub {
+ is_deeply [sort +FOO::config_names('t/etc/amanda')],
+ [sort qw(foobar DailySet1 WeeklySet1)] => 'got configs';
+ dies_ok { FOO::config_names('t/etc/no-amanda') } 'dies on missing configs';
+};
+
+subtest 'file systems' => sub {
+ my @fs = do {
+ local @ARGV = ('/proc/filesystems');
+ map { /(\S+)/ } grep { not /^nodev/ } <>;
+ };
+ my @devs =
+ sort { $a->[0] cmp $b->[0] }
+ map { [$_->[0], (stat $_->[0])[0]] }
+ grep { $_->[1] ~~ @fs }
+ map { [(split)[6, 1]] } `df -PT`;
+ ok scalar @fs => 'have file systems for testing';
+ ok scalar @devs => 'have devices for testing';
+ is_deeply [sort { $a->[0] cmp $b->[0] } FOO::get_devices()],
+ \@devs => 'got the proper devices';
+
+};
+
+done_testing;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/t/etc/amanda/DailySet1/amanda-client.conf Sat Jan 25 23:08:21 2014 +0100
@@ -0,0 +1,1 @@
+conf "DailySet1"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/t/etc/amanda/WeeklySet1/amanda-client.conf Sat Jan 25 23:08:21 2014 +0100
@@ -0,0 +1,1 @@
+conf "WeeklySet1" # testing only
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/t/etc/amanda/foo/amanda-client.conf Sat Jan 25 23:08:21 2014 +0100
@@ -0,0 +1,1 @@
+conf "foobar"