@ -1,10 +1,12 @@
#!/usr/bin/env bash
#TODO: terminer funcname present dasn osync et non dans ofunc
PROGRAM = "osync" # Rsync based two way sync engine with fault tolerance
AUTHOR = "(L) 2013-2016 by Orsiris de Jong"
CONTACT = "http://www.netpower.fr/osync - ozy@netpower.fr"
PROGRAM_VERSION = 1.1-dev
PROGRAM_BUILD = 201602180 2
PROGRAM_BUILD = 201602180 3
IS_STABLE = no
source "./ofunctions.sh"
@ -79,7 +81,7 @@ function TrapQuit {
}
function CheckEnvironment {
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
if [ " $REMOTE_OPERATION " = = "yes" ] ; then
if ! type ssh > /dev/null 2>& 1 ; then
@ -95,7 +97,7 @@ function CheckEnvironment {
}
function CheckCurrentConfig {
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
if [ " $INSTANCE_ID " = = "" ] ; then
Logger "No INSTANCE_ID defined in config file." "CRITICAL"
@ -133,13 +135,13 @@ function CheckCurrentConfig {
function _CreateStateDirsLocal {
local replica_state_dir = " ${ 1 } "
__CheckArguments 1 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 1 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
if ! [ -d " $replica_state_dir " ] ; then
$COMMAND_SUDO mkdir -p " $replica_state_dir " > " $RUN_DIR / $PROGRAM . $ FUNCNAME. $SCRIPT_PID " 2>& 1
$COMMAND_SUDO mkdir -p " $replica_state_dir " > " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } . $SCRIPT_PID " 2>& 1
if [ $? != 0 ] ; then
Logger " Cannot create state dir [ $replica_state_dir ]. " "CRITICAL"
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID ) " "ERROR"
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID ) " "ERROR"
exit 1
fi
fi
@ -147,26 +149,26 @@ function _CreateStateDirsLocal {
function _CreateStateDirsRemote {
local replica_state_dir = " ${ 1 } "
__CheckArguments 1 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 1 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local cmd =
CheckConnectivity3rdPartyHosts
CheckConnectivityRemoteHost
cmd = $SSH_CMD ' "if ! [ -d \"' $replica_state_dir '\" ]; then ' $COMMAND_SUDO ' mkdir -p \"' $replica_state_dir '\"; fi" > "' $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID '" 2>&1'
cmd = $SSH_CMD ' "if ! [ -d \"' $replica_state_dir '\" ]; then ' $COMMAND_SUDO ' mkdir -p \"' $replica_state_dir '\"; fi" > "' $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID '" 2>&1'
Logger " cmd: $cmd " "DEBUG"
eval " $cmd " &
WaitForTaskCompletion $! 720 1800 $ FUNCNAME
WaitForTaskCompletion $! 720 1800 ${ FUNCNAME[0] }
if [ $? != 0 ] ; then
Logger " Cannot create remote state dir [ $replica_state_dir ]. " "CRITICAL"
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID ) " "ERROR"
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID ) " "ERROR"
exit 1
fi
}
function CreateStateDirs {
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
_CreateStateDirsLocal " ${ INITIATOR [1] } ${ INITIATOR [3] } "
if [ " $REMOTE_OPERATION " != "yes" ] ; then
@ -178,14 +180,14 @@ function CreateStateDirs {
function _CheckReplicaPathsLocal {
local replica_path = " ${ 1 } "
__CheckArguments 1 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 1 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
if [ ! -d " $replica_path " ] ; then
if [ " $CREATE_DIRS " = = "yes" ] ; then
$COMMAND_SUDO mkdir -p " $replica_path " > " $RUN_DIR / $PROGRAM . $ FUNCNAME. $SCRIPT_PID " 2>& 1
$COMMAND_SUDO mkdir -p " $replica_path " > " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } . $SCRIPT_PID " 2>& 1
if [ $? != 0 ] ; then
Logger " Cannot create local replica path [ $replica_path ]. " "CRITICAL"
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID ) "
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID ) "
exit 1
else
Logger " Created local replica path [ $replica_path ]. " "NOTICE"
@ -204,26 +206,26 @@ function _CheckReplicaPathsLocal {
function _CheckReplicaPathsRemote {
local replica_path = " ${ 1 } "
__CheckArguments 1 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 1 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local cmd =
CheckConnectivity3rdPartyHosts
CheckConnectivityRemoteHost
cmd = $SSH_CMD ' "if ! [ -d \"' $replica_path '\" ]; then if [ \"' $CREATE_DIRS '\" == \"yes\" ]; then ' $COMMAND_SUDO ' mkdir -p \"' $replica_path '\"; fi; fi" > "' $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID '" 2>&1'
cmd = $SSH_CMD ' "if ! [ -d \"' $replica_path '\" ]; then if [ \"' $CREATE_DIRS '\" == \"yes\" ]; then ' $COMMAND_SUDO ' mkdir -p \"' $replica_path '\"; fi; fi" > "' $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID '" 2>&1'
Logger " cmd: $cmd " "DEBUG"
eval " $cmd " &
WaitForTaskCompletion $! 720 1800 $ FUNCNAME
WaitForTaskCompletion $! 720 1800 ${ FUNCNAME[0] }
if [ $? != 0 ] ; then
Logger " Cannot create remote replica path [ $replica_path ]. " "CRITICAL"
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID ) " "ERROR"
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID ) " "ERROR"
exit 1
fi
cmd = $SSH_CMD ' "if [ ! -w \"' $replica_path '\" ];then exit 1; fi" 2>&1'
Logger " cmd: $cmd " "DEBUG"
eval " $cmd " &
WaitForTaskCompletion $! 720 1800 $ FUNCNAME
WaitForTaskCompletion $! 720 1800 ${ FUNCNAME[0] }
if [ $? != 0 ] ; then
Logger " Remote replica path [ $replica_path ] is not writable. " "CRITICAL"
exit 1
@ -231,7 +233,7 @@ function _CheckReplicaPathsRemote {
}
function CheckReplicaPaths {
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
#INITIATOR_SYNC_DIR_CANN=$(realpath "$INITIATOR_SYNC_DIR") #TODO: investigate realpath & readlink issues on MSYS and busybox here
#TARGET_SYNC_DIR_CANN=$(realpath "$TARGET_SYNC_DIR") #TODO2: replace all variables with INITIATOR object
@ -253,7 +255,7 @@ function CheckReplicaPaths {
function _CheckDiskSpaceLocal {
local replica_path = " ${ 1 } "
__CheckArguments 1 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 1 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
Logger " Checking minimum disk space in [ $replica_path ]. " "NOTICE"
@ -265,7 +267,7 @@ function _CheckDiskSpaceLocal {
function _CheckDiskSpaceRemote {
local replica_path = " ${ 1 } "
__CheckArguments 1 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 1 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
Logger " Checking minimum disk space on target [ $replica_path ]. " "NOTICE"
@ -274,15 +276,15 @@ function _CheckDiskSpaceRemote {
CheckConnectivity3rdPartyHosts
CheckConnectivityRemoteHost
cmd = $SSH_CMD ' "' $COMMAND_SUDO ' df -P \"' $replica_path '\"" > "' $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID '" 2>&1'
cmd = $SSH_CMD ' "' $COMMAND_SUDO ' df -P \"' $replica_path '\"" > "' $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID '" 2>&1'
Logger " cmd: $cmd " "DEBUG"
eval " $cmd " &
WaitForTaskCompletion $! 720 1800 $ FUNCNAME
WaitForTaskCompletion $! 720 1800 ${ FUNCNAME[0] }
if [ $? != 0 ] ; then
Logger " Cannot get free space on target [ $replica_path ]. " "ERROR"
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID ) " "NOTICE"
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID ) " "NOTICE"
else
local disk_space = $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID | tail -1 | awk '{print $4}' )
local disk_space = $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID | tail -1 | awk '{print $4}' )
if [ $tdisk_space -lt $MINIMUM_SPACE ] ; then
Logger " There is not enough free space on replica [ $replica_path ] ( $disk_space KB). " "WARN"
fi
@ -290,7 +292,7 @@ function _CheckDiskSpaceRemote {
}
function CheckDiskSpace {
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
_CheckDiskSpaceLocal " ${ INITIATOR [1] } "
if [ " $REMOTE_OPERATION " != "yes" ] ; then
@ -303,7 +305,7 @@ function CheckDiskSpace {
function RsyncPatternsAdd {
local pattern = " ${ 1 } "
local pattern_type = " ${ 2 } " # exclude or include
__CheckArguments 2 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 2 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local rest =
@ -333,7 +335,7 @@ function RsyncPatternsAdd {
function RsyncPatternsFromAdd {
local pattern_from = " ${ 1 } "
local pattern_type = " ${ 2 } "
__CheckArguments 2 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 2 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local pattern_from =
@ -348,7 +350,7 @@ function RsyncPatternsFromAdd {
}
function RsyncPatterns {
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
if [ " $RSYNC_PATTERN_FIRST " = = "exclude" ] ; then
RsyncPatternsAdd " $RSYNC_EXCLUDE_PATTERN " "exclude"
@ -375,7 +377,7 @@ function RsyncPatterns {
function _WriteLockFilesLocal {
local lockfile = " ${ 1 } "
__CheckArguments 1 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 1 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
$COMMAND_SUDO echo " $SCRIPT_PID @ $INSTANCE_ID " > " $lockfile " #TODO: Determine best format for lockfile for v2
if [ $? != 0 ] ; then
@ -388,7 +390,7 @@ function _WriteLockFilesLocal {
function _WriteLockFilesRemote {
local lockfile = " ${ 1 } "
__CheckArguments 1 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 1 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local cmd =
@ -398,7 +400,7 @@ function _WriteLockFilesRemote {
cmd = $SSH_CMD ' "echo ' $SCRIPT_PID @$INSTANCE_ID ' | ' $COMMAND_SUDO ' tee \"' $lockfile '\"" > /dev/null 2>&1'
Logger " cmd: $cmd " "DEBUG"
eval " $cmd " &
WaitForTaskCompletion $! 720 1800 $ FUNCNAME
WaitForTaskCompletion $! 720 1800 ${ FUNCNAME[0] }
if [ $? != 0 ] ; then
Logger "Could not set lock on remote target replica." "CRITICAL"
exit 1
@ -408,7 +410,7 @@ function _WriteLockFilesRemote {
}
function WriteLockFiles {
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
_WriteLockFilesLocal " ${ INITIATOR [2] } "
if [ " $REMOTE_OPERATION " != "yes" ] ; then
@ -420,7 +422,7 @@ function WriteLockFiles {
function _CheckLocksLocal {
local lockfile = " ${ 1 } "
__CheckArguments 1 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 1 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local lockfile_content =
local lock_pid =
@ -443,7 +445,7 @@ function _CheckLocksLocal {
function _CheckLocksRemote { #TODO: Rewrite this a bit more beautiful
local lockfile = " ${ 1 } "
__CheckArguments 1 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 1 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local cmd =
local lock_pid =
@ -452,13 +454,13 @@ function _CheckLocksRemote { #TODO: Rewrite this a bit more beautiful
CheckConnectivity3rdPartyHosts
CheckConnectivityRemoteHost
cmd = $SSH_CMD ' "if [ -f \"' $lockfile '\" ]; then cat \"' $lockfile '\"; fi" > "' $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID '"'
cmd = $SSH_CMD ' "if [ -f \"' $lockfile '\" ]; then cat \"' $lockfile '\"; fi" > "' $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID '"'
Logger " cmd: $cmd " "DEBUG"
eval " $cmd " &
WaitForTaskCompletion $! 720 1800 $ FUNCNAME
WaitForTaskCompletion $! 720 1800 ${ FUNCNAME[0] }
if [ $? != 0 ] ; then
if [ -f " $RUN_DIR / $PROGRAM . $ FUNCNAME. $SCRIPT_PID " ] ; then
local lockfile_content = $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID )
if [ -f " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } . $SCRIPT_PID " ] ; then
local lockfile_content = $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID )
else
Logger "Cannot get remote lockfile." "CRITICAL"
exit 1
@ -491,7 +493,7 @@ function _CheckLocksRemote { #TODO: Rewrite this a bit more beautiful
}
function CheckLocks {
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
if [ $_NOLOCKS -eq 1 ] ; then
return 0
@ -516,7 +518,7 @@ function CheckLocks {
function _UnlockReplicasLocal {
local lockfile = " ${ 1 } "
__CheckArguments 1 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 1 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
if [ -f " $lockfile " ] ; then
$COMMAND_SUDO rm " $lockfile "
@ -530,27 +532,27 @@ function _UnlockReplicasLocal {
function _UnlockReplicasRemote {
local lockfile = " ${ 1 } "
__CheckArguments 1 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 1 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local cmd =
CheckConnectivity3rdPartyHosts
CheckConnectivityRemoteHost
cmd = $SSH_CMD ' "if [ -f \"' $lockfile '\" ]; then ' $COMMAND_SUDO ' rm -f \"' $lockfile '\"; fi" > "' $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID '" 2>&1'
cmd = $SSH_CMD ' "if [ -f \"' $lockfile '\" ]; then ' $COMMAND_SUDO ' rm -f \"' $lockfile '\"; fi" > "' $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID '" 2>&1'
Logger " cmd: $cmd " "DEBUG"
eval " $cmd " &
WaitForTaskCompletion $! 720 1800 $ FUNCNAME
WaitForTaskCompletion $! 720 1800 ${ FUNCNAME[0] }
if [ $? != 0 ] ; then
Logger "Could not unlock remote replica." "ERROR"
Logger " Command Output:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID ) " "NOTICE"
Logger " Command Output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID ) " "NOTICE"
else
Logger "Removed remote replica lock." "DEBUG"
fi
}
function UnlockReplicas {
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
if [ $_NOLOCKS -eq 1 ] ; then
return 0
@ -579,7 +581,7 @@ function tree_list {
local escaped_replica_path =
local rsync_cmd =
__CheckArguments 3 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 3 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
escaped_replica_path = $( EscapeSpaces " $replica_path " )
@ -594,7 +596,7 @@ function tree_list {
Logger " RSYNC_CMD: $rsync_cmd " "DEBUG"
## Redirect commands stderr here to get rsync stderr output in logfile
eval " $rsync_cmd " 2>> " $LOG_FILE "
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME $ FUNCNAME
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME ${ FUNCNAME[0] }
retval = $?
## Retval 24 = some files vanished while creating list
if ( [ $retval = = 0 ] || [ $retval = = 24 ] ) && [ -f " $RUN_DIR / $PROGRAM . $replica_type . $SCRIPT_PID " ] ; then
@ -613,7 +615,7 @@ function delete_list {
local tree_file_current = " ${ 3 } " # tree-file-current, will be prefixed with replica type
local deleted_list_file = " ${ 4 } " # file containing deleted file list, will be prefixed with replica type
local deleted_failed_list_file = " ${ 5 } " # file containing files that could not be deleted on last run, will be prefixed with replica type
__CheckArguments 5 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 5 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local cmd =
@ -650,27 +652,27 @@ function _get_file_ctime_mtime_local {
local replica_path = " ${ 1 } " # Contains replica path
local replica_type = " ${ 2 } " # Initiator / Target
local file_list = " ${ 3 } " # Contains list of files to get time attrs
__CheckArguments 3 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 3 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
cat " $file_list " | xargs -I { } stat -c '%n|%Z|%Y' " $replica_path {} " | sort > " $RUN_DIR / $PROGRAM . $ FUNCNAME. $replica_type . $SCRIPT_PID "
cat " $file_list " | xargs -I { } stat -c '%n|%Z|%Y' " $replica_path {} " | sort > " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } . $replica_type . $SCRIPT_PID "
}
function _get_file_ctime_mtime_remote {
local replica_path = " ${ 1 } " # Contains replica path
local replica_type = " ${ 2 } "
local file_list = " ${ 3 } "
__CheckArguments 3 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 3 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local cmd =
cmd = 'cat "' $file_list '" | ' $SSH_CMD ' xargs -I "' $replica_path '"{} stat -c "%n|%Z|%Y" "{}" | sort > "' $RUN_DIR /$PROGRAM .$ FUNCNAME.$replica_type .$SCRIPT_PID '"'
cmd = 'cat "' $file_list '" | ' $SSH_CMD ' xargs -I "' $replica_path '"{} stat -c "%n|%Z|%Y" "{}" | sort > "' $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$replica_type .$SCRIPT_PID '"'
Logger " CMD: $cmd " "DEBUG"
eval " $cmd "
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME $ FUNCNAME
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME ${ FUNCNAME[0] }
if [ $? != 0 ] ; then
Logger " Getting file attributes failed [ $retval ] on $replica_type . Stopping execution. " "CRITICAL"
if [ $_VERBOSE -eq 0 ] && [ -f " $RUN_DIR / $PROGRAM . $ FUNCNAME. $replica_type . $SCRIPT_PID " ] ; then
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$replica_type .$SCRIPT_PID ) " "NOTICE"
if [ $_VERBOSE -eq 0 ] && [ -f " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } . $replica_type . $SCRIPT_PID " ] ; then
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$replica_type .$SCRIPT_PID ) " "NOTICE"
fi
exit 1
fi
@ -681,7 +683,7 @@ function _get_file_ctime_mtime_remote {
function sync_attrs {
local initiator_replica = " ${ 1 } "
local target_replica = " ${ 2 } "
__CheckArguments 2 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 2 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local rsync_cmd =
local retval =
@ -691,37 +693,37 @@ function sync_attrs {
if [ " $REMOTE_OPERATION " = = "yes" ] ; then
CheckConnectivity3rdPartyHosts
CheckConnectivityRemoteHost
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" -i $RSYNC_ARGS $RSYNC_ATTR_ARGS $RSYNC_PARTIAL_EXCLUDE -e \" $RSYNC_SSH_CMD \" $BACKUP_DIR --exclude \" $OSYNC_DIR \" $RSYNC_PATTERNS $RSYNC_PARTIAL_EXCLUDE \" $initiator_replica \" $REMOTE_USER @ $REMOTE_HOST :\" $target_replica \" > $RUN_DIR / $PROGRAM . $ FUNCNAME. $SCRIPT_PID 2>&1 & "
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" -i $RSYNC_ARGS $RSYNC_ATTR_ARGS $RSYNC_PARTIAL_EXCLUDE -e \" $RSYNC_SSH_CMD \" $BACKUP_DIR --exclude \" $OSYNC_DIR \" $RSYNC_PATTERNS $RSYNC_PARTIAL_EXCLUDE \" $initiator_replica \" $REMOTE_USER @ $REMOTE_HOST :\" $target_replica \" > $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } . $SCRIPT_PID 2>&1 & "
else
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" -i $RSYNC_ARGS $RSYNC_ATTR_ARGS $RSYNC_PARTIAL_EXCLUDE --exclude \" $OSYNC_DIR \" $RSYNC_PATTERNS $RSYNC_PARTIAL_EXCLUDE \" $initiator_replica \" \" $target_replica \" > $RUN_DIR / $PROGRAM . $ FUNCNAME. $SCRIPT_PID 2>&1 & "
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" -i $RSYNC_ARGS $RSYNC_ATTR_ARGS $RSYNC_PARTIAL_EXCLUDE --exclude \" $OSYNC_DIR \" $RSYNC_PATTERNS $RSYNC_PARTIAL_EXCLUDE \" $initiator_replica \" \" $target_replica \" > $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } . $SCRIPT_PID 2>&1 & "
fi
Logger " RSYNC_CMD: $rsync_cmd " "DEBUG"
eval " $rsync_cmd "
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME $ FUNCNAME
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME ${ FUNCNAME[0] }
retval = $?
if [ $_VERBOSE -eq 1 ] && [ -f " $RUN_DIR / $PROGRAM . $ FUNCNAME. $SCRIPT_PID " ] ; then
Logger " List:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID ) " "NOTICE"
if [ $_VERBOSE -eq 1 ] && [ -f " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } . $SCRIPT_PID " ] ; then
Logger " List:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID ) " "NOTICE"
fi
if [ $retval != 0 ] && [ $retval != 24 ] ; then
Logger " Getting file list for attribute sync failed [ $retval ]. Stopping execution. " "CRITICAL"
if [ $_VERBOSE -eq 0 ] && [ -f " $RUN_DIR / $PROGRAM . $ FUNCNAME. $SCRIPT_PID " ] ; then
Logger " Rsync output:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID ) " "NOTICE"
if [ $_VERBOSE -eq 0 ] && [ -f " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } . $SCRIPT_PID " ] ; then
Logger " Rsync output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID ) " "NOTICE"
fi
exit $retval
else
cat " $RUN_DIR / $PROGRAM . $ FUNCNAME. $SCRIPT_PID " | ( grep -Ev "^[^ ]*(c|s|t)[^ ]* " || :) | ( grep -E "^[^ ]*(p|o|g|a)[^ ]* " || :) | sed -e 's/^[^ ]* //' > " $RUN_DIR / $PROGRAM . $ FUNCNAME-cleaned. $SCRIPT_PID "
cat " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } . $SCRIPT_PID " | ( grep -Ev "^[^ ]*(c|s|t)[^ ]* " || :) | ( grep -E "^[^ ]*(p|o|g|a)[^ ]* " || :) | sed -e 's/^[^ ]* //' > " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } -cleaned. $SCRIPT_PID "
if [ $? != 0 ] ; then
Logger "Cannot prepare file list for attribute sync." "CRITICAL"
exit 1
fi
fi
_get_file_ctime_mtime_local " ${ INITIATOR [1] } " " ${ INITIATOR [0] } " " $RUN_DIR / $PROGRAM . $ FUNCNAME-cleaned. $SCRIPT_PID "
_get_file_ctime_mtime_local " ${ INITIATOR [1] } " " ${ INITIATOR [0] } " " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } -cleaned. $SCRIPT_PID "
if [ " $REMOTE_OPERATION " != "yes" ] ; then
_get_file_ctime_mtime_local " ${ TARGET [1] } " " ${ TARGET [0] } " " $RUN_DIR / $PROGRAM . $ FUNCNAME-cleaned. $SCRIPT_PID "
_get_file_ctime_mtime_local " ${ TARGET [1] } " " ${ TARGET [0] } " " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } -cleaned. $SCRIPT_PID "
else
_get_file_ctime_mtime_remote " ${ TARGET [1] } " " ${ TARGET [0] } " " $RUN_DIR / $PROGRAM . $ FUNCNAME-cleaned. $SCRIPT_PID "
_get_file_ctime_mtime_remote " ${ TARGET [1] } " " ${ TARGET [0] } " " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } -cleaned. $SCRIPT_PID "
fi
# If target gets updated first, then sync_attr must update initiator's attrs first
@ -730,14 +732,14 @@ function sync_attrs {
source = targ
dest = ini
sed -i " s;^ ${ INITIATOR [1] } ; ${ TARGET [1] } ;g " " $RUN_DIR / $PROGRAM .syncattr. $SCRIPT_PID "
join -j 1 -t ';' -o 1.1,1.2,2.2 targ init | awk -F';' '{if ($2 < $3) print $1}' > " $RUN_DIR / $PROGRAM . $ FUNCNAME-attrfiles. $SCRIPT_PID "
join -j 1 -t ';' -o 1.1,1.2,2.2 targ init | awk -F';' '{if ($2 < $3) print $1}' > " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } -attrfiles. $SCRIPT_PID "
else
source = ini
dest = tar
sed -i " s;^ ${ TARGET [1] } ; ${ INITIATOR [1] } ;g " " $RUN_DIR / $PROGRAM .syncattr. $SCRIPT_PID "
join -j 1 -t ';' -o 1.1,1.2,2.2 init targ | awk -F';' '{if ($2 < $3) print $1}' > " $RUN_DIR / $PROGRAM . $ FUNCNAME-attrfiles. $SCRIPT_PID "
join -j 1 -t ';' -o 1.1,1.2,2.2 init targ | awk -F';' '{if ($2 < $3) print $1}' > " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } -attrfiles. $SCRIPT_PID "
fi
if [ " $REMOTE_OPERATION " != "yes" ] ; then
@ -747,16 +749,16 @@ function sync_attrs {
fi
Logger " RSYNC_CMD: $rsync_cmd " "DEBUG"
eval " $rsync_cmd "
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME $ FUNCNAME
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME ${ FUNCNAME[0] }
retval = $?
if [ $_VERBOSE -eq 1 ] && [ -f " $RUN_DIR / $PROGRAM . $ FUNCNAME-attrfiles. $SCRIPT_PID " ] ; then
if [ $_VERBOSE -eq 1 ] && [ -f " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } -attrfiles. $SCRIPT_PID " ] ; then
Logger " List:\n $( cat $RUN_DIR /$PROGRAM .$FUNCNAM -attrfiles.$SCRIPT_PID ) " "NOTICE"
fi
if [ $retval != 0 ] && [ $retval != 24 ] ; then
Logger " Updating file attributes on $source [ $retval ]. Stopping execution. " "CRITICAL"
if [ $_VERBOSE -eq 0 ] && [ -f " $RUN_DIR / $PROGRAM . $ FUNCNAME-attrfiles. $SCRIPT_PID " ] ; then
Logger " Rsync output:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME-attrfiles.$SCRIPT_PID ) " "NOTICE"
if [ $_VERBOSE -eq 0 ] && [ -f " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } -attrfiles. $SCRIPT_PID " ] ; then
Logger " Rsync output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } -attrfiles.$SCRIPT_PID ) " "NOTICE"
fi
exit $retval
else
@ -769,7 +771,7 @@ function sync_update {
local source_replica = " ${ 1 } " # Contains replica type of source: initiator, target
local destination_replica = " ${ 2 } " # Contains replica type of destination: initiator, target
local delete_list_filename = " ${ 3 } " # Contains deleted list filename, will be prefixed with replica type
__CheckArguments 3 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 3 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local rsync_cmd =
local retval =
@ -802,7 +804,7 @@ function sync_update {
fi
Logger " RSYNC_CMD: $rsync_cmd " "DEBUG"
eval " $rsync_cmd "
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME $ FUNCNAME
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME ${ FUNCNAME[0] }
retval = $?
if [ $_VERBOSE -eq 1 ] && [ -f " $RUN_DIR / $PROGRAM .update. $destination_replica . $SCRIPT_PID " ] ; then
Logger " List:\n $( cat $RUN_DIR /$PROGRAM .update.$destination_replica .$SCRIPT_PID ) " "NOTICE"
@ -826,7 +828,7 @@ function _delete_local {
local deleted_list_file = " ${ 2 } " # file containing deleted file list, will be prefixed with replica type
local deletion_dir = " ${ 3 } " # deletion dir in format .[workdir]/deleted
local deleted_failed_list_file = " ${ 4 } " # file containing files that could not be deleted on last run, will be prefixed with replica type
__CheckArguments 4 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 4 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local parentdir =
@ -890,20 +892,23 @@ function _delete_remote {
local deleted_list_file = " ${ 2 } " # file containing deleted file list, will be prefixed with replica type
local deletion_dir = " ${ 3 } " # deletion dir in format .[workdir]/deleted
local deleted_failed_list_file = " ${ 4 } " # file containing files that could not be deleted on last run, will be prefixed with replica type
__CheckArguments 4 $# $FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 4 $# ${ FUNCNAME [0] } " $@ " #__WITH_PARANOIA_DEBUG
local esc_dest_dir =
local rsync_cmd =
## This is a special coded function. Need to redelcare local functions on remote host, passing all needed variables as escaped arguments to ssh command.
## Anything beetween << ENDSSH and ENDSSH will be executed remotely
# Additionnaly, we need to copy the deletetion list to the remote state folder
local esc_dest_dir = " $( EscapeSpaces " ${ TARGET [1] } ${ TARGET [3] } " ) "
local rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" \" ${ INITIATOR [1] } $INITIATOR [3]}/ $2 \" $REMOTE_USER @ $REMOTE_HOST :\" $esc_dest_dir /\" > $RUN_DIR / $PROGRAM . $ FUNCNAME.precopy. $SCRIPT_PID 2>&1 "
esc_dest_dir = " $( EscapeSpaces " ${ TARGET [1] } ${ TARGET [3] } " ) "
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" \" ${ INITIATOR [1] } $INITIATOR [3]}/ $2 \" $REMOTE_USER @ $REMOTE_HOST :\" $esc_dest_dir /\" > $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } .precopy. $SCRIPT_PID 2>&1 "
Logger " RSYNC_CMD: $rsync_cmd " "DEBUG"
eval " $rsync_cmd " 2>> " $LOG_FILE "
if [ $? != 0 ] ; then
Logger "Cannot copy the deletion list to remote replica." "ERROR"
if [ -f " $RUN_DIR / $PROGRAM . $ FUNCNAME.precopy. $SCRIPT_PID " ] ; then
Logger " $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.precopy.$SCRIPT_PID ) " "ERROR"
if [ -f " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } .precopy. $SCRIPT_PID " ] ; then
Logger " $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .precopy.$SCRIPT_PID ) " "ERROR"
fi
exit 1
fi
@ -1010,9 +1015,9 @@ ENDSSH
sleep 5
## Copy back the deleted failed file list
local esc_source_file = " $( EscapeSpaces " ${ TARGET [1] } ${ TARGET [3] } / $deleted_failed_list_file " ) "
esc_source_file = " $( EscapeSpaces " ${ TARGET [1] } ${ TARGET [3] } / $deleted_failed_list_file " ) "
#TODO: Need to check if file exists prior to copy (or add a filemask and copy all state files)
local rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" $REMOTE_USER @ $REMOTE_HOST :\" $esc_source_file \" \" ${ INITIATOR [1] } ${ INITIATOR [3] } \" > \" $RUN_DIR / $PROGRAM .remote_failed_deletion_list_copy. $SCRIPT_PID \" "
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" $REMOTE_USER @ $REMOTE_HOST :\" $esc_source_file \" \" ${ INITIATOR [1] } ${ INITIATOR [3] } \" > \" $RUN_DIR / $PROGRAM .remote_failed_deletion_list_copy. $SCRIPT_PID \" "
Logger " RSYNC_CMD: $rsync_cmd " "DEBUG"
eval " $rsync_cmd " 2>> " $LOG_FILE "
if [ $? != 0 ] ; then
@ -1033,7 +1038,7 @@ function deletion_propagation {
local replica_type = " ${ 1 } " # Contains replica type: initiator, target
local deleted_list_file = " ${ 2 } " # file containing deleted file list, will be prefixed with replica type
local deleted_failed_list_file = " ${ 3 } " # file containing files that could not be deleted on last run, will be prefixed with replica type
__CheckArguments 3 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 3 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local replica_dir =
local delete_dir =
@ -1045,7 +1050,7 @@ function deletion_propagation {
delete_dir = " ${ INITIATOR [5] } "
_delete_local " $replica_dir " " ${ TARGET [0] } $deleted_list_file " " $delete_dir " " ${ TARGET [0] } $deleted_failed_list_file " &
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME $ FUNCNAME
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME ${ FUNCNAME[0] }
retval = $?
if [ $retval != 0 ] ; then
Logger " Deletion on replica $replica_type failed. " "CRITICAL"
@ -1060,7 +1065,7 @@ function deletion_propagation {
else
_delete_local " $replica_dir " " ${ INITIATOR [0] } $deleted_list_file " " $delete_dir " " ${ INITIATOR [0] } $deleted_failed_list_file " &
fi
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME $ FUNCNAME
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME ${ FUNCNAME[0] }
retval = $?
if [ $retval = = 0 ] ; then
if [ -f " $RUN_DIR / $PROGRAM ._delete_remote. $SCRIPT_PID " ] && [ $_VERBOSE -eq 1 ] ; then
@ -1069,8 +1074,8 @@ function deletion_propagation {
return $retval
else
Logger "Deletion on remote system failed." "CRITICAL"
if [ -f " $RUN_DIR / $PROGRAM _remote_deletion_ $SCRIPT_PID " ] ; then
Logger " Remote:\n $( cat $RUN_DIR /$PROGRAM ._delete_remote .$SCRIPT_PID ) " "CRITICAL"
if [ -f " $RUN_DIR / $PROGRAM .remote_deletion. $SCRIPT_PID " ] ; then
Logger " Remote:\n $( cat $RUN_DIR /$PROGRAM .remote_deletion .$SCRIPT_PID ) " "CRITICAL"
fi
exit 1
fi
@ -1087,9 +1092,9 @@ function deletion_propagation {
###### Step 5: Create after run tree list for initiator and target replicas (Steps 5M and 5S)
function Sync {
local resume count
local resume_sync
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
local resume_count =
local resume_sync=
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
Logger "Starting synchronization task." "NOTICE"
CheckConnectivity3rdPartyHosts
@ -1149,7 +1154,7 @@ function Sync {
if [ $? = = 0 ] ; then
echo " ${ SYNC_ACTION [2] } .success " > " ${ INITIATOR [7] } "
else
echo " ${ SYN c _ACTION[2] } .fail " > " ${ INITIATOR [7] } "
echo " ${ SYN C _ACTION[2] } .fail " > " ${ INITIATOR [7] } "
fi
resume_sync = "resumed"
fi
@ -1261,7 +1266,7 @@ function _SoftDeleteLocal {
local replica_type = " ${ 1 } " # replica type (initiator, target)
local replica_deletion_path = " ${ 2 } " # Contains the full path to softdelete / backup directory without ending slash
local change_time = " ${ 3 } "
__CheckArguments 3 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 3 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local retval =
@ -1273,21 +1278,21 @@ function _SoftDeleteLocal {
fi
if [ $_VERBOSE -eq 1 ] ; then
# Cannot launch log function from xargs, ugly hack
$FIND_CMD " $replica_deletion_path / " -type f -ctime +$change_time -print0 | xargs -0 -I { } echo "Will delete file {}" > " $RUN_DIR / $PROGRAM . $ FUNCNAME. $SCRIPT_PID "
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID ) " "NOTICE"
$FIND_CMD " $replica_deletion_path / " -type d -empty -ctime +$change_time -print0 | xargs -0 -I { } echo "Will delete directory {}" > " $RUN_DIR / $PROGRAM . $ FUNCNAME. $SCRIPT_PID "
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID ) " "NOTICE"
$FIND_CMD " $replica_deletion_path / " -type f -ctime +$change_time -print0 | xargs -0 -I { } echo "Will delete file {}" > " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } . $SCRIPT_PID "
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID ) " "NOTICE"
$FIND_CMD " $replica_deletion_path / " -type d -empty -ctime +$change_time -print0 | xargs -0 -I { } echo "Will delete directory {}" > " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } . $SCRIPT_PID "
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID ) " "NOTICE"
fi
if [ $_DRYRUN -ne 1 ] ; then
$FIND_CMD " $replica_deletion_path / " -type f -ctime +$change_time -print0 | xargs -0 -I { } rm -f "{}" && $FIND_CMD " $replica_deletion_path / " -type d -empty -ctime +$change_time -print0 | xargs -0 -I { } rm -rf "{}" > " $RUN_DIR / $PROGRAM . $ FUNCNAME. $SCRIPT_PID " 2>& 1 &
$FIND_CMD " $replica_deletion_path / " -type f -ctime +$change_time -print0 | xargs -0 -I { } rm -f "{}" && $FIND_CMD " $replica_deletion_path / " -type d -empty -ctime +$change_time -print0 | xargs -0 -I { } rm -rf "{}" > " $RUN_DIR / $PROGRAM . ${ FUNCNAME[0] } . $SCRIPT_PID " 2>& 1 &
else
Dummy &
fi
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME $ FUNCNAME
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME ${ FUNCNAME[0] }
retval = $?
if [ $retval -ne 0 ] ; then
Logger " Error while executing cleanup on $replica_type replica. " "ERROR"
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID ) " "NOTICE"
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID ) " "NOTICE"
else
Logger " Cleanup complete on $replica_type replica. " "NOTICE"
fi
@ -1300,7 +1305,7 @@ function _SoftDeleteRemote {
local replica_type = " ${ 1 } "
local replica_deletion_path = " ${ 2 } " # Contains the full path to softdelete / backup directory without ending slash
local change_time = " ${ 3 } "
__CheckArguments 3 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 3 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local retval =
@ -1315,33 +1320,33 @@ function _SoftDeleteRemote {
if [ $_VERBOSE -eq 1 ] ; then
# Cannot launch log function from xargs, ugly hack
cmd = $SSH_CMD ' "if [ -d \"' $replica_deletion_path '\" ]; then ' $COMMAND_SUDO ' ' $REMOTE_FIND_CMD ' \"' $replica_deletion_path '/\" -type f -ctime +' $change_time ' -print0 | xargs -0 -I {} echo Will delete file {} && ' $REMOTE_FIND_CMD ' \"' $replica_deletion_path '/\" -type d -empty -ctime ' $change_time ' -print0 | xargs -0 -I {} echo Will delete directory {}; else echo \"No remote backup/deletion directory.\"; exit 1; fi" > "' $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID '" 2>&1'
cmd = $SSH_CMD ' "if [ -d \"' $replica_deletion_path '\" ]; then ' $COMMAND_SUDO ' ' $REMOTE_FIND_CMD ' \"' $replica_deletion_path '/\" -type f -ctime +' $change_time ' -print0 | xargs -0 -I {} echo Will delete file {} && ' $REMOTE_FIND_CMD ' \"' $replica_deletion_path '/\" -type d -empty -ctime ' $change_time ' -print0 | xargs -0 -I {} echo Will delete directory {}; else echo \"No remote backup/deletion directory.\"; exit 1; fi" > "' $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID '" 2>&1'
Logger " cmd: $cmd " "DEBUG"
eval " $cmd " &
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME $ FUNCNAME
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID ) " "NOTICE"
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME ${ FUNCNAME[0] }
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID ) " "NOTICE"
fi
if [ $_DRYRUN -ne 1 ] ; then
cmd = $SSH_CMD ' "if [ -d \"' $replica_deletion_path '\" ]; then ' $COMMAND_SUDO ' ' $REMOTE_FIND_CMD ' \"' $replica_deletion_path '/\" -type f -ctime +' $change_time ' -print0 | xargs -0 -I {} rm -f \"{}\" && ' $REMOTE_FIND_CMD ' \"' $replica_deletion_path '/\" -type d -empty -ctime ' $change_time ' -print0 | xargs -0 -I {} rm -rf \"{}\"; else echo \"No remote backup/deletion directory.\"; fi" > "' $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID '" 2>&1'
cmd = $SSH_CMD ' "if [ -d \"' $replica_deletion_path '\" ]; then ' $COMMAND_SUDO ' ' $REMOTE_FIND_CMD ' \"' $replica_deletion_path '/\" -type f -ctime +' $change_time ' -print0 | xargs -0 -I {} rm -f \"{}\" && ' $REMOTE_FIND_CMD ' \"' $replica_deletion_path '/\" -type d -empty -ctime ' $change_time ' -print0 | xargs -0 -I {} rm -rf \"{}\"; else echo \"No remote backup/deletion directory.\"; fi" > "' $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID '" 2>&1'
Logger " cmd: $cmd " "DEBUG"
eval " $cmd " &
else
Dummy &
fi
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME $ FUNCNAME
WaitForCompletion $! $SOFT_MAX_EXEC_TIME $HARD_MAX_EXEC_TIME ${ FUNCNAME[0] }
retval = $?
if [ $retval -ne 0 ] ; then
Logger "Error while executing cleanup on remote target replica." "ERROR"
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .$ FUNCNAME.$SCRIPT_PID ) " "NOTICE"
Logger " Command output:\n $( cat $RUN_DIR /$PROGRAM .${ FUNCNAME[0] } .$SCRIPT_PID ) " "NOTICE"
else
Logger "Cleanup complete on target replica." "NOTICE"
fi
}
function SoftDelete {
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
if [ " $CONFLICT_BACKUP " != "no" ] && [ $CONFLICT_BACKUP_DAYS -ne 0 ] ; then
Logger "Running conflict backup cleanup." "NOTICE"
@ -1367,7 +1372,7 @@ function SoftDelete {
}
function Init {
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
# Set error exit code if a piped command fails
set -o pipefail
@ -1529,7 +1534,7 @@ function Init {
}
function Main {
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
CreateStateDirs
CheckLocks
@ -1537,7 +1542,7 @@ function Main {
}
function Usage {
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
if [ " $IS_STABLE " != "yes" ] ; then
echo -e "\e[93mThis is an unstable dev build. Please use with caution.\e[0m"
@ -1575,7 +1580,7 @@ function Usage {
}
function SyncOnChanges {
__CheckArguments 0 $# $ FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
__CheckArguments 0 $# ${ FUNCNAME[0] } " $@ " #__WITH_PARANOIA_DEBUG
local cmd =
local retval =
@ -1626,7 +1631,6 @@ FORCE_UNLOCK=0
no_maxtime = 0
# Alert flags
opts = ""
soft_alert_total = 0
ERROR_ALERT = 0
soft_stop = 0
_QUICK_SYNC = 0
@ -1656,7 +1660,7 @@ do
opts = $opts " --verbose"
; ;
--stats)
stats = 1
STATS = 1
opts = $opts " --stats"
; ;
--partial)
@ -1756,9 +1760,9 @@ opts="${opts# *}"
if [ " $LOGFILE " = = "" ] ; then
if [ -w /var/log ] ; then
LOG_FILE = /var/log/$PROGRAM _ $INSTANCE_ID .log
LOG_FILE = /var/log/$PROGRAM . $INSTANCE_ID .log
else
LOG_FILE = ./$PROGRAM _ $INSTANCE_ID .log
LOG_FILE = ./$PROGRAM . $INSTANCE_ID .log
fi
else
LOG_FILE = " $LOGFILE "