#!/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