#!/bin/bash # Full path of configuration file CONF_FILE="/etc/incremental_backup/incremental_backup.conf" echo "----------------- RIBS ----------------" echo "--- Rod's Incremental Backup System ---" echo "" # Read the configuration file echo -n "Reading configuration file... " source $CONF_FILE if [ $? -ne 0 ]; then echo -e "\e[31mFAILED\e[0m" echo "Aborting." exit 1 else echo -e "\e[32mOK\e[0m" fi # Today's date DAY0=`date -I` echo "Today's date: $DAY0" # Previous backup's date DAY1=`ls $BACKUP_ROOT | grep -v lost+found | tail -n1` if [ "$DAY1" == "" ]; then DAY1=`date -I -d "yesterday"` echo "No previous backup date. Using yesterday's date." elif [ "$DAY1" == "$DAY0" ]; then DAY1=`ls $BACKUP_ROOT | grep -v lost+found | tail -n1 | head -n1` echo "Previous backup date: $DAY1" else echo "Previous backup date: $DAY1" fi # target directory TRG="$BACKUP_ROOT/$DAY0" # link destination directory: LNK="$BACKUP_ROOT/$DAY1" # rsync options OPT="-ah --delete --link-dest=$LNK --exclude-from=$EXC_FILE" if [ "$DRY_RUN" -eq 1 ]; then OPT="$OPT -n" fi echo -n "Run started " date echo "" # -------- Start backup ------- echo "Starting incremental backup." if [ "$DRY_RUN" -eq 1 ]; then echo "This will be a dry run. Nothing will actually be backed up." sleep 10 fi # Check to see if the backup drive is connected echo -n "Checking if device connected... " if [ ! -b "$BACKUP_DEV" ]; then echo -e "\e[31mFAILED\e[0m" echo "The backup device is not present." echo "Check to make sure it's connected and powered on and that the" echo "device name in $CONF_FILE is correct." echo "Aborting." exit 1 else echo -e "\e[32mOK\e[0m" fi # Check that the backup drive serial number is correct echo -n "Checking device serial number... " dev_sn=`smartctl -a $BACKUP_DEV|grep "Serial Number:"|cut -d: -f2| sed 's/[[:space:]]//g'` if [ "$dev_sn" != "$BACKUP_DEV_SN" ]; then echo -e "\e[31mFAILED\e[0m" echo "The backup device that is attached does not have the correct" echo "serial number. Make sure the correct device is connected and" echo "check that the serial number in $CONF_FILE" echo "matches the serial number of the device as reported by" echo "smartctl -a $BACKUP_DEV" echo "Aborting." exit 1 else echo -e "\e[32mOK\e[0m" fi # Mount the backup drive # First, check to see that drive is mounted mount|grep -q $BACKUP_PART if [ $? -ne 0 ]; then echo -n "Backup device partition not mounted. Mounting read-only... " mount $BACKUP_PART $BACKUP_ROOT -o ro if [ $? -ne 0 ]; then echo -e "\e[31mFAILED\e[0m" echo "An error was encountered while attempting to mount" echo "$BACKUP_PART on $BACKUP_ROOT" echo "Aborting." exit 1 else echo -e "\e[32mOK\e[0m" fi fi # Next, if it's mounted ro, remount it rw mount|grep $BACKUP_PART |grep -q "(rw)" if [ $? -ne 0 ]; then echo "Backup device partition mounted read-only." echo -n " Remounting read-write... " mount $BACKUP_PART $BACKUP_ROOT -o remount,rw if [ $? -ne 0 ]; then echo -e "\e[31mFAILED\e[0m" echo "An error was encountered while attempting to mount" echo "$BACKUP_PART on $BACKUP_ROOT in read-write mode." echo "Aborting." exit 1 else echo -e "\e[32mOK\e[0m" fi else echo "Backup device partition already mounted read-write. Continuing" fi # Execute the backup echo -n "running rsync backup... " rsync $OPT $SRC $TRG if [ $? -ne 0 ]; then echo -e "\e[31mFAILED\e[0m" echo "An error was encountered while attempting to backup. No old" echo "backups will be removed." if [ "$REMOUNT" -eq 1 ]; then mount $BACKUP_PART $BACKUP_ROOT -o remount,ro else umount $BACKUP_ROOT fi exit 1 else echo -e "\e[32mOK\e[0m" fi # Date of $DAY_LMT DAY_TO_REMOVE=`date -I -d "$DAY_LMT days ago"` # Delete the specified backup, if it exists if [ "$DRY_RUN" -eq 1 ]; then echo "This is a dry run, so no old backups will be removed." else if [ -d $BACKUP_ROOT/$DAY_TO_REMOVE ]; then echo -n "Removing oldest backup... " rm -r $BACKUP_ROOT/$DAY_TO_REMOVE if [ $? -ne 0 ];then echo -e "\e[31mFAILED\e[0m" else echo -e "\e[32mOK\e[0m" fi fi fi # Unmount the backup drive and exit echo -n "Syncing disks... " sync if [ $? -ne 0 ];then echo -e "\e[31mFAILED\e[0m" else echo -e "\e[32mOK\e[0m" fi if [ "$REMOUNT" -eq 1 ]; then echo -n "Remounting backup device read-only... " mount $BACKUP_PART $BACKUP_ROOT -o remount,ro if [ $? -ne 0 ]; then echo -e "\e[31mFAILED\e[0m" else echo -e "\e[32mOK\e[0m" fi else echo -n "Unmounting backup device... " umount $BACKUP_PART if [ $? -ne 0 ]; then echo -e "\e[31mFAILED\e[0m" else echo -e "\e[32mOK\e[0m" fi fi echo "Backup complete." echo "" echo -n "Run ended " date echo "" exit 0