From 1c408b3009564d9474fe30fb399deb98788974c1 Mon Sep 17 00:00:00 2001 From: deajan Date: Fri, 11 Oct 2013 21:35:20 +0200 Subject: [PATCH] Added OS detection --- CHANGELOG.md | 6 ++--- osync.sh | 71 ++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 64 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 198c6dd..19f9d12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,18 +4,18 @@ FUTURE IMPROVEMENTS - Sync function merge (master and slave functions are more more or less the same) - Tree function merge (current and after tree functions are the same except for output filename and logging) - Tree functions execute piped commands (grep, awk) on master when launched on remote slave which can cause more bandwith usage -- Exit trap function must also kill child processes -- Make osync run on MSYS for Windows compatibility ? KNOWN ISSUES ------------ - If master and remote slave systems don't have rsync in the same path, execution may fail (RSYNC_PATH is always configured on master, even when executed on slave) -- When remote system is Msys, Windows' find.exe is used instead of MSYS find RECENT CHANGES -------------- +- Added local and remote operating system detection + - Added forced usage of MSYS find on remote MSYS hosts + - Updated MSYS handling - Merged MSYS (MinGW minimal system) bash compatibility under Windows from Obackup - Added check for /var/log directory - Added check for shared memory directory diff --git a/osync.sh b/osync.sh index ef6f219..bd6f4ba 100755 --- a/osync.sh +++ b/osync.sh @@ -2,8 +2,8 @@ ###### Osync - Rsync based two way sync engine with fault tolerance ###### (L) 2013 by Orsiris "Ozy" de Jong (www.netpower.fr) -OSYNC_VERSION=0.99preRC2 -OSYNC_BUILD=1010201301 +OSYNC_VERSION=0.99preRC2-MSYS-compatible +OSYNC_BUILD=1110201301 DEBUG=no SCRIPT_PID=$$ @@ -100,7 +100,7 @@ function TrapQuit if type -p pkill > /dev/null 2>&1 then pkill -TERM -P $$ - elif [ "$OSTYPE" == "msys" ] + elif [ "$LOCAL_OS" == "msys" ] then ## This is not really a clean way to get child process pids, especially the tail -n +2 which resolves a strange char apparition in msys bash for pid in $(ps -a | awk '{$1=$1}$1' | awk '{print $1" "$2}' | grep " $$$" | awk '{print $1}' | tail -n +2) @@ -174,6 +174,7 @@ function CleanUp if [ "$DEBUG" != "yes" ] then rm -f $RUN_DIR/osync_config_$SCRIPT_PID + rm -f $RUN_DIR/osync_remote_os_$SCRIPT_PID rm -f $RUN_DIR/osync_run_local_$SCRIPT_PID rm -f $RUN_DIR/osync_run_remote_$SCRIPT_PID rm -f $RUN_DIR/osync_master-tree-current_$SCRIPT_PID @@ -265,13 +266,56 @@ function CheckEnvironment fi } +function GetOperatingSystem +{ + LOCAL_OS_VAR=$(uname -spio) + if [ "$REMOTE_SYNC" == "yes" ] + then + eval "$SSH_CMD uname -spio > $RUN_DIR/osync_remote_os_$SCRIPT_PID 2>&1 &" + REMOTE_OS_VAR=$(cat $RUN_DIR/osync_remote_os_$SCRIPT_PID) + fi + + case $LOCAL_OS_VAR in + "Linux"*) + LOCAL_OS="Linux" + ;; + "FreeBSD"*) + LOCAL_OS="FreeBSD" + ;; + "MINGW32"*) + LOCAL_OS="msys" + ;; + *) + LogError "Running on >> $LOCAL_OS_VAR << not supported. Please report to the author." + exit 1 + ;; + esac + + case $REMOTE_OS_VAR in + "Linux"*) + REMOTE_OS="Linux" + ;; + "FreeBSD"*) + REMOTE_OS="FreeBSD" + ;; + "MINGW32"*) + REMOTE_OS="msys" + ;; + "") + ;; + *) + LogError "Running on remote >> $REMOTE_OS_VAR << not supported. Please report to the author." + exit 1 + esac +} + # Waits for pid $1 to complete. Will log an alert if $2 seconds passed since current task execution unless $2 equals 0. # Will stop task and log alert if $3 seconds passed since current task execution unless $3 equals 0. function WaitForTaskCompletion { soft_alert=0 SECONDS_BEGIN=$SECONDS - if [ "$OSTYPE" == "msys" ] + if [ "$LOCAL_OS" == "msys" ] then PROCESS_TEST="ps -a | awk '{\$1=\$1}\$1' | awk '{print \$1}' | grep $1" else @@ -321,7 +365,7 @@ function WaitForTaskCompletion function WaitForCompletion { soft_alert=0 - if [ "$OSTYPE" == "msys" ] + if [ "$LOCAL_OS" == "msys" ] then PROCESS_TEST="ps -a | awk '{\$1=\$1}\$1' | awk '{print \$1}' | grep $1" else @@ -457,7 +501,7 @@ function CheckConnectivityRemoteHost { if [ "$REMOTE_HOST_PING" != "no" ] && [ "$REMOTE_SYNC" != "no" ] then - if [ "$OSTYPE" == "msys" ] + if [ "$LOCAL_OS" == "msys" ] then ping $REMOTE_HOST -n 2 > /dev/null 2>&1 else @@ -480,7 +524,7 @@ function CheckConnectivity3rdPartyHosts IFS=$' \t\n' for i in $REMOTE_3RD_PARTY_HOSTS do - if [ "$OSTYPE" == "msys" ] + if [ "$LOCAL_OS" == "msys" ] then ping $i -n 2 > /dev/null 2>&1 else @@ -1389,6 +1433,8 @@ function SoftDelete function Init { + GetOperatingSystem + # Set error exit code if a piped command fails set -o pipefail set -o errtrace @@ -1415,14 +1461,19 @@ function Init MAIL_ALERT_MSG="Warning: Execution of osync instance $OSYNC_ID (pid $SCRIPT_PID) as $LOCAL_USER@$LOCAL_HOST produced errors." ## If running Msys, find command of windows is used instead of msys one - if [ "$OSTYPE" == "msys" ] + if [ "$LOCAL_OS" == "msys" ] then FIND_CMD=$(dirname $BASH)/find else FIND_CMD=find fi - ## Not elegant... waiting for a good idea on how to detect remote system - REMOTE_FIND_CMD=$FIND_CMD + + if [ "$REMOTE_OS" == "msys" ] + then + REMOTE_FIND_CMD=$(dirname $BASH)/find + else + REMOTE_FIND_CMD=find + fi ## Rsync does not like spaces in directory names, considering it as two different directories. Handling this schema by escaping space ## It seems this only happens when trying to execute an rsync command through eval $rsync_cmd... on a remote host. This is freaking unholy to find a workaround...