diff --git a/CHANGELOG.md b/CHANGELOG.md index a9fc4aa..c8d64e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,15 @@ -KNOWN BUGS ----------- +KNOWN ISSUES +------------ - Cannot write pidlock on remote slave with SUDO_EXEC=yes but insufficient rights (sudo does not work for command echo) - If master and remote slave aren't the same distros and rsync binary isn't in the same path, execution may fail (RSYNC_PATH should be configurable) +- Possible non delete status for a file with space in name on master replica from slave remote replica RECENT CHANGES -------------- -24 Jul. 2013: beta milestone +- Revamped a bit code to add bash 3.2 compatibility +- 24 Jul. 2013: beta milestone - Fixed some bad error handling in CheckMasterSlaveDirs and LockDirectories - Added support for spaces in sync dirs and exclude lists - Fixed false exit code if no remote slave lock present diff --git a/osync.sh b/osync.sh index f2021d0..acb9822 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.95 -OSYNC_BUILD=2407201304 +OSYNC_VERSION=0.96 +OSYNC_BUILD=3107201301 DEBUG=no SCRIPT_PID=$$ @@ -975,61 +975,133 @@ function Sync resume_sync=none fi - ## In this case statement, ;& means executing every command below regardless of conditions - case $resume_sync in - none|noresume) - ;& - master-replica-tree.fail) + + ################################################################################################################################################# Actual sync begins here + + ## This replaces the case statement below because ;& operator is not supported in bash 3.2... Code is more messy than case :( + if [ "$resume_sync" == "none" ] || [ "$resume_sync" == "noresume" ] + then master_tree_current - ;& - master-replica-tree.success|slave-replica-tree.fail) + resume_sync="resumed" + fi + if [ "$resume_sync" == "resumed" ] || [ "$resume_sync" == "master-replica-tree.success" ] || [ "$resume_sync" == "slave-replica-tree.fail" ] + then slave_tree_current - ;& - slave-replica-tree.success|master-replica-deleted-list.fail) + resume_sync="resumed" + fi + if [ "$resume_sync" == "resumed" ] || [ "$resume_sync" == "slave-replica-tree.success" ] || [ "$resume_sync" == "master-replica-deleted-list.fail" ] + then master_delete_list - ;& - master-replica-deleted-list.success|slave-replica-deleted-list.fail) + resume_sync="resumed" + fi + if [ "$resume_sync" == "resumed" ] || [ "$resume_sync" == "master-replica-deleted-list.success" ] || [ "$resume_sync" == "slave-replica-deleted-list.fail" ] + then slave_delete_list - ;& - slave-replica-deleted-list.success|update-master-replica.fail|update-slave-replica.fail) - if [ "$CONFLICT_PREVALANCE" != "master" ] - then - case $resume_sync in - none) - ;& - slave-replica-deleted-list.success|update-master-replica.fail) - sync_update_master - ;& - update-master-replica.success|update-slave-replica.fail) + resume_sync="resumed" + fi + if [ "$resume_sync" == "resumed" ] || [ "$resume_sync" == "slave-replica-deleted-list.success" ] || [ "$resume_sync" == "update-master-replica.fail" ] || [ "$resume_sync" == "update-slave-replica.fail" ] + then + if [ "$CONFLICT_PREVALANCE" != "master" ] + then + if [ "$resume_sync" == "resumed" ] || [ "$resume_sync" == "slave-replica-deleted-list.success" ] || [ "$resume_sync" == "update-master-replica.fail" ] + then sync_update_master - ;; - esac - else - case $resume_sync in - none) - ;& - slave-replica-deleted-list.success|update-slave-replica.fail) + resume_sync="resumed" + fi + if [ "$resume_sync" == "resumed" ] || [ "$resume_sync" == "update-master-replica.success" ] || [ "$resume_sync" == "update-slave-replica.fail" ] + then sync_update_slave - ;& - update-slave-replica.success|update-master-replica.fail) - sync_update_master - ;; - esac - fi - ;& - update-slave-replica.success|update-master-replica.success|delete-propagation-slave.fail) + resume_sync="resumed" + fi + else + if [ "$resume_sync" == "resumed" ] || [ "$resume_sync" == "slave-replica-deleted-list.success" ] || [ "$resume_sync" == "update-slave-replica.fail" ] + then + sync_update_slave + resume_sync="resumed" + fi + if [ "$resume_sync" == "resumed" ] || [ "$resume_sync" == "update-slave-replica.success" ] || [ "$resume_sync" == "update-master-replica.fail" ] + then + sync_update_master + resume_sync="resumed" + fi + fi + fi + if [ "$resume_sync" == "resumed" ] || [ "$resume_sync" == "update-slave-replica.success" ] || [ "$resume_sync" == "update-master-replica.success" ] || [ "$resume_sync" == "delete-propagation-slave.fail" ] + then delete_on_slave - ;& - delete-propagation-slave.success|delete-propagation-master.fail) + resume_sync="resumed" + fi + if [ "$resume_sync" == "resumed" ] || [ "$resume_sync" == "delete-propagation-slave.success" ] || [ "$resume_sync" == "delete-propagation-master.fail" ] + then delete_on_master - ;& - delete-propagation-master.success|master-replica-tree-after.fail) + resume_sync="resumed" + fi + if [ "$resume_sync" == "resumed" ] || [ "$resume_sync" == "delete-propagation-master.success" ] || [ "$resume_sync" == "master-replica-tree-after.fail" ] + then master_tree_after - ;& - master-replica-tree-after.success|slave-replica-tree-after.fail) + resume_sync="resumed" + fi + if [ "$resume_sync" == "resumed" ] || [ "$resume_sync" == "master-replica-tree-after.success" ] || [ "$resume_sync" == "slave-replica-tree-after.fail" ] + then slave_tree_after - ;; - esac + resume_sync="resumed" + fi + +# ## In this case statement, ;& means executing every command below regardless of conditions. Only works with bash v4 +# case $resume_sync in +# none|noresume) +# ;& +# master-replica-tree.fail) +# master_tree_current +# ;& +# master-replica-tree.success|slave-replica-tree.fail) +# slave_tree_current +# ;& +# slave-replica-tree.success|master-replica-deleted-list.fail) +# master_delete_list +# ;& +# master-replica-deleted-list.success|slave-replica-deleted-list.fail) +# slave_delete_list +# ;& +# slave-replica-deleted-list.success|update-master-replica.fail|update-slave-replica.fail) +# if [ "$CONFLICT_PREVALANCE" != "master" ] +# then +# case $resume_sync in +# none) +# ;& +# slave-replica-deleted-list.success|update-master-replica.fail) +# sync_update_master +# ;& +# update-master-replica.success|update-slave-replica.fail) +# sync_update_master +# ;; +# esac +# else +# case $resume_sync in +# none) +# ;& +# slave-replica-deleted-list.success|update-slave-replica.fail) +# sync_update_slave +# ;& +# update-slave-replica.success|update-master-replica.fail) +# sync_update_master +# ;; +# esac +# fi +# ;& +# update-slave-replica.success|update-master-replica.success|delete-propagation-slave.fail) +# delete_on_slave +# ;& +# delete-propagation-slave.success|delete-propagation-master.fail) +# delete_on_master +# ;& +# delete-propagation-master.success|master-replica-tree-after.fail) +# master_tree_after +# ;& +# master-replica-tree-after.success|slave-replica-tree-after.fail) +# slave_tree_after +# ;; +# esac Log "Finished synchronization task." echo "sync.success" > "$MASTER_STATE_DIR/last-action" @@ -1213,7 +1285,7 @@ function Usage echo "--dry: will run osync without actuallyv doing anything; just testing" echo "--silent: will run osync without any output to stdout, usefull for cron jobs" echo "--verbose: adds command outputs" - ecoh "--force-unlock: will override any existing active or dead locks on master and slave replica" + echo "--force-unlock: will override any existing active or dead locks on master and slave replica" exit 128 }