aboutsummaryrefslogtreecommitdiff
path: root/ssync-fetch
diff options
context:
space:
mode:
Diffstat (limited to 'ssync-fetch')
-rwxr-xr-xssync-fetch114
1 files changed, 114 insertions, 0 deletions
diff --git a/ssync-fetch b/ssync-fetch
new file mode 100755
index 0000000..2a79e64
--- /dev/null
+++ b/ssync-fetch
@@ -0,0 +1,114 @@
+#!/usr/bin/env sh
+
+USAGE="ssync-fetch [options] QUEUE_FILE DEST_DIR
+ OPTIONS
+ -r REMOTE_HOST
+ remote host to download from such as user@hostname
+ username can be omitted if identical to $USER
+ or if set in ssh_config
+ -k KEY_FILE
+ ssh-key file to use (needs to be non-interactive)
+ optional: will use default session key
+ or key set in ssh_config for REMOTE_HOST
+ -v verbose logging
+ -h print this message"
+
+# HELPER FUNCTIONS
+
+function verbose_log {
+ if [ ! -z "$VERBOSE_FLAG" ]; then
+ echo "$@"
+ fi
+}
+
+# OPTIONS
+
+KEY_FILE_FLAG=
+KEY_FILE_ARG=
+REMOTE_HOST_FLAG=
+REMOTE_HOST_ARG=
+VERBOSE_FLAG=
+
+while getopts "hvr:k:" opt; do
+ case "${opt}" in
+ h) echo "$USAGE"
+ exit 1
+ ;;
+ v) VERBOSE_FLAG=1
+ ;;
+ k) KEY_FILE_FLAG=1
+ KEY_FILE_ARG="${OPTARG}"
+ ;;
+ c) CONCURRENCY_FLAG=1
+ CONCURRENCY_ARG="${OPTARG}"
+ ;;
+ r) REMOTE_HOST_FLAG=1
+ REMOTE_HOST_ARG="${OPTARG}"
+ ;;
+ esac
+done
+
+shift $(($OPTIND -1))
+
+if [ $# -ne 2 ]; then
+ echo "$USAGE"
+ exit 1
+fi
+
+QUEUE_FILE=$1
+DEST_DIR=$2
+
+# VALIDATION
+
+if [ ! -f "$QUEUE_FILE" ]; then
+ echo "Queue file '$QUEUE_FILE' does not exist"
+ exit 1
+fi
+
+if [ ! -d "$DEST_DIR" ]; then
+ echo "Destination directory '$DEST_DIR' does not exist"
+ exit 1
+fi
+
+if [ -z "$REMOTE_HOST_FLAG" ]; then
+ echo "Remote host option -r required"
+ exit 1
+elif [ -z "$REMOTE_HOST_ARG" ]; then
+ echo "Invalid remote host '$REMOTE_HOST_ARG'"
+ exit 1
+fi
+
+# CONFIGURATIONS
+
+ssh_id_param=""
+if [ ! -z "${KEY_FILE_FLAG}" ]; then
+ if [ ! -f "${KEY_FILE_ARG}" ]; then
+ echo "Identity file '${KEY_FILE_ARG}' does not exist"
+ exit 1
+ fi
+ ssh_id_param="-i ${KEY_FILE_ARG}"
+fi
+
+concurrent_param=""
+if [ ! -z "${CONCURRENCY_FLAG}" ]; then
+ if [ "${CONCURRENCY_ARG}" -gt 0 ]; then
+ concurrent_param="-X nrequests=${CONCURRENCY_ARG}"
+ fi
+fi
+real_dest=$(realpath $DEST_DIR)
+tmp_dir=$(mktemp -d /tmp/ssync_fetch_run.XXXXXX)
+ts=$(date +%s)
+verbose_log "Writing temp files to ${tmp_dir} with timestamp ${ts}"
+
+# GENERATE BATCH
+batch_file=$tmp_dir/batch_${ts}
+verbose_log "Converting the queue file to sftp batch file: ${batch_file}"
+cat $QUEUE_FILE | xargs -I{} echo "@reget {} ${real_dest}/" >> $batch_file
+
+verbose_log "Beginning download"
+verbose_log "sftp -N ${ssh_id_param} -b ${batch_file} ${REMOTE_HOST_ARG}"
+
+sftp -N ${ssh_id_param} -b ${batch_file} ${REMOTE_HOST_ARG}
+
+verbose_log "ssync-fetch finished"
+