Rebuilt targets
This commit is contained in:
parent
25070032c4
commit
bbfa4c9d3b
|
@ -2,12 +2,14 @@
|
||||||
|
|
||||||
#TODO treeList, deleteList, _getFileCtimeMtime, conflictList should be called without having statedir informed. Just give the full path ?
|
#TODO treeList, deleteList, _getFileCtimeMtime, conflictList should be called without having statedir informed. Just give the full path ?
|
||||||
#Check dryruns with nosuffix mode for timestampList
|
#Check dryruns with nosuffix mode for timestampList
|
||||||
|
#WIP: currently TRAVIS_RUN debug lines in n_osync and run_tests for conflictLog
|
||||||
|
|
||||||
|
|
||||||
PROGRAM="osync" # Rsync based two way sync engine with fault tolerance
|
PROGRAM="osync" # Rsync based two way sync engine with fault tolerance
|
||||||
AUTHOR="(C) 2013-2018 by Orsiris de Jong"
|
AUTHOR="(C) 2013-2018 by Orsiris de Jong"
|
||||||
CONTACT="http://www.netpower.fr/osync - ozy@netpower.fr"
|
CONTACT="http://www.netpower.fr/osync - ozy@netpower.fr"
|
||||||
PROGRAM_VERSION=1.3.0-beta1
|
PROGRAM_VERSION=1.3.0-beta1
|
||||||
PROGRAM_BUILD=2018100105
|
PROGRAM_BUILD=2018100106
|
||||||
IS_STABLE=no
|
IS_STABLE=no
|
||||||
|
|
||||||
##### Execution order #__WITH_PARANOIA_DEBUG
|
##### Execution order #__WITH_PARANOIA_DEBUG
|
||||||
|
@ -40,22 +42,10 @@ IS_STABLE=no
|
||||||
# UnlockReplicas yes #__WITH_PARANOIA_DEBUG
|
# UnlockReplicas yes #__WITH_PARANOIA_DEBUG
|
||||||
# CleanUp no #__WITH_PARANOIA_DEBUG
|
# CleanUp no #__WITH_PARANOIA_DEBUG
|
||||||
|
|
||||||
_OFUNCTIONS_VERSION=2.3.0-RC1
|
_OFUNCTIONS_VERSION=2.3.0-RC2
|
||||||
_OFUNCTIONS_BUILD=2018100103
|
_OFUNCTIONS_BUILD=2018100204
|
||||||
_OFUNCTIONS_BOOTSTRAP=true
|
_OFUNCTIONS_BOOTSTRAP=true
|
||||||
|
|
||||||
## To use in a program, define the following variables:
|
|
||||||
## PROGRAM=program-name
|
|
||||||
## INSTANCE_ID=program-instance-name
|
|
||||||
## _DEBUG=yes/no
|
|
||||||
## _LOGGER_SILENT=true/false
|
|
||||||
## _LOGGER_VERBOSE=true/false
|
|
||||||
## _LOGGER_ERR_ONLY=true/false
|
|
||||||
## _LOGGER_PREFIX="date"/"time"/""
|
|
||||||
|
|
||||||
## Logger sets {ERROR|WARN}_ALERT variable when called with critical / error / warn loglevel
|
|
||||||
## When called from subprocesses, variable of main process cannot be set. Status needs to be get via $RUN_DIR/$PROGRAM.Logger.{error|warn}.$SCRIPT_PID.$TSTAMP
|
|
||||||
|
|
||||||
if ! type "$BASH" > /dev/null; then
|
if ! type "$BASH" > /dev/null; then
|
||||||
echo "Please run this script only with bash shell. Tested on bash >= 3.2"
|
echo "Please run this script only with bash shell. Tested on bash >= 3.2"
|
||||||
exit 127
|
exit 127
|
||||||
|
@ -131,7 +121,6 @@ else
|
||||||
RUN_DIR=.
|
RUN_DIR=.
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#### PoorMansRandomGenerator SUBSET ####
|
|
||||||
# Get a random number on Windows BusyBox alike, also works on most Unixes
|
# Get a random number on Windows BusyBox alike, also works on most Unixes
|
||||||
function PoorMansRandomGenerator {
|
function PoorMansRandomGenerator {
|
||||||
local digits="${1}" # The number of digits to generate
|
local digits="${1}" # The number of digits to generate
|
||||||
|
@ -146,7 +135,6 @@ function PoorMansRandomGenerator {
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
#### PoorMansRandomGenerator SUBSET END ####
|
|
||||||
|
|
||||||
# Initial TSTMAP value before function declaration
|
# Initial TSTMAP value before function declaration
|
||||||
TSTAMP=$(date '+%Y%m%dT%H%M%S').$(PoorMansRandomGenerator 4)
|
TSTAMP=$(date '+%Y%m%dT%H%M%S').$(PoorMansRandomGenerator 4)
|
||||||
|
@ -159,13 +147,6 @@ set -o pipefail
|
||||||
set -o errtrace
|
set -o errtrace
|
||||||
|
|
||||||
|
|
||||||
function Dummy {
|
|
||||||
__CheckArguments 0 $# "$@" #__WITH_PARANOIA_DEBUG
|
|
||||||
|
|
||||||
sleep $SLEEP_TIME
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# Array to string converter, see http://stackoverflow.com/questions/1527049/bash-join-elements-of-an-array
|
# Array to string converter, see http://stackoverflow.com/questions/1527049/bash-join-elements-of-an-array
|
||||||
# usage: joinString separaratorChar Array
|
# usage: joinString separaratorChar Array
|
||||||
function joinString {
|
function joinString {
|
||||||
|
@ -411,6 +392,35 @@ function KillAllChilds {
|
||||||
return $errorcount
|
return $errorcount
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function CleanUp {
|
||||||
|
__CheckArguments 0 $# "$@" #__WITH_PARANOIA_DEBUG
|
||||||
|
|
||||||
|
if [ "$_DEBUG" != "yes" ]; then
|
||||||
|
rm -f "$RUN_DIR/$PROGRAM."*".$SCRIPT_PID.$TSTAMP"
|
||||||
|
# Fix for sed -i requiring backup extension for BSD & Mac (see all sed -i statements)
|
||||||
|
rm -f "$RUN_DIR/$PROGRAM."*".$SCRIPT_PID.$TSTAMP.tmp"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function GenericTrapQuit {
|
||||||
|
local exitcode=0
|
||||||
|
|
||||||
|
# Get ERROR / WARN alert flags from subprocesses that call Logger
|
||||||
|
if [ -f "$RUN_DIR/$PROGRAM.Logger.warn.$SCRIPT_PID.$TSTAMP" ]; then
|
||||||
|
WARN_ALERT=true
|
||||||
|
exitcode=2
|
||||||
|
fi
|
||||||
|
if [ -f "$RUN_DIR/$PROGRAM.Logger.error.$SCRIPT_PID.$TSTAMP" ]; then
|
||||||
|
ERROR_ALERT=true
|
||||||
|
exitcode=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
CleanUp
|
||||||
|
exit $exitcode
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# osync/obackup/pmocr script specific mail alert function, use SendEmail function for generic mail sending
|
# osync/obackup/pmocr script specific mail alert function, use SendEmail function for generic mail sending
|
||||||
function SendAlert {
|
function SendAlert {
|
||||||
local runAlert="${1:-false}" # Specifies if current message is sent while running or at the end of a run
|
local runAlert="${1:-false}" # Specifies if current message is sent while running or at the end of a run
|
||||||
|
@ -1216,16 +1226,6 @@ function ExecTasks {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function CleanUp {
|
|
||||||
__CheckArguments 0 $# "$@" #__WITH_PARANOIA_DEBUG
|
|
||||||
|
|
||||||
if [ "$_DEBUG" != "yes" ]; then
|
|
||||||
rm -f "$RUN_DIR/$PROGRAM."*".$SCRIPT_PID.$TSTAMP"
|
|
||||||
# Fix for sed -i requiring backup extension for BSD & Mac (see all sed -i statements)
|
|
||||||
rm -f "$RUN_DIR/$PROGRAM."*".$SCRIPT_PID.$TSTAMP.tmp"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Usage: var=$(StripSingleQuotes "$var")
|
# Usage: var=$(StripSingleQuotes "$var")
|
||||||
function StripSingleQuotes {
|
function StripSingleQuotes {
|
||||||
local string="${1}"
|
local string="${1}"
|
||||||
|
@ -1264,27 +1264,37 @@ function EscapeDoubleQuotes {
|
||||||
echo "${value//\"/\\\"}"
|
echo "${value//\"/\\\"}"
|
||||||
}
|
}
|
||||||
|
|
||||||
function IsNumericExpand {
|
|
||||||
eval "local value=\"${1}\"" # Needed eval so variable variables can be processed
|
|
||||||
|
|
||||||
if [[ $value =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then
|
|
||||||
echo 1
|
|
||||||
else
|
|
||||||
echo 0
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Usage [ $(IsNumeric $var) -eq 1 ]
|
# Usage [ $(IsNumeric $var) -eq 1 ]
|
||||||
function IsNumeric {
|
function IsNumeric {
|
||||||
local value="${1}"
|
local value="${1}"
|
||||||
|
|
||||||
if [[ $value =~ ^[0-9]+([.][0-9]+)?$ ]]; then
|
if type expr > /dev/null 2>&1; then
|
||||||
echo 1
|
expr "$value" : "^[-+]\?[0-9]*\.\?[0-9]\+$" > /dev/null 2>&1
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo 1
|
||||||
|
else
|
||||||
|
echo 0
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
echo 0
|
if [[ $value =~ ^[-+]?[0-9]+([.][0-9]+)?$ ]]; then
|
||||||
|
echo 1
|
||||||
|
else
|
||||||
|
echo 0
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function IsNumericExpand {
|
||||||
|
eval "local value=\"${1}\"" # Needed eval so variable variables can be processed
|
||||||
|
|
||||||
|
echo $(IsNumeric "$value")
|
||||||
|
# if [[ $value =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then
|
||||||
|
# echo 1
|
||||||
|
#else
|
||||||
|
# echo 0
|
||||||
|
#fi
|
||||||
|
}
|
||||||
|
|
||||||
# Function is busybox compatible since busybox ash does not understand direct regex, we use expr
|
# Function is busybox compatible since busybox ash does not understand direct regex, we use expr
|
||||||
function IsInteger {
|
function IsInteger {
|
||||||
local value="${1}"
|
local value="${1}"
|
||||||
|
@ -1874,9 +1884,9 @@ function RsyncPatternsAdd {
|
||||||
rest="${rest#*$PATH_SEPARATOR_CHAR}"
|
rest="${rest#*$PATH_SEPARATOR_CHAR}"
|
||||||
fi
|
fi
|
||||||
if [ "$RSYNC_PATTERNS" == "" ]; then
|
if [ "$RSYNC_PATTERNS" == "" ]; then
|
||||||
RSYNC_PATTERNS="--"$patternType"=\"$str\""
|
RSYNC_PATTERNS="--$patternType=\"$str\""
|
||||||
else
|
else
|
||||||
RSYNC_PATTERNS="$RSYNC_PATTERNS --"$patternType"=\"$str\""
|
RSYNC_PATTERNS="$RSYNC_PATTERNS --$patternType=\"$str\""
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
set +f
|
set +f
|
||||||
|
@ -1893,7 +1903,7 @@ function RsyncPatternsFromAdd {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -e "$patternFrom" ]; then
|
if [ -e "$patternFrom" ]; then
|
||||||
RSYNC_PATTERNS="$RSYNC_PATTERNS --"$patternType"-from=\"$patternFrom\""
|
RSYNC_PATTERNS="$RSYNC_PATTERNS --$patternType-from=\"$patternFrom\""
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1983,14 +1993,10 @@ function PostInit {
|
||||||
# Define remote commands
|
# Define remote commands
|
||||||
if [ -f "$SSH_RSA_PRIVATE_KEY" ]; then
|
if [ -f "$SSH_RSA_PRIVATE_KEY" ]; then
|
||||||
SSH_CMD="$(type -p ssh) $SSH_COMP -q -i $SSH_RSA_PRIVATE_KEY $SSH_OPTS $REMOTE_USER@$REMOTE_HOST -p $REMOTE_PORT"
|
SSH_CMD="$(type -p ssh) $SSH_COMP -q -i $SSH_RSA_PRIVATE_KEY $SSH_OPTS $REMOTE_USER@$REMOTE_HOST -p $REMOTE_PORT"
|
||||||
#WIP
|
|
||||||
#SSH_REVERSE_CMD="$(type -p ssh) $SSH_COMP -q -i $INITIATOR_SSH_RSA_PRIVATE_KEY $SSH_OPTS $INITIATOR_REMOTE_USER@$INITIATOR_REMOTE_HOST -p $INITIATOR_REMOTE_PORT"
|
|
||||||
SCP_CMD="$(type -p scp) $SSH_COMP -q -i $SSH_RSA_PRIVATE_KEY -P $REMOTE_PORT"
|
SCP_CMD="$(type -p scp) $SSH_COMP -q -i $SSH_RSA_PRIVATE_KEY -P $REMOTE_PORT"
|
||||||
RSYNC_SSH_CMD="$(type -p ssh) $SSH_COMP -q -i $SSH_RSA_PRIVATE_KEY $SSH_OPTS -p $REMOTE_PORT"
|
RSYNC_SSH_CMD="$(type -p ssh) $SSH_COMP -q -i $SSH_RSA_PRIVATE_KEY $SSH_OPTS -p $REMOTE_PORT"
|
||||||
elif [ -f "$SSH_PASSWORD_FILE" ]; then
|
elif [ -f "$SSH_PASSWORD_FILE" ]; then
|
||||||
SSH_CMD="$(type -p sshpass) -f $SSH_PASSWORD_FILE $(type -p ssh) $SSH_COMP -q $SSH_OPTS $REMOTE_USER@$REMOTE_HOST -p $REMOTE_PORT"
|
SSH_CMD="$(type -p sshpass) -f $SSH_PASSWORD_FILE $(type -p ssh) $SSH_COMP -q $SSH_OPTS $REMOTE_USER@$REMOTE_HOST -p $REMOTE_PORT"
|
||||||
#WIP
|
|
||||||
#SSH_REVERSE_CMD="$(type -p sshpass) -f $INITIATOR_SSH_PASSWORD_FILE $(type -p ssh) $SSH_COMP -q $SSH_OPTS $INITIATOR_REMOTE_USER@$INITIATOR_REMOTE_HOST -p $INITIATOR_REMOTE_PORT"
|
|
||||||
SCP_CMD="$(type -p sshpass) -f $SSH_PASSWORD_FILE $(type -p scp) $SSH_COMP -q -P $REMOTE_PORT"
|
SCP_CMD="$(type -p sshpass) -f $SSH_PASSWORD_FILE $(type -p scp) $SSH_COMP -q -P $REMOTE_PORT"
|
||||||
RSYNC_SSH_CMD="$(type -p sshpass) -f $SSH_PASSWORD_FILE $(type -p ssh) $SSH_COMP -q $SSH_OPTS -p $REMOTE_PORT"
|
RSYNC_SSH_CMD="$(type -p sshpass) -f $SSH_PASSWORD_FILE $(type -p ssh) $SSH_COMP -q $SSH_OPTS -p $REMOTE_PORT"
|
||||||
else
|
else
|
||||||
|
@ -2221,7 +2227,7 @@ function VerComp () {
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $1 == $2 ]]
|
if [[ "$1" == "$2" ]]
|
||||||
then
|
then
|
||||||
echo 0
|
echo 0
|
||||||
return
|
return
|
||||||
|
@ -3580,6 +3586,15 @@ function conflictList {
|
||||||
|
|
||||||
join -j 1 -t ';' -o 1.1,1.2,1.3,2.2,2.3 "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.${INITIATOR[$__type]}.$SCRIPT_PID.$TSTAMP" "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.${TARGET[$__type]}.$SCRIPT_PID.$TSTAMP" > "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.compare.$SCRIPT_PID.$TSTAMP"
|
join -j 1 -t ';' -o 1.1,1.2,1.3,2.2,2.3 "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.${INITIATOR[$__type]}.$SCRIPT_PID.$TSTAMP" "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.${TARGET[$__type]}.$SCRIPT_PID.$TSTAMP" > "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.compare.$SCRIPT_PID.$TSTAMP"
|
||||||
retval=$?
|
retval=$?
|
||||||
|
|
||||||
|
#WIP
|
||||||
|
if [ $TRAVIS_RUN == true ]; then
|
||||||
|
echo "conflictList debug retval=$retval"
|
||||||
|
cat "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.${INITIATOR[$__type]}.$SCRIPT_PID.$TSTAMP"
|
||||||
|
cat "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.${TARGET[$__type]}.$SCRIPT_PID.$TSTAMP"
|
||||||
|
cat "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.compare.$SCRIPT_PID.$TSTAMP"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ $retval -ne 0 ]; then
|
if [ $retval -ne 0 ]; then
|
||||||
Logger "Cannot create conflict list file." "ERROR"
|
Logger "Cannot create conflict list file." "ERROR"
|
||||||
return $retval
|
return $retval
|
||||||
|
@ -5169,6 +5184,12 @@ function LogConflicts {
|
||||||
local subject
|
local subject
|
||||||
local body
|
local body
|
||||||
|
|
||||||
|
#WIP
|
||||||
|
if [ $TRAVIS_RUN == true ]; then
|
||||||
|
cat "$RUN_DIR/$PROGRAM.conflictList.compare.$SCRIPT_PID.$TSTAMP"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# We keep this in a separate if check because of the subshell used for Logger with _LOGGER_PREFIX
|
# We keep this in a separate if check because of the subshell used for Logger with _LOGGER_PREFIX
|
||||||
if [ -f "$RUN_DIR/$PROGRAM.conflictList.compare.$SCRIPT_PID.$TSTAMP" ]; then
|
if [ -f "$RUN_DIR/$PROGRAM.conflictList.compare.$SCRIPT_PID.$TSTAMP" ]; then
|
||||||
Logger "File conflicts: INITIATOR << >> TARGET" "ALWAYS"
|
Logger "File conflicts: INITIATOR << >> TARGET" "ALWAYS"
|
||||||
|
@ -5176,6 +5197,7 @@ function LogConflicts {
|
||||||
|
|
||||||
(
|
(
|
||||||
_LOGGER_PREFIX=""
|
_LOGGER_PREFIX=""
|
||||||
|
|
||||||
if [ -f "$RUN_DIR/$PROGRAM.conflictList.compare.$SCRIPT_PID.$TSTAMP" ]; then
|
if [ -f "$RUN_DIR/$PROGRAM.conflictList.compare.$SCRIPT_PID.$TSTAMP" ]; then
|
||||||
echo "" > "${INITIATOR[$__replicaDir]}${INITIATOR[$__stateDir]}/${INITIATOR[$__conflictListFile]}"
|
echo "" > "${INITIATOR[$__replicaDir]}${INITIATOR[$__stateDir]}/${INITIATOR[$__conflictListFile]}"
|
||||||
while read -r line; do
|
while read -r line; do
|
||||||
|
|
354
install.sh
354
install.sh
|
@ -10,83 +10,113 @@ PROGRAM_BINARY=$PROGRAM".sh"
|
||||||
PROGRAM_BATCH=$PROGRAM"-batch.sh"
|
PROGRAM_BATCH=$PROGRAM"-batch.sh"
|
||||||
SSH_FILTER="ssh_filter.sh"
|
SSH_FILTER="ssh_filter.sh"
|
||||||
|
|
||||||
SCRIPT_BUILD=2018090301
|
SCRIPT_BUILD=2018100201
|
||||||
INSTANCE_ID="installer-$SCRIPT_BUILD"
|
INSTANCE_ID="installer-$SCRIPT_BUILD"
|
||||||
|
|
||||||
## osync / obackup / pmocr / zsnap install script
|
## osync / obackup / pmocr / zsnap install script
|
||||||
## Tested on RHEL / CentOS 6 & 7, Fedora 23, Debian 7 & 8, Mint 17 and FreeBSD 8, 10 and 11
|
## Tested on RHEL / CentOS 6 & 7, Fedora 23, Debian 7 & 8, Mint 17 and FreeBSD 8, 10 and 11
|
||||||
## Please adapt this to fit your distro needs
|
## Please adapt this to fit your distro needs
|
||||||
|
|
||||||
|
_OFUNCTIONS_VERSION=2.3.0-RC2
|
||||||
|
_OFUNCTIONS_BUILD=2018100204
|
||||||
_OFUNCTIONS_BOOTSTRAP=true
|
_OFUNCTIONS_BOOTSTRAP=true
|
||||||
|
|
||||||
# Get current install.sh path from http://stackoverflow.com/a/246128/2635443
|
if ! type "$BASH" > /dev/null; then
|
||||||
SCRIPT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
echo "Please run this script only with bash shell. Tested on bash >= 3.2"
|
||||||
|
exit 127
|
||||||
|
fi
|
||||||
|
|
||||||
|
## Correct output of sort command (language agnostic sorting)
|
||||||
|
export LC_ALL=C
|
||||||
|
|
||||||
|
## Default umask for file creation
|
||||||
|
umask 0077
|
||||||
|
|
||||||
|
# Standard alert mail body
|
||||||
|
MAIL_ALERT_MSG="Execution of $PROGRAM instance $INSTANCE_ID on $(date) has warnings/errors."
|
||||||
|
|
||||||
|
# Environment variables that can be overriden by programs
|
||||||
|
_DRYRUN=false
|
||||||
_LOGGER_SILENT=false
|
_LOGGER_SILENT=false
|
||||||
_STATS=1
|
_LOGGER_VERBOSE=false
|
||||||
ACTION="install"
|
_LOGGER_ERR_ONLY=false
|
||||||
FAKEROOT=""
|
_LOGGER_PREFIX="date"
|
||||||
|
if [ "$KEEP_LOGGING" == "" ]; then
|
||||||
|
KEEP_LOGGING=1801
|
||||||
|
fi
|
||||||
|
|
||||||
function GetCommandlineArguments {
|
# Initial error status, logging 'WARN', 'ERROR' or 'CRITICAL' will enable alerts flags
|
||||||
for i in "$@"; do
|
ERROR_ALERT=false
|
||||||
case $i in
|
WARN_ALERT=false
|
||||||
--prefix=*)
|
|
||||||
FAKEROOT="${i##*=}"
|
|
||||||
;;
|
## allow debugging from command line with _DEBUG=yes
|
||||||
--silent)
|
if [ ! "$_DEBUG" == "yes" ]; then
|
||||||
_LOGGER_SILENT=true
|
_DEBUG=no
|
||||||
;;
|
_LOGGER_VERBOSE=false
|
||||||
--no-stats)
|
else
|
||||||
_STATS=0
|
trap 'TrapError ${LINENO} $?' ERR
|
||||||
;;
|
_LOGGER_VERBOSE=true
|
||||||
--remove)
|
fi
|
||||||
ACTION="uninstall"
|
|
||||||
;;
|
if [ "$SLEEP_TIME" == "" ]; then # Leave the possibity to set SLEEP_TIME as environment variable when runinng with bash -x in order to avoid spamming console
|
||||||
--help|-h|-?)
|
SLEEP_TIME=.05
|
||||||
Usage
|
fi
|
||||||
;;
|
|
||||||
*)
|
SCRIPT_PID=$$
|
||||||
Logger "Unknown option '$i'" "SIMPLE"
|
|
||||||
Usage
|
LOCAL_USER=$(whoami)
|
||||||
exit
|
LOCAL_HOST=$(hostname)
|
||||||
;;
|
|
||||||
esac
|
if [ "$PROGRAM" == "" ]; then
|
||||||
done
|
PROGRAM="ofunctions"
|
||||||
|
fi
|
||||||
|
|
||||||
|
## Default log file until config file is loaded
|
||||||
|
if [ -w /var/log ]; then
|
||||||
|
LOG_FILE="/var/log/$PROGRAM.log"
|
||||||
|
elif ([ "$HOME" != "" ] && [ -w "$HOME" ]); then
|
||||||
|
LOG_FILE="$HOME/$PROGRAM.log"
|
||||||
|
elif [ -w . ]; then
|
||||||
|
LOG_FILE="./$PROGRAM.log"
|
||||||
|
else
|
||||||
|
LOG_FILE="/tmp/$PROGRAM.log"
|
||||||
|
fi
|
||||||
|
|
||||||
|
## Default directory where to store temporary run files
|
||||||
|
if [ -w /tmp ]; then
|
||||||
|
RUN_DIR=/tmp
|
||||||
|
elif [ -w /var/tmp ]; then
|
||||||
|
RUN_DIR=/var/tmp
|
||||||
|
else
|
||||||
|
RUN_DIR=.
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get a random number on Windows BusyBox alike, also works on most Unixes
|
||||||
|
function PoorMansRandomGenerator {
|
||||||
|
local digits="${1}" # The number of digits to generate
|
||||||
|
local number
|
||||||
|
|
||||||
|
# Some read bytes can't be used, se we read twice the number of required bytes
|
||||||
|
dd if=/dev/urandom bs=$digits count=2 2> /dev/null | while read -r -n1 char; do
|
||||||
|
number=$number$(printf "%d" "'$char")
|
||||||
|
if [ ${#number} -ge $digits ]; then
|
||||||
|
echo ${number:0:$digits}
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
GetCommandlineArguments "$@"
|
# Initial TSTMAP value before function declaration
|
||||||
|
TSTAMP=$(date '+%Y%m%dT%H%M%S').$(PoorMansRandomGenerator 4)
|
||||||
|
|
||||||
CONF_DIR=$FAKEROOT/etc/$PROGRAM
|
# Default alert attachment filename
|
||||||
BIN_DIR="$FAKEROOT/usr/local/bin"
|
ALERT_LOG_FILE="$RUN_DIR/$PROGRAM.$SCRIPT_PID.$TSTAMP.last.log"
|
||||||
SERVICE_DIR_INIT=$FAKEROOT/etc/init.d
|
|
||||||
# Should be /usr/lib/systemd/system, but /lib/systemd/system exists on debian & rhel / fedora
|
|
||||||
SERVICE_DIR_SYSTEMD_SYSTEM=$FAKEROOT/lib/systemd/system
|
|
||||||
SERVICE_DIR_SYSTEMD_USER=$FAKEROOT/etc/systemd/user
|
|
||||||
SERVICE_DIR_OPENRC=$FAKEROOT/etc/init.d
|
|
||||||
|
|
||||||
if [ "$PROGRAM" == "osync" ]; then
|
# Set error exit code if a piped command fails
|
||||||
SERVICE_NAME="osync-srv"
|
set -o pipefail
|
||||||
elif [ "$PROGRAM" == "pmocr" ]; then
|
set -o errtrace
|
||||||
SERVICE_NAME="pmocr-srv"
|
|
||||||
fi
|
|
||||||
|
|
||||||
SERVICE_FILE_INIT="$SERVICE_NAME"
|
|
||||||
SERVICE_FILE_SYSTEMD_SYSTEM="$SERVICE_NAME@.service"
|
|
||||||
SERVICE_FILE_SYSTEMD_USER="$SERVICE_NAME@.service.user"
|
|
||||||
SERVICE_FILE_OPENRC="$SERVICE_NAME-openrc"
|
|
||||||
|
|
||||||
## Generic code
|
|
||||||
|
|
||||||
## Default log file
|
|
||||||
if [ -w "$FAKEROOT/var/log" ]; then
|
|
||||||
LOG_FILE="$FAKEROOT/var/log/$PROGRAM-install.log"
|
|
||||||
elif ([ "$HOME" != "" ] && [ -w "$HOME" ]); then
|
|
||||||
LOG_FILE="$HOME/$PROGRAM-install.log"
|
|
||||||
else
|
|
||||||
LOG_FILE="./$PROGRAM-install.log"
|
|
||||||
fi
|
|
||||||
|
|
||||||
#### RemoteLogger SUBSET ####
|
|
||||||
|
|
||||||
# Array to string converter, see http://stackoverflow.com/questions/1527049/bash-join-elements-of-an-array
|
# Array to string converter, see http://stackoverflow.com/questions/1527049/bash-join-elements-of-an-array
|
||||||
# usage: joinString separaratorChar Array
|
# usage: joinString separaratorChar Array
|
||||||
|
@ -170,17 +200,11 @@ function RemoteLogger {
|
||||||
_Logger "" "$prefix$value"
|
_Logger "" "$prefix$value"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
elif [ "$level" == "PARANOIA_DEBUG" ]; then #__WITH_PARANOIA_DEBUG
|
|
||||||
if [ "$_PARANOIA_DEBUG" == "yes" ]; then #__WITH_PARANOIA_DEBUG
|
|
||||||
_Logger "" "$prefix\e[35m$value\e[0m" #__WITH_PARANOIA_DEBUG
|
|
||||||
return #__WITH_PARANOIA_DEBUG
|
|
||||||
fi #__WITH_PARANOIA_DEBUG
|
|
||||||
else
|
else
|
||||||
_Logger "" "\e[41mLogger function called without proper loglevel [$level].\e[0m" true
|
_Logger "" "\e[41mLogger function called without proper loglevel [$level].\e[0m" true
|
||||||
_Logger "" "Value was: $prefix$value" true
|
_Logger "" "Value was: $prefix$value" true
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
#### RemoteLogger SUBSET END ####
|
|
||||||
|
|
||||||
# General log function with log levels:
|
# General log function with log levels:
|
||||||
|
|
||||||
|
@ -249,11 +273,6 @@ function Logger {
|
||||||
_Logger "$prefix$value" "$prefix$value"
|
_Logger "$prefix$value" "$prefix$value"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
elif [ "$level" == "PARANOIA_DEBUG" ]; then #__WITH_PARANOIA_DEBUG
|
|
||||||
if [ "$_PARANOIA_DEBUG" == "yes" ]; then #__WITH_PARANOIA_DEBUG
|
|
||||||
_Logger "$prefix$value" "$prefix\e[35m$value\e[0m" #__WITH_PARANOIA_DEBUG
|
|
||||||
return #__WITH_PARANOIA_DEBUG
|
|
||||||
fi #__WITH_PARANOIA_DEBUG
|
|
||||||
elif [ "$level" == "SIMPLE" ]; then
|
elif [ "$level" == "SIMPLE" ]; then
|
||||||
if [ "$_LOGGER_SILENT" == true ]; then
|
if [ "$_LOGGER_SILENT" == true ]; then
|
||||||
_Logger "$preix$value"
|
_Logger "$preix$value"
|
||||||
|
@ -266,6 +285,167 @@ function Logger {
|
||||||
_Logger "Value was: $prefix$value" "Value was: $prefix$value" true
|
_Logger "Value was: $prefix$value" "Value was: $prefix$value" true
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Portable child (and grandchild) kill function tester under Linux, BSD and MacOS X
|
||||||
|
function KillChilds {
|
||||||
|
local pid="${1}" # Parent pid to kill childs
|
||||||
|
local self="${2:-false}" # Should parent be killed too ?
|
||||||
|
|
||||||
|
# Paranoid checks, we can safely assume that $pid should not be 0 nor 1
|
||||||
|
if [ $(IsInteger "$pid") -eq 0 ] || [ "$pid" == "" ] || [ "$pid" == "0" ] || [ "$pid" == "1" ]; then
|
||||||
|
Logger "Bogus pid given [$pid]." "CRITICAL"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if kill -0 "$pid" > /dev/null 2>&1; then
|
||||||
|
if children="$(pgrep -P "$pid")"; then
|
||||||
|
if [[ "$pid" == *"$children"* ]]; then
|
||||||
|
Logger "Bogus pgrep implementation." "CRITICAL"
|
||||||
|
children="${children/$pid/}"
|
||||||
|
fi
|
||||||
|
for child in $children; do
|
||||||
|
KillChilds "$child" true
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Try to kill nicely, if not, wait 15 seconds to let Trap actions happen before killing
|
||||||
|
if [ "$self" == true ]; then
|
||||||
|
# We need to check for pid again because it may have disappeared after recursive function call
|
||||||
|
if kill -0 "$pid" > /dev/null 2>&1; then
|
||||||
|
kill -s TERM "$pid"
|
||||||
|
Logger "Sent SIGTERM to process [$pid]." "DEBUG"
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
sleep 15
|
||||||
|
Logger "Sending SIGTERM to process [$pid] failed." "DEBUG"
|
||||||
|
kill -9 "$pid"
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
Logger "Sending SIGKILL to process [$pid] failed." "DEBUG"
|
||||||
|
return 1
|
||||||
|
fi # Simplify the return 0 logic here
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function KillAllChilds {
|
||||||
|
local pids="${1}" # List of parent pids to kill separated by semi-colon
|
||||||
|
local self="${2:-false}" # Should parent be killed too ?
|
||||||
|
|
||||||
|
|
||||||
|
local errorcount=0
|
||||||
|
|
||||||
|
IFS=';' read -a pidsArray <<< "$pids"
|
||||||
|
for pid in "${pidsArray[@]}"; do
|
||||||
|
KillChilds $pid $self
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
errorcount=$((errorcount+1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return $errorcount
|
||||||
|
}
|
||||||
|
|
||||||
|
function CleanUp {
|
||||||
|
|
||||||
|
if [ "$_DEBUG" != "yes" ]; then
|
||||||
|
rm -f "$RUN_DIR/$PROGRAM."*".$SCRIPT_PID.$TSTAMP"
|
||||||
|
# Fix for sed -i requiring backup extension for BSD & Mac (see all sed -i statements)
|
||||||
|
rm -f "$RUN_DIR/$PROGRAM."*".$SCRIPT_PID.$TSTAMP.tmp"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function GenericTrapQuit {
|
||||||
|
local exitcode=0
|
||||||
|
|
||||||
|
# Get ERROR / WARN alert flags from subprocesses that call Logger
|
||||||
|
if [ -f "$RUN_DIR/$PROGRAM.Logger.warn.$SCRIPT_PID.$TSTAMP" ]; then
|
||||||
|
WARN_ALERT=true
|
||||||
|
exitcode=2
|
||||||
|
fi
|
||||||
|
if [ -f "$RUN_DIR/$PROGRAM.Logger.error.$SCRIPT_PID.$TSTAMP" ]; then
|
||||||
|
ERROR_ALERT=true
|
||||||
|
exitcode=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
CleanUp
|
||||||
|
exit $exitcode
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Get current install.sh path from http://stackoverflow.com/a/246128/2635443
|
||||||
|
SCRIPT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
|
||||||
|
_LOGGER_SILENT=false
|
||||||
|
_STATS=1
|
||||||
|
ACTION="install"
|
||||||
|
FAKEROOT=""
|
||||||
|
|
||||||
|
function GetCommandlineArguments {
|
||||||
|
for i in "$@"; do
|
||||||
|
case $i in
|
||||||
|
--prefix=*)
|
||||||
|
FAKEROOT="${i##*=}"
|
||||||
|
;;
|
||||||
|
--silent)
|
||||||
|
_LOGGER_SILENT=true
|
||||||
|
;;
|
||||||
|
--no-stats)
|
||||||
|
_STATS=0
|
||||||
|
;;
|
||||||
|
--remove)
|
||||||
|
ACTION="uninstall"
|
||||||
|
;;
|
||||||
|
--help|-h|-?)
|
||||||
|
Usage
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
Logger "Unknown option '$i'" "SIMPLE"
|
||||||
|
Usage
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
GetCommandlineArguments "$@"
|
||||||
|
|
||||||
|
CONF_DIR=$FAKEROOT/etc/$PROGRAM
|
||||||
|
BIN_DIR="$FAKEROOT/usr/local/bin"
|
||||||
|
SERVICE_DIR_INIT=$FAKEROOT/etc/init.d
|
||||||
|
# Should be /usr/lib/systemd/system, but /lib/systemd/system exists on debian & rhel / fedora
|
||||||
|
SERVICE_DIR_SYSTEMD_SYSTEM=$FAKEROOT/lib/systemd/system
|
||||||
|
SERVICE_DIR_SYSTEMD_USER=$FAKEROOT/etc/systemd/user
|
||||||
|
SERVICE_DIR_OPENRC=$FAKEROOT/etc/init.d
|
||||||
|
|
||||||
|
if [ "$PROGRAM" == "osync" ]; then
|
||||||
|
SERVICE_NAME="osync-srv"
|
||||||
|
elif [ "$PROGRAM" == "pmocr" ]; then
|
||||||
|
SERVICE_NAME="pmocr-srv"
|
||||||
|
fi
|
||||||
|
|
||||||
|
SERVICE_FILE_INIT="$SERVICE_NAME"
|
||||||
|
SERVICE_FILE_SYSTEMD_SYSTEM="$SERVICE_NAME@.service"
|
||||||
|
SERVICE_FILE_SYSTEMD_USER="$SERVICE_NAME@.service.user"
|
||||||
|
SERVICE_FILE_OPENRC="$SERVICE_NAME-openrc"
|
||||||
|
|
||||||
|
## Generic code
|
||||||
|
|
||||||
|
## Default log file
|
||||||
|
if [ -w "$FAKEROOT/var/log" ]; then
|
||||||
|
LOG_FILE="$FAKEROOT/var/log/$PROGRAM-install.log"
|
||||||
|
elif ([ "$HOME" != "" ] && [ -w "$HOME" ]); then
|
||||||
|
LOG_FILE="$HOME/$PROGRAM-install.log"
|
||||||
|
else
|
||||||
|
LOG_FILE="./$PROGRAM-install.log"
|
||||||
|
fi
|
||||||
|
|
||||||
## Modified version of https://gist.github.com/cdown/1163649
|
## Modified version of https://gist.github.com/cdown/1163649
|
||||||
function UrlEncode {
|
function UrlEncode {
|
||||||
local length="${#1}"
|
local length="${#1}"
|
||||||
|
@ -658,19 +838,27 @@ function Usage {
|
||||||
exit 127
|
exit 127
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function TrapQuit {
|
||||||
|
local exitcode=0
|
||||||
|
|
||||||
|
# Get ERROR / WARN alert flags from subprocesses that call Logger
|
||||||
|
if [ -f "$RUN_DIR/$PROGRAM.Logger.warn.$SCRIPT_PID.$TSTAMP" ]; then
|
||||||
|
WARN_ALERT=true
|
||||||
|
exitcode=2
|
||||||
|
fi
|
||||||
|
if [ -f "$RUN_DIR/$PROGRAM.Logger.error.$SCRIPT_PID.$TSTAMP" ]; then
|
||||||
|
ERROR_ALERT=true
|
||||||
|
exitcode=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
CleanUp
|
||||||
|
exit $exitcode
|
||||||
|
}
|
||||||
|
|
||||||
############################## Script entry point
|
############################## Script entry point
|
||||||
|
|
||||||
if [ "$LOGFILE" == "" ]; then
|
trap TrapQuit TERM EXIT HUP QUIT
|
||||||
if [ -w /var/log ]; then
|
|
||||||
LOG_FILE="/var/log/$PROGRAM.$INSTANCE_ID.log"
|
|
||||||
elif ([ "$HOME" != "" ] && [ -w "$HOME" ]); then
|
|
||||||
LOG_FILE="$HOME/$PROGRAM.$INSTANCE_ID.log"
|
|
||||||
else
|
|
||||||
LOG_FILE="./$PROGRAM.$INSTANCE_ID.log"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
LOG_FILE="$LOGFILE"
|
|
||||||
fi
|
|
||||||
if [ ! -w "$(dirname $LOG_FILE)" ]; then
|
if [ ! -w "$(dirname $LOG_FILE)" ]; then
|
||||||
echo "Cannot write to log [$(dirname $LOG_FILE)]."
|
echo "Cannot write to log [$(dirname $LOG_FILE)]."
|
||||||
else
|
else
|
||||||
|
|
185
osync-batch.sh
185
osync-batch.sh
|
@ -1,9 +1,9 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
SUBPROGRAM=osync
|
SUBPROGRAM=osync
|
||||||
PROGRAM="$SUBPROGRAM-batch" # Batch program to run osync / obackup instances sequentially and rerun failed ones
|
PROGRAM="$SUBPROGRAM-batch" # Batch program to run osync / obackup instances sequentially and rerun failed ones
|
||||||
AUTHOR="(L) 2013-2017 by Orsiris de Jong"
|
AUTHOR="(L) 2013-2018 by Orsiris de Jong"
|
||||||
CONTACT="http://www.netpower.fr - ozy@netpower.fr"
|
CONTACT="http://www.netpower.fr - ozy@netpower.fr"
|
||||||
PROGRAM_BUILD=2016120401
|
PROGRAM_BUILD=2018100101
|
||||||
|
|
||||||
## Runs an osync /obackup instance for every conf file found
|
## Runs an osync /obackup instance for every conf file found
|
||||||
## If an instance fails, run it again if time permits
|
## If an instance fails, run it again if time permits
|
||||||
|
@ -26,34 +26,185 @@ else
|
||||||
LOG_FILE=./$SUBPROGRAM-batch.log
|
LOG_FILE=./$SUBPROGRAM-batch.log
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
## Default directory where to store temporary run files
|
||||||
|
if [ -w /tmp ]; then
|
||||||
|
RUN_DIR=/tmp
|
||||||
|
elif [ -w /var/tmp ]; then
|
||||||
|
RUN_DIR=/var/tmp
|
||||||
|
else
|
||||||
|
RUN_DIR=.
|
||||||
|
fi
|
||||||
|
|
||||||
# No need to edit under this line ##############################################################
|
# No need to edit under this line ##############################################################
|
||||||
|
|
||||||
function _logger {
|
#### RemoteLogger SUBSET ####
|
||||||
local value="${1}" # What to log
|
|
||||||
echo -e "$value" >> "$LOG_FILE"
|
# Array to string converter, see http://stackoverflow.com/questions/1527049/bash-join-elements-of-an-array
|
||||||
|
# usage: joinString separaratorChar Array
|
||||||
|
function joinString {
|
||||||
|
local IFS="$1"; shift; echo "$*";
|
||||||
}
|
}
|
||||||
|
|
||||||
function Logger {
|
# Sub function of Logger
|
||||||
local value="${1}" # What to log
|
function _Logger {
|
||||||
local level="${2}" # Log level: DEBUG, NOTICE, WARN, ERROR, CRITIAL
|
local logValue="${1}" # Log to file
|
||||||
|
local stdValue="${2}" # Log to screeen
|
||||||
|
local toStdErr="${3:-false}" # Log to stderr instead of stdout
|
||||||
|
|
||||||
prefix="$(date) - "
|
if [ "$logValue" != "" ]; then
|
||||||
|
echo -e "$logValue" >> "$LOG_FILE"
|
||||||
|
|
||||||
|
# Build current log file for alerts if we have a sufficient environment
|
||||||
|
if [ "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID.$TSTAMP" != "" ]; then
|
||||||
|
echo -e "$logValue" >> "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.$SCRIPT_PID.$TSTAMP"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$stdValue" != "" ] && [ "$_LOGGER_SILENT" != true ]; then
|
||||||
|
if [ $toStdErr == true ]; then
|
||||||
|
# Force stderr color in subshell
|
||||||
|
(>&2 echo -e "$stdValue")
|
||||||
|
|
||||||
|
else
|
||||||
|
echo -e "$stdValue"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Remote logger similar to below Logger, without log to file and alert flags
|
||||||
|
function RemoteLogger {
|
||||||
|
local value="${1}" # Sentence to log (in double quotes)
|
||||||
|
local level="${2}" # Log level
|
||||||
|
local retval="${3:-undef}" # optional return value of command
|
||||||
|
|
||||||
|
if [ "$_LOGGER_PREFIX" == "time" ]; then
|
||||||
|
prefix="TIME: $SECONDS - "
|
||||||
|
elif [ "$_LOGGER_PREFIX" == "date" ]; then
|
||||||
|
prefix="R $(date) - "
|
||||||
|
else
|
||||||
|
prefix=""
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$level" == "CRITICAL" ]; then
|
if [ "$level" == "CRITICAL" ]; then
|
||||||
_logger "$prefix\e[41m$value\e[0m"
|
_Logger "" "$prefix\e[1;33;41m$value\e[0m" true
|
||||||
|
if [ $_DEBUG == "yes" ]; then
|
||||||
|
_Logger -e "" "[$retval] in [$(joinString , ${FUNCNAME[@]})] SP=$SCRIPT_PID P=$$" true
|
||||||
|
fi
|
||||||
|
return
|
||||||
elif [ "$level" == "ERROR" ]; then
|
elif [ "$level" == "ERROR" ]; then
|
||||||
_logger "$prefix\e[91m$value\e[0m"
|
_Logger "" "$prefix\e[31m$value\e[0m" true
|
||||||
|
if [ $_DEBUG == "yes" ]; then
|
||||||
|
_Logger -e "" "[$retval] in [$(joinString , ${FUNCNAME[@]})] SP=$SCRIPT_PID P=$$" true
|
||||||
|
fi
|
||||||
|
return
|
||||||
elif [ "$level" == "WARN" ]; then
|
elif [ "$level" == "WARN" ]; then
|
||||||
_logger "$prefix\e[93m$value\e[0m"
|
_Logger "" "$prefix\e[33m$value\e[0m" true
|
||||||
|
if [ $_DEBUG == "yes" ]; then
|
||||||
|
_Logger -e "" "[$retval] in [$(joinString , ${FUNCNAME[@]})] SP=$SCRIPT_PID P=$$" true
|
||||||
|
fi
|
||||||
|
return
|
||||||
elif [ "$level" == "NOTICE" ]; then
|
elif [ "$level" == "NOTICE" ]; then
|
||||||
_logger "$prefix$value"
|
if [ $_LOGGER_ERR_ONLY != true ]; then
|
||||||
|
_Logger "" "$prefix$value"
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
elif [ "$level" == "VERBOSE" ]; then
|
||||||
|
if [ $_LOGGER_VERBOSE == true ]; then
|
||||||
|
_Logger "" "$prefix$value"
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
elif [ "$level" == "ALWAYS" ]; then
|
||||||
|
_Logger "" "$prefix$value"
|
||||||
|
return
|
||||||
elif [ "$level" == "DEBUG" ]; then
|
elif [ "$level" == "DEBUG" ]; then
|
||||||
if [ "$DEBUG" == "yes" ]; then
|
if [ "$_DEBUG" == "yes" ]; then
|
||||||
_logger "$prefix$value"
|
_Logger "" "$prefix$value"
|
||||||
|
return
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
_logger "\e[41mLogger function called without proper loglevel.\e[0m"
|
_Logger "" "\e[41mLogger function called without proper loglevel [$level].\e[0m" true
|
||||||
_logger "$prefix$value"
|
_Logger "" "Value was: $prefix$value" true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
#### RemoteLogger SUBSET END ####
|
||||||
|
|
||||||
|
# General log function with log levels:
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
|
# _LOGGER_SILENT: Disables any output to stdout & stderr
|
||||||
|
# _LOGGER_ERR_ONLY: Disables any output to stdout except for ALWAYS loglevel
|
||||||
|
# _LOGGER_VERBOSE: Allows VERBOSE loglevel messages to be sent to stdout
|
||||||
|
|
||||||
|
# Loglevels
|
||||||
|
# Except for VERBOSE, all loglevels are ALWAYS sent to log file
|
||||||
|
|
||||||
|
# CRITICAL, ERROR, WARN sent to stderr, color depending on level, level also logged
|
||||||
|
# NOTICE sent to stdout
|
||||||
|
# VERBOSE sent to stdout if _LOGGER_VERBOSE = true
|
||||||
|
# ALWAYS is sent to stdout unless _LOGGER_SILENT = true
|
||||||
|
# DEBUG & PARANOIA_DEBUG are only sent to stdout if _DEBUG=yes
|
||||||
|
# SIMPLE is a wrapper for QuickLogger that does not use advanced functionality
|
||||||
|
function Logger {
|
||||||
|
local value="${1}" # Sentence to log (in double quotes)
|
||||||
|
local level="${2}" # Log level
|
||||||
|
local retval="${3:-undef}" # optional return value of command
|
||||||
|
|
||||||
|
if [ "$_LOGGER_PREFIX" == "time" ]; then
|
||||||
|
prefix="TIME: $SECONDS - "
|
||||||
|
elif [ "$_LOGGER_PREFIX" == "date" ]; then
|
||||||
|
prefix="$(date '+%Y-%m-%d %H:%M:%S') - "
|
||||||
|
else
|
||||||
|
prefix=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
## Obfuscate _REMOTE_TOKEN in logs (for ssh_filter usage only in osync and obackup)
|
||||||
|
value="${value/env _REMOTE_TOKEN=$_REMOTE_TOKEN/__(o_O)__}"
|
||||||
|
value="${value/env _REMOTE_TOKEN=\$_REMOTE_TOKEN/__(o_O)__}"
|
||||||
|
|
||||||
|
if [ "$level" == "CRITICAL" ]; then
|
||||||
|
_Logger "$prefix($level):$value" "$prefix\e[1;33;41m$value\e[0m" true
|
||||||
|
ERROR_ALERT=true
|
||||||
|
# ERROR_ALERT / WARN_ALERT is not set in main when Logger is called from a subprocess. Need to keep this flag.
|
||||||
|
echo -e "[$retval] in [$(joinString , ${FUNCNAME[@]})] SP=$SCRIPT_PID P=$$\n$prefix($level):$value" >> "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.error.$SCRIPT_PID.$TSTAMP"
|
||||||
|
return
|
||||||
|
elif [ "$level" == "ERROR" ]; then
|
||||||
|
_Logger "$prefix($level):$value" "$prefix\e[91m$value\e[0m" true
|
||||||
|
ERROR_ALERT=true
|
||||||
|
echo -e "[$retval] in [$(joinString , ${FUNCNAME[@]})] SP=$SCRIPT_PID P=$$\n$prefix($level):$value" >> "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.error.$SCRIPT_PID.$TSTAMP"
|
||||||
|
return
|
||||||
|
elif [ "$level" == "WARN" ]; then
|
||||||
|
_Logger "$prefix($level):$value" "$prefix\e[33m$value\e[0m" true
|
||||||
|
WARN_ALERT=true
|
||||||
|
echo -e "[$retval] in [$(joinString , ${FUNCNAME[@]})] SP=$SCRIPT_PID P=$$\n$prefix($level):$value" >> "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.warn.$SCRIPT_PID.$TSTAMP"
|
||||||
|
return
|
||||||
|
elif [ "$level" == "NOTICE" ]; then
|
||||||
|
if [ "$_LOGGER_ERR_ONLY" != true ]; then
|
||||||
|
_Logger "$prefix$value" "$prefix$value"
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
elif [ "$level" == "VERBOSE" ]; then
|
||||||
|
if [ $_LOGGER_VERBOSE == true ]; then
|
||||||
|
_Logger "$prefix($level):$value" "$prefix$value"
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
elif [ "$level" == "ALWAYS" ]; then
|
||||||
|
_Logger "$prefix$value" "$prefix$value"
|
||||||
|
return
|
||||||
|
elif [ "$level" == "DEBUG" ]; then
|
||||||
|
if [ "$_DEBUG" == "yes" ]; then
|
||||||
|
_Logger "$prefix$value" "$prefix$value"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
elif [ "$level" == "SIMPLE" ]; then
|
||||||
|
if [ "$_LOGGER_SILENT" == true ]; then
|
||||||
|
_Logger "$preix$value"
|
||||||
|
else
|
||||||
|
_Logger "$preix$value" "$prefix$value"
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
else
|
||||||
|
_Logger "\e[41mLogger function called without proper loglevel [$level].\e[0m" "\e[41mLogger function called without proper loglevel [$level].\e[0m" true
|
||||||
|
_Logger "Value was: $prefix$value" "Value was: $prefix$value" true
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
36
osync.sh
36
osync.sh
|
@ -2,17 +2,19 @@
|
||||||
|
|
||||||
#TODO treeList, deleteList, _getFileCtimeMtime, conflictList should be called without having statedir informed. Just give the full path ?
|
#TODO treeList, deleteList, _getFileCtimeMtime, conflictList should be called without having statedir informed. Just give the full path ?
|
||||||
#Check dryruns with nosuffix mode for timestampList
|
#Check dryruns with nosuffix mode for timestampList
|
||||||
|
#WIP: currently TRAVIS_RUN debug lines in n_osync and run_tests for conflictLog
|
||||||
|
|
||||||
|
|
||||||
PROGRAM="osync" # Rsync based two way sync engine with fault tolerance
|
PROGRAM="osync" # Rsync based two way sync engine with fault tolerance
|
||||||
AUTHOR="(C) 2013-2018 by Orsiris de Jong"
|
AUTHOR="(C) 2013-2018 by Orsiris de Jong"
|
||||||
CONTACT="http://www.netpower.fr/osync - ozy@netpower.fr"
|
CONTACT="http://www.netpower.fr/osync - ozy@netpower.fr"
|
||||||
PROGRAM_VERSION=1.3.0-beta1
|
PROGRAM_VERSION=1.3.0-beta1
|
||||||
PROGRAM_BUILD=2018100105
|
PROGRAM_BUILD=2018100106
|
||||||
IS_STABLE=no
|
IS_STABLE=no
|
||||||
|
|
||||||
|
|
||||||
_OFUNCTIONS_VERSION=2.3.0-RC1
|
_OFUNCTIONS_VERSION=2.3.0-RC1
|
||||||
_OFUNCTIONS_BUILD=2018100103
|
_OFUNCTIONS_BUILD=2018100105
|
||||||
_OFUNCTIONS_BOOTSTRAP=true
|
_OFUNCTIONS_BOOTSTRAP=true
|
||||||
|
|
||||||
## To use in a program, define the following variables:
|
## To use in a program, define the following variables:
|
||||||
|
@ -98,7 +100,6 @@ else
|
||||||
RUN_DIR=.
|
RUN_DIR=.
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#### PoorMansRandomGenerator SUBSET ####
|
|
||||||
# Get a random number on Windows BusyBox alike, also works on most Unixes
|
# Get a random number on Windows BusyBox alike, also works on most Unixes
|
||||||
function PoorMansRandomGenerator {
|
function PoorMansRandomGenerator {
|
||||||
local digits="${1}" # The number of digits to generate
|
local digits="${1}" # The number of digits to generate
|
||||||
|
@ -113,7 +114,6 @@ function PoorMansRandomGenerator {
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
#### PoorMansRandomGenerator SUBSET END ####
|
|
||||||
|
|
||||||
# Initial TSTMAP value before function declaration
|
# Initial TSTMAP value before function declaration
|
||||||
TSTAMP=$(date '+%Y%m%dT%H%M%S').$(PoorMansRandomGenerator 4)
|
TSTAMP=$(date '+%Y%m%dT%H%M%S').$(PoorMansRandomGenerator 4)
|
||||||
|
@ -1729,9 +1729,9 @@ function RsyncPatternsAdd {
|
||||||
rest="${rest#*$PATH_SEPARATOR_CHAR}"
|
rest="${rest#*$PATH_SEPARATOR_CHAR}"
|
||||||
fi
|
fi
|
||||||
if [ "$RSYNC_PATTERNS" == "" ]; then
|
if [ "$RSYNC_PATTERNS" == "" ]; then
|
||||||
RSYNC_PATTERNS="--"$patternType"=\"$str\""
|
RSYNC_PATTERNS="--$patternType=\"$str\""
|
||||||
else
|
else
|
||||||
RSYNC_PATTERNS="$RSYNC_PATTERNS --"$patternType"=\"$str\""
|
RSYNC_PATTERNS="$RSYNC_PATTERNS --$patternType=\"$str\""
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
set +f
|
set +f
|
||||||
|
@ -1747,7 +1747,7 @@ function RsyncPatternsFromAdd {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -e "$patternFrom" ]; then
|
if [ -e "$patternFrom" ]; then
|
||||||
RSYNC_PATTERNS="$RSYNC_PATTERNS --"$patternType"-from=\"$patternFrom\""
|
RSYNC_PATTERNS="$RSYNC_PATTERNS --$patternType-from=\"$patternFrom\""
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1834,14 +1834,10 @@ function PostInit {
|
||||||
# Define remote commands
|
# Define remote commands
|
||||||
if [ -f "$SSH_RSA_PRIVATE_KEY" ]; then
|
if [ -f "$SSH_RSA_PRIVATE_KEY" ]; then
|
||||||
SSH_CMD="$(type -p ssh) $SSH_COMP -q -i $SSH_RSA_PRIVATE_KEY $SSH_OPTS $REMOTE_USER@$REMOTE_HOST -p $REMOTE_PORT"
|
SSH_CMD="$(type -p ssh) $SSH_COMP -q -i $SSH_RSA_PRIVATE_KEY $SSH_OPTS $REMOTE_USER@$REMOTE_HOST -p $REMOTE_PORT"
|
||||||
#WIP
|
|
||||||
#SSH_REVERSE_CMD="$(type -p ssh) $SSH_COMP -q -i $INITIATOR_SSH_RSA_PRIVATE_KEY $SSH_OPTS $INITIATOR_REMOTE_USER@$INITIATOR_REMOTE_HOST -p $INITIATOR_REMOTE_PORT"
|
|
||||||
SCP_CMD="$(type -p scp) $SSH_COMP -q -i $SSH_RSA_PRIVATE_KEY -P $REMOTE_PORT"
|
SCP_CMD="$(type -p scp) $SSH_COMP -q -i $SSH_RSA_PRIVATE_KEY -P $REMOTE_PORT"
|
||||||
RSYNC_SSH_CMD="$(type -p ssh) $SSH_COMP -q -i $SSH_RSA_PRIVATE_KEY $SSH_OPTS -p $REMOTE_PORT"
|
RSYNC_SSH_CMD="$(type -p ssh) $SSH_COMP -q -i $SSH_RSA_PRIVATE_KEY $SSH_OPTS -p $REMOTE_PORT"
|
||||||
elif [ -f "$SSH_PASSWORD_FILE" ]; then
|
elif [ -f "$SSH_PASSWORD_FILE" ]; then
|
||||||
SSH_CMD="$(type -p sshpass) -f $SSH_PASSWORD_FILE $(type -p ssh) $SSH_COMP -q $SSH_OPTS $REMOTE_USER@$REMOTE_HOST -p $REMOTE_PORT"
|
SSH_CMD="$(type -p sshpass) -f $SSH_PASSWORD_FILE $(type -p ssh) $SSH_COMP -q $SSH_OPTS $REMOTE_USER@$REMOTE_HOST -p $REMOTE_PORT"
|
||||||
#WIP
|
|
||||||
#SSH_REVERSE_CMD="$(type -p sshpass) -f $INITIATOR_SSH_PASSWORD_FILE $(type -p ssh) $SSH_COMP -q $SSH_OPTS $INITIATOR_REMOTE_USER@$INITIATOR_REMOTE_HOST -p $INITIATOR_REMOTE_PORT"
|
|
||||||
SCP_CMD="$(type -p sshpass) -f $SSH_PASSWORD_FILE $(type -p scp) $SSH_COMP -q -P $REMOTE_PORT"
|
SCP_CMD="$(type -p sshpass) -f $SSH_PASSWORD_FILE $(type -p scp) $SSH_COMP -q -P $REMOTE_PORT"
|
||||||
RSYNC_SSH_CMD="$(type -p sshpass) -f $SSH_PASSWORD_FILE $(type -p ssh) $SSH_COMP -q $SSH_OPTS -p $REMOTE_PORT"
|
RSYNC_SSH_CMD="$(type -p sshpass) -f $SSH_PASSWORD_FILE $(type -p ssh) $SSH_COMP -q $SSH_OPTS -p $REMOTE_PORT"
|
||||||
else
|
else
|
||||||
|
@ -2070,7 +2066,7 @@ function VerComp () {
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $1 == $2 ]]
|
if [[ "$1" == "$2" ]]
|
||||||
then
|
then
|
||||||
echo 0
|
echo 0
|
||||||
return
|
return
|
||||||
|
@ -3393,6 +3389,15 @@ function conflictList {
|
||||||
|
|
||||||
join -j 1 -t ';' -o 1.1,1.2,1.3,2.2,2.3 "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.${INITIATOR[$__type]}.$SCRIPT_PID.$TSTAMP" "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.${TARGET[$__type]}.$SCRIPT_PID.$TSTAMP" > "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.compare.$SCRIPT_PID.$TSTAMP"
|
join -j 1 -t ';' -o 1.1,1.2,1.3,2.2,2.3 "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.${INITIATOR[$__type]}.$SCRIPT_PID.$TSTAMP" "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.${TARGET[$__type]}.$SCRIPT_PID.$TSTAMP" > "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.compare.$SCRIPT_PID.$TSTAMP"
|
||||||
retval=$?
|
retval=$?
|
||||||
|
|
||||||
|
#WIP
|
||||||
|
if [ $TRAVIS_RUN == true ]; then
|
||||||
|
echo "conflictList debug retval=$retval"
|
||||||
|
cat "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.${INITIATOR[$__type]}.$SCRIPT_PID.$TSTAMP"
|
||||||
|
cat "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.${TARGET[$__type]}.$SCRIPT_PID.$TSTAMP"
|
||||||
|
cat "$RUN_DIR/$PROGRAM.${FUNCNAME[0]}.compare.$SCRIPT_PID.$TSTAMP"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ $retval -ne 0 ]; then
|
if [ $retval -ne 0 ]; then
|
||||||
Logger "Cannot create conflict list file." "ERROR"
|
Logger "Cannot create conflict list file." "ERROR"
|
||||||
return $retval
|
return $retval
|
||||||
|
@ -4947,6 +4952,12 @@ function LogConflicts {
|
||||||
local subject
|
local subject
|
||||||
local body
|
local body
|
||||||
|
|
||||||
|
#WIP
|
||||||
|
if [ $TRAVIS_RUN == true ]; then
|
||||||
|
cat "$RUN_DIR/$PROGRAM.conflictList.compare.$SCRIPT_PID.$TSTAMP"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# We keep this in a separate if check because of the subshell used for Logger with _LOGGER_PREFIX
|
# We keep this in a separate if check because of the subshell used for Logger with _LOGGER_PREFIX
|
||||||
if [ -f "$RUN_DIR/$PROGRAM.conflictList.compare.$SCRIPT_PID.$TSTAMP" ]; then
|
if [ -f "$RUN_DIR/$PROGRAM.conflictList.compare.$SCRIPT_PID.$TSTAMP" ]; then
|
||||||
Logger "File conflicts: INITIATOR << >> TARGET" "ALWAYS"
|
Logger "File conflicts: INITIATOR << >> TARGET" "ALWAYS"
|
||||||
|
@ -4954,6 +4965,7 @@ function LogConflicts {
|
||||||
|
|
||||||
(
|
(
|
||||||
_LOGGER_PREFIX=""
|
_LOGGER_PREFIX=""
|
||||||
|
|
||||||
if [ -f "$RUN_DIR/$PROGRAM.conflictList.compare.$SCRIPT_PID.$TSTAMP" ]; then
|
if [ -f "$RUN_DIR/$PROGRAM.conflictList.compare.$SCRIPT_PID.$TSTAMP" ]; then
|
||||||
echo "" > "${INITIATOR[$__replicaDir]}${INITIATOR[$__stateDir]}/${INITIATOR[$__conflictListFile]}"
|
echo "" > "${INITIATOR[$__replicaDir]}${INITIATOR[$__stateDir]}/${INITIATOR[$__conflictListFile]}"
|
||||||
while read -r line; do
|
while read -r line; do
|
||||||
|
|
Loading…
Reference in New Issue