From e7ac16329b76d8a17fa7b247d55d3c3f7c9f2e10 Mon Sep 17 00:00:00 2001 From: Antoine Beaupre Date: Tue, 16 Jun 2009 10:51:29 -0400 Subject: parse rdiff-backup logfile for the last real successful backup instead of just relying on the backup logfile timestamp --- files/checkbackups.pl | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) (limited to 'files') diff --git a/files/checkbackups.pl b/files/checkbackups.pl index 5748f75..2084e86 100755 --- a/files/checkbackups.pl +++ b/files/checkbackups.pl @@ -41,10 +41,11 @@ my @vserver_dirs = qw{/var/lib/vservers /vservers}; our $opt_d = "/backup"; our $opt_c = 48 * 60 * 60; our $opt_w = 24 * 60 * 60; +our $opt_v = 0; -if (!getopts('d:c:w:')) { +if (!getopts('d:c:w:v')) { print < ] [ -c ] [ -w ] +Usage: $0 [ -d ] [ -c ] [ -w ] -v EOF ; exit(); @@ -63,16 +64,33 @@ foreach $host (@hosts) { chomp($host); my $flag=""; my $type="unknown"; + my $extra_msg=""; @vservers = (); $state = $STATE_UNKNOWN; $message = "???"; if (-d $host) { # guess the backup type and find a proper stamp file to compare - # XXX: this doesn't check if the backup was actually successful # XXX: the backup type should be part of the machine registry + my $last_bak; if (-d "$host/rdiff-backup") { $flag="$host/rdiff-backup/rdiff-backup-data/backup.log"; $type="rdiff"; + if (open(FLAG, $flag)) { + while () { + if (/StartTime ([0-9]*).[0-9]* \((.*)\)/) { + $last_bak = $1; + $extra_msg = ' [backup.log]'; + $opt_v && print STDERR "found timestamp $1 ($2) in backup.log\n"; + } + } + if (!$last_bak) { + $message = "cannot parse backup.log for a valid timestamp"; + next; + } + } else { + $opt_v && print STDERR "cannot open backup.log\n"; + } + close(FLAG); foreach my $vserver_dir (@vserver_dirs) { $dir = "$host/rdiff-backup$vserver_dir"; if (opendir(DIR, $dir)) { @@ -81,23 +99,28 @@ foreach $host (@hosts) { } } } elsif (-d "$host/dump") { + # XXX: this doesn't check backup consistency $flag="$host/dump/" . `ls -tr $host/dump | tail -1`; chomp($flag); $type="dump"; } elsif (-d "$host/dup") { + # XXX: this doesn't check backup consistency $flag="$host/dup"; $type="duplicity"; } else { $message = "unknown system"; next; } - my @stats = stat($flag); - if (not @stats) { - $message = "cannot stat flag $flag"; - next; + if (!defined($last_bak)) { + my @stats = stat($flag); + if (not @stats) { + $message = "cannot stat flag $flag"; + next; + } + $last_bak = $stats[9]; } my $t = time(); - my $delta = $t - $stats[9]; + my $delta = $t - $last_bak; if ($delta > $crit) { $state = $STATE_CRITICAL; } elsif ($delta > $warn) { @@ -105,7 +128,7 @@ foreach $host (@hosts) { } elsif ($delta >= 0) { $state = $STATE_OK; } - $message = "$delta seconds old"; + $message = "$delta seconds old$extra_msg"; } else { $message = "no directory"; } -- cgit v1.2.3