summaryrefslogtreecommitdiff
path: root/scripts/wsrep_sst_common.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/wsrep_sst_common.sh')
-rw-r--r--scripts/wsrep_sst_common.sh167
1 files changed, 113 insertions, 54 deletions
diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh
index deebe7cf820..daa5d9d9055 100644
--- a/scripts/wsrep_sst_common.sh
+++ b/scripts/wsrep_sst_common.sh
@@ -22,6 +22,45 @@ set -ue
# Setting the path for some utilities on CentOS
export PATH="$PATH:/usr/sbin:/usr/bin:/sbin:/bin"
+trim_string()
+{
+ if [ -n "$BASH_VERSION" ]; then
+ local pattern="[![:space:]${2:-}]"
+ local x="${1#*$pattern}"
+ local z=${#1}
+ x=${#x}
+ if [ $x -ne $z ]; then
+ local y="${1%$pattern*}"
+ y=${#y}
+ x=$(( z-x-1 ))
+ y=$(( y-x+1 ))
+ printf '%s' "${1:$x:$y}"
+ else
+ printf ''
+ fi
+ else
+ local pattern="[[:space:]${2:-}]"
+ echo "$1" | sed -E "s/^$pattern+|$pattern+\$//g"
+ fi
+}
+
+trim_dir()
+{
+ local t=$(trim_string "$1")
+ if [ "$t" != '/' ]; then
+ if [ "${t%/}" != "$t" ]; then
+ t=$(trim_string "${t%/}")
+ fi
+ else
+ t='.'
+ fi
+ if [ -n "$BASH_VERSION" ]; then
+ printf '%s' "$t"
+ else
+ echo "$t"
+ fi
+}
+
WSREP_SST_OPT_BYPASS=0
WSREP_SST_OPT_BINLOG=""
WSREP_SST_OPT_BINLOG_INDEX=""
@@ -44,9 +83,9 @@ WSREP_SST_OPT_ADDR_PORT=""
WSREP_SST_OPT_HOST=""
WSREP_SST_OPT_HOST_UNESCAPED=""
WSREP_SST_OPT_HOST_ESCAPED=""
-INNODB_DATA_HOME_DIR="${INNODB_DATA_HOME_DIR:-}"
-INNODB_LOG_GROUP_HOME="${INNODB_LOG_GROUP_HOME:-}"
-INNODB_UNDO_DIR="${INNODB_UNDO_DIR:-}"
+INNODB_DATA_HOME_DIR=$(trim_dir "${INNODB_DATA_HOME_DIR:-}")
+INNODB_LOG_GROUP_HOME=$(trim_dir "${INNODB_LOG_GROUP_HOME:-}")
+INNODB_UNDO_DIR=$(trim_dir "${INNODB_UNDO_DIR:-}")
INNODB_FORCE_RECOVERY=""
INNOEXTRA=""
@@ -138,22 +177,22 @@ case "$1" in
;;
'--datadir')
# Let's remove the trailing slash:
- readonly WSREP_SST_OPT_DATA="${2%/}"
+ readonly WSREP_SST_OPT_DATA=$(trim_dir "$2")
shift
;;
'--innodb-data-home-dir')
# Let's remove the trailing slash:
- readonly INNODB_DATA_HOME_DIR="${2%/}"
+ readonly INNODB_DATA_HOME_DIR=$(trim_dir "$2")
shift
;;
'--innodb-log-group-home-dir')
# Let's remove the trailing slash:
- readonly INNODB_LOG_GROUP_HOME="${2%/}"
+ readonly INNODB_LOG_GROUP_HOME=$(trim_dir "$2")
shift
;;
'--innodb-undo-directory')
# Let's remove the trailing slash:
- readonly INNODB_UNDO_DIR="${2%/}"
+ readonly INNODB_UNDO_DIR=$(trim_dir "$2")
shift
;;
'--defaults-file')
@@ -247,6 +286,7 @@ case "$1" in
'--mysqld-args')
original_cmd=""
shift
+ cmd_tail=0
while [ $# -gt 0 ]; do
lname="${1#--}"
# "--" is interpreted as the end of the list of options:
@@ -261,7 +301,7 @@ case "$1" in
shift
done
fi
- break;
+ break
fi
# Make sure the argument does not start with "--", otherwise it
# is a long option, which is processed after this "if":
@@ -301,15 +341,25 @@ case "$1" in
if [ "${2#-}" = "$2" ]; then
shift
value="$1"
+ elif [ "$2" = '--' ]; then
+ shift
+ if [ $# -gt 1 ]; then
+ cmd_tail=1
+ shift
+ value="$1"
+ fi
fi
fi
if [ $option = 'h' ]; then
if [ -z "$WSREP_SST_OPT_DATA" ]; then
- MYSQLD_OPT_DATADIR="${value%/}"
+ MYSQLD_OPT_DATADIR=$(trim_dir "$value")
fi
elif [ $option != 'u' -a \
$option != 'P' ]
then
+ if [ $cmd_tail -ne 0 ]; then
+ option="$option --"
+ fi
if [ -z "$value" ]; then
slist="$slist$option"
elif [ -z "$slist" ]; then
@@ -317,9 +367,16 @@ case "$1" in
else
slist="$slist -$option '$value'"
fi
+ break
+ fi
+ if [ $cmd_tail -ne 0 ]; then
+ if [ -n "$slist" ]; then
+ slist="$slist --"
+ else
+ slist='-'
+ fi
fi
break
-
else
slist="$slist$option"
fi
@@ -329,7 +386,7 @@ case "$1" in
original_cmd="$original_cmd -$slist"
fi
elif [ -z "$options" ]; then
- # We found an equal sign without any characters after it:
+ # We found an minus sign without any characters after it:
original_cmd="$original_cmd -"
else
# We found a value that does not start with a minus -
@@ -338,7 +395,15 @@ case "$1" in
original_cmd="$original_cmd '$1'"
fi
shift
- continue;
+ if [ $cmd_tail -ne 0 ]; then
+ # All other arguments must be copied unchanged:
+ while [ $# -gt 0 ]; do
+ original_cmd="$original_cmd '$1'"
+ shift
+ done
+ break
+ fi
+ continue
fi
# Now we are sure that we are working with an option
# that has a "long" name, so remove all characters after
@@ -370,19 +435,19 @@ case "$1" in
case "$option" in
'--innodb-data-home-dir')
if [ -z "$INNODB_DATA_HOME_DIR" ]; then
- MYSQLD_OPT_INNODB_DATA_HOME_DIR="${value%/}"
+ MYSQLD_OPT_INNODB_DATA_HOME_DIR=$(trim_dir "$value")
fi
skip_mysqld_arg=1
;;
'--innodb-log-group-home-dir')
if [ -z "$INNODB_LOG_GROUP_HOME" ]; then
- MYSQLD_OPT_INNODB_LOG_GROUP_HOME="${value%/}"
+ MYSQLD_OPT_INNODB_LOG_GROUP_HOME=$(trim_dir "$value")
fi
skip_mysqld_arg=1
;;
'--innodb-undo-directory')
if [ -z "$INNODB_UNDO_DIR" ]; then
- MYSQLD_OPT_INNODB_UNDO_DIR="${value%/}"
+ MYSQLD_OPT_INNODB_UNDO_DIR=$(trim_dir "$value")
fi
skip_mysqld_arg=1
;;
@@ -412,7 +477,7 @@ case "$1" in
;;
'--datadir')
if [ -z "$WSREP_SST_OPT_DATA" ]; then
- MYSQLD_OPT_DATADIR="${value%/}"
+ MYSQLD_OPT_DATADIR=$(trim_dir "$value")
fi
skip_mysqld_arg=1
;;
@@ -530,12 +595,10 @@ get_binlog()
WSREP_SST_OPT_LOG_BASENAME=$(parse_cnf '--mysqld' 'log-basename')
fi
if [ -z "$WSREP_SST_OPT_BINLOG" ]; then
- # If the --log-bin option is specified without a parameter,
+ # If the log-bin option is specified without a parameter,
# then we need to build the name of the index file according
# to the rules described in the server documentation:
- if [ -n "${MYSQLD_OPT_LOG_BIN+x}" -o \
- $(in_config '--mysqld' 'log-bin') -eq 1 ]
- then
+ if [ $(in_config '--mysqld' 'log-bin') -eq 1 ]; then
if [ -n "$WSREP_SST_OPT_LOG_BASENAME" ]; then
# If the WSREP_SST_OPT_BINLOG variable is not set, but
# --log-basename is present among the arguments of mysqld,
@@ -543,8 +606,7 @@ get_binlog()
# the "-bin" suffix:
readonly WSREP_SST_OPT_BINLOG="$WSREP_SST_OPT_LOG_BASENAME-bin"
else
- # If the --log-bin option is present without a value, then
- # we take the default name:
+ # Take the default name:
readonly WSREP_SST_OPT_BINLOG='mysql-bin'
fi
fi
@@ -554,10 +616,10 @@ get_binlog()
# it according to the specifications for the server:
if [ -z "$WSREP_SST_OPT_BINLOG_INDEX" ]; then
if [ -n "$WSREP_SST_OPT_LOG_BASENAME" ]; then
- # If the WSREP_SST_OPT_BINLOG variable is not set, but
+ # If the WSREP_SST_OPT_BINLOG_INDEX variable is not set, but
# --log-basename is present among the arguments of mysqld,
- # then set WSREP_SST_OPT_BINLOG equal to the base name with
- # the "-bin" suffix:
+ # then set WSREP_SST_OPT_BINLOG_INDEX equal to the base name
+ # with the "-bin" suffix:
readonly WSREP_SST_OPT_BINLOG_INDEX="$WSREP_SST_OPT_LOG_BASENAME-bin.index"
else
# the default name (note that base of this name
@@ -754,7 +816,11 @@ parse_cnf()
if [ -z "$reval" ]; then
[ -n "${3:-}" ] && reval="$3"
fi
- echo "$reval"
+ if [ -n "$BASH_VERSION" ]; then
+ printf '%s' "$reval"
+ else
+ echo "$reval"
+ fi
}
#
@@ -804,7 +870,11 @@ in_config()
break
fi
done
- echo $found
+ if [ -n "$BASH_VERSION" ]; then
+ printf '%s' $found
+ else
+ echo $found
+ fi
}
wsrep_auth_not_set()
@@ -937,11 +1007,22 @@ wsrep_gen_secret()
{
get_openssl
if [ -n "$OPENSSL_BINARY" ]; then
- echo $("$OPENSSL_BINARY" rand -hex 16)
- else
- printf "%04x%04x%04x%04x%04x%04x%04x%04x" \
+ "$OPENSSL_BINARY" rand -hex 16
+ elif [ -n "$BASH_VERSION" ]; then
+ printf '%04x%04x%04x%04x%04x%04x%04x%04x' \
$RANDOM $RANDOM $RANDOM $RANDOM \
$RANDOM $RANDOM $RANDOM $RANDOM
+ elif [ -n $(commandex 'cksum') -a \
+ -n $(commandex 'printf') ]
+ then
+ printf '%08x%08x%08x%08x' \
+ $(head -8 /dev/urandom | cksum | cut -d ' ' -f1) \
+ $(head -8 /dev/urandom | cksum | cut -d ' ' -f1) \
+ $(head -8 /dev/urandom | cksum | cut -d ' ' -f1) \
+ $(head -8 /dev/urandom | cksum | cut -d ' ' -f1)
+ else
+ wsrep_log_error "Unable to generate 16-byte secret"
+ exit 22
fi
}
@@ -979,14 +1060,14 @@ is_local_ip()
if [ -n "$ip_util" ]; then
# ip address show ouput format is " inet[6] <address>/<mask>":
"$ip_util" address show \
- | grep -E "^[[:space:]]*inet.? [^[:space:]]+/" -o \
+ | grep -E '^[[:space:]]*inet.? [^[:space:]]+/' -o \
| grep -F " $1/" >/dev/null && return 0
else
local ifconfig_util=$(commandex 'ifconfig')
if [ -n "$ifconfig_util" ]; then
# ifconfig output format is " inet[6] <address> ...":
"$ifconfig_util" \
- | grep -E "^[[:space:]]*inet.? [^[:space:]]+ " -o \
+ | grep -E '^[[:space:]]*inet.? [^[:space:]]+ ' -o \
| grep -F " $1 " >/dev/null && return 0
fi
fi
@@ -1220,28 +1301,6 @@ check_for_version()
return 0
}
-trim_string()
-{
- if [ -n "$BASH_VERSION" ]; then
- local pattern="[![:space:]${2:-}]"
- local x="${1#*$pattern}"
- local z=${#1}
- x=${#x}
- if [ $x -ne $z ]; then
- local y="${1%$pattern*}"
- y=${#y}
- x=$(( z-x-1 ))
- y=$(( y-x+1 ))
- printf '%s' "${1:$x:$y}"
- else
- printf ''
- fi
- else
- local pattern="[[:space:]${2:-}]"
- echo "$1" | sed -E "s/^$pattern+|$pattern+\$//g"
- fi
-}
-
#
# Check whether process is still running.
# The first parameter contains the name of the PID file.