[project @ steve@lobefin.net-20090220020630-8k0anuy6jox1goe6]
[mirror/dsa-nagios.git] / dsa-nagios-nrpe-config / dsa-check-dabackup
index 8e707a4..f400023 100755 (executable)
@@ -30,7 +30,8 @@ use Getopt::Long;
 use Fcntl qw(:seek);
 
 my $DABACKUP_CONF = '/etc/da-backup.conf';
-my $MAX_AGE = 24*60*60;
+my $MAX_AGE = 30*60*60;
+my $TOO_FRESH = 5*60;
 my %CODE = (
        'UNDEF'         => -1,
        'OK'            => 0,
@@ -45,11 +46,12 @@ $SIG{__DIE__ } = sub() {
 
 
 my $EXITCODE = 'UNDEF';
-my @MESSAGE = ();
+my %MESSAGE = ();
 
-sub problem($$) {
-       my ($code, $msg) = @_;
-       push @MESSAGE, $msg;
+sub problem($$$) {
+       my ($code, $msg, $resource) = @_;
+       $MESSAGE{$msg} = [] unless defined $MESSAGE{$msg};
+       push @{$MESSAGE{$msg}}, $resource;
        $EXITCODE = ($CODE{$code} > $CODE{$EXITCODE}) ? $code : $EXITCODE;
 };
 
@@ -104,31 +106,44 @@ die ("No confdir found in $DABACKUP_CONF") unless defined $confdir;
 die ("No logdir found in $DABACKUP_CONF") unless defined $logdir;
 
 opendir(DIR, $confdir) or die ("Cannot opendir $confdir: $!\n");
-my %conffiles = map {$_ => 1} grep { !/^\./ } readdir(DIR);
+my %conffiles = map {$_ => 1} grep { !/^\./ && !/\.bak$/} readdir(DIR);
 closedir(DIR);
 
 opendir(DIR, $logdir) or die ("Cannot opendir $logdir: $!\n");
 my %logfiles = map {$_ => 1} grep { !/^\./ && !/\.[0-9]+(\.gz)?$/} readdir(DIR);
 closedir(DIR);
 
+if (scalar keys %conffiles == 0) {
+       print "WARNING: da-backup installed but no backups configured\n";
+       exit $CODE{'WARNING'};
+};
+
 for my $f (keys %conffiles) {
        unless (exists $logfiles{$f}) {
-               problem('WARNING', "$f has no log");
+               problem('WARNING', 'no log', $f);
        }
 }
-problem('WARNING', 'da-backup installed but no backups configured') if (scalar keys %conffiles == 0);
 
 FILE:
 for my $f (sort {$a cmp $b} keys %logfiles) {
        unless (exists $conffiles{$f}) {
-               problem('WARNING', "log $f has no config");
+               problem('WARNING', 'no config', $f);
                next;
        }
 
        my @stat = stat("$logdir/$f") or die ("Cannot stat $logdir/$f: $!\n");
        my $age = time - $stat[10];
+
+       if ($age < $TOO_FRESH) { # File is too new, let's use the old one
+               if (-e "$logdir/$f.0") {
+                       $f .= ".0";
+                       my @stat = stat("$logdir/$f") or die ("Cannot stat $logdir/$f: $!\n");
+                       $age = time - $stat[10];
+               };
+       };
+
        if ($age < 0) {
-               problem('WARNING', "%f is from the future");
+               problem('WARNING', 'future timestamp', $f);
                next;
        } elsif ($age > $MAX_AGE) {
                my $hage;
@@ -138,7 +153,7 @@ for my $f (sort {$a cmp $b} keys %logfiles) {
                } else {
                        $hage = sprintf("%d hours", $age /  3600);
                };
-               problem('WARNING', "$f is $hage old");
+               problem('WARNING', 'old', "$f ($hage)");
                next;
        };
 
@@ -149,15 +164,16 @@ for my $f (sort {$a cmp $b} keys %logfiles) {
        while (<FH>) {
                chomp;
                if (/^sent\s+\d+\s+bytes\s+received\s+\d+\s+bytes\s+[\d\.]+\s+bytes\/sec$/) {
-                       problem('OK', "$f probably ok");
+                       problem('OK', 'probably ok', $f);
                        close(FH);
                        next FILE;
                };
                $last2 = $last;
                $last = $_;
        };
-       problem('CRITICAL', "$f failed ($last2 $last)");
+       problem('CRITICAL', 'FAILED', "$f ($last2 $last)");
 };
 
-print $EXITCODE,": ", join(";  ", @MESSAGE), "\n";
+my $msg = join("; ", map {"$_: ".join(', ', @{$MESSAGE{$_}}) } (sort {$a cmp $b} keys %MESSAGE));
+print $EXITCODE, ": ", $msg, "\n";
 exit $CODE{$EXITCODE};