diff options
-rwxr-xr-x | files/checkbackups.pl | 101 | ||||
-rw-r--r-- | manifests/server.pp | 4 | ||||
-rwxr-xr-x | templates/checkbackups.sh | 73 |
3 files changed, 103 insertions, 75 deletions
diff --git a/files/checkbackups.pl b/files/checkbackups.pl new file mode 100755 index 0000000..24632d1 --- /dev/null +++ b/files/checkbackups.pl @@ -0,0 +1,101 @@ +#!/usr/bin/perl -w + +# This script is designed to check a backup directory populated with +# subdirectories named after hosts, within which there are backups of various +# types. +# +# Example: +# /home/backup: +# foo.example.com +# +# foo.example.com: +# rdiff-backup .ssh +# +# rdiff-backup: +# root home rdiff-backup-data usr var +# +# There are heuristics to determine the backup type. Currently, the following +# types are supported: +# +# rdiff-backup: assumes there is a rdiff-backup/rdiff-backup-data/backup.log file +# duplicity: assumes there is a dup subdirectory, checks the latest file +# dump files: assumes there is a dump subdirectory, checks the latest file +# +# This script returns output suitable for send_nsca to send the results to +# nagios and should therefore be used like this: +# +# checkbackups.sh | send_nsca -H nagios.example.com + +use Getopt::Std; + +# XXX: taken from utils.sh from nagios-plugins-basic +my $STATE_OK=0; +my $STATE_WARNING=1; +my $STATE_CRITICAL=2; +my $STATE_UNKNOWN=3; +my $STATE_DEPENDENT=4; + +our $opt_d = "/backup"; +our $opt_c = 48 * 60 * 60; +our $opt_w = 24 * 60 * 60; + +if (!getopts('d:c:w:')) { + print <<EOF +Usage: $0 [ -d <backupdir> ] [ -c <threshold> ] [ -w <threshold> ] +EOF + ; + exit(); +} + +my $backupdir= $opt_d; +my $crit = $opt_c; +my $warn = $opt_w; + +# XXX: this should be a complete backup registry instead +my @hosts=qx{ls $backupdir}; + +chdir($backupdir); +foreach my $host (@hosts) { + chomp($host); + my $flag=""; + my $type="unknown"; + 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 + if (-d "$host/rdiff-backup") { + $flag="$host/rdiff-backup/rdiff-backup-data/backup.log"; + $type="rdiff"; + } elsif (-d "$host/dump") { + $flag="$host/dump/" . `ls -tr $host/dump | tail -1`; + chomp($flag); + $type="dump"; + } elsif (-d "$host/dup") { + $flag="$host/dup"; + $type="duplicity"; + } else { + printf "$host\tbackups\t$STATE_UNKNOWN\tunknown system\n"; + next; + } + my @stats = stat($flag); + if (not @stats) { + printf "$host\tbackups\t$STATE_UNKNOWN\tcannot stat flag $flag\n"; + next; + } + my $t = time(); + my $delta = $t - $stats[9]; + my $state = $STATE_UNKNOWN; + if ($delta > $crit) { + $state = $STATE_CRITICAL; + } elsif ($delta > $warn) { + $state = $STATE_WARNING; + } elsif ($delta >= 0) { + $state = $STATE_OK; + } + print "$host\t"; + print "backups\t$state"; + print "\t$delta seconds old\n"; + } else { + printf "$host\tbackups\t$STATE_UNKNOWN\tno directory\n"; + } +} diff --git a/manifests/server.pp b/manifests/server.pp index 4284ffa..9b08b22 100644 --- a/manifests/server.pp +++ b/manifests/server.pp @@ -25,12 +25,12 @@ class backupninja::server { file { "/usr/local/bin/checkbackups": ensure => "present", - content => template("backupninja/checkbackups.sh"), + source => "puppet://$servername/backupninja/checkbackups.pl", mode => 0755, owner => root, group => root, } cron { checkbackups: - command => "/usr/local/bin/checkbackups.sh | /usr/sbin/send_nsca -H nagios.koumbit.net -c /etc/send_nsca.cfg", + command => "/usr/local/bin/checkbackups -d $real_backupdir | /usr/sbin/send_nsca -H nagios.koumbit.net -c /etc/send_nsca.cfg | grep -v 'sent to host successfully'", user => "root", hour => "8-23", minute => 59, diff --git a/templates/checkbackups.sh b/templates/checkbackups.sh deleted file mode 100755 index 8d143a3..0000000 --- a/templates/checkbackups.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/sh - -# This script is designed to check a backup directory populated with -# subdirectories named after hosts, within which there are backups of various -# types. -# -# Example: -# /home/backup: -# foo.example.com -# -# foo.example.com: -# rdiff-backup .ssh -# -# rdiff-backup: -# root home rdiff-backup-data usr var -# -# There are heuristics to determine the backup type. Currently, the following -# types are supported: -# -# rdiff-backup: assumes there is a rdiff-backup/rdiff-backup-data/backup.log file -# duplicity: assumes there is a dup subdirectory, checks the latest file -# dump files: assumes there is a dump subdirectory, checks the latest file -# -# This script returns output suitable for send_nsca to send the results to -# nagios and should therefore be used like this: -# -# checkbackups.sh | send_nsca -H nagios.example.com - -# XXX: taken from utils.sh from nagios-plugins-basic -STATE_OK=0 -STATE_WARNING=1 -STATE_CRITICAL=2 -STATE_UNKNOWN=3 -STATE_DEPENDENT=4 - -backupdir="<%= real_backupdir -%>" - -# XXX: this should be a complete backup registry instead -hosts=`ls $backupdir` -stampfile=$backupdir/.stamp - -cd $backupdir -for host in $hosts; do - flag="" - type="unknown" - if [ -d $host ]; then - # 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 - if [ -d $host/rdiff-backup ]; then - flag=$host/rdiff-backup/rdiff-backup-data/backup.log - type="rdiff" - elif [ -d $host/dump ]; then - flag="$host/dump/`ls -tr $host/dump | tail -1`" - type="dump" - elif [ -d $host/dup ]; then - flag="$host/dup/`ls -tr $host/dup | tail -1`" - type="duplicity" - else - printf "$host\tbackups\t$STATE_UNKNOWN\tUNKNOWN unknown system\n" - continue - fi - touch -t `date +%Y%m%d0000.00` $stampfile - date=`ls -l $flag | awk '{print $6 " " $7}'` - if [ $flag -nt $stampfile ]; then - printf "$host\tbackups\t$STATE_OK\tOK timestamp $date\n" - else - printf "$host\tbackups\t$STATE_CRITICAL\tCRITICAL timestamp $date\n" - fi - else - printf "$host\tbackups\t$STATE_UNKNOWN\tUNKNOWN timestamp no directory\n" - fi -done |