SweStore/swetrans arc

From SNIC Documentation
Jump to: navigation, search
#!/bin/bash 

function error_quit {
    echo -e "$@"
    echo
    echo -e 'Usage:'
    echo -e 'swstrans from|to [-r] from  to'
    echo -e '-r:\t potional; remove copied files'
    echo -e 'from:\t origin path; can include "*", "?" as wildcards'
    echo -e 'to:\t destination directory name ending with "/"'
    echo
    echo -e 'Example:'
    echo -e "swstrans to './run_1/fld*' JET/"
    echo -e 'Copies files fld* from local ./run_1/ to srm://srm.swegrid.se/snic/dnsturb/JET/'
    echo
    echo -e "swstrans from 'JET/fld*' ./run_1/"
    echo -e 'Copies files fld* from srm://srm.swegrid.se/snic/dnsturb/JET/ to local ./run_1/'
    exit 1
}

# parameters
srm_pth='srm://srm.swegrid.se/snic/'
srm_dom='dnsturb/'
swstr=$srm_pth$srm_dom
srm_cp='arccp'
srm_cp_opt=' --retries=3 --timeout=30'
srm_ls='arcls'
srm_rm='arcrm'
loc_rm='rm'
loc_mkdir='mkdirhier'
loc_ls='ls'
logfile='log_file'
errorfile='error_file'
awk='awk'
sed='sed'

# variables
remove=0
file_list=''
error_files=''
copied_files=''

# arguments
args=("$@")
argsnr=$#

# check arguments
# parameters number check
if [ $[argsnr] -lt 3 -o $[argsnr] -gt 4 ]; then
    error_quit 'Wrong arguments number!'
fi

# take paths
path_from="${args[$[argsnr-2]]}"
path_to="${args[$[argsnr-1]]}"

# separate directory and base names
base_from="${path_from##*/}"
dir_from="${path_from:0:${#path_from} - ${#base_from}}"

base_to="${path_to##*/}"
dir_to="${path_to:0:${#path_to} - ${#base_to}}"

# we don't overwrite any files, so base_to should be empty
if [ "${base_to}" != ""  ]; then
    error_msg='path_to should be directory name ending with "/"'
    error_quit ${error_msg}
fi

# change unix wildcards for awk
set -f
base_from=$(echo ${base_from}|$sed -e 's/\./\\./g' -e 's/\*/\.\*/g' -e 's/\?/\./g')
base_from="/^"$base_from"$/ {print}"

# first parameter check
case "${args[0]}" in
    from)
# check directories
# from
# create sestore path removing leading ./
	dir_from=$swstr$(echo ${dir_from}| $sed -e 's/^\.//' -e 's/^\///')
	`$srm_ls $dir_from 1>/dev/null 2>/dev/null`
	if [ $? -ne 0 ]; then
	    echo "Input directory: "${dir_from}" does not exist."| tee -a $logfile
	    exit 1
	fi
# to
	if [ ! -d  ${dir_to} ]; then
	    echo "Output directory: "${dir_to}" does not exist on local machine."| tee -a $logfile
	    echo "Creating: "${dir_to}| tee -a $logfile
	    `$loc_mkdir ${dir_to} 1>/dev/null`
	    if [ $? -ne 0 ]; then
		echo "Cannot create: "${dir_to}| tee -a $logfile
		exit 1
	    fi
	elif [ -L ${dir_to}  ]; then
	    echo "Output directory: "${dir_to}" is a symbolic link!"| tee -a $logfile
	    exit 1
	fi
# get file list
	file_list=`$srm_ls $dir_from 2>/dev/null | $awk "$base_from"`
#	file_list=$($srm_ls $dir_from 2>/dev/null | $awk '/f./ {print}')
# set rm, ls command
	rm=$srm_rm
	ls=$loc_ls
	;;
    to)
# check directories
# from
	if [ ! -d  ${dir_from} ]; then
	    echo "Input directory: "${dir_from}" does not exist on local machine!"| tee -a $logfile
	    exit 1
	fi
# to
# create sestore path removing leading ./
	dir_to=$swstr$(echo ${dir_to}| $sed -e 's/^\.//' -e 's/^\///')
	`$srm_ls $dir_to 1>/dev/null 2>/dev/null`
	if [ $? -ne 0 ]; then
	    echo "Output directory: "${dir_to}" does not exist."| tee -a $logfile
	    echo "It will be created by "${srm_cp}" during copying files."| tee -a $logfile
	fi
# get file list
	file_list=`$loc_ls $dir_from 2>/dev/null | $awk "$base_from"`

# set rm, ls command
	rm=$loc_rm
	ls=$srm_ls
	;;
    *) error_quit 'Wrong option'
	;;
esac


# check remove option
if [ $[argsnr] -eq 4 -a "${args[1]}" == "-r" ]; then
    remove=1
fi

# check file_list
if [ "$file_list" == "" ]; then
    echo 'List of files is empty; nothing to do'| tee -a $logfile
    exit 0
fi

# copy files
for file in ${file_list}; do
# we don't want to overwrite files, so check if the file exists
    `$ls $dir_to$file 1>/dev/null 2>/dev/null`
    if [ $? -ne 0 ]; then
	echo 'Copying file: '$dir_from$file' to '$dir_to | tee -a $logfile
	$srm_cp $srm_cp_opt $dir_from$file $dir_to 1>/dev/null 2> /dev/null
	if [ $? -eq 0 ]; then
	    echo 'Done: ' $dir_from$file `date +%c`| tee -a $logfile
	    copied_files=$copied_files' '$file
	else
	    echo 'ERROR copying: '$dir_from$file' transfer problem.' | tee -a $logfile
	    error_files=$error_files' '$file
	fi
    else
	echo 'ERROR copying: '$dir_from$file'; file: '$dir_to$file' exists. Skipping.' | tee -a $logfile
	error_files=$error_files' '$file
    fi
done

# removing copied files
if [ $[remove] -eq 1 ]; then
    for file in $copied_files; do
	echo 'Removing file: '$dir_from$file | tee -a $logfile
	`$rm $dir_from$file 1>/dev/null 2>/dev/null`
	if [ $? -eq 0 ]; then
	    echo $dir_from$file ' removed' | tee -a $logfile
	else
	    echo 'ERROR removing file: '$dir_from$file | tee -a $logfile
	fi
    done
fi

# output error list
if [ "$error_files" != "" ]; then
    echo 'Files not copied:' | tee -a $errorfile
    for file in $error_files; do
	echo $dir_from$file | tee -a $errorfile
    done
fi

echo 'Done: ' `date +%c`| tee -a $logfile

exit 0