Merge branch 'master' of https://github.com/joudinet/ejabberd into joudinet-master

This commit is contained in:
Christophe Romain 2017-05-30 12:37:27 +02:00
commit 0042f18c1f
1 changed files with 94 additions and 97 deletions

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/bin/sh
# define default configuration # define default configuration
POLL=true POLL=true
@ -27,35 +27,59 @@ if [ "$INSTALLUSER" != "" ] ; then
mkdir -p "$INSTALLUSER_HOME" mkdir -p "$INSTALLUSER_HOME"
chown "$INSTALLUSER" "$INSTALLUSER_HOME" chown "$INSTALLUSER" "$INSTALLUSER_HOME"
fi fi
EXEC_CMD="su $INSTALLUSER -c" EXEC_CMD="as_install_user"
fi fi
done done
if [ `id -g` -eq `id -g $INSTALLUSER` ] ; then if [ `id -g` -eq `id -g $INSTALLUSER` ] ; then
EXEC_CMD="bash -c" EXEC_CMD="as_current_user"
fi fi
if [ "$EXEC_CMD" = "false" ] ; then if [ "$EXEC_CMD" = "false" ] ; then
echo "This command can only be run by root or the user $INSTALLUSER" >&2 echo "This command can only be run by root or the user $INSTALLUSER" >&2
exit 4 exit 4
fi fi
else else
EXEC_CMD="bash -c" EXEC_CMD="as_current_user"
fi fi
# run command either directly or via su $INSTALLUSER
exec_cmd()
{
if [ "EXEC_CMD" = as_install_user ]; then
su -c '"$0" $@"' "INSTALLUSER" -- "$@"
else
"$@"
fi
}
# parse command line parameters # parse command line parameters
declare -a ARGS=() next=init
while [ $# -ne 0 ] ; do for arg; do
PARAM="$1" # Empty argument list as it is already saved in the for buffer
shift if [ "$next" = init ]; then
case $PARAM in next=
--) break ;; set --
--no-timeout) EJABBERD_NO_TIMEOUT="--no-timeout" ;; fi
--node) ERLANG_NODE_ARG=$1 ; shift ;; case $next in
--config-dir) ETC_DIR="$1" ; shift ;; node) ERLANG_NODE_ARG=$arg; next=;;
--config) EJABBERD_CONFIG_PATH="$1" ; shift ;; config-dir) ETC_DIR=$arg; next=;;
--ctl-config) EJABBERDCTL_CONFIG_PATH="$1" ; shift ;; config) EJABBERD_CONFIG_PATH=$arg; next=;;
--logs) LOGS_DIR="$1" ; shift ;; ctl-config) EJABBERDCTL_CONFIG_PATH=$arg; next=;;
--spool) SPOOL_DIR="$1" ; shift ;; logs) LOGS_DIR=$arg; next=;;
*) ARGS=("${ARGS[@]}" "$PARAM") ;; spool) SPOOL_DIR=$arg; next=;;
"")
case $arg in
--) next=raw;;
--no-timeout) EJABBERD_NO_TIMEOUT="--no-timeout" ;;
--node) next=node;;
--config-dir) next=config-dir;;
--config) next=config;;
--ctl-config) next=ctl-config;;
--logs) next=logs;;
--spool) next=spool;;
*) set -- "$@" "$arg";; # unknown option, keep it.
esac;;
raw) # we are after --, keep options as it is.
set -- "$@" "$arg";;
esac esac
done done
@ -93,7 +117,7 @@ ERL_CRASH_DUMP=$LOGS_DIR/erl_crash_$DATETIME.dump
ERL_INETRC=$ETC_DIR/inetrc ERL_INETRC=$ETC_DIR/inetrc
# define mnesia options # define mnesia options
MNESIA_OPTS="-mnesia dir \"\\\"$SPOOL_DIR\\\"\" $MNESIA_OPTIONS" MNESIA_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS"
# define erl parameters # define erl parameters
ERLANG_OPTS="+K $POLL -smp $SMP +P $ERL_PROCESSES $ERL_OPTIONS" ERLANG_OPTS="+K $POLL -smp $SMP +P $ERL_PROCESSES $ERL_OPTIONS"
KERNEL_OPTS="" KERNEL_OPTS=""
@ -150,40 +174,20 @@ export CONTRIB_MODULES_PATH
export CONTRIB_MODULES_CONF_DIR export CONTRIB_MODULES_CONF_DIR
export ERL_LIBS export ERL_LIBS
shell_escape_str() # TODO: Too much copy-and-paste below, factorize!
{
if test $# -eq 0; then
printf '"" '
else
shell_escape "$@"
fi
}
shell_escape()
{
local RES=()
for i in "$@"; do
if test -z "$i"; then
printf '"" '
else
printf '%q ' "$i"
fi
done
}
# start server # start server
start() start()
{ {
check_start check_start
CMD="`shell_escape \"$ERL\" \"$NAME\" \"$ERLANG_NODE\"` \ exec_cmd $ERL \
-noinput -detached \ $NAME $ERLANG_NODE \
$MNESIA_OPTS \ -noinput -detached \
$KERNEL_OPTS \ $MNESIA_OPTS \
$EJABBERD_OPTS \ $KERNEL_OPTS \
-s ejabberd \ $EJABBERD_OPTS \
$ERLANG_OPTS \ -s ejabberd \
`shell_escape \"${ARGS[@]}\" \"$@\"`" $ERLANG_OPTS \
$EXEC_CMD "$CMD" "$@"
} }
# attach to server # attach to server
@ -191,13 +195,12 @@ debug()
{ {
debugwarning debugwarning
NID=$(uid debug) NID=$(uid debug)
CMD="`shell_escape \"$ERL\" \"$NAME\" \"$NID\"` \ exec_cmd $ERL $NAME $NID \
-remsh $ERLANG_NODE \ -remsh $ERLANG_NODE \
-hidden \ -hidden \
$KERNEL_OPTS \ $KERNEL_OPTS \
$ERLANG_OPTS \ $ERLANG_OPTS \
`shell_escape \"${ARGS[@]}\" \"$@\"`" "$@"
$EXEC_CMD "$CMD"
} }
# attach to server using Elixir # attach to server using Elixir
@ -206,27 +209,24 @@ iexdebug()
debugwarning debugwarning
# Elixir shell is hidden as default # Elixir shell is hidden as default
NID=$(uid debug) NID=$(uid debug)
CMD="`shell_escape \"$IEX\" \"$IEXNAME\" \"$NID\"` \ exec_cmd $IEX $IEXNAME $NID \
-remsh $ERLANG_NODE \ -remsh "$ERLANG_NODE" \
--erl `shell_escape \"$KERNEL_OPTS\"` \ --erl "$KERNEL_OPTS" \
--erl `shell_escape \"$ERLANG_OPTS\"` \ --erl "$ERLANG_OPTS" \
--erl `shell_escape \"${ARGS[@]}\"` \ --erl "$@"
--erl `shell_escape_str \"$@\"`"
$EXEC_CMD "ERL_PATH=\"$ERL\" $CMD"
} }
# start interactive server # start interactive server
live() live()
{ {
livewarning livewarning
CMD="`shell_escape \"$ERL\" \"$NAME\" \"${ERLANG_NODE}\"` \ exec_cmd $ERL $NAME $ERLANG_NODE \
$MNESIA_OPTS \ $MNESIA_OPTS \
$KERNEL_OPTS \ $KERNEL_OPTS \
$EJABBERD_OPTS \ $EJABBERD_OPTS \
-s ejabberd \ -s ejabberd \
$ERLANG_OPTS \ $ERLANG_OPTS \
`shell_escape \"${ARGS[@]}\" \"$@\"`" "$@"
$EXEC_CMD "$CMD"
} }
# start interactive server with Elixir # start interactive server with Elixir
@ -234,30 +234,27 @@ iexlive()
{ {
livewarning livewarning
echo $@ echo $@
CMD="`shell_escape \"$IEX\" \"$IEXNAME\" \"${ERLANG_NODE}\"` \ exec_cmd $IEX $IEXNAME $ERLANG_NODE \
--erl \"-mnesia dir \\\"$SPOOL_DIR\\\"\" \ --erl "-mnesia dir \"$SPOOL_DIR\"" \
--erl \"`shell_escape \"$KERNEL_OPTS\"`\" \ --erl "$KERNEL_OPTS" \
--erl \"`shell_escape \"$EJABBERD_OPTS\"`\" \ --erl "$EJABBERD_OPTS" \
--app ejabberd \ --app ejabberd \
--erl `shell_escape \"$ERLANG_OPTS\"` \ --erl "$ERLANG_OPTS" \
--erl `shell_escape \"${ARGS[@]}\"` \ --erl "$@"
--erl `shell_escape_str \"$@\"`"
$EXEC_CMD "ERL_PATH=\"$ERL\" $CMD"
} }
# start server in the foreground # start server in the foreground
foreground() foreground()
{ {
check_start check_start
CMD="`shell_escape \"$ERL\" \"$NAME\" \"$ERLANG_NODE\"` \ exec_cmd $ERL $NAME $ERLANG_NODE \
-noinput \ -noinput \
$MNESIA_OPTS \ $MNESIA_OPTS \
$KERNEL_OPTS \ $KERNEL_OPTS \
$EJABBERD_OPTS \ $EJABBERD_OPTS \
-s ejabberd \ -s ejabberd \
$ERLANG_OPTS \ $ERLANG_OPTS \
`shell_escape \"${ARGS[@]}\" \"$@\"`" "$@"
$EXEC_CMD "$CMD"
} }
debugwarning() debugwarning()
@ -311,9 +308,9 @@ livewarning()
etop() etop()
{ {
NID=$(uid top) NID=$(uid top)
$EXEC_CMD "$ERL \ exec_cmd $ERL \
$NAME $NID \ $NAME $NID \
-hidden -s etop -s erlang halt -output text -node $ERLANG_NODE" -hidden -s etop -s erlang halt -output text -node $ERLANG_NODE
} }
ping() ping()
@ -327,11 +324,11 @@ ping()
PING_NODE=$(hostname) PING_NODE=$(hostname)
fi fi
NID=$(uid ping ${PING_NODE}) NID=$(uid ping ${PING_NODE})
$EXEC_CMD "$ERL \ exec_cmd $ERL \
$PING_NAME $NID \ $PING_NAME $NID \
-hidden $KERNEL_OPTS $ERLANG_OPTS \ -hidden $KERNEL_OPTS $ERLANG_OPTS \
-eval 'io:format(\"~p~n\",[net_adm:ping('\"'\"'$PEER'\"'\"')])' \ -eval 'io:format("~p~n",[net_adm:ping('"$PEER"')])' \
-s erlang halt -output text -noinput" -s erlang halt -output text -noinput
} }
help() help()
@ -359,11 +356,10 @@ help()
ctl() ctl()
{ {
NID=$(uid ctl) NID=$(uid ctl)
CMD="`shell_escape \"$ERL\" \"$NAME\" \"$NID\"` \ exec_cmd $ERL $NAME $NID \
-noinput -hidden $KERNEL_OPTS -s ejabberd_ctl \ -noinput -hidden $KERNEL_OPTS -s ejabberd_ctl \
-extra `shell_escape \"$ERLANG_NODE\"` $EJABBERD_NO_TIMEOUT \ -extra $ERLANG_NODE $EJABBERD_NO_TIMEOUT \
`shell_escape \"$@\"`" "$@"
$EXEC_CMD "$CMD"
result=$? result=$?
case $result in case $result in
2) help;; 2) help;;
@ -376,7 +372,8 @@ ctl()
uid() uid()
{ {
uuid=$(uuidgen 2>/dev/null) uuid=$(uuidgen 2>/dev/null)
[ -z "$uuid" -a -f /proc/sys/kernel/random/uuid ] && uuid=$(</proc/sys/kernel/random/uuid) [ -z "$uuid" -a -f /proc/sys/kernel/random/uuid ] && \
uuid=$(cat /proc/sys/kernel/random/uuid)
[ -z "$uuid" ] && uuid=$(printf "%X" $RANDOM$(date +%M%S)$$) [ -z "$uuid" ] && uuid=$(printf "%X" $RANDOM$(date +%M%S)$$)
uuid=${uuid%%-*} uuid=${uuid%%-*}
[ $# -eq 0 ] && echo ${uuid}-${ERLANG_NODE} [ $# -eq 0 ] && echo ${uuid}-${ERLANG_NODE}
@ -431,16 +428,16 @@ wait_for_status()
} }
# main handler # main handler
case "${ARGS[0]}" in case $@ in
'start') start;; 'start') start;;
'debug') debug;; 'debug') debug;;
'iexdebug') iexdebug;; 'iexdebug') iexdebug;;
'live') live;; 'live') live;;
'iexlive') iexlive;; 'iexlive') iexlive;;
'foreground') foreground;; 'foreground') foreground;;
'ping'*) ping ${ARGS[1]};; 'ping'*) shift; ping "$@";;
'etop') etop;; 'etop') etop;;
'started') wait_for_status 0 30 2;; # wait 30x2s before timeout 'started') wait_for_status 0 30 2;; # wait 30x2s before timeout
'stopped') wait_for_status 3 30 2 && stop_epmd;; # wait 30x2s before timeout 'stopped') wait_for_status 3 30 2 && stop_epmd;; # wait 30x2s before timeout
*) ctl "${ARGS[@]}";; *) ctl "$@";;
esac esac