# HG changeset patch # User Heiko Schlittermann (JUMPER) # Date 1390687701 -3600 # Node ID 2247be0e2a13c417cf8905bcef756578b3ccfe8f # Parent 92818898bb2c89993a166a2d16667b6e1283ad71 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. diff -r 92818898bb2c -r 2247be0e2a13 Build.PL --- 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; diff -r 92818898bb2c -r 2247be0e2a13 plugins/check_amanda-client --- 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 +=item B<-x>|B<--exclude> [I]I + +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:]I + +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> diff -r 92818898bb2c -r 2247be0e2a13 t/00-basic.t --- /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; diff -r 92818898bb2c -r 2247be0e2a13 t/etc/amanda/DailySet1/amanda-client.conf --- /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" diff -r 92818898bb2c -r 2247be0e2a13 t/etc/amanda/WeeklySet1/amanda-client.conf --- /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 diff -r 92818898bb2c -r 2247be0e2a13 t/etc/amanda/foo/amanda-client.conf --- /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" diff -r 92818898bb2c -r 2247be0e2a13 t/etc/no-amanda/.dir