check_dump.pl
changeset 3 8c160b9b0a73
parent 0 2427d1ed9802
equal deleted inserted replaced
2:c1d47261de24 3:8c160b9b0a73
     1 #! /usr/bin/perl -w
     1 #! /usr/bin/perl
     2 
     2 
     3 #   Copyright (C) 2011  Christian Arnold
     3 #   Copyright (C) 2011  Christian Arnold
     4 #
     4 #
     5 #   This program is free software: you can redistribute it and/or modify
     5 #   This program is free software: you can redistribute it and/or modify
     6 #   it under the terms of the GNU General Public License as published by
     6 #   it under the terms of the GNU General Public License as published by
    13 #   GNU General Public License for more details.
    13 #   GNU General Public License for more details.
    14 #
    14 #
    15 #   You should have received a copy of the GNU General Public License
    15 #   You should have received a copy of the GNU General Public License
    16 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
    16 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
    17 #
    17 #
    18 #	Christian Arnold <arnold@schlittermann.de>
    18 #   Christian Arnold <arnold@schlittermann.de>
    19 
    19 
    20 use 5.010;
    20 use 5.010;
    21 use Perl6::Slurp;
       
    22 use strict;
    21 use strict;
    23 use warnings;
    22 use warnings;
       
    23 use Perl6::Slurp;
    24 use File::Basename;
    24 use File::Basename;
    25 use Pod::Usage;
    25 use Pod::Usage;
    26 use Getopt::Long;
    26 use Getopt::Long;
    27 use Date::Parse qw(str2time);
    27 use Date::Parse qw(str2time);
    28 use Cwd qw(realpath);
    28 use Cwd qw(realpath);
    46     UNKNOWN   => 3,
    46     UNKNOWN   => 3,
    47     DEPENDENT => 4
    47     DEPENDENT => 4
    48 );
    48 );
    49 
    49 
    50 my $ME      = basename $0;
    50 my $ME      = basename $0;
    51 my $VERSION = "0.1";
    51 my $VERSION = "0.2";
    52 my $NAME    = "DUMP";
    52 my $NAME    = "DUMP";
    53 my $NOW     = time();
    53 my $NOW     = time();
    54 
    54 
    55 MAIN: {
    55 MAIN: {
    56     Getopt::Long::Configure('bundling');
    56     Getopt::Long::Configure('bundling');
    70     my %devs = @_;
    70     my %devs = @_;
    71     my %rc;
    71     my %rc;
    72 
    72 
    73     foreach my $devno ( keys %devs ) {
    73     foreach my $devno ( keys %devs ) {
    74         if ( $devs{$devno}{date} ) {
    74         if ( $devs{$devno}{date} ) {
    75             if ( ( $NOW - $devs{$devno}{date} ) >
    75             if ( ( $NOW - str2time( $devs{$devno}{date} ) ) >
    76                 ( $devs{$devno}{dump} * 86400 ) )
    76                 ( $devs{$devno}{dump} * 86_400 * 2 ) )
    77             {
    77             {
    78                 $rc{ $devs{$devno}{dev} } = { rc => $ERRORS{WARNING} };
    78                 $rc{ $devs{$devno}{dev} } = {
       
    79                     rc       => $ERRORS{CRITICAL},
       
    80                     lastdump => "[$devs{$devno}{date}]"
       
    81                 };
    79             }
    82             }
       
    83             elsif ( ( $NOW - str2time( $devs{$devno}{date} ) ) >
       
    84                 ( $devs{$devno}{dump} * 86_400 ) )
       
    85             {
       
    86                 $rc{ $devs{$devno}{dev} } = {
       
    87                     rc       => $ERRORS{WARNING},
       
    88                     lastdump => "[$devs{$devno}{date}]"
       
    89                 };
       
    90             }
       
    91             else {
       
    92                 $rc{ $devs{$devno}{dev} } = {
       
    93                     rc       => $ERRORS{OK},
       
    94                     lastdump => "[$devs{$devno}{date}]"
       
    95                 };
       
    96             }
    80         }
    97         }
    81         else {
    98         else {
    82             $rc{ $devs{$devno}{dev} } = { rc => $ERRORS{CRITICAL} };
    99             $rc{ $devs{$devno}{dev} } = {
    83         }
   100                 rc       => $ERRORS{CRITICAL},
    84     }
   101                 lastdump => "[NEVER]"
    85 
   102             };
    86     my ( @critical, @warning );
   103         }
       
   104     }
       
   105 
       
   106     my ( @critical, @warning, @ok );
    87 
   107 
    88     foreach my $dev ( keys %rc ) {
   108     foreach my $dev ( keys %rc ) {
    89         if ( $rc{$dev}{rc} eq $ERRORS{CRITICAL} ) {
   109         if ( $rc{$dev}{rc} eq $ERRORS{CRITICAL} ) {
    90             push @critical, $dev;
   110             push @critical, "$dev last dump: $rc{$dev}{lastdump}";
       
   111             next;
       
   112         }
       
   113         elsif ( $rc{$dev}{rc} eq $ERRORS{WARNING} ) {
       
   114             push @warning, "$dev last dump: $rc{$dev}{lastdump}";
       
   115             next;
    91         }
   116         }
    92         else {
   117         else {
    93             push @warning, $dev;
   118             push @ok, "$dev last dump: $rc{$dev}{lastdump}";
    94         }
   119         }
    95     }
   120     }
    96 
   121 
    97     say "$NAME CRITICAL: @critical check dump backup" and exit $ERRORS{CRITICAL}
   122     say "$NAME CRITICAL: " . join( ', ', @critical ) and exit $ERRORS{CRITICAL}
    98       if (@critical);
   123       if (@critical);
    99     say "$NAME WARNING: @warning check dump backup" and exit $ERRORS{WARNING}
   124     say "$NAME WARNING: " . join( ', ', @warning ) and exit $ERRORS{WARNING}
   100       if (@warning);
   125       if (@warning);
   101     say "$NAME OK: all dump backups in limit" and exit $ERRORS{OK};
   126     say "$NAME OK: " . join( ', ', @ok ) and exit $ERRORS{OK};
   102 }
   127 }
   103 
   128 
   104 sub get_candidates() {
   129 sub get_candidates() {
   105 
   130 
   106     my %devs;
   131     my %devs;
   125 sub get_history(%) {
   150 sub get_history(%) {
   126 
   151 
   127     my %devs = @_;
   152     my %devs = @_;
   128 
   153 
   129     say "$NAME CRITICAL: Command 'dump' not found." and exit $ERRORS{CRITICAL}
   154     say "$NAME CRITICAL: Command 'dump' not found." and exit $ERRORS{CRITICAL}
   130       if system("command -v dump >/dev/null");
   155       if system("command -v /sbin/dump >/dev/null");
   131 
   156 
   132     foreach (`dump -W`) {
   157     foreach (`/sbin/dump -W`) {
   133         chomp;
   158         chomp;
   134         /^
   159         /^
   135 		(?:\s+|>\s+)
   160 		(?:\s+|>\s+)
   136 		(?<dev>\S+)\s+
   161 		(?<dev>\S+)\s+
   137 		\(
   162 		\(
   150                 dev   => $+{dev},
   175                 dev   => $+{dev},
   151                 rdev  => $rdev,
   176                 rdev  => $rdev,
   152                 mp    => $+{mp},
   177                 mp    => $+{mp},
   153                 level => $+{level},
   178                 level => $+{level},
   154                 dump  => $devs{"$major:$minor"}{dump},
   179                 dump  => $devs{"$major:$minor"}{dump},
   155                 date  => str2time( $+{date} )
   180                 date  => $+{date}
   156             };
   181             };
   157         }
   182         }
   158     }
   183     }
   159 
   184 
   160     return %devs;
   185     return %devs;
   161 }
   186 }
   162 
   187 
   163 sub real_device($) {
   188 sub real_device($) {
   164     my $dev = shift;
   189     my $dev = shift;
   165 
   190 
       
   191     # get the real device
   166     if ( $dev ~~ /^(LABEL|UUID)=/ ) {
   192     if ( $dev ~~ /^(LABEL|UUID)=/ ) {
   167         chomp( $dev = `blkid -c /dev/null -o device -t '$dev'` );
   193 
       
   194         # only root can use blkid without cache
       
   195         if ( not scalar($<) ) {
       
   196             chomp( $dev = `/sbin/blkid -c /dev/null -o device -t '$dev'` );
       
   197         }
       
   198         else {
       
   199             chomp( $dev = `/sbin/blkid -o device -t '$dev'` );
       
   200         }
   168     }
   201     }
   169 
   202 
   170     $dev = realpath($dev);
   203     $dev = realpath($dev);
   171 }
   204 }
   172 
   205 
   173 sub devno($) {
   206 sub devno($) {
   174     my @mm = ( ( stat shift )[6] >> 8, ( stat _ )[6] & 0xff );
   207     my $dev = shift;
       
   208 
       
   209     # get major and minor number for device
       
   210     my @mm = ( ( stat($dev) )[6] >> 8, ( stat($dev) )[6] & 0xff );
   175     return wantarray ? @mm : "$mm[0]:$mm[1]";
   211     return wantarray ? @mm : "$mm[0]:$mm[1]";
   176 }
   212 }
   177 
   213 
   178 sub version($$) {
   214 sub version($$) {
   179     my $progname = shift;
   215     my $progname = shift;
   221 
   257 
   222 =back
   258 =back
   223 
   259 
   224 =head1 DESCRIPTION
   260 =head1 DESCRIPTION
   225 
   261 
   226 This nagios plugin check backup status from dump.
   262 This nagios plugin check backup status from dump. If run as non B<root>,
       
   263 the built-in B<blkid>(8) will get block device attributes from the default cache file I</etc/blkid.tab>.
   227 
   264 
   228 =head1 VERSION
   265 =head1 VERSION
   229 
   266 
   230 This man page is current for version 0.1 of B<check_dump>.
   267 This man page is current for version 0.2 of B<check_dump>.
   231 
   268 
   232 =head1 AUTHOR
   269 =head1 AUTHOR
   233 
   270 
   234 Written by Christian Arnold L<arnold@schlittermann.de>
   271 Written by Christian Arnold L<arnold@schlittermann.de>
   235 
   272