#!/bin/bash
#set -x

#  Author: Michael Lustfield
#  Date: May 13, 2008
#  Description: Used for performing backups over network
#  to a server authenticated via pre-shared keys. Pulls
#  data from /root/.backup-data.
#  ! This script requires that sshfs, sendemail be
#  installed. !


# Declare arrays
declare -a filedata
declare -a csrc
declare -a cdest

# Some variables based on host
host="$(hostname)"
mrdir="/home/$host/data"
mldir="/mnt/backup$RANDOM"
subject="Server Backup: $host, $(date)"

logfile="/var/log/backup-exec.log"

# Load file-data
i=0
while IFS= read line; do
	filedata[i]="$line"
	(( i++ ))
done < /root/.backup-data

# Parse file data
c1=0
c2=0
m=$i
for (( i=0; i<=m; i++ )); do
	case "$i" in
		'0')
			adminemail=${filedata[0]}
			;;
		'1')
			smtpserver=${filedata[1]}
			;;
		'2')
			server=${filedata[2]}
			;;
		'3')
			nomount=${filedata[3]}
			;;
		'4')
			blank='expansion'
			;;
		*)
			if [ $((i % 2)) -eq 0 ]; then
				cdest[$c1]=${filedata[$i]}
				(( c1++ ))
			else
				csrc[$c2]=${filedata[$i]}
				(( c2++ ))
			fi
			;;
	esac
done

datalength=$(( c1-1 ))

# Check src/dest
c1=${#cdest[@]}
c2=${#csrc[@]}

if [ "$c1" != "$(($c2-1))" ]; then
	msg="Error 243: Unequal I/O Fields"
	echo "Error 243: Unequal I/O Fields"
	sendEmail -f "root@$host.com" -t "$adminemail" -u "$subject" -m "$msg" -s "$smtpserver:25"
	exit 1
fi

# Create backup directory
mkdir $mldir

# Mount backup directory
msg="Backup of $host to $server"
sshfs "$host@$server:$mrdir" "$mldir"
#msg="$( echo "$msg"; echo "Mounted Backup Directories:"; mount | grep backup )"

# Verify backup directory is mounted
mount | grep "$mldir"
chk="$?"
if [[ "$chk" != "0" ]]; then
	msg="$( echo "$msg"; echo "---ERROR: REMOTE BACKUP DIRECTORY WAS NOT MOUNTED---")"
	if [[ "$nomount" = "die" ]]; then
		msg="$( echo "$msg"; echo "backup-data requested \"die\". Backup Not Performed")"
		dead="yes"
	fi
fi

# Log start
echo "Begin Backup$(date)" >> $mldir/log

# Backup specified data
for (( i=0; i<=$datalength; i++ )); do

	# Check death
	if [[ "$dead" = "yes" ]]; then
		continue
	fi

	# Make variables easier to read
	src="${csrc[$i]}"
	dest="${cdest[$i]}"
	msg="$( echo "$msg"; echo "Backup $src to $mldir/$dest.")"

	## Make sure backup destination exists
	#if [ ! -e "$mldir/$dest" ]; then
	#	mkdir "$mldir/$dest"
	#fi

	# Check for empty directory
	if [[ "$(ls -1A "$src" | wc -l)" == "0" ]]; then
		msg="$( echo "$msg"; echo "!ERROR! EMPTY DIR: $src.")"
		continue
	fi

	# Perform sync
	rsync -rupEz --safe-links --delete --force "$src" "$mldir/$dest"
done

# Log end

echo "End Backup: $(date)" >> $mldir/log

# Unmount backup directory
umount $mldir; sleep 5; umount $mldir; sleep 1
#msg="$( echo "$msg"; echo "Mounted Backup Directories:"; mount | grep backup )"

# Send alert email
sendEmail -f "root@$host.com" -t "$adminemail" -u "$subject" -m "$msg" -s "$smtpserver:25"

# Remove backup directory
rmdir $mldir

echo "Completed backup"

exit
