2016-11-21 15:25:58 +01:00
|
|
|
#!/bin/sh
|
2007-05-21 05:41:13 +02:00
|
|
|
|
2008-01-01 11:53:05 +01:00
|
|
|
# define default configuration
|
|
|
|
POLL=true
|
|
|
|
SMP=auto
|
|
|
|
ERL_MAX_PORTS=32000
|
|
|
|
ERL_PROCESSES=250000
|
|
|
|
ERL_MAX_ETS_TABLES=1400
|
2013-06-18 15:56:28 +02:00
|
|
|
FIREWALL_WINDOW=""
|
|
|
|
ERLANG_NODE=ejabberd@localhost
|
2013-04-08 11:12:54 +02:00
|
|
|
|
2008-01-01 11:53:05 +01:00
|
|
|
# define default environment variables
|
2013-04-08 11:12:54 +02:00
|
|
|
ERL={{erl}}
|
2015-01-29 18:43:47 +01:00
|
|
|
IEX={{bindir}}/iex
|
2016-05-01 21:29:59 +02:00
|
|
|
EPMD={{epmd}}
|
2013-04-08 11:12:54 +02:00
|
|
|
INSTALLUSER={{installuser}}
|
2007-05-21 05:41:13 +02:00
|
|
|
|
2013-06-18 15:56:28 +02:00
|
|
|
# check the proper system user is used if defined
|
2017-05-31 18:11:45 +02:00
|
|
|
EXEC_CMD="false"
|
|
|
|
if [ -n "$INSTALLUSER" ] ; then
|
|
|
|
if [ $(id -g) -eq $(id -g $INSTALLUSER || echo -1) ] ; then
|
2016-11-21 15:25:58 +01:00
|
|
|
EXEC_CMD="as_current_user"
|
2017-05-31 18:11:45 +02:00
|
|
|
else
|
|
|
|
id -Gn | grep -q wheel && EXEC_CMD="as_install_user"
|
2013-06-18 15:56:28 +02:00
|
|
|
fi
|
|
|
|
else
|
2016-11-21 15:25:58 +01:00
|
|
|
EXEC_CMD="as_current_user"
|
2013-06-18 15:56:28 +02:00
|
|
|
fi
|
2017-05-31 18:11:45 +02:00
|
|
|
if [ "$EXEC_CMD" = "false" ] ; then
|
|
|
|
echo "ERROR: This command can only be run by root or the user $INSTALLUSER" >&2
|
|
|
|
exit 7
|
|
|
|
fi
|
2013-06-18 15:56:28 +02:00
|
|
|
|
2017-05-31 18:11:45 +02:00
|
|
|
# set backward compatibility on command line parameters
|
|
|
|
set -- $(echo "$*" | sed -e \
|
|
|
|
"s/--node/-n/;s/--spool/-s/;s/--logs/-l/;\
|
|
|
|
s/--config/-f/;s/--ctl-config/-c/;s/--config-dir/-d/;\
|
|
|
|
s/--no-timeout/-t/")
|
2008-01-01 11:53:05 +01:00
|
|
|
# parse command line parameters
|
2017-05-31 18:11:45 +02:00
|
|
|
while getopts n:s:l:f:c:d:tx opt; do
|
|
|
|
case $opt in
|
|
|
|
n) ERLANG_NODE_ARG=$OPTARG;;
|
|
|
|
s) SPOOL_DIR=$OPTARG;;
|
|
|
|
l) LOGS_DIR=$OPTARG;;
|
|
|
|
f) EJABBERD_CONFIG_PATH=$OPTARG;;
|
|
|
|
c) EJABBERDCTL_CONFIG_PATH=$OPTARG;;
|
|
|
|
d) ETC_DIR=$OPTARG;;
|
|
|
|
t) NO_TIMEOUT="--no-timeout";;
|
2008-01-01 11:53:05 +01:00
|
|
|
esac
|
|
|
|
done
|
2017-05-31 18:11:45 +02:00
|
|
|
# keep extra command line parameters for ejabberd
|
|
|
|
shift $((OPTIND-1))
|
2007-05-21 05:41:13 +02:00
|
|
|
|
2017-05-31 18:11:45 +02:00
|
|
|
# define ejabberd variables if not already defined from the command line
|
|
|
|
: ${ETC_DIR:={{sysconfdir}}/ejabberd}
|
|
|
|
: ${LOGS_DIR:={{localstatedir}}/log/ejabberd}
|
|
|
|
: ${SPOOL_DIR:={{localstatedir}}/lib/ejabberd}
|
|
|
|
: ${EJABBERD_CONFIG_PATH:="$ETC_DIR"/ejabberd.yml}
|
|
|
|
: ${EJABBERDCTL_CONFIG_PATH:="$ETC_DIR"/ejabberdctl.cfg}
|
|
|
|
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
|
|
|
|
[ "$ERLANG_NODE_ARG" != "" ] && ERLANG_NODE=$ERLANG_NODE_ARG
|
|
|
|
: ${EJABBERD_DOC_PATH:={{docdir}}}
|
|
|
|
: ${EJABBERD_LOG_PATH:="$LOGS_DIR"/ejabberd.log}
|
2008-07-13 21:10:01 +02:00
|
|
|
|
2013-06-18 15:56:28 +02:00
|
|
|
# define erl parameters
|
|
|
|
ERLANG_OPTS="+K $POLL -smp $SMP +P $ERL_PROCESSES $ERL_OPTIONS"
|
|
|
|
if [ "$FIREWALL_WINDOW" != "" ] ; then
|
2017-05-31 18:11:45 +02:00
|
|
|
ERLANG_OPTS="$ERLANG_OPTS -kernel " \
|
|
|
|
"inet_dist_listen_min ${FIREWALL_WINDOW%-*} " \
|
|
|
|
"inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
|
2013-06-18 15:56:28 +02:00
|
|
|
fi
|
|
|
|
if [ "$INET_DIST_INTERFACE" != "" ] ; then
|
2017-05-31 18:11:45 +02:00
|
|
|
INET_DIST_INTERFACE2=$("$ERL" -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt)
|
|
|
|
if [ "$INET_DIST_INTERFACE2" != "" ] ; then
|
|
|
|
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface \"$INET_DIST_INTERFACE2\""
|
2013-06-18 19:35:55 +02:00
|
|
|
fi
|
2013-06-18 15:56:28 +02:00
|
|
|
fi
|
|
|
|
if [ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] ; then
|
|
|
|
NAME="-sname"
|
|
|
|
else
|
|
|
|
NAME="-name"
|
|
|
|
fi
|
2017-05-31 18:11:45 +02:00
|
|
|
ERL_LIBS={{libdir}}
|
|
|
|
ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump
|
|
|
|
ERL_INETRC="$ETC_DIR"/inetrc
|
2007-10-17 04:33:19 +02:00
|
|
|
|
2017-05-31 18:11:45 +02:00
|
|
|
# define ejabberd parameters
|
|
|
|
rate=$(sed '/^[ ]*log_rate_limit/!d;s/.*://;s/ *//' "$EJABBERD_CONFIG_PATH")
|
|
|
|
rotate=$(sed '/^[ ]*log_rotate_size/!d;s/.*://;s/ *//' "$EJABBERD_CONFIG_PATH")
|
|
|
|
count=$(sed '/^[ ]*log_rotate_count/!d;s/.*://;s/ *//' "$EJABBERD_CONFIG_PATH")
|
|
|
|
date=$(sed '/^[ ]*log_rotate_date/!d;s/.*://;s/ *//' "$EJABBERD_CONFIG_PATH")
|
2014-07-02 10:41:12 +02:00
|
|
|
[ -z "$rate" ] || EJABBERD_OPTS="log_rate_limit $rate"
|
2017-05-31 18:11:45 +02:00
|
|
|
[ -z "$rotate" ] || EJABBERD_OPTS="$EJABBERD_OPTS log_rotate_size $rotate"
|
|
|
|
[ -z "$count" ] || EJABBERD_OPTS="$EJABBERD_OPTS log_rotate_count $count"
|
|
|
|
[ -z "$date" ] || EJABBERD_OPTS="$EJABBERD_OPTS log_rotate_date '$date'"
|
|
|
|
[ -z "$EJABBERD_OPTS" ] || EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS"
|
|
|
|
EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd"
|
2010-03-18 12:57:21 +01:00
|
|
|
|
2008-01-01 11:53:05 +01:00
|
|
|
# export global variables
|
|
|
|
export EJABBERD_CONFIG_PATH
|
2008-01-13 23:46:00 +01:00
|
|
|
export EJABBERD_LOG_PATH
|
2009-01-20 20:42:08 +01:00
|
|
|
export EJABBERD_DOC_PATH
|
2009-08-24 23:21:04 +02:00
|
|
|
export EJABBERD_PID_PATH
|
2008-01-13 23:46:00 +01:00
|
|
|
export ERL_CRASH_DUMP
|
2011-05-31 12:26:44 +02:00
|
|
|
export ERL_EPMD_ADDRESS
|
2008-01-13 23:46:00 +01:00
|
|
|
export ERL_INETRC
|
2008-01-01 11:53:05 +01:00
|
|
|
export ERL_MAX_PORTS
|
|
|
|
export ERL_MAX_ETS_TABLES
|
2015-03-24 16:00:56 +01:00
|
|
|
export CONTRIB_MODULES_PATH
|
2015-10-26 22:42:07 +01:00
|
|
|
export CONTRIB_MODULES_CONF_DIR
|
2015-10-15 15:08:45 +02:00
|
|
|
export ERL_LIBS
|
2007-10-17 04:33:19 +02:00
|
|
|
|
2017-05-31 18:11:45 +02:00
|
|
|
# run command either directly or via su $INSTALLUSER
|
|
|
|
exec_cmd()
|
2015-01-29 18:43:47 +01:00
|
|
|
{
|
2017-05-31 18:11:45 +02:00
|
|
|
case $EXEC_CMD in
|
|
|
|
as_install_user) su -c '"$0" $@"' "$INSTALLUSER" -- "$@" ;;
|
|
|
|
as_current_user) "$@" ;;
|
|
|
|
esac
|
2015-01-29 18:43:47 +01:00
|
|
|
}
|
2017-05-31 18:11:45 +02:00
|
|
|
exec_erl()
|
2015-01-29 18:43:47 +01:00
|
|
|
{
|
2017-05-31 18:11:45 +02:00
|
|
|
NODE=$1; shift
|
|
|
|
exec_cmd $ERL $NAME $NODE $ERLANG_OPTS "$@"
|
2015-01-29 18:43:47 +01:00
|
|
|
}
|
2017-05-31 18:11:45 +02:00
|
|
|
exec_iex()
|
2015-10-29 19:39:21 +01:00
|
|
|
{
|
2017-05-31 18:11:45 +02:00
|
|
|
NODE=$1; shift
|
|
|
|
exec_cmd $IEX -$NAME $NODE --erl "$ERLANG_OPTS" "$@"
|
2015-10-29 19:39:21 +01:00
|
|
|
}
|
|
|
|
|
2017-05-31 18:11:45 +02:00
|
|
|
# usage
|
2015-01-29 18:43:47 +01:00
|
|
|
debugwarning()
|
2007-05-21 05:41:13 +02:00
|
|
|
{
|
2009-12-11 20:42:59 +01:00
|
|
|
if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then
|
2014-07-11 12:34:52 +02:00
|
|
|
echo "--------------------------------------------------------------------"
|
|
|
|
echo ""
|
|
|
|
echo "IMPORTANT: we will attempt to attach an INTERACTIVE shell"
|
|
|
|
echo "to an already running ejabberd node."
|
|
|
|
echo "If an ERROR is printed, it means the connection was not successful."
|
|
|
|
echo "You can interact with the ejabberd node if you know how to use it."
|
|
|
|
echo "Please be extremely cautious with your actions,"
|
|
|
|
echo "and exit immediately if you are not completely sure."
|
|
|
|
echo ""
|
|
|
|
echo "To detach this shell from ejabberd, press:"
|
|
|
|
echo " control+c, control+c"
|
|
|
|
echo ""
|
|
|
|
echo "--------------------------------------------------------------------"
|
2014-07-21 15:25:16 +02:00
|
|
|
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
2014-07-11 12:34:52 +02:00
|
|
|
echo " EJABBERD_BYPASS_WARNINGS=true"
|
2015-01-29 18:43:47 +01:00
|
|
|
echo "Press return to continue"
|
2013-06-18 15:56:28 +02:00
|
|
|
read foo
|
2014-07-21 15:25:16 +02:00
|
|
|
echo ""
|
2015-05-22 17:28:40 +02:00
|
|
|
fi
|
2007-10-17 04:33:19 +02:00
|
|
|
}
|
|
|
|
|
2015-01-29 18:43:47 +01:00
|
|
|
livewarning()
|
2007-10-17 04:33:19 +02:00
|
|
|
{
|
2009-12-11 20:42:59 +01:00
|
|
|
if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then
|
2014-07-11 12:34:52 +02:00
|
|
|
echo "--------------------------------------------------------------------"
|
|
|
|
echo ""
|
|
|
|
echo "IMPORTANT: ejabberd is going to start in LIVE (interactive) mode."
|
|
|
|
echo "All log messages will be shown in the command shell."
|
|
|
|
echo "You can interact with the ejabberd node if you know how to use it."
|
|
|
|
echo "Please be extremely cautious with your actions,"
|
|
|
|
echo "and exit immediately if you are not completely sure."
|
|
|
|
echo ""
|
|
|
|
echo "To exit this LIVE mode and stop ejabberd, press:"
|
|
|
|
echo " q(). and press the Enter key"
|
|
|
|
echo ""
|
|
|
|
echo "--------------------------------------------------------------------"
|
2014-07-21 15:25:16 +02:00
|
|
|
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
2014-07-11 12:34:52 +02:00
|
|
|
echo " EJABBERD_BYPASS_WARNINGS=true"
|
2015-01-29 18:43:47 +01:00
|
|
|
echo "Press return to continue"
|
2013-06-18 15:56:28 +02:00
|
|
|
read foo
|
2014-07-21 15:25:16 +02:00
|
|
|
echo ""
|
2009-12-11 20:42:59 +01:00
|
|
|
fi
|
2013-06-18 15:56:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
help()
|
2008-10-12 14:00:20 +02:00
|
|
|
{
|
|
|
|
echo ""
|
|
|
|
echo "Commands to start an ejabberd node:"
|
2015-10-29 19:39:21 +01:00
|
|
|
echo " start Start an ejabberd node in server mode"
|
|
|
|
echo " debug Attach an interactive Erlang shell to a running ejabberd node"
|
|
|
|
echo " iexdebug Attach an interactive Elixir shell to a running ejabberd node"
|
|
|
|
echo " live Start an ejabberd node in live (interactive) mode"
|
|
|
|
echo " iexlive Start an ejabberd node in live (interactive) mode, within an Elixir shell"
|
|
|
|
echo " foreground Start an ejabberd node in server mode (attached)"
|
2008-10-12 14:00:20 +02:00
|
|
|
echo ""
|
|
|
|
echo "Optional parameters when starting an ejabberd node:"
|
2014-07-21 15:25:16 +02:00
|
|
|
echo " --config-dir dir Config ejabberd: $ETC_DIR"
|
2008-10-12 14:00:20 +02:00
|
|
|
echo " --config file Config ejabberd: $EJABBERD_CONFIG_PATH"
|
|
|
|
echo " --ctl-config file Config ejabberdctl: $EJABBERDCTL_CONFIG_PATH"
|
|
|
|
echo " --logs dir Directory for logs: $LOGS_DIR"
|
2014-07-21 15:25:16 +02:00
|
|
|
echo " --spool dir Database spool dir: $SPOOL_DIR"
|
2008-10-12 14:00:20 +02:00
|
|
|
echo " --node nodename ejabberd node name: $ERLANG_NODE"
|
|
|
|
echo ""
|
|
|
|
}
|
|
|
|
|
2017-05-31 18:11:45 +02:00
|
|
|
# generic erlang node ping feature
|
|
|
|
ping()
|
2007-05-21 05:41:13 +02:00
|
|
|
{
|
2017-05-31 18:11:45 +02:00
|
|
|
PEER=${1:-$ERLANG_NODE}
|
|
|
|
if [ "$PEER" = "${PEER%.*}" ] ; then
|
|
|
|
PING_NAME="-sname"
|
|
|
|
PING_NODE=$(hostname -s)
|
|
|
|
else
|
|
|
|
PING_NAME="-name"
|
|
|
|
PING_NODE=$(hostname)
|
|
|
|
fi
|
|
|
|
exec_cmd $ERL $PING_NAME $(uid ping $PING_NODE) $ERLANG_OPTS \
|
|
|
|
-noinput -hidden -eval 'io:format("~p~n",[net_adm:ping('"$PEER"')])' \
|
|
|
|
-s erlang halt -output text
|
2007-05-21 05:41:13 +02:00
|
|
|
}
|
|
|
|
|
2017-05-31 18:11:45 +02:00
|
|
|
# dynamic node name helper
|
2016-04-21 12:00:51 +02:00
|
|
|
uid()
|
2010-01-24 14:39:15 +01:00
|
|
|
{
|
2016-04-21 12:00:51 +02:00
|
|
|
uuid=$(uuidgen 2>/dev/null)
|
2017-05-31 18:11:45 +02:00
|
|
|
[ -z "$uuid" -a -f /proc/sys/kernel/random/uuid ] && uuid=$(cat /proc/sys/kernel/random/uuid)
|
2016-04-21 12:00:51 +02:00
|
|
|
[ -z "$uuid" ] && uuid=$(printf "%X" $RANDOM$(date +%M%S)$$)
|
|
|
|
uuid=${uuid%%-*}
|
|
|
|
[ $# -eq 0 ] && echo ${uuid}-${ERLANG_NODE}
|
|
|
|
[ $# -eq 1 ] && echo ${uuid}-${1}-${ERLANG_NODE}
|
|
|
|
[ $# -eq 2 ] && echo ${uuid}-${1}@${2}
|
2010-01-24 14:39:15 +01:00
|
|
|
}
|
|
|
|
|
2013-06-18 15:56:28 +02:00
|
|
|
# stop epmd if there is no other running node
|
|
|
|
stop_epmd()
|
2007-05-21 05:41:13 +02:00
|
|
|
{
|
2016-04-25 14:26:04 +02:00
|
|
|
"$EPMD" -names 2>/dev/null | grep -q name || "$EPMD" -kill >/dev/null
|
2007-05-21 05:41:13 +02:00
|
|
|
}
|
|
|
|
|
2013-06-18 15:56:28 +02:00
|
|
|
# make sure node not already running and node name unregistered
|
2017-05-31 18:11:45 +02:00
|
|
|
# if all ok, ensure runtime directory exists and make it current directory
|
2013-06-18 15:56:28 +02:00
|
|
|
check_start()
|
2009-08-24 21:43:52 +02:00
|
|
|
{
|
2016-04-25 14:26:04 +02:00
|
|
|
"$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && {
|
2013-06-18 15:56:28 +02:00
|
|
|
ps ux | grep -v grep | grep -q " $ERLANG_NODE " && {
|
|
|
|
echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running."
|
|
|
|
exit 4
|
|
|
|
} || {
|
|
|
|
ps ux | grep -v grep | grep -q beam && {
|
|
|
|
echo "ERROR: The ejabberd node '$ERLANG_NODE' is registered,"
|
|
|
|
echo " but no related beam process has been found."
|
|
|
|
echo "Shutdown all other erlang nodes, and call 'epmd -kill'."
|
|
|
|
exit 5
|
|
|
|
} || {
|
2016-04-25 14:26:04 +02:00
|
|
|
"$EPMD" -kill >/dev/null
|
2013-06-18 15:56:28 +02:00
|
|
|
}
|
|
|
|
}
|
2017-05-31 18:11:45 +02:00
|
|
|
} || {
|
|
|
|
cd "$SPOOL_DIR" || {
|
|
|
|
echo "ERROR: ejabberd can not access directory $SPOOL_DIR"
|
|
|
|
exit 6
|
|
|
|
}
|
2013-06-18 15:56:28 +02:00
|
|
|
}
|
2009-08-24 21:43:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
# allow sync calls
|
2017-05-31 18:11:45 +02:00
|
|
|
wait_status()
|
2009-08-24 21:43:52 +02:00
|
|
|
{
|
|
|
|
# args: status try delay
|
|
|
|
# return: 0 OK, 1 KO
|
|
|
|
timeout=$2
|
|
|
|
status=4
|
2013-06-18 15:56:28 +02:00
|
|
|
while [ $status -ne $1 ] ; do
|
2009-08-24 21:43:52 +02:00
|
|
|
sleep $3
|
2013-06-18 15:56:28 +02:00
|
|
|
timeout=`expr $timeout - 1`
|
2017-05-31 18:11:45 +02:00
|
|
|
if [ $timeout -eq 0 ] ; then
|
2009-08-24 21:43:52 +02:00
|
|
|
status=$1
|
2017-05-31 18:11:45 +02:00
|
|
|
else
|
2009-08-24 21:43:52 +02:00
|
|
|
ctl status > /dev/null
|
|
|
|
status=$?
|
2017-05-31 18:11:45 +02:00
|
|
|
fi
|
2009-08-24 21:43:52 +02:00
|
|
|
done
|
2017-05-31 18:11:45 +02:00
|
|
|
[ $timeout -gt 0 ]
|
2012-06-08 17:33:21 +02:00
|
|
|
}
|
|
|
|
|
2017-05-31 18:11:45 +02:00
|
|
|
# main
|
|
|
|
case $1 in
|
|
|
|
start)
|
|
|
|
check_start
|
|
|
|
exec_erl $ERLANG_NODE $EJABBERD_OPTS -noinput -detached
|
|
|
|
;;
|
|
|
|
foreground)
|
|
|
|
check_start
|
|
|
|
exec_erl $ERLANG_NODE $EJABBERD_OPTS -noinput
|
|
|
|
;;
|
|
|
|
live)
|
|
|
|
livewarning
|
|
|
|
check_start
|
|
|
|
exec_erl $ERLANG_NODE $EJABBERD_OPTS
|
|
|
|
;;
|
|
|
|
debug)
|
|
|
|
debugwarning
|
|
|
|
exec_erl $(uid debug) -hidden -remsh $ERLANG_NODE
|
|
|
|
;;
|
|
|
|
etop)
|
|
|
|
exec_erl $(uid top) -hidden -node $ERLANG_NODE -s etop \
|
|
|
|
-s erlang halt -output text
|
|
|
|
;;
|
|
|
|
iexdebug)
|
|
|
|
debugwarning
|
|
|
|
exec_iex $(uid debug) --remsh "$ERLANG_NODE"
|
|
|
|
;;
|
|
|
|
iexlive)
|
|
|
|
livewarning
|
|
|
|
exec_iex $ERLANG_NODE --erl "$EJABBERD_OPTS" --app ejabberd
|
|
|
|
;;
|
|
|
|
ping)
|
|
|
|
ping $2
|
|
|
|
;;
|
|
|
|
started)
|
|
|
|
wait_status 0 30 2 # wait 30x2s before timeout
|
|
|
|
;;
|
|
|
|
stopped)
|
|
|
|
wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
exec_erl $(uid ctl) -hidden -noinput -s ejabberd_ctl \
|
|
|
|
-extra $ERLANG_NODE $NO_TIMEOUT "$@"
|
|
|
|
result=$?
|
|
|
|
case $result in
|
|
|
|
2|3) help;;
|
|
|
|
*) :;;
|
|
|
|
esac
|
|
|
|
exit $result
|
|
|
|
;;
|
2007-05-21 05:41:13 +02:00
|
|
|
esac
|