Fork me on GitHub

Basic Backup Script

This is a very basic and rough script.

It uses diskutil on Mac OS X to generate a disk image and then copy this disk image to a location. Improvements are welcome.

#!/bin/bash

##
## Very Basic backup script. V.00003
##

# Copyright 2006 Henri Shustak GNU GPU v3

## Settings

# Log File
logfile=""

backup_name="Backup1"

# Volume with Data
backup_src_volume="/Volumes/SoruceVolume"

# This is messy - should be fixed
if [ "${backup_src_volume}" == "/" ] ; then
        # Only works with source volumes with no spaces - due the last awk - either improve this script or put in the actual volume name
        will_it_work=`ls -l /Volumes/ | grep -e "-> /$" | awk -F " -> /" '{print $1}' | awk '{print NF}'`
        if [ $will_it_work == 9 ] ; then 
        	backup_src_volume=/Volumes/`ls -l /Volumes/ | grep -e "-> /$" | awk -F " -> /" '{print $1}' | awk '{print $9}'`
        else
        	echo "WARNING! : Specify the full volume name, even if it is the root directory." | tee -ai >> "$logfile"
        fi
fi

# Folder to Backup 
backup_src="${backup_src_volume}/path/to/directory/to/backup"

# Volume we are using for backups
backup_dst_volume=/Volumes/DestVolumeName

# Destination for Backup
backup_dst="/Volumes/${backup_dst_volume}/Backups/${backup_name}/"

# Backup Locking 
lock_file_dir="/tmp/"
primary_lock_file_name="${lock_file_dir}basic_backup_inprogress.lock"

# Templocation for files
temp_location="/tmp/"

## Preflight Check
backup_volume_name=`basename "$backup_dst_volume"`
backup_volume_check=`ls /Volumes/ | grep -x "$backup_volume_name"`
if [ "$backup_volume_check" != "$backup_volume_name" ] ; then
	echo "ERROR! : Volume is unavailible" | tee -ai >> "$logfile"
	echo "         Backup will not continue" | tee -ai >> "$logfile"
	exit -1
fi



function run_backup {
       
       	current_date=`date "+%Y-%m-%d"`
		backup_image="${backup_name}-(${current_date}).dmg"
       
       	# Check if the directorys to backup and the backup destinations availible and that todays backup has not already been copied
        if [ -d "$backup_src_volume" ] && [ "$backup_src" ] && [ -d "$backup_dst" ] && ! [ -f "${backup_dst}${backup_image}" ] ; then
     
     		# Carry on with the backup 
  
			touch "${primary_lock_file_name}"
	 
			echo "Backup Commencing..." | tee -ai >> "$logfile"
			 
			# Check Temporary Image is not already there 
			if ! [ -f "${temp_location}${backup_image}" ] ; then

				# Create Encrypted Disk Image
				/bin/echo -n "    " >> "$logfile"
				hdiutil create -srcfolder "${backup_src}" "${temp_location}${backup_image}" 2>&1 >> "$logfile"
				if [ $? != 0 ] ; then
						echo "    WARNING! : Failed to Create Temporary Backup Disk Image" | tee -ai >> "$logfile"
				fi	
	
				if ! [ -f "${temp_location}${backup_image}" ] ; then
					echo "    WARNING! : Unable to copy backup image to backup directory" | tee -ai >> "$logfile"
					echo "               File : ${temp_location}${backup_image} dose not exist" | tee -ai >> "$logfile"
				else
					# Perform Copy
					echo "     Copying up backup image to backup volume..." | tee -ai >> "$logfile"
					ditto -rsrc "${temp_location}${backup_image}" "${backup_dst}${backup_image}"
					if [ $? != 0 ] ; then
						echo "      WARNING! : Error while coping the backup image" | tee -ai >> "$logfile"
					fi
					
					# Remove Temp File
					rm "${temp_location}${backup_image}"
					if [ $? != 0 ] ; then
						echo "    WARNING! : error removing temporary disk image file." | tee -ai >> "$logfile"
					else
						echo "    Backup Complete." | tee -ai "$logfile"
					fi
						
				fi
			else 
				echo "    ERROR! : Temporary Backup Image Exists. This backup will not complete. " | tee -ai >> "$logfile"
			fi
				
			rm "${primary_lock_file_name}"
		
		fi
		
	

}


function open_log {
	echo "#######################" >> $logfile
	echo "`date`" >> $logfile
	echo "" >> $logfile
}

function close_log {
	echo "" >> "$logfile"
	echo "" >> "$logfile"
	echo "" >> "$logfile"
}


if [ "${logfile}" == "" ] ; then
	logfile=/dev/null
fi


if ! [ -d "$backup_dst" ] ; then
        echo "    ERROR: Backup Destination Directory is not available. Backup stopped." | tee -ai "$logfile"
        echo "           Specified Backup Directory : $backup_dst" | tee -ai "$logfile"
        close_log
        exit -1
fi

day_of_the_week=`date | cut -c -3`



open_log

#if [ "${day_of_the_week}" == "Fri" ] ; then
	run_backup
#fi


close_log



exit 0