@ -6,8 +6,8 @@
PROGRAM = "osync" # Rsync based two way sync engine with fault tolerance
AUTHOR = "(C) 2013-2020 by Orsiris de Jong"
CONTACT = "http://www.netpower.fr/osync - ozy@netpower.fr"
PROGRAM_VERSION = 1.3.0-pre rc1
PROGRAM_BUILD = 20200 12302
PROGRAM_VERSION = 1.3.0-rc1
PROGRAM_BUILD = 20200 42901
IS_STABLE = false
CONFIG_FILE_REVISION_REQUIRED = 1.3.0
@ -43,7 +43,7 @@ CONFIG_FILE_REVISION_REQUIRED=1.3.0
# CleanUp no #__WITH_PARANOIA_DEBUG
_OFUNCTIONS_VERSION = 2.3.0-RC4
_OFUNCTIONS_BUILD = 20200 315 02
_OFUNCTIONS_BUILD = 20200 429 02
_OFUNCTIONS_BOOTSTRAP = true
if ! type " $BASH " > /dev/null; then
@ -284,8 +284,8 @@ function Logger {
fi
## Obfuscate _REMOTE_TOKEN in logs (for ssh_filter usage only in osync and obackup)
value = " ${ value /env _REMOTE_TOKEN= $_REMOTE_TOKEN /env _REMOTE_TOKEN=__ ( o_O) __} "
value = " ${ value /env _REMOTE_TOKEN= \$ _REMOTE_TOKEN /env _REMOTE_TOKEN=__ ( o_O) __} "
value = " ${ value /env _REMOTE_TOKEN= $_REMOTE_TOKEN /env _REMOTE_TOKEN=__ o_O__} "
value = " ${ value /env _REMOTE_TOKEN= \$ _REMOTE_TOKEN /env _REMOTE_TOKEN=__ o_O__} "
if [ " $level " = = "CRITICAL" ] ; then
_Logger " $prefix ( $level ): $value " " $prefix \e[1;33;41m $value \e[0m " true
@ -1761,11 +1761,7 @@ function RunLocalCommand {
if [ $_LOGGER_VERBOSE = = true ] || [ $retval -ne 0 ] ; then
Logger " Truncated output:\n $( head -c16384 " $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $SCRIPT_PID . $TSTAMP " ) " "NOTICE"
fi
if [ " $STOP_ON_CMD_ERROR " = = true ] && [ $retval -ne 0 ] ; then
Logger "Stopping on command execution error." "CRITICAL"
exit 1
fi
return $retval
}
## Runs remote command $1 and waits for completition in $2 seconds
@ -1799,15 +1795,10 @@ function RunRemoteCommand {
Logger "Command failed." "ERROR"
fi
if [ -f " $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $SCRIPT_PID . $TSTAMP " ] && ( [ $_LOGGER_VERBOSE = = true ] || [ $retval -ne 0 ] )
then
if [ -f " $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $SCRIPT_PID . $TSTAMP " ] && ( [ $_LOGGER_VERBOSE = = true ] || [ $retval -ne 0 ] ) ; then
Logger " Truncated output:\n $( head -c16384 " $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $SCRIPT_PID . $TSTAMP " ) " "NOTICE"
fi
if [ " $STOP_ON_CMD_ERROR " = = true ] && [ $retval -ne 0 ] ; then
Logger "Stopping on command execution error." "CRITICAL"
exit 1
fi
return $retval
}
function RunBeforeHook {
@ -1826,6 +1817,14 @@ function RunBeforeHook {
fi
if [ " $pids " != "" ] ; then
ExecTasks $pids " ${ FUNCNAME [0] } " false 0 0 0 0 true $SLEEP_TIME $KEEP_LOGGING
retval = $?
fi
echo " ert= $retval "
if [ " $STOP_ON_CMD_ERROR " = = true ] && [ $retval -ne 0 ] ; then
Logger "Stopping on command execution error." "CRITICAL"
exit 1
fi
}
@ -3526,11 +3525,6 @@ function UnlockReplicas {
###### Sync core functions
## 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 weval $rsyncCmd on a remote host.
## So I am using unescaped $INITIATOR_SYNC_DIR for local rsync calls and escaped $ESC_INITIATOR_SYNC_DIR for remote rsync calls like user@host:$ESC_INITIATOR_SYNC_DIR
## The same applies for target sync dir..............................................T.H.I.S..I.S..A..P.R.O.G.R.A.M.M.I.N.G..N.I.G.H.T.M.A.R.E
function treeList {
local replicaPath = " ${ 1 } " # path to the replica for which a tree needs to be constructed
local replicaType = " ${ 2 } " # replica type: initiator, target
@ -3539,11 +3533,8 @@ function treeList {
__CheckArguments 3 $# " $@ " #__WITH_PARANOIA_DEBUG
local retval
local escapedReplicaPath
local rsyncCmd
escapedReplicaPath = $( EscapeSpaces " $replicaPath " )
# operation explanation
# (command || :) = Return code 0 regardless of command return code
# (grep -E \"^-|^d|^l\" || :) = Be sure line begins with '-' or 'd' or 'l' (rsync semantics for file, directory or symlink)
@ -3555,7 +3546,7 @@ function treeList {
if [ " $REMOTE_OPERATION " = = true ] && [ " $replicaType " = = " ${ TARGET [ $__type ] } " ] ; then
CheckConnectivity3rdPartyHosts
CheckConnectivityRemoteHost
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" $RSYNC_DEFAULT_ARGS $RSYNC_ATTR_ARGS $RSYNC_TYPE_ARGS --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE -e \" $RSYNC_SSH_CMD \" --list-only $REMOTE_USER @ $REMOTE_HOST :\" $escapedReplicaPath \" 2> \"$RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $replicaType .error. $SCRIPT_PID . $TSTAMP \" | (grep -E \"^-|^d|^l\" || :) | (sed $SED_REGEX_ARG 's/^.{10} +[0-9,]+ [0-9/]{10} [0-9:]{8} //' || :) | (awk 'BEGIN { FS=\" -> \" } ; { print \$1 }' || :) | (grep -v \"^\. $\" || :) | sort > \" $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $replicaType . $SCRIPT_PID . $TSTAMP \" "
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" $RSYNC_DEFAULT_ARGS $RSYNC_ATTR_ARGS $RSYNC_TYPE_ARGS --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE -e \" $RSYNC_SSH_CMD \" --list-only $REMOTE_USER @ $REMOTE_HOST :\" '$replicaPath ' \" 2> \"$RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $replicaType .error. $SCRIPT_PID . $TSTAMP \" | (grep -E \"^-|^d|^l\" || :) | (sed $SED_REGEX_ARG 's/^.{10} +[0-9,]+ [0-9/]{10} [0-9:]{8} //' || :) | (awk 'BEGIN { FS=\" -> \" } ; { print \$1 }' || :) | (grep -v \"^\. $\" || :) | sort > \" $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $replicaType . $SCRIPT_PID . $TSTAMP \" "
else
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" $RSYNC_DEFAULT_ARGS $RSYNC_ATTR_ARGS $RSYNC_TYPE_ARGS --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE --list-only \" $replicaPath \" 2> \" $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $replicaType .error. $SCRIPT_PID . $TSTAMP \" | (grep -E \"^-|^d|^l\" || :) | (sed $SED_REGEX_ARG 's/^.{10} +[0-9,]+ [0-9/]{10} [0-9:]{8} //' || :) | (awk 'BEGIN { FS=\" -> \" } ; { print \$1 }' || :) | (grep -v \"^\. $\" || :) | sort > \" $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $replicaType . $SCRIPT_PID . $TSTAMP \" "
fi
@ -3980,7 +3971,6 @@ function timestampList {
__CheckArguments 4 $# " $@ " #__WITH_PARANOIA_DEBUG
local retval
local escapedReplicaPath
local rsyncCmd
Logger " Getting file stats for $replicaType replica [ $replicaPath ]. " "NOTICE"
@ -4003,7 +3993,6 @@ function conflictList {
__CheckArguments 2 $# " $@ " #__WITH_PARANOIA_DEBUG
local retval
local escapedReplicaPath
if [ -f " ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ INITIATOR [ $__type ] } $timestampCurrentFilename " ] && [ -f " ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ TARGET [ $__type ] } $timestampCurrentFilename " ] ; then
# Remove prepending replicaPaths
@ -4080,8 +4069,6 @@ function syncAttrs {
local sourceDir
local destDir
local escSourceDir
local escDestDir
local destReplica
if [ " $LOCAL_OS " = = "BusyBox" ] || [ " $LOCAL_OS " = = "Android" ] || [ " $REMOTE_OS " = = "BusyBox" ] || [ " $REMOTE_OS " = = "Android" ] ; then
@ -4094,7 +4081,7 @@ function syncAttrs {
if [ " $REMOTE_OPERATION " = = true ] ; then
CheckConnectivity3rdPartyHosts
CheckConnectivityRemoteHost
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" -i -n $RSYNC_DEFAULT_ARGS $RSYNC_ATTR_ARGS $RSYNC_PARTIAL_EXCLUDE -e \" $RSYNC_SSH_CMD \" --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE \" $initiatorReplica \" $REMOTE_USER @ $REMOTE_HOST :\" $targetReplica \" >> $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $SCRIPT_PID . $TSTAMP 2>&1 "
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" -i -n $RSYNC_DEFAULT_ARGS $RSYNC_ATTR_ARGS $RSYNC_PARTIAL_EXCLUDE -e \" $RSYNC_SSH_CMD \" --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE \" $initiatorReplica \" $REMOTE_USER @ $REMOTE_HOST :\" ' $targetReplica ' \" >> $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $SCRIPT_PID . $TSTAMP 2>&1 "
else
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" -i -n $RSYNC_DEFAULT_ARGS $RSYNC_ATTR_ARGS $RSYNC_PARTIAL_EXCLUDE --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE \" $initiatorReplica \" \" $targetReplica \" >> $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } . $SCRIPT_PID . $TSTAMP 2>&1 "
fi
@ -4149,16 +4136,12 @@ function syncAttrs {
if [ " $CONFLICT_PREVALANCE " = = " ${ TARGET [ $__type ] } " ] ; then
sourceDir = " ${ INITIATOR [ $__replicaDir ] } "
escSourceDir = $( EscapeSpaces " ${ INITIATOR [ $__replicaDir ] } " )
destDir = " ${ TARGET [ $__replicaDir ] } "
escDestDir = $( EscapeSpaces " ${ TARGET [ $__replicaDir ] } " )
destReplica = " ${ TARGET [ $__type ] } "
join -j 1 -t ';' -o 1.1,1.2,2.2 " $RUN_DIR / $PROGRAM .ctime_mtime___. ${ INITIATOR [ $__type ] } . $SCRIPT_PID . $TSTAMP " " $RUN_DIR / $PROGRAM .ctime_mtime___. ${ TARGET [ $__type ] } . $SCRIPT_PID . $TSTAMP " | awk -F';' '{if ($2 > $3) print $1}' > " $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } -ctime_files. $SCRIPT_PID . $TSTAMP "
else
sourceDir = " ${ TARGET [ $__replicaDir ] } "
escSourceDir = $( EscapeSpaces " ${ TARGET [ $__replicaDir ] } " )
destDir = " ${ INITIATOR [ $__replicaDir ] } "
escDestDir = $( EscapeSpaces " ${ INITIATOR [ $__replicaDir ] } " )
destReplica = " ${ INITIATOR [ $__type ] } "
join -j 1 -t ';' -o 1.1,1.2,2.2 " $RUN_DIR / $PROGRAM .ctime_mtime___. ${ TARGET [ $__type ] } . $SCRIPT_PID . $TSTAMP " " $RUN_DIR / $PROGRAM .ctime_mtime___. ${ INITIATOR [ $__type ] } . $SCRIPT_PID . $TSTAMP " | awk -F';' '{if ($2 > $3) print $1}' > " $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } -ctime_files. $SCRIPT_PID . $TSTAMP "
fi
@ -4176,9 +4159,9 @@ function syncAttrs {
# No rsync args (hence no -r) because files are selected with --from-file
if [ " $destReplica " = = " ${ INITIATOR [ $__type ] } " ] ; then
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" $RSYNC_DRY_ARG $RSYNC_ATTR_ARGS $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE --exclude-from=\" ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ INITIATOR [ $__type ] } ${ INITIATOR [ $__deletedListFile ] } \" --exclude-from=\" ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ TARGET [ $__type ] } ${ INITIATOR [ $__deletedListFile ] } \" --files-from=\" $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } -ctime_files. $SCRIPT_PID . $TSTAMP \" $REMOTE_USER @ $REMOTE_HOST :\" $ e scS ourceDir \" \"$destDir \" >> $RUN_DIR / $PROGRAM .attr-update. $destReplica . $SCRIPT_PID . $TSTAMP 2>&1 "
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" $RSYNC_DRY_ARG $RSYNC_ATTR_ARGS $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE --exclude-from=\" ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ INITIATOR [ $__type ] } ${ INITIATOR [ $__deletedListFile ] } \" --exclude-from=\" ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ TARGET [ $__type ] } ${ INITIATOR [ $__deletedListFile ] } \" --files-from=\" $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } -ctime_files. $SCRIPT_PID . $TSTAMP \" $REMOTE_USER @ $REMOTE_HOST :\" ' $ sourceDir' \" \"$destDir \" >> $RUN_DIR / $PROGRAM .attr-update. $destReplica . $SCRIPT_PID . $TSTAMP 2>&1 "
else
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" $RSYNC_DRY_ARG $RSYNC_ATTR_ARGS $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE --exclude-from=\" ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ INITIATOR [ $__type ] } ${ INITIATOR [ $__deletedListFile ] } \" --exclude-from=\" ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ TARGET [ $__type ] } ${ INITIATOR [ $__deletedListFile ] } \" --files-from=\" $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } -ctime_files. $SCRIPT_PID . $TSTAMP \" \" $sourceDir \" $REMOTE_USER @ $REMOTE_HOST :\" $escDestDir \" >> $RUN_DIR / $PROGRAM .attr-update. $destReplica . $SCRIPT_PID . $TSTAMP 2>&1 "
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" $RSYNC_DRY_ARG $RSYNC_ATTR_ARGS $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE --exclude-from=\" ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ INITIATOR [ $__type ] } ${ INITIATOR [ $__deletedListFile ] } \" --exclude-from=\" ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ TARGET [ $__type ] } ${ INITIATOR [ $__deletedListFile ] } \" --files-from=\" $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } -ctime_files. $SCRIPT_PID . $TSTAMP \" \" $sourceDir \" $REMOTE_USER @ $REMOTE_HOST :\" '$destDir ' \" >> $RUN_DIR / $PROGRAM .attr-update. $destReplica . $SCRIPT_PID . $TSTAMP 2>&1 "
fi
else
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" $RSYNC_DRY_ARG $RSYNC_ATTR_ARGS $SYNC_OPTS --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE --exclude-from=\" ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ INITIATOR [ $__type ] } ${ INITIATOR [ $__deletedListFile ] } \" --exclude-from=\" ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / ${ TARGET [ $__type ] } ${ INITIATOR [ $__deletedListFile ] } \" --files-from=\" $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } -ctime_files. $SCRIPT_PID . $TSTAMP \" \" $sourceDir \" \" $destDir \" >> $RUN_DIR / $PROGRAM .attr-update. $destReplica . $SCRIPT_PID . $TSTAMP 2>&1 "
@ -4216,9 +4199,7 @@ function syncUpdate {
local retval
local sourceDir
local escSourceDir
local destDir
local escDestDir
local backupArgs
local deleteArgs
@ -4230,16 +4211,10 @@ function syncUpdate {
sourceDir = " ${ INITIATOR [ $__replicaDir ] } "
destDir = " ${ TARGET [ $__replicaDir ] } "
backupArgs = " $TARGET_BACKUP "
escSourceDir = $( EscapeSpaces " ${ INITIATOR [ $__replicaDir ] } " )
escDestDir = $( EscapeSpaces " ${ TARGET [ $__replicaDir ] } " )
else
sourceDir = " ${ TARGET [ $__replicaDir ] } "
destDir = " ${ INITIATOR [ $__replicaDir ] } "
backupArgs = " $INITIATOR_BACKUP "
escSourceDir = $( EscapeSpaces " ${ TARGET [ $__replicaDir ] } " )
escDestDir = $( EscapeSpaces " ${ INITIATOR [ $__replicaDir ] } " )
fi
if [ " $remoteDelete " = = true ] ; then
@ -4257,9 +4232,9 @@ function syncUpdate {
CheckConnectivity3rdPartyHosts
CheckConnectivityRemoteHost
if [ " $sourceReplica " = = " ${ INITIATOR [ $__type ] } " ] ; then
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" $RSYNC_DEFAULT_ARGS $RSYNC_DRY_ARG $RSYNC_ATTR_ARGS $RSYNC_TYPE_ARGS $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" $backupArgs $deleteArgs --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE $exclude_list_initiator $exclude_list_target \" $sourceDir \" $REMOTE_USER @ $REMOTE_HOST :\" $escDestDir \" >> $RUN_DIR / $PROGRAM .update. $destinationReplica . $SCRIPT_PID . $TSTAMP 2>&1 "
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" $RSYNC_DEFAULT_ARGS $RSYNC_DRY_ARG $RSYNC_ATTR_ARGS $RSYNC_TYPE_ARGS $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" $backupArgs $deleteArgs --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE $exclude_list_initiator $exclude_list_target \" $sourceDir \" $REMOTE_USER @ $REMOTE_HOST :\" '$destDir ' \" >> $RUN_DIR / $PROGRAM .update. $destinationReplica . $SCRIPT_PID . $TSTAMP 2>&1 "
else
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" $RSYNC_DEFAULT_ARGS $RSYNC_DRY_ARG $RSYNC_ATTR_ARGS $RSYNC_TYPE_ARGS $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" $backupArgs $deleteArgs --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE $exclude_list_initiator $exclude_list_target $REMOTE_USER @ $REMOTE_HOST :\" $ e scS ourceDir \" \"$destDir \" >> $RUN_DIR / $PROGRAM .update. $destinationReplica . $SCRIPT_PID . $TSTAMP 2>&1 "
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" $RSYNC_DEFAULT_ARGS $RSYNC_DRY_ARG $RSYNC_ATTR_ARGS $RSYNC_TYPE_ARGS $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" $backupArgs $deleteArgs --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE $exclude_list_initiator $exclude_list_target $REMOTE_USER @ $REMOTE_HOST :\" ' $ sourceDir' \" \"$destDir \" >> $RUN_DIR / $PROGRAM .update. $destinationReplica . $SCRIPT_PID . $TSTAMP 2>&1 "
fi
else
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" $RSYNC_DEFAULT_ARGS $RSYNC_DRY_ARG $RSYNC_ATTR_ARGS $RSYNC_TYPE_ARGS $SYNC_OPTS $backupArgs $deleteArgs --exclude \" $OSYNC_DIR \" $RSYNC_FULL_PATTERNS $RSYNC_PARTIAL_EXCLUDE $exclude_list_initiator $exclude_list_target \" $sourceDir \" \" $destDir \" >> $RUN_DIR / $PROGRAM .update. $destinationReplica . $SCRIPT_PID . $TSTAMP 2>&1 "
@ -4382,7 +4357,6 @@ function _deleteRemote {
__CheckArguments 3 $# " $@ " #__WITH_PARANOIA_DEBUG
local retval
local escDestDir
local rsyncCmd
local failedDeleteList
@ -4406,8 +4380,7 @@ function _deleteRemote {
## Anything beetween << ENDSSH and ENDSSH will be executed remotely
# Additionnaly, we need to copy the deletetion list to the remote state folder
escDestDir = " $( EscapeSpaces " ${ TARGET [ $__replicaDir ] } ${ TARGET [ $__stateDir ] } " ) "
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" -e \" $RSYNC_SSH_CMD \" \" ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / $deletionListFromReplica ${ INITIATOR [ $__deletedListFile ] } \" $REMOTE_USER @ $REMOTE_HOST :\" $escDestDir /\" >> $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } .precopy. $SCRIPT_PID . $TSTAMP 2>&1 "
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" -e \" $RSYNC_SSH_CMD \" \" ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__stateDir ] } / $deletionListFromReplica ${ INITIATOR [ $__deletedListFile ] } \" $REMOTE_USER @ $REMOTE_HOST :\"' ${ TARGET [ $__replicaDir ] } ${ TARGET [ $__stateDir ] } '/\" >> $RUN_DIR / $PROGRAM . ${ FUNCNAME [0] } .precopy. $SCRIPT_PID . $TSTAMP 2>&1 "
Logger " RSYNC_CMD: $rsyncCmd " "DEBUG"
eval " $rsyncCmd " 2>> " $LOG_FILE "
retval = $?
@ -4427,7 +4400,7 @@ env _REMOTE_EXECUTION="true" env PROGRAM="'$PROGRAM'" env SCRIPT_PID="'$SCRIPT_P
env _DRYRUN = " ' $_DRYRUN ' " \
env LOCAL_OS = " $REMOTE_OS " \
env FILE_LIST = " ' ${ TARGET [ $__replicaDir ] } ${ TARGET [ $__stateDir ] } / $deletionListFromReplica ${ INITIATOR [ $__deletedListFile ] } ' " env REPLICA_DIR = " ' $replicaDir ' " env SOFT_DELETE = " ' $SOFT_DELETE ' " \
env DELETION_DIR = " ' $( EscapeSpaces " $deletionDir " ) ' " env FAILED_DELETE_LIST = " ' $failedDeleteList ' " env SUCCESS_DELETE_LIST = " ' $successDeleteList ' " env REPLICA_TYPE = " ' $replicaType ' " \
env DELETION_DIR = " ' $deletionDir ' " env FAILED_DELETE_LIST = " ' $failedDeleteList ' " env SUCCESS_DELETE_LIST = " ' $successDeleteList ' " env REPLICA_TYPE = " ' $replicaType ' " \
env LC_ALL = C $COMMAND_SUDO ' bash -s' << 'ENDSSH' >> " $RUN_DIR / $PROGRAM .remote_deletion. $SCRIPT_PID . $TSTAMP " 2>& 1
_REMOTE_TOKEN = "(o_0)"
## Default directory where to store temporary run files
@ -4696,7 +4669,7 @@ ENDSSH
fi
## Copy back the deleted failed file list
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) -r --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" -e \" $RSYNC_SSH_CMD \" --include \" $( dirname ${ TARGET [ $__stateDir ] } ) \" --include \" ${ TARGET [ $__stateDir ] } \" --include \" ${ TARGET [ $__stateDir ] } / $replicaType ${ TARGET [ $__failedDeletedListFile ] } \" --include \" ${ TARGET [ $__stateDir ] } / $replicaType ${ TARGET [ $__successDeletedListFile ] } \" --exclude='*' $REMOTE_USER @ $REMOTE_HOST :\" $( EscapeSpaces " ${ TARGET [ $__replicaDir ] } " ) \" \"${ INITIATOR [ $__replicaDir ] } \" > \" $RUN_DIR / $PROGRAM .remote_failed_deletion_list_copy. $SCRIPT_PID . $TSTAMP \" "
rsyncCmd = " $( type -p $RSYNC_EXECUTABLE ) -r --rsync-path=\"env LC_ALL=C env _REMOTE_TOKEN= $_REMOTE_TOKEN $RSYNC_PATH \" -e \" $RSYNC_SSH_CMD \" --include \" $( dirname ${ TARGET [ $__stateDir ] } ) \" --include \" ${ TARGET [ $__stateDir ] } \" --include \" ${ TARGET [ $__stateDir ] } / $replicaType ${ TARGET [ $__failedDeletedListFile ] } \" --include \" ${ TARGET [ $__stateDir ] } / $replicaType ${ TARGET [ $__successDeletedListFile ] } \" --exclude='*' $REMOTE_USER @ $REMOTE_HOST :\" '${ TARGET [ $__replicaDir ] } ' \" \"${ INITIATOR [ $__replicaDir ] } \" > \" $RUN_DIR / $PROGRAM .remote_failed_deletion_list_copy. $SCRIPT_PID . $TSTAMP \" "
Logger " RSYNC_CMD: $rsyncCmd " "DEBUG"
eval " $rsyncCmd " 2>> " $LOG_FILE "
if [ $? -ne 0 ] ; then
@ -5722,7 +5695,7 @@ function _TriggerInitiatorRunRemote {
$SSH_CMD env _REMOTE_TOKEN = " $_REMOTE_TOKEN " \
env _DEBUG = " ' $_DEBUG ' " env _PARANOIA_DEBUG = " ' $_PARANOIA_DEBUG ' " env _LOGGER_SILENT = " ' $_LOGGER_SILENT ' " env _LOGGER_VERBOSE = " ' $_LOGGER_VERBOSE ' " env _LOGGER_PREFIX = " ' $_LOGGER_PREFIX ' " env _LOGGER_ERR_ONLY = " ' $_LOGGER_ERR_ONLY ' " \
env _REMOTE_EXECUTION = "true" env PROGRAM = " ' $PROGRAM ' " env SCRIPT_PID = " ' $SCRIPT_PID ' " env TSTAMP = " ' $TSTAMP ' " \
env INSTANCE_ID = " ' $INSTANCE_ID ' " env PUSH_FILE = " ' $( EscapeSpaces " ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__updateTriggerFile ] } " ) ' " \
env INSTANCE_ID = " ' $INSTANCE_ID ' " env PUSH_FILE = " ' ${ INITIATOR [ $__replicaDir ] } ${ INITIATOR [ $__updateTriggerFile ] } ' " \
env LC_ALL = C $COMMAND_SUDO ' bash -s' << 'ENDSSH' > "$RUN_DIR/$PROGRAM.${FUNCNAME [ 0] } .$SCRIPT_PID .$TSTAMP " 2> " $RUN_DIR /$PROGRAM .${ FUNCNAME [0] } .error.$SCRIPT_PID .$TSTAMP "
_REMOTE_TOKEN = "(o_0)"
## Default directory where to store temporary run files
@ -6318,7 +6291,7 @@ function Usage {
echo "--initiator=\"\" Master replica path. Will contain state and backup directory (is mandatory)"
echo "--target=\"\" Local or remote target replica path. Can be a ssh uri like ssh://user@host.com:22//path/to/target/replica (is mandatory)"
echo "--rsakey=\"\" Alternative path to rsa private key for ssh connection to target replica"
echo "--ssh-controlmaster Allow using a single TCP connection for all ssh calls. Will make remote sync faster, but may fail easier on lossy links"
echo "--ssh-controlmaster Allow using a single TCP connection for all ssh calls. Will make remote sync faster, but may fail easier on lossy links"
echo "--password-file=\"\" If no rsa private key is used for ssh authentication, a password file can be used"
echo "--remote-token=\"\" When using ssh filter protection, you must specify the remote token set in ssh_filter.sh"
echo "--instance-id=\"\" Optional sync task name to identify this synchronization task when using multiple targets"