@ -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.1-pre
PROGRAM_BUILD = 201511 1901
PROGRAM_BUILD = 201511 2702
IS_STABLE = no
FUNC_BUILD = 2015111901
@ -83,6 +83,7 @@ function Dummy {
sleep .1
}
#__FUNC:Logger
function _Logger {
local svalue = " ${ 1 } " # What to log to screen
local lvalue = " ${ 2 :- $svalue } " # What to log to logfile, defaults to screen value
@ -135,6 +136,7 @@ function Logger {
_Logger " $prefix $value "
fi
}
#__ENDFUNC
# Portable child (and grandchild) kill function tester under Linux, BSD and MacOS X
function KillChilds {
@ -1132,12 +1134,14 @@ function CheckDiskSpace {
fi
}
function RsyncExcludePattern {
__CheckArguments 0 $# $FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
function RsyncPatternsAdd {
local pattern = " ${ 1 } "
__CheckArguments 1 $# $FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
# Disable globbing so wildcards from exclusions do not get expanded
set -f
rest = " $ RSYNC_EXCLUDE_PATTERN "
rest = " $ pattern "
while [ -n " $rest " ]
do
# Take the string until first occurence until $PATH_SEPARATOR_CHAR
@ -1149,31 +1153,50 @@ function RsyncExcludePattern {
# Cut everything before the first occurence of $PATH_SEPARATOR_CHAR
rest = ${ rest #* $PATH_SEPARATOR_CHAR }
fi
if [ " $RSYNC_EXCLUDE " = = "" ] ; then
RSYNC_EXCLUDE = " --exclude=\" $str \" "
if [ " $RSYNC_PATTERNS " = = "" ] ; then
RSYNC_PATTERNS = " --exclude=\" $str \" "
else
RSYNC_ EXCLUDE= " $RSYNC_EXCLUDE --exclude=\" $str \" "
RSYNC_ PATTERNS= " $RSYNC_PATTERNS --exclude=\" $str \" "
fi
done
set +f
}
function RsyncExcludeFrom {
__CheckArguments 0 $# $FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
function RsyncPatternsFromAdd {
local pattern_from = " ${ 1 } "
__CheckArguments 1 $# $FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
if [ ! " $RSYNC_EXCLUDE_FROM " = = "" ] ; then
if [ ! " $ pattern_from " = = "" ] ; then
## Check if the exclude list has a full path, and if not, add the config file path if there is one
if [ " $( basename $ RSYNC_EXCLUDE_FROM) " = = " $RSYNC_EXCLUDE_FROM " ] ; then
RSYNC_EXCLUDE_FROM= $( dirname $ConfigFile ) /$RSYNC_EXCLUDE_FROM
if [ " $( basename $ pattern_from) " = = " $pattern_from " ] ; then
pattern_from= $( dirname $ConfigFile ) /$pattern_ffrom
fi
if [ -e " $ RSYNC_EXCLUDE_FROM " ] ; then
RSYNC_ EXCLUDE= " $RSYNC_EXCLUDE --exclude-from=\" $RSYNC_EXCLUDE_FROM \" "
if [ -e " $ pattern_from " ] ; then
RSYNC_ PATTERNS= " $RSYNC_PATTERNS --exclude-from=\" $pattern_from \" "
fi
fi
}
function RsyncPatterns {
__CheckArguments 0 $# $FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
if [ " $RSYNC_PATTERN_ORDER " = = "exclude" ] ; then
RsyncPatternsAdd " $RSYNC_EXCLUDE_PATTERN "
RsyncPatternsFromAdd " $RSYNC_EXCLUDE_FROM "
RsyncPatternsAdd " $RSYNC_INCLUDE_PATTERN "
RsyncPatternsFromAdd " $RSYNC_INCLUDE_FROM "
elif [ " $RSYNC_PATTERN_ORDER " = = "include" ] ; then
RsyncPatternsAdd " $RSYNC_INCLUDE_PATTERN "
RsyncPatternsFromAdd " $RSYNC_EXCLUDE_FROM "
RsyncPatternsAdd " $RSYNC_EXCLUDE_PATTERN "
RsyncPatternsFromAdd " $RSYNC_EXCLUDE_FROM "
else
Logger "Bogus RSYNC_PATTERN_ORDER in config file" "WARN"
fi
}
function _WriteLockFilesLocal {
local lockfile = " ${ 1 } "
__CheckArguments 1 $# $FUNCNAME " $@ " #__WITH_PARANOIA_DEBUG
@ -1372,9 +1395,9 @@ function tree_list {
if [ " $REMOTE_OPERATION " = = "yes" ] && [ " $replica_type " = = "target" ] ; then
CheckConnectivity3rdPartyHosts
CheckConnectivityRemoteHost
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" $RSYNC_ARGS -8 --exclude \" $OSYNC_DIR \" $RSYNC_ EXCLUDE -e \" $RSYNC_SSH_CMD \" --list-only $REMOTE_USER @ $REMOTE_HOST :\" $escaped_replica_path /\" | grep \"^-\|^d\" | awk '{\$1=\$2=\$3=\$4=\"\" ;print}' | awk '{\$1=\$1 ;print}' | (grep -v \"^\. $\" || :) | sort > \" $RUN_DIR / $PROGRAM . $replica_type . $SCRIPT_PID \" & "
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" $RSYNC_ARGS -8 --exclude \" $OSYNC_DIR \" $RSYNC_ PATTERNS -e \" $RSYNC_SSH_CMD \" --list-only $REMOTE_USER @ $REMOTE_HOST :\" $escaped_replica_path /\" | grep \"^-\|^d\" | awk '{\$1=\$2=\$3=\$4=\"\" ;print}' | awk '{\$1=\$1 ;print}' | (grep -v \"^\. $\" || :) | sort > \" $RUN_DIR / $PROGRAM . $replica_type . $SCRIPT_PID \" & "
else
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" $RSYNC_ARGS -8 --exclude \" $OSYNC_DIR \" $RSYNC_ EXCLUDE --list-only \" $replica_path /\" | grep \"^-\|^d\" | awk '{\$1=\$2=\$3=\$4=\"\" ;print}' | awk '{\$1=\$1 ;print}' | (grep -v \"^\. $\" || :) | sort > \" $RUN_DIR / $PROGRAM . $replica_type . $SCRIPT_PID \" & "
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" $RSYNC_ARGS -8 --exclude \" $OSYNC_DIR \" $RSYNC_ PATTERNS --list-only \" $replica_path /\" | grep \"^-\|^d\" | awk '{\$1=\$2=\$3=\$4=\"\" ;print}' | awk '{\$1=\$1 ;print}' | (grep -v \"^\. $\" || :) | sort > \" $RUN_DIR / $PROGRAM . $replica_type . $SCRIPT_PID \" & "
fi
Logger " RSYNC_CMD: $rsync_cmd " "DEBUG"
## Redirect commands stderr here to get rsync stderr output in logfile
@ -1455,12 +1478,12 @@ function sync_update {
CheckConnectivity3rdPartyHosts
CheckConnectivityRemoteHost
if [ " $source_replica " = = "initiator" ] ; then
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" $RSYNC_ARGS $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" $BACKUP_DIR --exclude \" $OSYNC_DIR \" $RSYNC_ EXCLUDE --exclude-from=\" $INITIATOR_STATE_DIR / $source_replica $delete_list_filename \" --exclude-from=\" $INITIATOR_STATE_DIR / $destination_replica $delete_list_filename \" \" $SOURCE_DIR /\" $REMOTE_USER @ $REMOTE_HOST :\" $ESC_DEST_DIR /\" > $RUN_DIR / $PROGRAM .update. $destination_replica . $SCRIPT_PID 2>&1 & "
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" $RSYNC_ARGS $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" $BACKUP_DIR --exclude \" $OSYNC_DIR \" $RSYNC_ PATTERNS --exclude-from=\" $INITIATOR_STATE_DIR / $source_replica $delete_list_filename \" --exclude-from=\" $INITIATOR_STATE_DIR / $destination_replica $delete_list_filename \" \" $SOURCE_DIR /\" $REMOTE_USER @ $REMOTE_HOST :\" $ESC_DEST_DIR /\" > $RUN_DIR / $PROGRAM .update. $destination_replica . $SCRIPT_PID 2>&1 & "
else
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" $RSYNC_ARGS $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" $BACKUP_DIR --exclude \" $OSYNC_DIR \" $RSYNC_ EXCLUDE --exclude-from=\" $INITIATOR_STATE_DIR / $destination_replica $delete_list_filename \" --exclude-from=\" $INITIATOR_STATE_DIR / $source_replica $delete_list_filename \" $REMOTE_USER @ $REMOTE_HOST :\" $ESC_SOURCE_DIR /\" \" $DEST_DIR /\" > $RUN_DIR / $PROGRAM .update. $destination_replica . $SCRIPT_PID 2>&1 & "
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" $RSYNC_ARGS $SYNC_OPTS -e \" $RSYNC_SSH_CMD \" $BACKUP_DIR --exclude \" $OSYNC_DIR \" $RSYNC_ PATTERNS --exclude-from=\" $INITIATOR_STATE_DIR / $destination_replica $delete_list_filename \" --exclude-from=\" $INITIATOR_STATE_DIR / $source_replica $delete_list_filename \" $REMOTE_USER @ $REMOTE_HOST :\" $ESC_SOURCE_DIR /\" \" $DEST_DIR /\" > $RUN_DIR / $PROGRAM .update. $destination_replica . $SCRIPT_PID 2>&1 & "
fi
else
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" $RSYNC_ARGS $SYNC_OPTS $BACKUP_DIR --exclude \" $OSYNC_DIR \" $RSYNC_ EXCLUDE --exclude-from=\" $INITIATOR_STATE_DIR / $source_replica $delete_list_filename \" --exclude-from=\" $INITIATOR_STATE_DIR / $destination_replica $delete_list_filename \" \" $SOURCE_DIR /\" \" $DEST_DIR /\" > $RUN_DIR / $PROGRAM .update. $destination_replica . $SCRIPT_PID 2>&1 & "
rsync_cmd = " $( type -p $RSYNC_EXECUTABLE ) --rsync-path=\" $RSYNC_PATH \" $RSYNC_ARGS $SYNC_OPTS $BACKUP_DIR --exclude \" $OSYNC_DIR \" $RSYNC_ PATTERNS --exclude-from=\" $INITIATOR_STATE_DIR / $source_replica $delete_list_filename \" --exclude-from=\" $INITIATOR_STATE_DIR / $destination_replica $delete_list_filename \" \" $SOURCE_DIR /\" \" $DEST_DIR /\" > $RUN_DIR / $PROGRAM .update. $destination_replica . $SCRIPT_PID 2>&1 & "
fi
Logger " RSYNC_CMD: $rsync_cmd " "DEBUG"
eval " $rsync_cmd "
@ -2087,7 +2110,7 @@ function Init {
if [ " $PARTIAL " = = "yes" ] ; then
SYNC_OPTS = $SYNC_OPTS " --partial --partial-dir=\" $PARTIAL_DIR \" "
RSYNC_ EXCLUDE= " $RSYNC_EXCLUDE --exclude=\" $PARTIAL_DIR \" "
RSYNC_ PATTERNS= " $RSYNC_PATTERNS --exclude=\" $PARTIAL_DIR \" "
fi
## Conflict options
@ -2103,10 +2126,8 @@ function Init {
TARGET_BACKUP =
fi
## Add Rsync exclude patterns
RsyncExcludePattern
## Add Rsync exclude from file
RsyncExcludeFrom
## Add Rsync include / exclude patterns
RsyncPatterns
## Filenames for state files
if [ $_DRYRUN -eq 1 ] ; then
@ -2209,7 +2230,7 @@ function SyncOnChanges {
fi
Logger "#### Monitoring now." "NOTICE"
inotifywait --exclude $OSYNC_DIR $RSYNC_ EXCLUDE -qq -r -e create -e modify -e delete -e move -e attrib --timeout " $MAX_WAIT " " $INITIATOR_SYNC_DIR " &
inotifywait --exclude $OSYNC_DIR $RSYNC_ PATTERNS -qq -r -e create -e modify -e delete -e move -e attrib --timeout " $MAX_WAIT " " $INITIATOR_SYNC_DIR " &
OSYNC_SUB_PID = $!
wait $OSYNC_SUB_PID
retval = $?