#!/bin/bash


#+++++++++++++++++++++++++++++++++++++++++++++++++++
# eSales Media Backup Script
#
# Author: Benjamin Roth
# Version: 18.0.3
#+++++++++++++++++++++++++++++++++++++++++++++++++++


if [ ! $1 -a $2 -a $3 ]
then
	echo "Wrong parameter count."
	exit 1
fi

#####################
#     PARAMETER     #
#####################
TARGETDIR=$2
SERVER=`echo $1 | awk -F:: '{ print $2 }'`
USER=`echo $1 | awk -F:: '{ print $3 }' | awk -F: '{ print $1 }'`
PASSWD=`echo $1 | awk -F:: '{ print $3 }' | awk -F: '{ print $2 }'`
WEEKLYDOW=`echo $1 | awk -F:: '{ print $4 }'`
JOBNAME=$3

##########################
#     PREREQUISITIES     #
##########################

# REMOTE DIR STRUCTURE
REMOTETREE=$(mktemp)
ftp -pn $SERVER <<END_OF_SESSION
quote USER $USER
quote PASS $PASSWD
ls -R $REMOTETREE
bye
END_OF_SESSION

grep ":$" $REMOTETREE | cut -d: -f1 | uniq | sort -o $REMOTETREE

# REQUIRED STRUCTURE
REQTREE=$(mktemp)
echo "weekly" >  $REQTREE
echo "daily" >>  $REQTREE

cat $REQTREE | cut -d: -f1 | uniq | sort -o $REQTREE

# compare local and remote, list missing remote directories
MISSINGDIR=$(mktemp)
for ITEM in $(diff $REMOTETREE $REQTREE | grep "^>" | cut -d\> -f2 ) ; do
	echo "$ITEM" >> $MISSINGDIR
done

# remove blank lines and lines where mkdir has no argument and clean up manually
sed -i '/^$/d' $MISSINGDIR
sed -i '/^mkdir$/d' $MISSINGDIR
echo "/" >> $MISSINGDIR		#harmless 'directory exists" to avoid empty file

# create missing directories
for ITEM in $(cat $MISSINGDIR); do
	ftp -pn $SERVER <<END_OF_SESSION
	user $USER $PASSWD
	cd /
	mkdir $ITEM
	bye
END_OF_SESSION
done

#####################
#     FUNCTIONS     #
#####################

function upload() {
	if [ ! $1 -a $2 ]
	then
		echo "Wrong parameter count."
		exit 1
	fi
	files=$1
	dir=$2

	## upload the files
	for ITEM in $(cat $files); do
		FILE=$(basename $ITEM)
		LOCALDIR=$(dirname $ITEM)
		REMOTEDIR=/${dir}/

		## ftp starts here
		ftp -pn $SERVER <<END_OF_SESSION
		user $USER $PASSWD
		binary
		lcd $LOCALDIR
		cd $REMOTEDIR
		put $FILE ._$FILE.part
		rename ._$FILE.part $FILE
		bye
END_OF_SESSION
	done
}

##############################
#     FETCH BACKUP FILES     #
##############################
if [ -d $TARGETDIR ]
then
	# Check for existing backup files
	COUNT=`find $TARGETDIR -maxdepth 1 -type f -regex ".*/${JOBNAME//\./\\.}_[0-9]*\(_?[0-9]*\)\..*" | wc -l`
	
	if [ "$COUNT" -gt 0 ]
	then
		MD5FILES=$(mktemp)

		UPLOADWEEKLY=$(mktemp)
		UPLOADDAILY=$(mktemp)

		find $TARGETDIR -maxdepth 1 -type f -regex ".*/${JOBNAME//\./\\.}_[0-9]*\(_?[0-9]*\)\.sql" -printf '%T@ %p\n' | sort -k 1n | sed 's/^[^ ]* //' | tail -n 1 |
		while read LINE
		do
			if [ -f $LINE ]
			then
				echo $LINE >> $UPLOADWEEKLY
				echo $LINE >> $UPLOADDAILY
				md5sum $LINE | awk '{print $1}' > ${LINE}.md5
				echo ${LINE}.md5 >> $MD5FILES
			fi
		done
		
		
		find $TARGETDIR -maxdepth 1 -type f -regex ".*/${JOBNAME//\./\\.}_[0-9]*\(_?[0-9]*\)\.tgz" -printf '%T@ %p\n' | sort -k 1n | sed 's/^[^ ]* //' | tail -n 1 |
		while read LINE
		do
			if [ -f $LINE ]
			then
				echo $LINE >> $UPLOADWEEKLY
				echo $LINE >> $UPLOADDAILY
				md5sum $LINE | awk '{print $1}' > ${LINE}.md5
				echo ${LINE}.md5 >> $MD5FILES
			fi
		done
		
		upload $UPLOADDAILY daily
		upload $MD5FILES daily

		if [ `date "+%u"` -eq $WEEKLYDOW ] || [ `date "+%w"` -eq $WEEKLYDOW ]
		then
			upload $UPLOADWEEKLY weekly
			upload $MD5FILES weekly
		fi


		for ITEM in $(cat $MD5FILES); do
			rm $ITEM
		done
	fi
fi

exit 0