3 # Check the status of da-backup backups
4 # Copyright 2007 Stephen Gran <sgran@debian.org>
5 # Copyright 2008 Peter Palfrader
7 # Permission is hereby granted, free of charge, to any person obtaining
8 # a copy of this software and associated documentation files (the
9 # "Software"), to deal in the Software without restriction, including
10 # without limitation the rights to use, copy, modify, merge, publish,
11 # distribute, sublicense, and/or sell copies of the Software, and to
12 # permit persons to whom the Software is furnished to do so, subject to
13 # the following conditions:
15 # The above copyright notice and this permission notice shall be
16 # included in all copies or substantial portions of the Software.
18 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22 # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 my $DABACKUP_CONF = '/etc/da-backup.conf';
33 my $MAX_AGE = 24*60*60;
41 $SIG{__DIE__ } = sub() {
43 exit $CODE{'UNKNOWN'};
47 my $EXITCODE = 'UNDEF';
51 my ($code, $msg) = @_;
53 $EXITCODE = ($CODE{$code} > $CODE{$EXITCODE}) ? $code : $EXITCODE;
58 my ($exitcode, $fd) = @_;
60 print $fd "Usage: $PROGRAM_NAME --help\n";
61 print $fd "Usage: $PROGRAM_NAME";
67 Getopt::Long::config('bundling');
69 'h|help' => \$params->{'help'},
71 die ("$PROGRAM_NAME: Usage: $PROGRAM_NAME [-fwhv]\n");
74 help(0, *STDOUT) if $params->{'help'};
75 help(1, *STDERR) if scalar @ARGV > 0;
78 unless (-e $DABACKUP_CONF) {
79 if (-e '/etc/da-backup') {
80 print "WARNING: No $DABACKUP_CONF, but we have /etc/da-backup/\n";
81 exit $CODE{'WARNING'};
83 if (-e '/var/log/da-backup') {
84 print "WARNING: No $DABACKUP_CONF, but we have /var/log/da-backup/\n";
85 exit $CODE{'WARNING'};
87 print "OK: no backup configured\n";
94 open (FH, "< $DABACKUP_CONF") or die ("Cannot open $DABACKUP_CONF: $!\n");
98 } elsif (/logdir=(.*)/) {
103 die ("No confdir found in $DABACKUP_CONF") unless defined $confdir;
104 die ("No logdir found in $DABACKUP_CONF") unless defined $logdir;
106 opendir(DIR, $confdir) or die ("Cannot opendir $confdir: $!\n");
107 my %conffiles = map {$_ => 1} grep { !/^\./ } readdir(DIR);
110 opendir(DIR, $logdir) or die ("Cannot opendir $logdir: $!\n");
111 my %logfiles = map {$_ => 1} grep { !/^\./ && !/\.[0-9]+(\.gz)?$/} readdir(DIR);
114 for my $f (keys %conffiles) {
115 unless (exists $logfiles{$f}) {
116 problem('WARNING', "$f has no log");
119 problem('WARNING', 'da-backup installed but no backups configured') if (scalar keys %conffiles == 0);
122 for my $f (sort {$a cmp $b} keys %logfiles) {
123 unless (exists $conffiles{$f}) {
124 problem('WARNING', "log $f has no config");
128 my @stat = stat("$logdir/$f") or die ("Cannot stat $logdir/$f: $!\n");
129 my $age = time - $stat[10];
131 problem('WARNING', "%f is from the future");
133 } elsif ($age > $MAX_AGE) {
136 if ($age > 48 * 3600) {
137 $hage = sprintf("%d days", $age / 24 / 3600);
139 $hage = sprintf("%d hours", $age / 3600);
141 problem('WARNING', "$f is $hage old");
145 open(FH, "< $logdir/$f") or die ("Cannot open $logdir/$f: $!\n");
146 sysseek(FH, -1024, SEEK_END); # just try it - doesn't matter if it fails
151 if (/^sent\s+\d+\s+bytes\s+received\s+\d+\s+bytes\s+[\d\.]+\s+bytes\/sec$/) {
152 problem('OK', "$f probably ok");
159 problem('CRITICAL', "$f failed ($last2 $last)");
162 print $EXITCODE,": ", join("; ", @MESSAGE), "\n";
163 exit $CODE{$EXITCODE};