#!/usr/bin/env bash set -e RUNID=$(openssl rand -hex 16) function log { echo -e "${RUNID}\t$(date -Is)\t$@" } if [ $# -lt 4 ]; then echo "Usage: ssync KEY_FILE REMOTE REMOTE_DIR SRC_DIR" exit 1 fi # opts KEY_FILE=$1 REMOTE=$2 REMOTE_DIR=$3 SRC_DIR=$4 # constants PARALLEL=5 SSYNC_DIR=$HOME/.local/share/ssync FETCHED_FILE=$SSYNC_DIR/fetched FETCH_FILE=$SSYNC_DIR/fetch LASTRAN_FILE=$SSYNC_DIR/lastran NEXT_RUN_DATE=$(date -u -Is -d '5 minutes ago') RUN_DIR=$SSYNC_DIR/.runs/ CURGET_FILE=$RUN_DIR/$RUNID if [ ! -f $LASTRAN_FILE ]; then mkdir -p $SSYNC_DIR echo $NEXT_RUN_DATE > $LASTRAN_FILE log "No run existed marking next run for files newer than: $NEXT_RUN_DATE" exit 0; fi PREV_RUN_DATE=$(cat $LASTRAN_FILE) # main if [[ $PREV_RUN_DATE == "" ]]; then echo $NEXT_RUN_DATE > $LASTRAN_FILE log "No run existed marking next run for files newer than: $NEXT_RUN_DATE" exit 0; fi if [ ! -f $FETCHED_FILE ]; then touch $FETCHED_FILE fi log "Failsafe - Running at: $NEXT_RUN_DATE - if failed to write use this timestamp in $LASTRAN_FILE" log "Syncing files since: $PREV_RUN_DATE" log "Fetching files" mkdir -p $RUN_DIR ssh -i $KEY_FILE $REMOTE "find ${REMOTE_DIR} -type f -newermt ${PREV_RUN_DATE} -exec realpath --relative-to ${REMOTE_DIR} {} \;" >> $CURGET_FILE GET_COUNT=$(wc -l $CURGET_FILE | cut -d' ' -f1) if [ $GET_COUNT -gt 0 ]; then comm -23 <(sort -u $CURGET_FILE) <(sort -u $FETCHED_FILE) > $FETCH_FILE COUNT=$(wc -l $FETCH_FILE | cut -d' ' -f1) if [ $COUNT -gt 0 ]; then # # Syncing # log "Found ${COUNT} files to fetch" cat $FETCH_FILE >> $FETCHED_FILE log "Wrote files to fetched files" log "Syncing now" cat $FETCH_FILE | xargs -n1 -P$PARALLEL -I '{}' rsync -e "ssh -i $KEY_FILE" \ -av \ $REMOTE:"${REMOTE_DIR}/'{}'" ${SRC_DIR} else log "No new files to sync - found $GET_COUNT existing files" fi else log "No new files found - deleting $CURGET_FILE" rm -f $CURGET_FILE fi echo $NEXT_RUN_DATE > $LASTRAN_FILE log "Done syncing"