#!/bin/bash ### Backup Script # Monthly backups created on the 1st of the month, within rotation # Daily backups created everyday, within rotation . /etc/rbackup/rbackup.conf ############################################################################ ### Script Variables X="--exclude-from=/etc/rbackup/filter.conf" DAY=`date +%b%d` DAY01=`date +%d` ############################################################################ lock=/var/lock/rbackup.lock if [ -f "$lock" ]; then pid=`head -n 1 $lock` testpid=`ps -p $pid --no-headers` if [ -z "$testpid" ]; then echo $$ > $lock else echo "RBackup already running... Aborting." exit 0 fi else echo $$ > $lock fi set -e ############################################ Clean up Functions ######################################### local_day_cleanup () { echo "Cleaning up old daily backups." COUNT=1 for backup in `ls --hide=*01 -t $TARGET 2>/dev/null`; do if [ $backup == $DAY ]; then echo "Today's backup($backup) already exists, re-syncing." touch $TARGET/$backup COUNT=0 fi if [ $COUNT -ge $DAYROTATION ]; then rm -rf $TARGET/$backup fi let COUNT=$COUNT+1 done } remote_day_cleanup () { echo "Cleaning up old daily backups." COUNT=1 for backup in `ssh $BACKUPHOST "ls --hide=*01 -t $TARGET 2>/dev/null"`; do if [ $backup == $DAY ]; then echo "Today's backup($backup) already exists, re-syncing." `ssh $BACKUPHOST "touch $TARGET/$backup"` COUNT=0 fi if [ $COUNT -ge $DAYROTATION ]; then ssh $BACKUPHOST "rm -rf $TARGET/$backup" fi let COUNT=$COUNT+1 done } local_month_cleanup () { echo "Cleaning up old monthly backups." COUNT=0 for backup in `ls -td $TARGET/*01 2>/dev/null`; do if [ $backup == $DAY ]; then echo "Today's backup($backup) already exists, re-syncing." touch $backup COUNT=0 fi if [ $COUNT -ge $MONTHROTATION ]; then rm -rf $backup fi let COUNT=$COUNT+1 done } remote_month_cleanup () { echo "Cleaning up old monthly backups." COUNT=0 for backup in `ssh $BACKUPHOST "ls -td $TARGET/*01 2>/dev/null"`; do if [ $backup == $DAY ]; then echo "Today's backup($backup) already exists, re-syncing." `ssh $BACKUPHOST "touch $backup"` COUNT=0 fi if [ $COUNT -ge $MONTHROTATION ]; then ssh $BACKUPHOST "rm -rf $backup" fi let COUNT=$COUNT+1 done } ################################################ sync functions #################################### sync_remote () { LD="--link-dest=$TARGET/`ssh $BACKUPHOST "ls -t $TARGET/ |head -n1"`" echo "Backup began: `date`" for source in $SOURCES; do rsync -a --delete $RSYNC_FLAGS $X --exclude=$TARGET $LD \ $source $BACKUPHOST:$TARGET/$DAY && echo "Successful backup of $source." done ssh $BACKUPHOST "if [ -e $TARGET/$DAY ]; then touch $TARGET/$DAY; fi" if [ -n "$SQLDB" ]; then for db in $SQLDB; do mysqldump $db |ssh $BACKUPHOST "cat > $TARGET/$DAY/$db.sql" && echo "Database $db saved." done fi } sync_local () { LD="--link-dest=$TARGET/`ls -t $TARGET/ |head -n1`" echo "Backup began: `date`" for source in $SOURCES; do rsync -a --delete $RSYNC_FLAGS $X --exclude=$TARGET $LD $source \ $TARGET/$DAY && echo "Successful backup of $source." done if [ -e $TARGET/$DAY ]; then touch $TARGET/$DAY; fi if [ -n "$SQLDB" ]; then for db in $SQLDB; do mysqldump $db > $TARGET/$DAY/$db.sql && echo "Database $db saved." done fi } ###################################################################################################### if [ -n "$BACKUPHOST" ]; then echo "Rsyncing to Remote Backup Filesystem." remote_day_cleanup sync_remote remote_month_cleanup else echo "Rsyncing to Local Backup Filesystem." local_day_cleanup sync_local local_month_cleanup fi echo "Backup Completed: `date`" rm -f $lock >/dev/null exit 0