#!/bin/sh # 0:disable debug, 1:enabled debug DEBUG=0 log(){ [ "$DEBUG" -eq 0 ] && return local level=$1 local msg=$2 local time=`date +"%m/%d %T"` case $1 in "i") msg=$time$logBy"[i] "$msg ;; "w") msg=$time$logBy"[war] "$msg ;; "e") msg=$time$logBy"[Error!] "$msg ;; *) msg=$time$logBy"[war] unknown msg level! "$msg ;; esac echo $msg >> $logFile } getShareDir(){ log i "get remote share dir, server mode[$1]..." if [ x"$1" == x"1" ]; then rsyncStdout=`eval $rs $rsopt "$un"@[${ip}]${uriColon}#qnaplist | awk 'BEGIN{FS="\t"} {print $1}'` elif [ x"$1" == x"2" ]; then rsyncStdout=`eval $rs $rsoptListDir "$un"@[${ip}]${uriColon} 2>/dev/null | awk '/^d/{ if (index($5,".") != 1) print $5}'` else rsyncStdout=`eval $rs $rsopt "$un"@[${ip}]${uriColon} | awk 'BEGIN{FS="\t"} {print $1}'` fi dirArr=() while read -r line; do log i "dir [$line]" [ ! -z "$line" ] && dirArr+=("$line") done <<< "$rsyncStdout" local dirNum=${#dirArr[@]} log i "dir number [$dirNum]" test $dirNum = 0 && log e "Remote share dir number = 0" i=0 while [ $i -lt $dirNum ] do dir=${dirArr[$i]} case $dir in "global") ;; "home") ;; "printers") ;; "Qsync") ;; "TMBackup") ;; *) log i "use folder [$dir]" eval "$2=\"$dir\"" break ;; esac i=$(($i+1)) done } genFile(){ local path=$1 local size=$2 local seek case ${size: -1} in "T") seek=${size%T}M;; "G") seek=${size%G}k;; "M") seek=${size%M};; *) log e "generating size=$size error!";; esac mkdir -p $(dirname $path) rm -f $path log i "generating $size file@$path" dd if=/dev/zero of=$path bs=1M count=0 seek=$seek > /dev/null 2>&1 log i "$size $path generated!" } sendDir(){ local ldir=\'$1\' local rdir=\'$2\' log i "send dir start: src=[$ldir]" eval $rs $rsopt $ldir "$un"@[${ip}]${uriColon}"${rdir}" > $speedData 2>&1 & log i "send dir end: dst=[$rdir]" } rmRemoteDir(){ local rdir="$1" local ldir="$myDir/$(basename $rdir)" log i "remove remote tmp dir..." log i "local dir: [$ldir]" rm -fr $ldir; touch $ldir log i "remote dir: [$rdir]" log i "upload empty file to overwrite remote dir [$rdir]" rsopt="$rsopt --delete" eval $rs $rsopt $ldir "$un"@[${ip}]${uriColon}"$(dirname $rdir)" > /dev/null 2>&1 log i "donwload remote empty file to local and remove it" rsopt="$rsopt --remove-source-files" eval $rs $rsopt "$un"@[${ip}]${uriColon}"${rdir}" "$(dirname $ldir)" > /dev/null 2>&1 rm -f $ldir log i "remove remote tmp dir done!" } killDelay(){ name=$1 delay=$2 killSh=$killSelf #generate kill script cat > $killSh <<-EOF #!/bin/sh sleep $delay killall -q $name EOF chmod +x $killSh $killSh & #sh -c $killSh & } rmOldFiles(){ local targetDir=$1 #abs path local oldTimeMax=$2 #seconds curTime=`date +%s` for i in `find $targetDir/*` do fileTime=`stat -c %Y $i` diffTime=$(($curTime - $fileTime)) [ $diffTime -gt $oldTimeMax ] && (log i "Remove old file/folder [$i]"; rm -rf $i) done } argCount=$# uriColon="::" # rsync daemon mode use double colon, eg:[USER@]HOST::SRC... case $argCount in "9") #rsync function ip="$1" port="$2" un=$(echo $3 | sed -e "s/'/'\\\\''/g; 1s/^/'/; \$s/\$/'/") # bug 100812 pw=$(echo $4 | sed -e "s/'/'\\\\''/g; 1s/^/'/; \$s/\$/'/") # password in side single quote action="$5" myDir="$6" #myDir=/tmp/rsyncSpeedTest logFile="$7" speedData="$8" sid="$9" logBy="-sh" smode=`test $un = "'admin'" && echo 1 || echo 0` rsyncPid=$myDir/pid.$sid ;; "10") #rsync function #for HBS, add arg 10 for distinguishing qnap or normal mode ip="$1" port="$2" un=$(echo $3 | sed -e "s/'/'\\\\''/g; 1s/^/'/; \$s/\$/'/") # bug 100812 pw_with_quote=$(echo $4 | sed -e "s/'/'\\\\''/g; 1s/^/'/; \$s/\$/'/") # password in side single quote pw=$4 action="$5" myDir="$6" #myDir=/tmp/rsyncSpeedTest logFile="$7" speedData="$8" sid="$9" mode=${10} logBy="-sh" smode=$mode rsyncPid=$myDir/pid.$sid ;; "11") # spec 12735 for HBS, add arg 11 of ssh port that require by server mode == 2 ip="$1" port="$2" un="$3" pw_with_quote=$(echo $4 | sed -e "s/'/'\\\\''/g; 1s/^/'/; \$s/\$/'/") # password in side single quote pw=$4 action="$5" myDir="$6" #myDir=/tmp/rsyncSpeedTest logFile="$7" speedData="$8" sid="$9" smode="${10}" ssh_port="${11}" logBy="-sh" rsyncPid=$myDir/pid.$sid ;; "6") #log function myDir="$4" #myDir=/tmp/rsyncSpeedTest logFile="$5" speedData="$6" logBy="-C" log "$1" "$2" "$3" # $1=level $2=msg $3=caller exit ;; *) log "===>'$#'=$#, '$1'=$1 '$2'=$2 '$3'=$3 '$4'=$4 '$5'=$5 '$6'=$6" echo "#=$#" echo "1=$1, 2=$2, 3=$3, 4=$4, 5=$5" ;; esac if [ x"$smode" == x"2" ]; then rsopt="-e 'ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -l $un -j \"$pw\" -p $ssh_port' -avPS" rsoptListDir="-e 'ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -l $un -j \"$pw\" -p $ssh_port' " uriColon=":" # server mode 2 is use rsync shell mode, need change to use single colon echo "$rsopt" else rsopt="-avP --sever-mode=$smode --password=$pw_with_quote --port=$port -S" rsoptListDir=$rsopt fi rs=$myDir/rsync.$sid tmpDir=$myDir/.$(basename $myDir)@ #[.rsyncSpeedTes@] remove remote dir purpos only tmpf=$myDir/tmp.$sid killSelf=$myDir/killSelf.sh.$sid RSYNC_CMD="/mnt/ext/opt/HybridBackup/bin/rsync" case $action in "start") log i "ip=$1 port=$2 un=$3 pw=$4 action=$5" log i "Clean test environment" killall $(basename $rs) $(basename $killSelf) [ "$DEBUG" -eq 0 ] && (rm -rf $myDir/*.$sid $tmpDir) rmOldFiles $myDir 600 #Remove files older than 600 secs log i "tmpDir: [$tmpDir]" mkdir -p $tmpDir ln -s ${RSYNC_CMD} $rs getShareDir $smode rdir rMyDir="$rdir/$(basename $tmpDir)" test -z "$rdir" && (log e "Remote share dir is empty!"; exit) || (log i "remote share dir = [$rdir]") delay=20 # log i "Killself start, delay=$delay" # killDelay $(basename $rs) $delay sendDir $tmpDir "$rdir" #create rMyDir if [ x"$smode" == x"2" ]; then # the spped over ssh will more slow, we use 1G is enough. genFile $tmpf 1G else genFile $tmpf 5G fi sendDir $tmpf "$rMyDir" #send file to rMyDir ;; "stop") getShareDir $smode rdir rMyDir="$rdir/$(basename $tmpDir)" log i "[stop] Stop test processes" killall $(basename $rs) $(basename $killSelf) log i "[stop] remove remote leftovers: $rMyDir" rmRemoteDir "$rMyDir" log i "[stop] remove local leftovers" [ "$DEBUG" -eq 0 ] && (rm -rf $myDir/*.$sid $tmpDir) ;; *) log i "unexcept action[$action]" ;; esac #[ok]--req#502, MS, v4.2.0, 2014/12/31