mirror of
https://github.com/correl/rebar.git
synced 2024-11-27 19:19:53 +00:00
cb5056b2e3
app.config has been a long standing erroneous file in rebar. Erlang/OTP documentation suggests a sys.config file instead. This file is stored in the releases/VSN directory. This does a few things but most importantly it ensures your config (contained in the application environment) survives a hot upgrade. It also has the advantage of allowing the configuration of the application to be versioned along side the application code. This patch flips rebar to use sys.config rather than app.config. Additionally it makes this flip to vm.args as well, making them versioned just like sys.config. This patch also includes runner script changes to support the old etc/app.config config file location and support for Windows. Thanks to mokele for the initial work and kick in the pants to make this finially happen.
187 lines
5 KiB
Bash
Executable file
187 lines
5 KiB
Bash
Executable file
#!/bin/sh
|
|
# -*- tab-width:4;indent-tabs-mode:nil -*-
|
|
# ex: ts=4 sw=4 et
|
|
|
|
RUNNER_SCRIPT_DIR=$(cd ${0%/*} && pwd)
|
|
|
|
RUNNER_BASE_DIR=${RUNNER_SCRIPT_DIR%/*}
|
|
RUNNER_ETC_DIR=$RUNNER_BASE_DIR/etc
|
|
RUNNER_LOG_DIR=$RUNNER_BASE_DIR/log
|
|
# Note the trailing slash on $PIPE_DIR/
|
|
PIPE_DIR=/tmp/$RUNNER_BASE_DIR/
|
|
RUNNER_USER=
|
|
|
|
# Make sure this script is running as the appropriate user
|
|
if [ ! -z "$RUNNER_USER" ] && [ `whoami` != "$RUNNER_USER" ]; then
|
|
exec sudo -u $RUNNER_USER -i $0 $@
|
|
fi
|
|
|
|
# Make sure CWD is set to runner base dir
|
|
cd $RUNNER_BASE_DIR
|
|
|
|
# Make sure log directory exists
|
|
mkdir -p $RUNNER_LOG_DIR
|
|
|
|
# Extract the target node name from node.args
|
|
NAME_ARG=`egrep '^-s?name' $RUNNER_ETC_DIR/vm.args`
|
|
if [ -z "$NAME_ARG" ]; then
|
|
echo "vm.args needs to have either -name or -sname parameter."
|
|
exit 1
|
|
fi
|
|
|
|
# Extract the target cookie
|
|
COOKIE_ARG=`grep '^-setcookie' $RUNNER_ETC_DIR/vm.args`
|
|
if [ -z "$COOKIE_ARG" ]; then
|
|
echo "vm.args needs to have a -setcookie parameter."
|
|
exit 1
|
|
fi
|
|
|
|
# Identify the script name
|
|
SCRIPT=`basename $0`
|
|
|
|
# Parse out release and erts info
|
|
START_ERL=`cat $RUNNER_BASE_DIR/releases/start_erl.data`
|
|
ERTS_VSN=${START_ERL% *}
|
|
APP_VSN=${START_ERL#* }
|
|
|
|
# Add ERTS bin dir to our path
|
|
ERTS_PATH=$RUNNER_BASE_DIR/erts-$ERTS_VSN/bin
|
|
|
|
# Setup command to control the node
|
|
NODETOOL="$ERTS_PATH/escript $ERTS_PATH/nodetool $NAME_ARG $COOKIE_ARG"
|
|
|
|
# Use releases/VSN/sys.config if it exists otherwise use etc/app.config
|
|
if [ -e "$RUNNER_BASE_DIR/releases/$APP_VSN/sys.config" ]; then
|
|
CONFIG_PATH="$RUNNER_BASE_DIR/releases/$APP_VSN/sys.config"
|
|
else
|
|
CONFIG_PATH="$RUNNER_ETC_DIR/app.config"
|
|
fi
|
|
|
|
# Use releases/VSN/vm.args if it exists otherwise use etc/vm.args
|
|
if [-e "$RUNNER_BASE_DIR/releases/$APP_VSN/vm.args" ]; then
|
|
VMARGS_PATH="$RUNNER_BASE_DIR/releases/$APP_VSN/vm.args"
|
|
else
|
|
VMARGS_PATH="$RUNNER_ETC_DIR/vm.args"
|
|
fi
|
|
|
|
# Check the first argument for instructions
|
|
case "$1" in
|
|
start)
|
|
# Make sure there is not already a node running
|
|
RES=`$NODETOOL ping`
|
|
if [ "$RES" = "pong" ]; then
|
|
echo "Node is already running!"
|
|
exit 1
|
|
fi
|
|
HEART_COMMAND="$RUNNER_BASE_DIR/bin/$SCRIPT start"
|
|
export HEART_COMMAND
|
|
mkdir -p $PIPE_DIR
|
|
shift # remove $1
|
|
$ERTS_PATH/run_erl -daemon $PIPE_DIR $RUNNER_LOG_DIR "exec $RUNNER_BASE_DIR/bin/$SCRIPT console $@" 2>&1
|
|
;;
|
|
|
|
stop)
|
|
# Wait for the node to completely stop...
|
|
case `uname -s` in
|
|
Linux|Darwin|FreeBSD|DragonFly|NetBSD|OpenBSD)
|
|
# PID COMMAND
|
|
PID=`ps ax -o pid= -o command=|\
|
|
grep "$RUNNER_BASE_DIR/.*/[b]eam"|awk '{print $1}'`
|
|
;;
|
|
SunOS)
|
|
# PID COMMAND
|
|
PID=`ps -ef -o pid= -o args=|\
|
|
grep "$RUNNER_BASE_DIR/.*/[b]eam"|awk '{print $1}'`
|
|
;;
|
|
CYGWIN*)
|
|
# UID PID PPID TTY STIME COMMAND
|
|
PID=`ps -efW|grep "$RUNNER_BASE_DIR/.*/[b]eam"|awk '{print $2}'`
|
|
;;
|
|
esac
|
|
$NODETOOL stop
|
|
ES=$?
|
|
if [ "$ES" -ne 0 ]; then
|
|
exit $ES
|
|
fi
|
|
while `kill -0 $PID 2>/dev/null`;
|
|
do
|
|
sleep 1
|
|
done
|
|
;;
|
|
|
|
restart)
|
|
## Restart the VM without exiting the process
|
|
$NODETOOL restart
|
|
ES=$?
|
|
if [ "$ES" -ne 0 ]; then
|
|
exit $ES
|
|
fi
|
|
;;
|
|
|
|
reboot)
|
|
## Restart the VM completely (uses heart to restart it)
|
|
$NODETOOL reboot
|
|
ES=$?
|
|
if [ "$ES" -ne 0 ]; then
|
|
exit $ES
|
|
fi
|
|
;;
|
|
|
|
ping)
|
|
## See if the VM is alive
|
|
$NODETOOL ping
|
|
ES=$?
|
|
if [ "$ES" -ne 0 ]; then
|
|
exit $ES
|
|
fi
|
|
;;
|
|
|
|
attach)
|
|
# Make sure a node IS running
|
|
RES=`$NODETOOL ping`
|
|
ES=$?
|
|
if [ "$ES" -ne 0 ]; then
|
|
echo "Node is not running!"
|
|
exit $ES
|
|
fi
|
|
|
|
shift
|
|
exec $ERTS_PATH/to_erl $PIPE_DIR
|
|
;;
|
|
|
|
console|console_clean)
|
|
# .boot file typically just $SCRIPT (ie, the app name)
|
|
# however, for debugging, sometimes start_clean.boot is useful:
|
|
case "$1" in
|
|
console) BOOTFILE=$SCRIPT ;;
|
|
console_clean) BOOTFILE=start_clean ;;
|
|
esac
|
|
# Setup beam-required vars
|
|
ROOTDIR=$RUNNER_BASE_DIR
|
|
BINDIR=$ROOTDIR/erts-$ERTS_VSN/bin
|
|
EMU=beam
|
|
PROGNAME=`echo $0 | sed 's/.*\\///'`
|
|
CMD="$BINDIR/erlexec -boot $RUNNER_BASE_DIR/releases/$APP_VSN/$BOOTFILE -mode embedded -config $CONFIG_PATH -args_file $VMARGS_PATH -- ${1+"$@"}"
|
|
export EMU
|
|
export ROOTDIR
|
|
export BINDIR
|
|
export PROGNAME
|
|
|
|
# Dump environment info for logging purposes
|
|
echo "Exec: $CMD"
|
|
echo "Root: $ROOTDIR"
|
|
|
|
# Log the startup
|
|
logger -t "$SCRIPT[$$]" "Starting up"
|
|
|
|
# Start the VM
|
|
exec $CMD
|
|
;;
|
|
|
|
*)
|
|
echo "Usage: $SCRIPT {start|stop|restart|reboot|ping|console|console_clean|attach}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
exit 0
|