#!/bin/bash # Copyright 2021 Luca Paris #This file is part of masync. #masync is free software: you can redistribute it and/or modify #it under the terms of the GNU General Public License as published by #the Free Software Foundation, either version 3 of the License, or #(at your option) any later version. #masync is distributed in the hope that it will be useful, #but WITHOUT ANY WARRANTY; without even the implied warranty of #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #GNU General Public License for more details. #You should have received a copy of the GNU General Public License #along with masync. If not, see . ## 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