Fix for service files and script to work with directories with spaces in their names

pull/177/head
psfloyd 2017-12-01 00:12:14 -03:00
parent 84c57c121e
commit 70c5c64373
3 changed files with 26 additions and 25 deletions

View File

@ -2,7 +2,7 @@
Description=Google drive sync (changed files) Description=Google drive sync (changed files)
[Service] [Service]
ExecStart=@GRIVE_SYNC_SH_BINARY@ listen "%i" ExecStart=@GRIVE_SYNC_SH_BINARY@ listen "%I"
Type=simple Type=simple
Restart=always Restart=always
RestartSec=30 RestartSec=30

View File

@ -14,16 +14,16 @@ cd ~
### ARGUMENT PARSING ### ### ARGUMENT PARSING ###
SCRIPT=${0} SCRIPT="${0}"
if [[ -z ${2} ]] || [[ ! -d ${2} ]] ; then if [[ -z "${2}" ]] || [[ ! -d "${2}" ]] ; then
echo "Need a directory name in the current users home directory as second argument. Aborting." echo "Need a directory name in the current users home directory as second argument. Aborting."
exit 1 exit 1
fi fi
DIRECTORY=$2 DIRECTORY="$2"
if [[ -z ${1} ]] ; then if [[ -z "${1}" ]] ; then
echo "Need a command as first argument. Aborting." echo "Need a command as first argument. Aborting."
exit 1 exit 1
else else
@ -39,13 +39,13 @@ fi
### LOCKFILE BOILERPLATE ### ### LOCKFILE BOILERPLATE ###
LOCKFILE="/run/user/$(id -u)/$(basename $0)_${DIRECTORY//\//_}" LOCKFILE="/run/user/"$(id -u)"/"$(basename "$0")"_"${DIRECTORY//\//_}""
LOCKFD=99 LOCKFD=99
# PRIVATE # PRIVATE
_lock() { flock -$1 $LOCKFD; } _lock() { flock -"$1" "$LOCKFD"; }
_no_more_locking() { _lock u; _lock xn && rm -f $LOCKFILE; } _no_more_locking() { _lock u; _lock xn && rm -f "$LOCKFILE"; }
_prepare_locking() { eval "exec $LOCKFD>\"$LOCKFILE\""; trap _no_more_locking EXIT; } _prepare_locking() { eval "exec "$LOCKFD">\""$LOCKFILE"\""; trap _no_more_locking EXIT; }
# ON START # ON START
_prepare_locking _prepare_locking
@ -61,7 +61,7 @@ unlock() { _lock u; } # drop a lock
# make sure we sync a second time, too # make sure we sync a second time, too
sync_directory() { sync_directory() {
_directory=${1} _directory="${1}"
if ping -c1 -W1 -q accounts.google.com >/dev/null 2>&1; then if ping -c1 -W1 -q accounts.google.com >/dev/null 2>&1; then
true true
# pass # pass
@ -70,18 +70,18 @@ sync_directory() {
exit 0 exit 0
fi fi
reset_timer_and_exit() { echo "Retriggered google drive sync" && touch -m $LOCKFILE && exit; } reset_timer_and_exit() { echo "Retriggered google drive sync" && touch -m "$LOCKFILE" && exit; }
exlock_now || reset_timer_and_exit exlock_now || reset_timer_and_exit
TIME_AT_START=0 TIME_AT_START=0
TIME_AT_END=1 TIME_AT_END=1
while [[ ${TIME_AT_START} -lt ${TIME_AT_END} ]]; do while [[ "${TIME_AT_START}" -lt "${TIME_AT_END}" ]]; do
echo "Syncing ${_directory}..." echo "Syncing "${_directory}"..."
TIME_AT_START=$(stat -c %Y $LOCKFILE) TIME_AT_START="$(stat -c %Y "$LOCKFILE")"
grive -p ${_directory} 2>&1 | grep -v -E "^Reading local directories$|^Reading remote server file list$|^Synchronizing files$|^Finished!$" grive -p "${_directory}" 2>&1 | grep -v -E "^Reading local directories$|^Reading remote server file list$|^Synchronizing files$|^Finished!$"
TIME_AT_END=$(stat -c %Y $LOCKFILE) TIME_AT_END="$(stat -c %Y "$LOCKFILE")"
echo "Sync of ${_directory} done." echo "Sync of "${_directory}" done."
done done
# always exit ok, so that we never go into a wrong systemd state # always exit ok, so that we never go into a wrong systemd state
@ -92,27 +92,28 @@ sync_directory() {
listen_directory() { listen_directory() {
_directory=${1} _directory="${1}"
type inotifywait >/dev/null 2>&1 || { echo >&2 "I require inotifywait but it's not installed. Aborting."; exit 1; } type inotifywait >/dev/null 2>&1 || { echo >&2 "I require inotifywait but it's not installed. Aborting."; exit 1; }
echo "Listening for changes in ~/${_directory}" echo "Listening for changes in ~/"${_directory}""
while true #run indefinitely while true #run indefinitely
do do
# Use a different call to not need to change exit into return # Use a different call to not need to change exit into return
inotifywait -q -r -e modify,attrib,close_write,move,create,delete --exclude ".grive_state|.grive" ${_directory} > /dev/null 2>&1 && ${SCRIPT} sync ${_directory} inotifywait -q -r -e modify,attrib,close_write,move,create,delete --exclude ".grive_state|.grive" "${_directory}" > /dev/null 2>&1 && ${SCRIPT} sync "${_directory}"
#echo ${SCRIPT} "${_directory}"
done done
# always exit ok, so that we never go into a wrong systemd state # always exit ok, so that we never go into a wrong systemd state
exit 0 exit 0
} }
if [[ ${COMMAND} == listen ]] ; then if [[ "${COMMAND}" == listen ]] ; then
listen_directory ${DIRECTORY} listen_directory "${DIRECTORY}"
else else
sync_directory ${DIRECTORY} sync_directory "${DIRECTORY}"
fi fi
# always exit ok, so that we never go into a wrong systemd state # always exit ok, so that we never go into a wrong systemd state
exit 0 exit 0

View File

@ -3,4 +3,4 @@ Description=Google drive sync
After=network-online.target After=network-online.target
[Service] [Service]
ExecStart=@GRIVE_SYNC_SH_BINARY@ sync "%i" ExecStart=@GRIVE_SYNC_SH_BINARY@ sync "%I"