masy/syncloop.sh

70 lines
2.5 KiB
Bash
Executable File

#!/bin/bash
## REQUIREMENT
# apt-get install inotify-tools
# @1 hash to retrieve sync
# @2 local path to sync
# @3 remote path to sync
#echo "$1, $2, $3"
source ~/bin/.synccmd.sh
TMPQUEUEFILE=~/.syncdir_$1.queue
TMPQUEUEDELETES=~/.syncdir_$1.deletes
LOCALPATH_HASH=$1
LOCALPATH=$2
REMOTEPATH=$3
REMOTEHOST=$(echo "$REMOTEPATH" | cut -d : -f 1 | cut -d @ -f 2)
REMOTERELATIVEPATH=$(echo "$REMOTEPATH" | cut -d : -f 2)
synccycle() {
lastsynctime="$(date -u +%s.%N)"
### max waiting time for pull (seconds)
maxpulllimit=30
while :
do
if [ -f "$TMPQUEUEFILE" ]; then
nqueue=$(wc -l < ${TMPQUEUEFILE})
if [ $nqueue -gt 0 ]; then
echo "${TMPQUEUEFILE} not empty syncing ${nqueue} actions from queue"
## FIRST STEP push deletion if there are
if [ -f "$TMPQUEUEDELETES" ]; then
ndeletes=$(wc -l < ${TMPQUEUEDELETES})
echo "delete queue $ndeletes"
cat "${TMPQUEUEDELETES}"
if [ $ndeletes -gt 0 ]; then
ssh $REMOTEHOST "rm -rf $(head -n $ndeletes ${TMPQUEUEDELETES} | tr '\n', ' ')"
# remove the first ndeletes lines
tail -n +$(expr ${ndeletes} + 1) < ${TMPQUEUEDELETES} > ${TMPQUEUEDELETES}
fi
fi
## end push deletion if there are
sync $LOCALPATH_HASH $LOCALPATH $REMOTEPATH
# remove the first nqueue lines from queue
tail -n +$(expr ${nqueue} + 1) < ${TMPQUEUEFILE} > ${TMPQUEUEFILE}
lastsynctime="$(date -u +%s.%N)"
## step to next iteration
continue
fi
fi
now="$(date -u +%s.%N)"
elapsed="$(bc <<<"$now-$lastsynctime")"
## if elapsed is greater than maxpulllimit sync from remote with delete option
if [ 1 -eq $(echo "$elapsed>$maxpulllimit" | bc) ]; then
echo 'maxpulllimit reached: sync from remote with --delete option'
sync $LOCALPATH_HASH $REMOTEPATH $LOCALPATH '--delete'
fi
done
}
synccycle &
# exclude swp,swpx and 4913 files created by vim
# inotifywait -m -r -e close_write -e move -e delete --exclude "\.swp|\.swx|4913|.txt~" ~/googleDrive/Copy/Appunti/
inotifywait -m -r -e close_write -e move -e delete --exclude "\.swp|\.swx|4913|.txt~" $LOCALPATH | while read dir action file; do
if [ $action = 'DELETE' ]; then
echo "Enqueue delete: $dir$file"
echo $dir$file | sed -e "s~$LOCALPATH~$REMOTERELATIVEPATH~g" | tee -a ${TMPQUEUEDELETES}
fi
echo "Add notify to queue: file '$file' in directory '$dir' for '$action'" | tee -a ${TMPQUEUEFILE}
done