@ -7,7 +7,7 @@ PROGRAM="osync" # Rsync based two way sync engine with fault tolerance
AUTHOR = "(C) 2013-2018 by Orsiris de Jong"
CONTACT = "http://www.netpower.fr/osync - ozy@netpower.fr"
PROGRAM_VERSION = 1.3.0-beta1
PROGRAM_BUILD = 2018101 7 01
PROGRAM_BUILD = 2018101 8 01
IS_STABLE = no
##### Execution order #__WITH_PARANOIA_DEBUG
@ -41,7 +41,7 @@ IS_STABLE=no
# CleanUp no #__WITH_PARANOIA_DEBUG
_OFUNCTIONS_VERSION = 2.3.0-RC2
_OFUNCTIONS_BUILD = 20181 01701
_OFUNCTIONS_BUILD = 20181 10502
_OFUNCTIONS_BOOTSTRAP = true
if ! type " $BASH " > /dev/null; then
@ -1090,7 +1090,7 @@ function ExecTasks {
# Check for valid exit codes
if [ $( ArrayContains $retval " ${ validExitCodes [@] } " ) -eq 0 ] ; then
if [ $noErrorLogsAtAll != true ] ; then
Logger " ${ FUNCNAME [0] } called by [ $id ] finished monitoring pid [ $pid ] with exitcode [ $retval ]. " " DEBUG "
Logger " ${ FUNCNAME [0] } called by [ $id ] finished monitoring pid [ $pid ] with exitcode [ $retval ]. " " ERROR "
if [ " $functionMode " = = "ParallelExec" ] ; then
Logger " Command was [ ${ commandsArrayPid [ $pid ] } ]. " "ERROR"
fi
@ -1431,6 +1431,8 @@ function GetLocalOS {
# There is no good way to tell if currently running in BusyBox shell. Using sluggish way.
if ls --help 2>& 1 | grep -i "BusyBox" > /dev/null; then
localOsVar = "BusyBox"
elif set -o | grep "winxp" > /dev/null; then
localOsVar = "BusyBox-w32"
else
# Detecting the special ubuntu userland in Windows 10 bash
if grep -i Microsoft /proc/sys/kernel/osrelease > /dev/null 2>& 1; then
@ -1463,7 +1465,7 @@ function GetLocalOS {
*"CYGWIN" *)
LOCAL_OS = "Cygwin"
; ;
*"Microsoft" *)
*"Microsoft" *| *"MS/Windows" *)
LOCAL_OS = "WinNT10"
; ;
*"Darwin" *)
@ -1494,7 +1496,8 @@ function GetLocalOS {
fi
# Get Host info for Windows
if [ " $LOCAL_OS " = = "msys" ] || [ " $LOCAL_OS " = = "BusyBox" ] || [ " $LOCAL_OS " = = "Cygwin" ] || [ " $LOCAL_OS " = = "WinNT10" ] ; then localOsVar = " $( uname -a) "
if [ " $LOCAL_OS " = = "msys" ] || [ " $LOCAL_OS " = = "BusyBox" ] || [ " $LOCAL_OS " = = "Cygwin" ] || [ " $LOCAL_OS " = = "WinNT10" ] ; then
localOsVar = " $localOsVar $( uname -a) "
if [ " $PROGRAMW6432 " != "" ] ; then
LOCAL_OS_BITNESS = 64
LOCAL_OS_FAMILY = "Windows"
@ -1508,6 +1511,9 @@ function GetLocalOS {
# Get Host info for Unix
else
LOCAL_OS_FAMILY = "Unix"
fi
if [ " $LOCAL_OS_FAMILY " = = "Unix" ] ; then
if uname -m | grep '64' > /dev/null 2>& 1; then
LOCAL_OS_BITNESS = 64
else
@ -2124,14 +2130,14 @@ function InitLocalOSDependingSettings {
function InitRemoteOSDependingSettings {
__CheckArguments 0 $# " $@ " #__WITH_PARANOIA_DEBUG
if [ " $REMOTE_OS " = = "msys" ] || [ " $ LOCAL _OS" = = "Cygwin" ] ; then
if [ " $REMOTE_OS " = = "msys" ] || [ " $ REMOTE _OS" = = "Cygwin" ] ; then
REMOTE_FIND_CMD = $( dirname $BASH ) /find
else
REMOTE_FIND_CMD = find
fi
## Stat command has different syntax on Linux and FreeBSD/MacOSX
if [ " $ LOCAL _OS" = = "MacOSX" ] || [ " $ LOCAL _OS" = = "BSD" ] ; then
if [ " $ REMOTE _OS" = = "MacOSX" ] || [ " $ REMOTE _OS" = = "BSD" ] ; then
REMOTE_STAT_CMD = "stat -f \"%Sm\""
REMOTE_STAT_CTIME_MTIME_CMD = "stat -f \\\"%N;%c;%m\\\""
else
@ -2310,13 +2316,26 @@ function SetConfFileValue () {
local value = " ${ 3 } "
local separator = " ${ 4 :- # } "
if grep " ^ $name = " " $file " > /dev/null; then
# Using -i.tmp for BSD compat
sed -i.tmp " s $separator ^ $name =.* $separator $name = $value $separator " " $file "
rm -f " $file .tmp "
Logger " Set [ $name ] to [ $value ] in config file [ $file ]. " "DEBUG"
if [ -f " $file " ] ; then
if grep " ^ $name = " " $file " > /dev/null 2>& 1; then
# Using -i.tmp for BSD compat
sed -i.tmp " s $separator ^ $name =.* $separator $name = $value $separator " " $file "
if [ $? -ne 0 ] ; then
Logger " Cannot update value [ $name ] to [ $value ] in config file [ $file ]. " "ERROR"
fi
rm -f " $file .tmp "
Logger " Set [ $name ] to [ $value ] in config file [ $file ]. " "DEBUG"
else
echo " $name = $value " >> " $file "
if [ $? -ne 0 ] ; then
Logger " Cannot create value [ $name ] to [ $value ] in config file [ $file ]. " "ERROR"
fi
fi
else
Logger " Cannot set value [ $name ] to [ $value ] in config file [ $file ]. " "ERROR"
echo " $name = $value " > " $file "
if [ $? -ne 0 ] ; then
Logger " Config file [ $file ] does not exist. Failed to create it witn value [ $name ]. " "ERROR"
fi
fi
}
@ -3524,16 +3543,16 @@ function _getFileCtimeMtimeLocal {
echo -n "" > " $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $replicaType . $SCRIPT_PID . $TSTAMP "
while IFS = '' read -r file; do
$STAT_CTIME_MTIME_CMD " $replicaPath $file " >> " $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $replicaType . $SCRIPT_PID . $TSTAMP "
$STAT_CTIME_MTIME_CMD " $replicaPath $file " >> " $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $replicaType . $SCRIPT_PID . $TSTAMP " 2> " $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $replicaType .error. $SCRIPT_PID . $TSTAMP "
if [ $? -ne 0 ] ; then
Logger " Could not get file attributes for [ $replicaPath $file ]. " "ERROR"
echo "1" > " $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } .subshellError. $replicaType . $SCRIPT_PID . $TSTAMP "
fi
done < " $fileList "
if [ -f " $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } .subshellError. $replicaType . $SCRIPT_PID . $TSTAMP " ] ; then
Logger " Getting file attributes failed [$retval ] on $replicaType . Stopping execution. " "CRITICAL" $retval
if [ -s " $RUN_DIR / $PROGRAM . ctime_mtime.$replicaType .$SCRIPT_PID . $TSTAMP " ] ; then #WIP: does this file exist
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME [0] } .$replicaType .$SCRIPT_PID .$TSTAMP ) " "WARN"
Logger " Getting file time attributes failed [$retval ] on $replicaType . Stopping execution. " "CRITICAL" $retval
if [ -s " $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $replicaType .error .$SCRIPT_PID . $TSTAMP " ] ; then
Logger " Command output:\n $( cat " $RUN_DIR /$PROGRAM .${ FUNCNAME [0] } .$replicaType .error. $SCRIPT_PID .$TSTAMP " ) " "WARN"
fi
return 1
else
@ -5726,23 +5745,21 @@ function LogConflicts {
local subject
local body
# We keep this in a separate if check because of the subshell used for Logger with _LOGGER_PREFIX
if [ -f " $RUN_DIR / $PROGRAM .conflictList.compare. $SCRIPT_PID . $TSTAMP " ] ; then
Logger "File conflicts: INITIATOR << >> TARGET" "ALWAYS"
fi
_LOGGER_PREFIX = ""
(
if [ -f " $RUN_DIR / $PROGRAM .conflictList.compare. $SCRIPT_PID . $TSTAMP " ] ; then
echo "" > " ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ INITIATOR [ $__conflictListFile ] } "
> " ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ INITIATOR [ $__conflictListFile ] } "
while read -r line; do
echo " ${ INITIATOR [ $__replicaDir ] } $( echo $line | awk -F';' '{print $1}' ) << >> ${ TARGET [ $__replicaDir ] } $( echo $line | awk -F';' '{print $1}' ) " >> " ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ INITIATOR [ $__conflictListFile ] } "
done < " $RUN_DIR / $PROGRAM .conflictList.compare. $SCRIPT_PID . $TSTAMP "
(
_LOGGER_PREFIX = ""
Logger " $( cat ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } /${ INITIATOR [ $__conflictListFile ] } ) " "ALWAYS"
)
else
Logger "No conflictList file." "ERROR"
fi
)
if [ " $ALERT_CONFLICTS " = = "yes" ] && [ -s " $RUN_DIR / $PROGRAM .conflictList.compare. $SCRIPT_PID . $TSTAMP " ] ; then
subject = " Conflictual files found in [ $INSTANCE_ID ] "
body = "List of conflictual files:" $'\n' " $( cat ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } /${ INITIATOR [ $__conflictListFile ] } ) "