Refactored CheckDiskSpace & CheckReplicaPath into CheckReplicas

pull/85/head
root 8 years ago
parent 59b8764da6
commit ae16cefe54

@ -4,9 +4,13 @@ PROGRAM="osync" # Rsync based two way sync engine with fault tolerance
AUTHOR="(C) 2013-2016 by Orsiris de Jong"
CONTACT="http://www.netpower.fr/osync - ozy@netpower.fr"
PROGRAM_VERSION=1.2-beta3
PROGRAM_BUILD=2016120604
PROGRAM_BUILD=2016120605
IS_STABLE=no
#TODO: replace _Logger & Logger in remote functions with ofunctions version dedicated to remote logging
#TODO: replace ArrayContains, IsNumeric, HumanToNumeric with ofunctions version via merge
#TODO: deal with _VERBOSE / _SILENT switches in remote Logger
# Execution order #__WITH_PARANOIA_DEBUG
# Function Name Is parallel #__WITH_PARANOIA_DEBUG
@ -18,8 +22,7 @@ IS_STABLE=no
# PostInit no #__WITH_PARANOIA_DEBUG
# GetRemoteOS no #__WITH_PARANOIA_DEBUG
# InitRemoteOSDependingSettings no #__WITH_PARANOIA_DEBUG
# CheckReplicaPaths yes #__WITH_PARANOIA_DEBUG
# CheckDiskSpace yes #__WITH_PARANOIA_DEBUG
# CheckReplicas yes #__WITH_PARANOIA_DEBUG
# RunBeforeHook yes #__WITH_PARANOIA_DEBUG
# Main no #__WITH_PARANOIA_DEBUG
# HandleLocks yes #__WITH_PARANOIA_DEBUG
@ -191,14 +194,11 @@ function CheckCurrentConfigAll {
###### Osync specific functions (non shared)
function _CheckReplicaPathsLocal {
function _CheckReplicasLocal {
local replicaPath="${1}"
__CheckArguments 1 $# "${FUNCNAME[0]}" "$@" #__WITH_PARANOIA_DEBUG
if [ ! -w "$replicaPath" ]; then
Logger "Local replica path [$replicaPath] is not writable." "CRITICAL"
exit 1
fi
local diskSpace
if [ ! -d "$replicaPath" ]; then
if [ "$CREATE_DIRS" == "yes" ]; then
@ -206,18 +206,38 @@ function _CheckReplicaPathsLocal {
if [ $? != 0 ]; then
Logger "Cannot create local replica path [$replicaPath]." "CRITICAL"
Logger "Command output:\n$(cat $RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID)"
exit 1
return 1
else
Logger "Created local replica path [$replicaPath]." "NOTICE"
fi
else
Logger "Local replica path [$replicaPath] does not exist." "CRITICAL"
exit 1
return 1
fi
fi
if [ ! -w "$replicaPath" ]; then
Logger "Local replica path [$replicaPath] is not writable." "CRITICAL"
return 1
fi
Logger "Checking minimum disk space in local replica [$replicaPath]." "NOTICE"
diskSpace=$($DF_CMD "$replicaPath" | tail -1 | awk '{print $4}')
if [ $? != 0 ]; then
Logger "Cannot get free space." "ERROR"
else
# Ugly fix for df in some busybox environments that can only show human formats
if [ $(IsInteger $diskSpace) -eq 0 ]; then
diskSpace=$(HumanToNumeric $diskSpace)
fi
if [ $diskSpace -lt $MINIMUM_SPACE ]; then
Logger "There is not enough free space on local replica [$replicaPath] ($diskSpace KB)." "WARN"
fi
fi
}
function _CheckReplicaPathsRemote {
function _CheckReplicasRemote {
local replicaPath="${1}"
__CheckArguments 1 $# "${FUNCNAME[0]}" "$@" #__WITH_PARANOIA_DEBUG
@ -226,69 +246,113 @@ function _CheckReplicaPathsRemote {
CheckConnectivity3rdPartyHosts
CheckConnectivityRemoteHost
$SSH_CMD replicaPath="'$replicaPath'" 'bash -s' << 'ENDSSH' 2>&1
if [ ! -w "$replicaPath" ]; then
exit 1
fi
ENDSSH
$SSH_CMD replicaPath="'$replicaPath'" CREATE_DIRS="'$CREATE_DIRS'" COMMAND_SUDO="'$COMMAND_SUDO'" DF_CMD="'$DF_CMD'" MINIMUM_SPACE="'$MINIMUM_SPACE'" 'bash -s' << 'ENDSSH' > "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID" 2>&1
## The following lines are executed remotely
function _logger {
local value="${1}" # What to log
echo -e "$value"
}
if [ $? != 0 ]; then
Logger "Remote replica path [$replicaPath] is not writable." "CRITICAL"
exit 1
fi
function Logger {
local value="${1}" # What to log
local level="${2}" # Log level: DEBUG, NOTICE, WARN, ERROR, CRITIAL
$SSH_CMD replicaPath="'$replicaPath'" CREATE_DIRS="'$CREATE_DIRS'" COMMAND_SUDO="'$COMMAND_SUDO'" 'bash -s' << 'ENDSSH' > "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID" 2>&1
if [ ! -d "$replicaPath" ]; then
if [ "$CREATE_DIRS" == "yes" ]; then
$COMMAND_SUDO mkdir -p "$replicaPath"
fi
fi
ENDSSH
if [ $? != 0 ]; then
Logger "Cannot create remote replica path [$replicaPath]." "CRITICAL"
Logger "Command output:\n$(cat $RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID)" "ERROR"
exit 1
fi
local prefix="RTIME: $SECONDS - "
if [ "$level" == "CRITICAL" ]; then
_logger "$prefix\e[41m$value\e[0m"
return
elif [ "$level" == "ERROR" ]; then
_logger "$prefix\e[91m$value\e[0m"
return
elif [ "$level" == "WARN" ]; then
_logger "$prefix\e[93m$value\e[0m"
return
elif [ "$level" == "NOTICE" ]; then
_logger "$prefix$value"
return
elif [ "$level" == "VERBOSE" ]; then
if [ $_LOGGER_VERBOSE == true ]; then
_logger "$prefix$value"
fi
return
elif [ "$level" == "DEBUG" ]; then
if [ "$_DEBUG" == "yes" ]; then
_logger "$prefix$value"
fi
return
else
_logger "\e[41mLogger function called without proper loglevel [$level].\e[0m"
_logger "$prefix$value"
fi
}
function IsInteger {
local value="${1}"
if [[ $value =~ ^[0-9]+$ ]]; then
echo 1
else
echo 0
fi
}
function CheckReplicaPaths {
__CheckArguments 0 $# "${FUNCNAME[0]}" "$@" #__WITH_PARANOIA_DEBUG
# Converts human readable sizes into integer kilobyte sizes
# Usage numericSize="$(HumanToNumeric $humanSize)"
function HumanToNumeric {
local value="${1}"
local notation
local suffix
local suffixPresent
local multiplier
notation=(K M G T P E)
for suffix in "${notation[@]}"; do
multiplier=$((multiplier+1))
if [[ "$value" == *"$suffix"* ]]; then
suffixPresent=$suffix
break;
fi
done
local pids
if [ "$suffixPresent" != "" ]; then
value=${value%$suffix*}
value=${value%.*}
# /1024 since we convert to kilobytes instead of bytes
value=$((value*(1024**multiplier/1024)))
else
value=${value%.*}
fi
if [ "$REMOTE_OPERATION" != "yes" ]; then
if [ "${INITIATOR[$__replicaDir]}" == "${TARGET[$__replicaDir]}" ]; then
Logger "Initiator and target path [${INITIATOR[$__replicaDir]}] cannot be the same." "CRITICAL"
echo $value
}
function _CheckReplicasRemoteSub {
if [ ! -d "$replicaPath" ]; then
if [ "$CREATE_DIRS" == "yes" ]; then
$COMMAND_SUDO mkdir -p "$replicaPath" >> "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID" 2>&1
if [ $? != 0 ]; then
Logger "Cannot create remote replica path [$replicaPath]." "CRITICAL"
Logger "Command output:\n$(cat $RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID)"
exit 1
else
Logger "Created remote replica path [$replicaPath]." "NOTICE"
fi
else
Logger "Remote replica path [$replicaPath] does not exist." "CRITICAL"
exit 1
fi
fi
_CheckReplicaPathsLocal "${INITIATOR[$__replicaDir]}" &
pids="$!"
if [ "$REMOTE_OPERATION" != "yes" ]; then
_CheckReplicaPathsLocal "${TARGET[$__replicaDir]}" &
pids="$pids;$!"
else
_CheckReplicaPathsRemote "${TARGET[$__replicaDir]}" &
pids="$pids;$!"
fi
WaitForTaskCompletion $pids 720 1800 $SLEEP_TIME $KEEP_LOGGING true true false ${FUNCNAME[0]}
if [ $? -ne 0 ]; then
Logger "Cancelling task." "CRITICAL"
if [ ! -w "$replicaPath" ]; then
Logger "Remote replica path [$replicaPath] is not writable." "CRITICAL"
exit 1
fi
}
function _CheckDiskSpaceLocal {
local replicaPath="${1}"
__CheckArguments 1 $# "${FUNCNAME[0]}" "$@" #__WITH_PARANOIA_DEBUG
local diskSpace
Logger "Checking minimum disk space in [$replicaPath]." "NOTICE"
Logger "Checking minimum disk space in remote replica [$replicaPath]." "NOTICE"
diskSpace=$($DF_CMD "$replicaPath" | tail -1 | awk '{print $4}')
if [ $? != 0 ]; then
Logger "Cannot get free space." "ERROR"
else
@ -298,63 +362,56 @@ function _CheckDiskSpaceLocal {
fi
if [ $diskSpace -lt $MINIMUM_SPACE ]; then
Logger "There is not enough free space on replica [$replicaPath] ($diskSpace KB)." "WARN"
Logger "There is not enough free space on remote replica [$replicaPath] ($diskSpace KB)." "WARN"
fi
fi
}
function _CheckDiskSpaceRemote {
local replicaPath="${1}"
__CheckArguments 1 $# "${FUNCNAME[0]}" "$@" #__WITH_PARANOIA_DEBUG
Logger "Checking remote minimum disk space in [$replicaPath]." "NOTICE"
local cmd
local diskSpace
CheckConnectivity3rdPartyHosts
CheckConnectivityRemoteHost
$SSH_CMD replicaPath="'$replicaPath'" COMMAND_SUDO="'$COMMAND_SUDO'" DF_CMD="'$DF_CMD'" bash -s << ENDSSH > "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID" 2>&1
$COMMAND_SUDO $DF_CMD "$replicaPath"
_CheckReplicasRemoteSub
exit $?
ENDSSH
if [ $? != 0 ]; then
Logger "Cannot get free space on target [$replicaPath]." "ERROR"
Logger "Command output:\n$(cat $RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID)" "NOTICE"
result=$?
if [ $result != 0 ]; then
Logger "Failed to check remote replica.." "CRITICAL"
fi
if [ -s "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID" ]; then
(
_LOGGER_PREFIX=""
Logger "$(cat $RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID)" "NOTICE"
)
fi
if [ $result != 0 ]; then
return 1
else
diskSpace=$(cat $RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID | tail -1 | awk '{print $4}')
# Ugly fix for df in some busybox environments that can only show human formats
if [ $(IsInteger $diskSpace) -eq 0 ]; then
diskSpace=$(HumanToNumeric $diskSpace)
fi
if [ $diskSpace -lt $MINIMUM_SPACE ]; then
Logger "There is not enough free space on replica [$replicaPath] ($diskSpace KB)." "WARN"
fi
return 0
fi
}
function CheckDiskSpace {
function CheckReplicas {
__CheckArguments 0 $# "${FUNCNAME[0]}" "$@" #__WITH_PARANOIA_DEBUG
local pids
if [ $MINIMUM_SPACE -eq 0 ]; then
Logger "Skipped minimum space check." "NOTICE"
return 0
if [ "$REMOTE_OPERATION" != "yes" ]; then
if [ "${INITIATOR[$__replicaDir]}" == "${TARGET[$__replicaDir]}" ]; then
Logger "Initiator and target path [${INITIATOR[$__replicaDir]}] cannot be the same." "CRITICAL"
exit 1
fi
fi
_CheckDiskSpaceLocal "${INITIATOR[$__replicaDir]}" &
_CheckReplicasLocal "${INITIATOR[$__replicaDir]}" &
pids="$!"
if [ "$REMOTE_OPERATION" != "yes" ]; then
_CheckDiskSpaceLocal "${TARGET[$__replicaDir]}" &
_CheckReplicasLocal "${TARGET[$__replicaDir]}" &
pids="$pids;$!"
else
_CheckDiskSpaceRemote "${TARGET[$__replicaDir]}" &
_CheckReplicasRemote "${TARGET[$__replicaDir]}" &
pids="$pids;$!"
fi
WaitForTaskCompletion $pids 720 1800 $SLEEP_TIME $KEEP_LOGGING true true false ${FUNCNAME[0]}
if [ $? -ne 0 ]; then
Logger "Cancelling task." "CRITICAL"
exit 1
fi
}
function _HandleLocksLocal {
@ -582,7 +639,14 @@ ENDSSH
if [ $? != 0 ]; then
Logger "Remote lock handling failed." "CRITICAL"
Logger "Command output:\n$(cat $RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID)" "ERROR"
fi
if [ -s "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID" ]; then
(
_LOGGER_PREFIX=""
Logger "$(cat $RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID)" "NOTICE"
)
fi
if [ $? != 0 ]; then
return 1
fi
}
@ -1122,8 +1186,6 @@ function _deleteRemote {
local deletionListFromReplica
local loggerPrefix
if [ "$replicaType" == "${INITIATOR[$__type]}" ]; then
deletionListFromReplica="${TARGET[$__type]}"
elif [ "$replicaType" == "${TARGET[$__type]}" ]; then
@ -1259,10 +1321,10 @@ $SSH_CMD ERROR_ALERT=0 sync_on_changes=$sync_on_changes _DEBUG=$_DEBUG _DRYRUN=$
ENDSSH
if [ -s "$RUN_DIR/$PROGRAM.remote_deletion.$SCRIPT_PID" ]; then
loggerPrefix="$_LOGGER_PREFIX"
(
_LOGGER_PREFIX=""
Logger "$(cat $RUN_DIR/$PROGRAM.remote_deletion.$SCRIPT_PID)" "ERROR"
_LOGGER_PREFIX="$loggerPrefix"
)
fi
## Copy back the deleted failed file list
@ -1821,9 +1883,7 @@ function _SummaryFromFile {
function Summary {
__CheckArguments 0 $# "${FUNCNAME[0]}" "$@" #__WITH_PARANOIA_DEBUG
local loggerPrefix
loggerPrefix="$_LOGGER_PREFIX"
(
_LOGGER_PREFIX=""
Logger "Attrib updates: INITIATOR << >> TARGET" "ALWAYS"
@ -1842,8 +1902,7 @@ function Summary {
_SummaryFromFile "${TARGET[$__replicaDir]}" "$RUN_DIR/$PROGRAM.delete.target.$SCRIPT_PID" "- >>"
fi
_SummaryFromFile "${INITIATOR[$__replicaDir]}" "$RUN_DIR/$PROGRAM.delete.initiator.$SCRIPT_PID" "- <<"
_LOGGER_PREFIX="$loggerPrefix"
)
}
function Init {
@ -2031,7 +2090,7 @@ function Init {
function Main {
__CheckArguments 0 $# "${FUNCNAME[0]}" "$@" #__WITH_PARANOIA_DEBUG
HandleLocks
#HandleLocks
Sync
}
@ -2343,8 +2402,7 @@ else
SOFT_MAX_EXEC_TIME=0
HARD_MAX_EXEC_TIME=0
fi
CheckReplicaPaths
CheckDiskSpace
CheckReplicas
RunBeforeHook
Main
if [ $? == 0 ]; then

Loading…
Cancel
Save