193 lines
5.8 KiB
Text
193 lines
5.8 KiB
Text
|
#!/bin/bash
|
||
|
#
|
||
|
# egrdbackup
|
||
|
#
|
||
|
# (c) 2006 Egressive Limited
|
||
|
# Backup script using rdiff-backup
|
||
|
# by rob@egressive.com
|
||
|
# modified by dave@egressive.com 20060920
|
||
|
# modified rob@egressive.com 20061206 moved config items into seperate .conf file
|
||
|
#
|
||
|
##
|
||
|
# Description - egrdbackup performs one task:
|
||
|
#
|
||
|
# Performs incremental backups of designated directory
|
||
|
# hierarchy or backup set (minus any exclusions) into a designated
|
||
|
# backup directory.
|
||
|
#
|
||
|
# The current view of the data at any time will reflect the most
|
||
|
# recent state of all the files in the backup set. Diffs for
|
||
|
# older versions of all files are stored in hidden directories.
|
||
|
# Older versions of any file can be recovered using rdiff-backup directly.
|
||
|
#
|
||
|
# For example, to recover a backup of the directory (and contents) of
|
||
|
# /home/operations from 4 days ago, where the backup directory is /backups, run:
|
||
|
#
|
||
|
# rdiff-backup -r 4D /backups/home/operations/ /home/operations/recovered-$(date "+%Y-%m-%d")
|
||
|
#
|
||
|
##
|
||
|
#
|
||
|
# Default Settings
|
||
|
#
|
||
|
DEBUG=false
|
||
|
#
|
||
|
if [ $DEBUG == "true" ] ; then
|
||
|
echo "Default Settings"
|
||
|
fi
|
||
|
#
|
||
|
RDIFF_COMMAND=`which rdiff-backup`
|
||
|
MAIL_COMMAND=`which mail`
|
||
|
DF_COMMAND=`which df`
|
||
|
GREP_COMMAND=`which grep`
|
||
|
TAIL_COMMAND=`which tail`
|
||
|
NICE_COMMAND=`which nice`
|
||
|
HEAD_COMMAND=`which head`
|
||
|
CAT_COMMAND=`which cat`
|
||
|
DIRNAME_COMMAND=`which dirname`
|
||
|
BASENAME_COMMAND=`which basename`
|
||
|
MAIL_TO=root # temporary - overridden in CONF_FILE
|
||
|
#
|
||
|
#
|
||
|
#EGRD_ROOT=/etc/egscripts/egrdbackup
|
||
|
EGRD_ROOT=`$DIRNAME_COMMAND $0`
|
||
|
EGRD_SCRIPT=`$BASENAME_COMMAND $0`
|
||
|
# config file
|
||
|
CONF_FILE=$EGRD_ROOT/$EGRD_SCRIPT.conf
|
||
|
# name of file to run before and after rdiff-backup runs - for example an initial rsync or usb mount
|
||
|
INITIAL_CMD_FILE="initial.sh"
|
||
|
POST_CMD_FILE="postrun.sh"
|
||
|
#
|
||
|
INITIAL_CMD_FILE_OK="true"
|
||
|
#
|
||
|
# initialise end status
|
||
|
BACKUP_STATUS="[SUCCESS]"
|
||
|
#
|
||
|
# Get local configuration
|
||
|
#
|
||
|
if [ $DEBUG == "true" ] ; then
|
||
|
echo "Get Local Settings"
|
||
|
fi
|
||
|
if [ -x $CONF_FILE ] ; then
|
||
|
. $CONF_FILE
|
||
|
else
|
||
|
$CAT_COMMAND $LOGFILE | $MAIL_COMMAND -s "[ERROR] Could not find config file for $SERVERNAME backup" $MAIL_TO
|
||
|
exit 1
|
||
|
fi
|
||
|
# logfile
|
||
|
LOGFILE=/var/log/$EGRD_LOGNAME.log # use logrotate to manage logs
|
||
|
#
|
||
|
#
|
||
|
##
|
||
|
if [ $DEBUG == "true" ] ; then
|
||
|
echo "Remove Older versions"
|
||
|
fi
|
||
|
#
|
||
|
# You will need a --force the first time you run, or if you clear out the $RDIFF_DEST
|
||
|
# directory at any stage. Probably safer not to use it normally.
|
||
|
#
|
||
|
# check to see if the default rdiff revision directory is in place - if so, don't force
|
||
|
#
|
||
|
if [ "$RDIFF_FORCE" == "true" ] ; then
|
||
|
RDIFF_FORCE_ARG=" --force "
|
||
|
fi
|
||
|
#
|
||
|
#
|
||
|
# If an initial command file exists (say to do an rsync first)
|
||
|
#
|
||
|
if [ -x $EGRD_ROOT/$INITIAL_CMD_FILE ] ; then
|
||
|
. $EGRD_ROOT/$INITIAL_CMD_FILE
|
||
|
fi
|
||
|
#
|
||
|
if ! [ $INITIAL_CMD_FILE_OK == "true" ]
|
||
|
then
|
||
|
BACKUP_STATUS="[ERROR]"
|
||
|
BACKUP_ERROR=" | Error during initial setup"
|
||
|
echo "Fatal error while running initial.sh" >> $LOGFILE 2>> $LOGFILE
|
||
|
$CAT_COMMAND $LOGFILE | $MAIL_COMMAND -s "$BACKUP_STATUS $SERVERNAME backup $BACKUP_ERROR" $MAIL_TO >> $LOGFILE 2>> $LOGFILE
|
||
|
echo "Email sent to $MAIL_TO" >> $LOGFILE
|
||
|
echo "Script complete" >> $LOGFILE 2>> $LOGFILE
|
||
|
echo "" >> $LOGFILE
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
if test -d $RDIFF_DEST/rdiff-backup-data ; then
|
||
|
if test -n $RDIFF_DAYS_OF_REVISIONS ; then
|
||
|
#
|
||
|
echo "++++++++++++++++++++++++++++++++++++++++++" >> $LOGFILE
|
||
|
echo " Deleting revisions older than $RDIFF_DAYS_OF_REVISIONS days " >> $LOGFILE
|
||
|
echo "++++++++++++++++++++++++++++++++++++++++++" >> $LOGFILE
|
||
|
# run delete command...
|
||
|
echo "Running command: $NICE_COMMAND $RDIFF_COMMAND --force --remove-older-than ${RDIFF_DAYS_OF_REVISIONS}D $RDIFF_DEST" >> $LOGFILE
|
||
|
if ! $NICE_COMMAND $RDIFF_COMMAND --force --remove-older-than ${RDIFF_DAYS_OF_REVISIONS}D $RDIFF_DEST >> $LOGFILE 2>> $LOGFILE ; then
|
||
|
if ! $TAIL_COMMAND -2 $LOGFILE | $GREP_COMMAND "No increments older" > /dev/null 2>> $LOGFILE ; then
|
||
|
BACKUP_STATUS="[ERROR]"
|
||
|
BACKUP_ERROR=" | Error deleting revisions"
|
||
|
fi
|
||
|
fi
|
||
|
fi
|
||
|
fi
|
||
|
#
|
||
|
##
|
||
|
ALL_RDIFF_EXCLUDES=""
|
||
|
if [ -n "$RDIFF_EXCLUDES" ] ; then
|
||
|
for i in $RDIFF_EXCLUDES ; do
|
||
|
ALL_RDIFF_EXCLUDES=$ALL_RDIFF_EXCLUDES" --exclude $i "
|
||
|
done
|
||
|
fi
|
||
|
#
|
||
|
# Start Rdiff-backup!
|
||
|
#
|
||
|
# make sure log file exists
|
||
|
if [ $DEBUG == "true" ] ; then
|
||
|
echo "Start backup"
|
||
|
fi
|
||
|
touch $LOGFILE
|
||
|
DATE=`date`
|
||
|
echo "+++++++++++++++++++++++++++++++++++++++++++" >> $LOGFILE
|
||
|
echo " Starting backup ($DATE) " >> $LOGFILE
|
||
|
echo "+++++++++++++++++++++++++++++++++++++++++++" >> $LOGFILE
|
||
|
echo "Running command: $NICE_COMMAND $RDIFF_COMMAND $RDIFF_ARGS $ALL_RDIFF_EXCLUDES $RDIFF_SRC $RDIFF_DEST " >> $LOGFILE
|
||
|
if ! $NICE_COMMAND $RDIFF_COMMAND $RDIFF_FORCE_ARG $RDIFF_ARGS $ALL_RDIFF_EXCLUDES $RDIFF_SRC $RDIFF_DEST \
|
||
|
>> $LOGFILE 2>> $LOGFILE ; then
|
||
|
echo "Error Code - rdiff-backup returned: $?" >> $LOGFILE
|
||
|
fi
|
||
|
if ! $TAIL_COMMAND -3 $LOGFILE | $GREP_COMMAND "Errors 0" > /dev/null 2>> $LOGFILE
|
||
|
then
|
||
|
BACKUP_STATUS="[ERROR]"
|
||
|
BACKUP_ERROR=$BACKUP_ERROR" | Error during backup"
|
||
|
fi
|
||
|
#
|
||
|
if [ $DEBUG == "true" ] ; then
|
||
|
echo "============================="
|
||
|
tail -10 $LOGFILE
|
||
|
echo "============================="
|
||
|
fi
|
||
|
#
|
||
|
if [ $DEBUG == "true" ] ; then
|
||
|
echo "Log and email out results"
|
||
|
fi
|
||
|
#
|
||
|
echo "File system usage:" >> $LOGFILE
|
||
|
$DF_COMMAND -h >> $LOGFILE 2>> $LOGFILE
|
||
|
#
|
||
|
if [ $DEBUG == "true" ] ; then
|
||
|
echo "Finish"
|
||
|
fi
|
||
|
#
|
||
|
DATE=`date`
|
||
|
echo "+++++++++++++++++++++++++++++++++++++++++++" >> $LOGFILE
|
||
|
echo " Completed backup ($DATE) " >> $LOGFILE
|
||
|
echo "+++++++++++++++++++++++++++++++++++++++++++" >> $LOGFILE
|
||
|
#
|
||
|
#
|
||
|
# If a post command file exists (say to unmount a usb drive)
|
||
|
#
|
||
|
if [ -x $EGRD_ROOT/$POST_CMD_FILE ] ; then
|
||
|
. $EGRD_ROOT/$POST_CMD_FILE
|
||
|
fi
|
||
|
#
|
||
|
$CAT_COMMAND $LOGFILE | $MAIL_COMMAND -s "$BACKUP_STATUS $SERVERNAME backup $BACKUP_ERROR" $MAIL_TO >> $LOGFILE 2>> $LOGFILE
|
||
|
echo "Email sent to $MAIL_TO" >> $LOGFILE
|
||
|
echo "Script complete" >> $LOGFILE 2>> $LOGFILE
|
||
|
echo "" >> $LOGFILE
|