aboutsummaryrefslogtreecommitdiffstats
path: root/priv/templates/extended_bin
diff options
context:
space:
mode:
authorTristan Sloughter <[email protected]>2015-04-28 22:36:44 -0500
committerTristan Sloughter <[email protected]>2015-05-08 11:16:53 -0500
commit88d1f29257869b0de9369881236477163804125a (patch)
treec14b95ae8efdebcf074d314b6b0afb662f3454fb /priv/templates/extended_bin
parenta36609536aaf7d98b5bd5d3364cab739dc6689b5 (diff)
downloadrelx-88d1f29257869b0de9369881236477163804125a.tar.gz
relx-88d1f29257869b0de9369881236477163804125a.tar.bz2
relx-88d1f29257869b0de9369881236477163804125a.zip
use mustache instead of erlydtl for overlays
Diffstat (limited to 'priv/templates/extended_bin')
-rwxr-xr-xpriv/templates/extended_bin428
1 files changed, 428 insertions, 0 deletions
diff --git a/priv/templates/extended_bin b/priv/templates/extended_bin
new file mode 100755
index 0000000..452669c
--- /dev/null
+++ b/priv/templates/extended_bin
@@ -0,0 +1,428 @@
+#!/bin/sh
+
+set -e
+
+SCRIPT_DIR="$(dirname "$0")"
+RELEASE_ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
+REL_NAME="{{ rel_name }}"
+REL_VSN="{{ rel_vsn }}"
+ERTS_VSN="{{ erts_vsn }}"
+CODE_LOADING_MODE="${CODE_LOADING_MODE:-embedded}"
+REL_DIR="$RELEASE_ROOT_DIR/releases/$REL_VSN"
+ERL_OPTS="{{ erl_opts }}"
+RUNNER_LOG_DIR="${RUNNER_LOG_DIR:-$RELEASE_ROOT_DIR/log}"
+
+find_erts_dir() {
+ local erts_dir="$RELEASE_ROOT_DIR/erts-$ERTS_VSN"
+ if [ -d "$erts_dir" ]; then
+ ERTS_DIR="$erts_dir";
+ ROOTDIR="$RELEASE_ROOT_DIR"
+ else
+ local erl="$(which erl)"
+ code="io:format(\"~s\", [code:root_dir()]), halt()."
+ local erl_root="$("$erl" -noshell -eval "$code")"
+ ERTS_DIR="$erl_root/erts-$ERTS_VSN"
+ ROOTDIR="$erl_root"
+ fi
+}
+
+# Get node pid
+relx_get_pid() {
+ if output="$(relx_nodetool rpcterms os getpid)"
+ then
+ echo "$output" | sed -e 's/"//g'
+ return 0
+ else
+ echo "$output"
+ return 1
+ fi
+}
+
+relx_get_longname() {
+ id="longname$(relx_gen_id)-${NAME}"
+ "$BINDIR/erl" -boot start_clean -eval 'io:format("~s~n", [node()]), halt()' -noshell -name $id | sed -e 's/.*@//g'
+}
+
+# Connect to a remote node
+relx_rem_sh() {
+ # Generate a unique id used to allow multiple remsh to the same node
+ # transparently
+ id="remsh$(relx_gen_id)-${NAME}"
+
+ # Get the node's ticktime so that we use the same thing.
+ TICKTIME="$(relx_nodetool rpcterms net_kernel get_net_ticktime)"
+
+ # Setup remote shell command to control node
+ exec "$BINDIR/erl" "$NAME_TYPE" "$id" -remsh "$NAME" -boot start_clean \
+ -boot_var ERTS_LIB_DIR "$ERTS_LIB_DIR" \
+ -setcookie "$COOKIE" -kernel net_ticktime $TICKTIME
+}
+
+# Generate a random id
+relx_gen_id() {
+ od -X /dev/urandom | head -n1 | awk '{print $2}'
+}
+
+# Control a node
+relx_nodetool() {
+ command="$1"; shift
+
+ "$ERTS_DIR/bin/escript" "$ROOTDIR/bin/nodetool" "$NAME_TYPE" "$NAME" \
+ -setcookie "$COOKIE" "$command" $@
+}
+
+# Run an escript in the node's environment
+relx_escript() {
+ shift; scriptpath="$1"; shift
+ export RELEASE_ROOT_DIR
+
+ "$ERTS_DIR/bin/escript" "$ROOTDIR/$scriptpath" $@
+}
+
+# Output a start command for the last argument of run_erl
+relx_start_command() {
+ printf "exec \"%s\" \"%s\"" "$RELEASE_ROOT_DIR/bin/$REL_NAME" \
+ "$START_OPTION"
+}
+
+# Use $CWD/vm.args if exists, otherwise releases/VSN/vm.args
+if [ -z "$VMARGS_PATH" ]; then
+ if [ -f "$RELEASE_ROOT_DIR/vm.args" ]; then
+ VMARGS_PATH="$RELEASE_ROOT_DIR/vm.args"
+ USE_DIR="$RELEASE_ROOT_DIR"
+ else
+ USE_DIR="$REL_DIR"
+ VMARGS_PATH="$REL_DIR/vm.args"
+ fi
+fi
+
+if [ $RELX_REPLACE_OS_VARS ]; then
+ awk '{while(match($0,"[$]{[^}]*}")) {var=substr($0,RSTART+2,RLENGTH -3);gsub("[$]{"var"}",ENVIRON[var])}}1' < $VMARGS_PATH > $VMARGS_PATH.2.config
+ VMARGS_PATH=$VMARGS_PATH.2.config
+fi
+
+# Make sure log directory exists
+mkdir -p "$RUNNER_LOG_DIR"
+
+if [ -z "$RELX_CONFIG_PATH" ]; then
+ if [ -f "$USE_DIR/sys.config" ]; then
+ RELX_CONFIG_PATH="$USE_DIR/sys.config"
+ else
+ RELX_CONFIG_PATH="$REL_DIR/sys.config"
+ fi
+fi
+
+if [ $RELX_REPLACE_OS_VARS ]; then
+ awk '{while(match($0,"[$]{[^}]*}")) {var=substr($0,RSTART+2,RLENGTH -3);gsub("[$]{"var"}",ENVIRON[var])}}1' < $RELX_CONFIG_PATH > $RELX_CONFIG_PATH.2.config
+ RELX_CONFIG_PATH=$RELX_CONFIG_PATH.2.config
+fi
+
+# Extract the target node name from node.args
+NAME_ARG=$(egrep '^-s?name' "$VMARGS_PATH")
+if [ -z "$NAME_ARG" ]; then
+ echo "vm.args needs to have either -name or -sname parameter."
+ exit 1
+fi
+
+# Extract the name type and name from the NAME_ARG for REMSH
+NAME_TYPE="$(echo "$NAME_ARG" | awk '{print $1}')"
+NAME="$(echo "$NAME_ARG" | awk '{print $2}')"
+
+PIPE_DIR="${PIPE_DIR:-/tmp/erl_pipes/$NAME/}"
+
+# Extract the target cookie
+COOKIE_ARG="$(grep '^-setcookie' "$VMARGS_PATH")"
+if [ -z "$COOKIE_ARG" ]; then
+ echo "vm.args needs to have a -setcookie parameter."
+ exit 1
+fi
+
+# Extract cookie name from COOKIE_ARG
+COOKIE="$(echo "$COOKIE_ARG" | awk '{print $2}')"
+
+find_erts_dir
+export ROOTDIR="$RELEASE_ROOT_DIR"
+export BINDIR="$ERTS_DIR/bin"
+export EMU="beam"
+export PROGNAME="erl"
+export LD_LIBRARY_PATH="$ERTS_DIR/lib:$LD_LIBRARY_PATH"
+ERTS_LIB_DIR="$ERTS_DIR/../lib"
+
+cd "$ROOTDIR"
+
+# User can specify an sname without @hostname
+# This will fail when creating remote shell
+# So here we check for @ and add @hostname if missing
+case $NAME in
+ *@*)
+ # Nothing to do
+ ;;
+ *)
+ # Add @hostname
+ case $NAME_TYPE in
+ -sname)
+ NAME=$NAME@`hostname -s`
+ ;;
+ -name)
+ NAME=$NAME@$(relx_get_longname)
+ ;;
+ esac
+ ;;
+esac
+
+# Check the first argument for instructions
+case "$1" in
+ start|start_boot)
+
+ # Make sure there is not already a node running
+ #RES=`$NODETOOL ping`
+ #if [ "$RES" = "pong" ]; then
+ # echo "Node is already running!"
+ # exit 1
+ #fi
+ # Save this for later.
+ CMD=$1
+ case "$1" in
+ start)
+ shift
+ START_OPTION="console"
+ HEART_OPTION="start"
+ ;;
+ start_boot)
+ shift
+ START_OPTION="console_boot"
+ HEART_OPTION="start_boot"
+ ;;
+ esac
+ RUN_PARAM="$@"
+
+ # Set arguments for the heart command
+ set -- "$SCRIPT_DIR/$REL_NAME" "$HEART_OPTION"
+ [ "$RUN_PARAM" ] && set -- "$@" "$RUN_PARAM"
+
+ # Export the HEART_COMMAND
+ HEART_COMMAND="$RELEASE_ROOT_DIR/bin/$REL_NAME $CMD"
+ export HEART_COMMAND
+
+ mkdir -p "$PIPE_DIR"
+
+ "$BINDIR/run_erl" -daemon "$PIPE_DIR" "$RUNNER_LOG_DIR" \
+ "$(relx_start_command)"
+ ;;
+
+ stop)
+ # Wait for the node to completely stop...
+ PID="$(relx_get_pid)"
+ if ! relx_nodetool "stop"; then
+ exit 1
+ fi
+ while $(kill -0 "$PID" 2>/dev/null);
+ do
+ sleep 1
+ done
+ ;;
+
+ restart)
+ ## Restart the VM without exiting the process
+ if ! relx_nodetool "restart"; then
+ exit 1
+ fi
+ ;;
+
+ reboot)
+ ## Restart the VM completely (uses heart to restart it)
+ if ! relx_nodetool "reboot"; then
+ exit 1
+ fi
+ ;;
+
+ pid)
+ ## Get the VM's pid
+ if ! relx_get_pid; then
+ exit 1
+ fi
+ ;;
+
+ ping)
+ ## See if the VM is alive
+ if ! relx_nodetool "ping"; then
+ exit 1
+ fi
+ ;;
+
+ escript)
+ ## Run an escript under the node's environment
+ if ! relx_escript $@; then
+ exit 1
+ fi
+ ;;
+
+ attach)
+ # Make sure a node IS running
+ if ! relx_nodetool "ping" > /dev/null; then
+ echo "Node is not running!"
+ exit 1
+ fi
+
+ shift
+ exec "$BINDIR/to_erl" "$PIPE_DIR"
+ ;;
+
+ remote_console)
+ # Make sure a node IS running
+ if ! relx_nodetool "ping" > /dev/null; then
+ echo "Node is not running!"
+ exit 1
+ fi
+
+ shift
+ relx_rem_sh
+ ;;
+
+ upgrade|downgrade|install)
+ if [ -z "$2" ]; then
+ echo "Missing package argument"
+ echo "Usage: $REL_NAME $1 {package base name}"
+ echo "NOTE {package base name} MUST NOT include the .tar.gz suffix"
+ exit 1
+ fi
+
+ # Make sure a node IS running
+ if ! relx_nodetool "ping" > /dev/null; then
+ echo "Node is not running!"
+ exit 1
+ fi
+
+ exec "$BINDIR/escript" "$ROOTDIR/bin/install_upgrade.escript" \
+ "install" "$REL_NAME" "$NAME" "$COOKIE" "$2"
+ ;;
+
+ unpack)
+ if [ -z "$2" ]; then
+ echo "Missing package argument"
+ echo "Usage: $REL_NAME $1 {package base name}"
+ echo "NOTE {package base name} MUST NOT include the .tar.gz suffix"
+ exit 1
+ fi
+
+ # Make sure a node IS running
+ if ! relx_nodetool "ping" > /dev/null; then
+ echo "Node is not running!"
+ exit 1
+ fi
+
+ exec "$BINDIR/escript" "$ROOTDIR/bin/install_upgrade.escript" \
+ "unpack" "$REL_NAME" "$NAME" "$COOKIE" "$2"
+ ;;
+
+ console|console_clean|console_boot)
+ # .boot file typically just $REL_NAME (ie, the app name)
+ # however, for debugging, sometimes start_clean.boot is useful.
+ # For e.g. 'setup', one may even want to name another boot script.
+ case "$1" in
+ console)
+ if [ -f "$REL_DIR/$REL_NAME.boot" ]; then
+ BOOTFILE="$REL_DIR/$REL_NAME"
+ else
+ BOOTFILE="$REL_DIR/start"
+ fi
+ ;;
+ console_clean)
+ BOOTFILE="$ROOTDIR/bin/start_clean"
+ ;;
+ console_boot)
+ shift
+ BOOTFILE="$1"
+ shift
+ ;;
+ esac
+ # Setup beam-required vars
+ EMU="beam"
+ PROGNAME="${0#*/}"
+
+ export EMU
+ export PROGNAME
+
+ # Store passed arguments since they will be erased by `set`
+ ARGS="$@"
+
+ # Build an array of arguments to pass to exec later on
+ # Build it here because this command will be used for logging.
+ set -- "$BINDIR/erlexec" -boot "$BOOTFILE" \
+ -boot_var ERTS_LIB_DIR "$ERTS_LIB_DIR" \
+ -env ERL_LIBS "$REL_DIR/lib" -config "$RELX_CONFIG_PATH" \
+ -args_file "$VMARGS_PATH"
+
+ # Dump environment info for logging purposes
+ echo "Exec: $@" -- ${1+$ARGS}
+ echo "Root: $ROOTDIR"
+
+ # Log the startup
+ echo "$RELEASE_ROOT_DIR"
+ logger -t "$REL_NAME[$$]" "Starting up"
+
+ # Start the VM
+ exec "$@" -- ${1+$ARGS}
+ ;;
+
+ foreground)
+ # start up the release in the foreground for use by runit
+ # or other supervision services
+
+ [ -f "$REL_DIR/$REL_NAME.boot" ] && BOOTFILE="$REL_NAME" || BOOTFILE=start
+ FOREGROUNDOPTIONS="-noshell -noinput +Bd"
+
+ # Setup beam-required vars
+ EMU=beam
+ PROGNAME="${0#*/}"
+
+ export EMU
+ export PROGNAME
+
+ # Store passed arguments since they will be erased by `set`
+ ARGS="$@"
+
+ # Build an array of arguments to pass to exec later on
+ # Build it here because this command will be used for logging.
+ set -- "$BINDIR/erlexec" $FOREGROUNDOPTIONS \
+ -boot "$REL_DIR/$BOOTFILE" -mode "$CODE_LOADING_MODE" -config "$RELX_CONFIG_PATH" \
+ -boot_var ERTS_LIB_DIR "$ERTS_LIB_DIR" \
+ -args_file "$VMARGS_PATH"
+
+ # Dump environment info for logging purposes
+ echo "Exec: $@" -- ${1+$ARGS}
+ echo "Root: $ROOTDIR"
+
+ # Start the VM
+ exec "$@" -- ${1+$ARGS}
+ ;;
+ rpc)
+ # Make sure a node IS running
+ if ! relx_nodetool "ping" > /dev/null; then
+ echo "Node is not running!"
+ exit 1
+ fi
+
+ shift
+
+ relx_nodetool rpc $@
+ ;;
+ rpcterms)
+ # Make sure a node IS running
+ if ! relx_nodetool "ping" > /dev/null; then
+ echo "Node is not running!"
+ exit 1
+ fi
+
+ shift
+
+ relx_nodetool rpcterms $@
+ ;;
+
+ *)
+ echo "Usage: $REL_NAME {start|start_boot <file>|foreground|stop|restart|reboot|pid|ping|console|console_clean|console_boot <file>|attach|remote_console|upgrade|escript|rpc|rpcterms}"
+ exit 1
+ ;;
+esac
+
+exit 0