#! /bin/sh # ------------------------------------------------------------- # --- init # ------------------------------------------------------------- # leave on error set -e # set program name and filespec: call="$0 $*" case $0 in /* ) script=$0 ;; * ) script="`/bin/pwd`/$0" ;; esac bindir=`/usr/bin/dirname ${script}` prog=`/bin/basename ${script}` # ------------------------------------------------------------- # --- help # ------------------------------------------------------------- DisplayUsage () { ${PAGER:-less} << EOF NAME $prog - General Storage System : ECMWF EcAccess gateway USAGE ${prog} list [-l,--long] -l, --long : long listing including modes, times, sizes etc ${prog} get [-f,--force] [-m,--mkdir] ${prog} put [-f,--force] [-m,--mkdir] -f, --force : overwrite existing destination files if necessary -m, --mkdir : create destination directories if necessary FILE SPECIFICATION A file is specified by the name of the ftp server, double dot, and standard unix file name: ftp.int:path/file Use '~/.netrc' to assign login names and passwords to the ftp address: machine ftp.int login anonymous password you@work.com GENERAL OPTIONS -v, --verbose : display info on progress EOF exit 0 } # err 'help text' err () { echo "$1" 1>&2 } # errit errit () { err "$prog - ERROR - from : ${call}" err "$prog - ERROR - Use '$prog --help' for more info." exit $1 } # ------------------------------------------------------------- # --- arguments # ------------------------------------------------------------- options='' task='' filespecs='' verbose='' # extract arguments for arg in "$@" ; do case ${arg} in -h | --help ) DisplayUsage ;; -v | --verbose ) verbose='T' ;; -* ) options="${options} ${arg}" ;; * ) # task or (one of the) file(s) if [ -z "${task}" ]; then task=${arg} else filespec=${arg} filespecs="${filespecs} ${filespec}" fi ;; esac done # not complete ? if [ -z "${task}" ]; then err "$prog - no arguments specified" errit 1 fi # ------------------------------------------------------------- # --- functions # ------------------------------------------------------------- # # EvalSpecials ftp.int:data/a.txt # host=${FTP_HOST} # filespec=${FS} # # Extract the ftp host name, store in 'FTP_HOST', # return last part in variable 'FS' . # EvalSpecials () { # split in ftp host name and rest: FTP_HOST="`echo $1 | /usr/bin/cut -d ':' -f 1`" FS="`echo $1 | /usr/bin/cut -d ':' -f 2`" } # ------------------------------------------------------------- # --- begin # ------------------------------------------------------------- test ${verbose} && echo "$prog - $0 $*" # test task: case ${task} in # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # list file or directory # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'list' ) # extract options #eccommand='ecls' for option in ${options} ; do case ${option} in #-l | --long ) eccommand="ecdir" ;; -* ) err "$prog - unknown option '${option}' for task '${task}'" errit 1 ;; esac done # extract source and destination filespec: filespec='' for spec in ${filespecs} ; do EvalSpecials ${spec} if [ -z "${filespec}" ]; then filespec=${FS} else err "$prog - ERROR - task '${task}' requires single file specification only." errit 1 fi done if [ -z "${filespec}" ]; then err "$prog - ERROR - tasks '${task}' requires file specification." errit 1 fi # list files: /usr/bin/ftp ${FTP_HOST} << EOF dir ${filespec} EOF ;; # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # copy files # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'get' ) # extract options ecget_options='' do_mkdir='' for option in ${options} ; do case ${option} in -f | --force ) ecget_options="${ecget_options}" ;; -m | --mkdir ) do_mkdir='true' ;; -* ) err "$prog - unknown option '${option}' for task '${task}'" errit 1 ;; esac done # extract source and destination filespec: source_spec='' dest_spec='' for spec in ${filespecs} ; do EvalSpecials ${spec} if [ -z "${source_spec}" ]; then source_spec=${FS} elif [ -z "${dest_spec}" ]; then dest_spec=${FS} else err "$prog - ERROR - task '${task}' requires source and destination file specifications only." errit 1 fi done if [ -z "${dest_spec}" ]; then err "$prog - ERROR - task '${task}' requires source and destination file specifications." errit 1 fi # create destination directory ? # o destination is an existing file : not necessary # o destination is an existing directory : not necessary if [ ${do_mkdir} ] && [ ! -f ${dest_spec} ] && [ ! -d ${dest_spec} ]; then # destination is not an existing file or directory; # create the directory part of the destination: dest_dir=`/usr/bin/dirname ${dest_spec}` test "${dest_dir}" != "." && /bin/mkdir -p ${dest_dir} fi # copy file; suppress error messages: /usr/bin/ftp ${FTP_HOST} << EOF get ${source_spec} ${dest_spec} EOF ;; 'put' ) # extract options ecput_options='' do_mkdir='' for option in ${options} ; do case ${option} in -f | --force ) ecput_options="${ecput_options}" ;; -m | --mkdir ) do_mkdir='true' ;; -* ) err "$prog - unknown option '${option}' for task '${task}'" errit 1 ;; esac done # extract source and destination filespec: source_spec='' dest_spec='' for spec in ${filespecs} ; do EvalSpecials ${spec} if [ -z "${source_spec}" ]; then source_spec=${FS} elif [ -z "${dest_spec}" ]; then dest_spec=${FS} else err "$prog - ERROR - task '${task}' requires source and destination file specifications only." errit 1 fi done if [ -z "${dest_spec}" ]; then err "$prog - ERROR - task '${task}' requires source and destination file specifications." errit 1 fi # create destination directory ? mkdir_command='' if [ ${do_mkdir} ]; then # o destination is an existing file : not necessary # o destination is an existing directory : not necessary #if ! ${script} exist ${dest_spec} ; then # do not test if directory already exists, # this takes more time than just creation .. # supress error messages about already existing directories ... dest_dir=`/usr/bin/dirname ${dest_spec}` mkdir_command="mkdir ${dest_dir}" #fi fi # copy file: outfile='.gss.out' /usr/bin/ftp ${FTP_HOST} > ${outfile} 2>&1 << EOF ${mkdir_command} put ${source_spec} ${dest_spec} EOF # check on error : if ( /bin/grep 'Could not create file.' ${outfile} > /dev/null ) ; then err "$prog - ERROR - from ftp:" err "$prog - -------------------------------------------" /bin/cat ${outfile} err "$prog - -------------------------------------------" errit 1 else # ok /bin/rm -f ${outfile} fi ;; # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # task ??? # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ) err "$prog - ERROR - unsupported task '${task}'" errit 1 ;; esac # tasks # ------------------------------------------------------------- # --- end # ------------------------------------------------------------- test ${verbose} && echo "$prog - end" # ok exit 0