From 9815a7bff3f212867741f9eb5bdf943324917472 Mon Sep 17 00:00:00 2001 From: deajan Date: Mon, 18 May 2015 10:53:11 +0200 Subject: [PATCH] Fixed #21 for missing readlink on MacOS X & BSD --- CHANGELOG.md | 1 + osync.sh | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 137fc71..ef964d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ UNDER WORK RECENT CHANGES -------------- +- Fixed #21 by adding portable shell readlink / realpath from https://github.com/mkropat/sh-realpath - Added detection of osync.sh script in osync-batch.sh to overcome mising path in crontab - Fixed osync-batch.sh script when osync is in executable path like /usr/local/bin - Fixed multiple keep logging messages since sleep time between commands has been lowered under a second diff --git a/osync.sh b/osync.sh index f988ae1..ab9dd0b 100755 --- a/osync.sh +++ b/osync.sh @@ -4,7 +4,7 @@ PROGRAM="Osync" # Rsync based two way sync engine with fault tolerance AUTHOR="(L) 2013-2015 by Orsiris \"Ozy\" de Jong" CONTACT="http://www.netpower.fr/osync - ozy@netpower.fr" PROGRAM_VERSION=1.00pre -PROGRAM_BUILD=2004201501 +PROGRAM_BUILD=1805201501 ## type doesn't work on platforms other than linux (bash). If if doesn't work, always assume output is not a zero exitcode if ! type -p "$BASH" > /dev/null @@ -615,6 +615,80 @@ function CheckConnectivity3rdPartyHosts fi } +############################################################################################ + +### realpath.sh implementation from https://github.com/mkropat/sh-realpath + +realpath() { + canonicalize_path "$(resolve_symlinks "$1")" +} + +resolve_symlinks() { + _resolve_symlinks "$1" +} + +_resolve_symlinks() { + _assert_no_path_cycles "$@" || return + + local dir_context path + path=$(readlink -- "$1") + if [ $? -eq 0 ]; then + dir_context=$(dirname -- "$1") + _resolve_symlinks "$(_prepend_dir_context_if_necessary "$dir_context" "$path")" "$@" + else + printf '%s\n' "$1" + fi +} + +_prepend_dir_context_if_necessary() { + if [ "$1" = . ]; then + printf '%s\n' "$2" + else + _prepend_path_if_relative "$1" "$2" + fi +} + +_prepend_path_if_relative() { + case "$2" in + /* ) printf '%s\n' "$2" ;; + * ) printf '%s\n' "$1/$2" ;; + esac +} + +_assert_no_path_cycles() { + local target path + + target=$1 + shift + + for path in "$@"; do + if [ "$path" = "$target" ]; then + return 1 + fi + done +} + +canonicalize_path() { + if [ -d "$1" ]; then + _canonicalize_dir_path "$1" + else + _canonicalize_file_path "$1" + fi +} + +_canonicalize_dir_path() { + (cd "$1" 2>/dev/null && pwd -P) +} + +_canonicalize_file_path() { + local dir file + dir=$(dirname -- "$1") + file=$(basename -- "$1") + (cd "$dir" 2>/dev/null && printf '%s/%s\n' "$(pwd -P)" "$file") +} + +### Specfic Osync function + function CreateOsyncDirs { if ! [ -d "$MASTER_STATE_DIR" ] @@ -647,8 +721,8 @@ function CreateOsyncDirs function CheckMasterSlaveDirs { - MASTER_SYNC_DIR_CANN=$(readlink -f "$MASTER_SYNC_DIR") - SLAVE_SYNC_DIR_CANN=$(readlink -f "$SLAVE_SYNC_DIR") + MASTER_SYNC_DIR_CANN=$(realpath "$MASTER_SYNC_DIR") + SLAVE_SYNC_DIR_CANN=$(realpath "$SLAVE_SYNC_DIR") if [ "$REMOTE_SYNC" != "yes" ] then