154f871dec4299c79113834fd45f17a4521ad8c6 jcasper Wed Nov 23 22:07:55 2022 -0800 Replacing lockfile in fetchCramReference with flock, to remove the procmail dependency. Also updating the browserbox version to match the current server version. refs #17547, #14717 diff --git src/product/scripts/fetchCramReference.sh src/product/scripts/fetchCramReference.sh index 9b66c52..ed36df3 100755 --- src/product/scripts/fetchCramReference.sh +++ src/product/scripts/fetchCramReference.sh @@ -1,116 +1,111 @@ #!/bin/bash set -beEu -o pipefail umask 002 # Given two directories: one containing files with URLs of files that need # to be downloaded and the other as a destination for those files, # perform the downloads. Locks are used to prevent multiple instances # from colliding. On error, an error file is generated and the lock is left # in place. User intervention is required to then resolve the issue. export MAXTRIES=5 usage() { echo "fetchCramReference.sh - fetch reference sequence files from remote servers" echo "Usage:" echo -e "\tfetchCramReference.sh <pending> <destination> <error>" echo "Where: <pending>, <destination>, and <error> are all directories." echo "This program provides automated download of remote files." echo "The files in the pending directory should contain the URLs" echo "of files to be downloaded - one per file. The downloads" echo "will be placed in the destination directory using the name" echo "the file possessed in the pending directory. In the event of" echo "a problem, a related error message will be placed in the" echo "error directory using the same filename." exit 255 } # rudimentary command-line handling if [ $# -lt 3 ] then usage fi export PENDING=$1 export DESTDIR=$2 export ERRORDIR=$3 if [ ! -d "$PENDING" ] then echo "Error: $PENDING is missing or not a directory" exit 255 fi if [ ! -d "$DESTDIR" ] then echo "Error: $DESTDIR is missing or not a directory" exit 255 fi if [ ! -d "$ERRORDIR" ] then echo "Error: $ERRORDIR is missing or not a directory" exit 255 fi -if lockfile -! -r 0 "${PENDING}/fetch.lock" >& /dev/null -then - # echo "${PENDING}/fetch.lock already exists. Exiting." - exit 0 -fi - +( +flock -n 9 || exit 0 # set up cleanup in the event of Ctrl-C trap '{rm -f "${PENDING}/*.out"; rm -f ${PENDING}/fetch.lock; exit 1; }' INT # Re-add files that previously failed, if they failed long enough ago. # Retry after 1 hour; give up after $MAXTRIES attempts find ${ERRORDIR} -type f -mmin +60 -printf "%f\0" | xargs -0 -n 1 -I % sh -c \ ' if [ -e "${PENDING}/%.try${MAXTRIES}" ] then rm -f "${PENDING}/%.try${MAXTRIES}" "${ERRORDIR}/%" else cp $(find "${PENDING}" -maxdepth 1 -type f -name "%.try*" -print -quit) "${PENDING}/%" || true rm -f "${ERRORDIR}/%" fi ' # Fetch files in parallel; up to 5 at a time. If xargs does not support -P 5 # in your Unix, delete that option to do serial fetch. ls "$PENDING" | (egrep -v 'fetch.lock|.out|.try' || true) | xargs -I % -n 1 -P 5 sh -c \ ' if WGETOUT=$(wget -nv -i "${PENDING}/%" -O "${PENDING}/%.out" 2>&1) then # Download successful mv "${PENDING}/%.out" "${DESTDIR}/%" && rm -f "${PENDING}/%" "${PENDING}/%.try*" || echo "Internal server error: Please contact system administrator" > ${ERRORDIR}/% else # Download failed, record wget error message echo "$WGETOUT" | tr "\n" "\t" > "${ERRORDIR}/%" fi # On error, increment try count if [ -e "${ERRORDIR}/%" ] then OLDTRY=$(find "${PENDING}" -maxdepth 1 -type f -name "%.try*" -print -quit) if [[ "${OLDTRY}" == "" ]] then mv "${PENDING}/%" "${PENDING}/%.try1" else NEWTRY=$(echo "${OLDTRY}" | perl -pe "s/try(\d+)$/\"try\".(\$1+1)/e" ) mv "${OLDTRY}" "${NEWTRY}" rm -f "${PENDING}/%" fi rm -f "${PENDING}/%.out" fi ' - -rm -f "${PENDING}/fetch.lock" +) 9>${PENDING}/fetch.lock