196 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/sh
 | 
						|
set -e
 | 
						|
 | 
						|
readlink_f () {
 | 
						|
  cd "$(dirname "$1")" > /dev/null
 | 
						|
  filename="$(basename "$1")"
 | 
						|
  if [ -h "$filename" ]; then
 | 
						|
    readlink_f "$(readlink "$filename")"
 | 
						|
  else
 | 
						|
    echo "$(pwd -P)/$filename"
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
SELF=$(readlink_f "$0")
 | 
						|
RELEASE_ROOT="$(CDPATH='' cd "$(dirname "$SELF")/.." && pwd -P)"
 | 
						|
export RELEASE_ROOT
 | 
						|
RELEASE_NAME="${RELEASE_NAME:-"api"}"
 | 
						|
export RELEASE_NAME
 | 
						|
RELEASE_VSN="${RELEASE_VSN:-"$(cut -d' ' -f2 "$RELEASE_ROOT/releases/start_erl.data")"}"
 | 
						|
export RELEASE_VSN
 | 
						|
RELEASE_COMMAND="$1"
 | 
						|
export RELEASE_COMMAND
 | 
						|
RELEASE_PROG="${RELEASE_PROG:-"$(echo "$0" | sed 's/.*\///')"}"
 | 
						|
export RELEASE_PROG
 | 
						|
 | 
						|
REL_VSN_DIR="$RELEASE_ROOT/releases/$RELEASE_VSN"
 | 
						|
. "$REL_VSN_DIR/env.sh"
 | 
						|
 | 
						|
RELEASE_COOKIE="${RELEASE_COOKIE:-"$(cat "$RELEASE_ROOT/releases/COOKIE")"}"
 | 
						|
export RELEASE_COOKIE
 | 
						|
RELEASE_MODE="${RELEASE_MODE:-"embedded"}"
 | 
						|
export RELEASE_MODE
 | 
						|
RELEASE_NODE="${RELEASE_NODE:-"$RELEASE_NAME"}"
 | 
						|
export RELEASE_NODE
 | 
						|
RELEASE_TMP="${RELEASE_TMP:-"$RELEASE_ROOT/tmp"}"
 | 
						|
export RELEASE_TMP
 | 
						|
RELEASE_VM_ARGS="${RELEASE_VM_ARGS:-"$REL_VSN_DIR/vm.args"}"
 | 
						|
export RELEASE_VM_ARGS
 | 
						|
RELEASE_REMOTE_VM_ARGS="${RELEASE_REMOTE_VM_ARGS:-"$REL_VSN_DIR/remote.vm.args"}"
 | 
						|
export RELEASE_REMOTE_VM_ARGS
 | 
						|
RELEASE_DISTRIBUTION="${RELEASE_DISTRIBUTION:-"sname"}"
 | 
						|
export RELEASE_DISTRIBUTION
 | 
						|
RELEASE_BOOT_SCRIPT="${RELEASE_BOOT_SCRIPT:-"start"}"
 | 
						|
export RELEASE_BOOT_SCRIPT
 | 
						|
RELEASE_BOOT_SCRIPT_CLEAN="${RELEASE_BOOT_SCRIPT_CLEAN:-"start_clean"}"
 | 
						|
export RELEASE_BOOT_SCRIPT_CLEAN
 | 
						|
 | 
						|
rand () {
 | 
						|
  dd count=1 bs=2 if=/dev/urandom 2> /dev/null | od -x | awk 'NR==1{print $2}'
 | 
						|
}
 | 
						|
 | 
						|
release_distribution () {
 | 
						|
  case $RELEASE_DISTRIBUTION in
 | 
						|
    none)
 | 
						|
      ;;
 | 
						|
 | 
						|
    name | sname)
 | 
						|
      echo "--$RELEASE_DISTRIBUTION $1"
 | 
						|
      ;;
 | 
						|
 | 
						|
    *)
 | 
						|
      echo "ERROR: Expected RELEASE_DISTRIBUTION to be sname, name, or none, got: $RELEASE_DISTRIBUTION" >&2
 | 
						|
      exit 1
 | 
						|
      ;;
 | 
						|
  esac
 | 
						|
}
 | 
						|
 | 
						|
rpc () {
 | 
						|
  exec "$REL_VSN_DIR/elixir" \
 | 
						|
       --hidden --cookie "$RELEASE_COOKIE" \
 | 
						|
       $(release_distribution "rpc-$(rand)-$RELEASE_NODE") \
 | 
						|
       --boot "$REL_VSN_DIR/$RELEASE_BOOT_SCRIPT_CLEAN" \
 | 
						|
       --boot-var RELEASE_LIB "$RELEASE_ROOT/lib" \
 | 
						|
       --vm-args "$RELEASE_REMOTE_VM_ARGS" \
 | 
						|
       --rpc-eval "$RELEASE_NODE" "$1"
 | 
						|
}
 | 
						|
 | 
						|
start () {
 | 
						|
  export_release_sys_config
 | 
						|
  REL_EXEC="$1"
 | 
						|
  shift
 | 
						|
  exec "$REL_VSN_DIR/$REL_EXEC" \
 | 
						|
       --cookie "$RELEASE_COOKIE" \
 | 
						|
       $(release_distribution "$RELEASE_NODE") \
 | 
						|
       --erl "-mode $RELEASE_MODE" \
 | 
						|
       --erl-config "$RELEASE_SYS_CONFIG" \
 | 
						|
       --boot "$REL_VSN_DIR/$RELEASE_BOOT_SCRIPT" \
 | 
						|
       --boot-var RELEASE_LIB "$RELEASE_ROOT/lib" \
 | 
						|
       --vm-args "$RELEASE_VM_ARGS" "$@"
 | 
						|
}
 | 
						|
 | 
						|
export_release_sys_config () {
 | 
						|
  DEFAULT_SYS_CONFIG="${RELEASE_SYS_CONFIG:-"$REL_VSN_DIR/sys"}"
 | 
						|
 | 
						|
  if grep -q "RUNTIME_CONFIG=true" "$DEFAULT_SYS_CONFIG.config"; then
 | 
						|
    RELEASE_SYS_CONFIG="$RELEASE_TMP/$RELEASE_NAME-$RELEASE_VSN-$(date +%Y%m%d%H%M%S)-$(rand).runtime"
 | 
						|
 | 
						|
    (mkdir -p "$RELEASE_TMP" && cat "$DEFAULT_SYS_CONFIG.config" >"$RELEASE_SYS_CONFIG.config") || (
 | 
						|
      echo "ERROR: Cannot start release because it could not write $RELEASE_SYS_CONFIG.config" >&2
 | 
						|
      exit 1
 | 
						|
    )
 | 
						|
  else
 | 
						|
    RELEASE_SYS_CONFIG="$DEFAULT_SYS_CONFIG"
 | 
						|
  fi
 | 
						|
 | 
						|
  export RELEASE_SYS_CONFIG
 | 
						|
}
 | 
						|
 | 
						|
case $1 in
 | 
						|
  start)
 | 
						|
    start "elixir" --no-halt
 | 
						|
    ;;
 | 
						|
 | 
						|
  start_iex)
 | 
						|
    start "iex"
 | 
						|
    ;;
 | 
						|
 | 
						|
  daemon)
 | 
						|
    start "elixir" --no-halt --pipe-to "${RELEASE_TMP}/pipe" "${RELEASE_TMP}/log"
 | 
						|
    ;;
 | 
						|
 | 
						|
  daemon_iex)
 | 
						|
    start "iex" --pipe-to "${RELEASE_TMP}/pipe" "${RELEASE_TMP}/log"
 | 
						|
    ;;
 | 
						|
 | 
						|
  eval)
 | 
						|
    if [ -z "$2" ]; then
 | 
						|
      echo "ERROR: EVAL expects an expression as argument" >&2
 | 
						|
      exit 1
 | 
						|
    fi
 | 
						|
    script="$2"
 | 
						|
    shift 2
 | 
						|
    export_release_sys_config
 | 
						|
    exec "$REL_VSN_DIR/elixir" \
 | 
						|
       --cookie "$RELEASE_COOKIE" \
 | 
						|
       --erl-config "$RELEASE_SYS_CONFIG" \
 | 
						|
       --boot "$REL_VSN_DIR/$RELEASE_BOOT_SCRIPT_CLEAN" \
 | 
						|
       --boot-var RELEASE_LIB "$RELEASE_ROOT/lib" \
 | 
						|
       --vm-args "$RELEASE_VM_ARGS" --eval "$script" -- "$@"
 | 
						|
    ;;
 | 
						|
 | 
						|
  remote)
 | 
						|
    exec "$REL_VSN_DIR/iex" \
 | 
						|
         --hidden --cookie "$RELEASE_COOKIE" \
 | 
						|
         $(release_distribution "rem-$(rand)-$RELEASE_NODE") \
 | 
						|
         --boot "$REL_VSN_DIR/$RELEASE_BOOT_SCRIPT_CLEAN" \
 | 
						|
         --boot-var RELEASE_LIB "$RELEASE_ROOT/lib" \
 | 
						|
         --vm-args "$RELEASE_REMOTE_VM_ARGS" \
 | 
						|
         --remsh "$RELEASE_NODE"
 | 
						|
    ;;
 | 
						|
 | 
						|
  rpc)
 | 
						|
    if [ -z "$2" ]; then
 | 
						|
      echo "ERROR: RPC expects an expression as argument" >&2
 | 
						|
      exit 1
 | 
						|
    fi
 | 
						|
    rpc "$2"
 | 
						|
    ;;
 | 
						|
 | 
						|
  restart|stop)
 | 
						|
    rpc "System.$1()"
 | 
						|
    ;;
 | 
						|
 | 
						|
  pid)
 | 
						|
    rpc "IO.puts System.pid()"
 | 
						|
    ;;
 | 
						|
 | 
						|
  version)
 | 
						|
    echo "$RELEASE_NAME $RELEASE_VSN"
 | 
						|
    ;;
 | 
						|
 | 
						|
  *)
 | 
						|
    echo "Usage: $(basename "$0") COMMAND [ARGS]
 | 
						|
 | 
						|
The known commands are:
 | 
						|
 | 
						|
    start          Starts the system
 | 
						|
    start_iex      Starts the system with IEx attached
 | 
						|
    daemon         Starts the system as a daemon
 | 
						|
    daemon_iex     Starts the system as a daemon with IEx attached
 | 
						|
    eval \"EXPR\"    Executes the given expression on a new, non-booted system
 | 
						|
    rpc \"EXPR\"     Executes the given expression remotely on the running system
 | 
						|
    remote         Connects to the running system via a remote shell
 | 
						|
    restart        Restarts the running system via a remote command
 | 
						|
    stop           Stops the running system via a remote command
 | 
						|
    pid            Prints the operating system PID of the running system via a remote command
 | 
						|
    version        Prints the release name and version to be booted
 | 
						|
" >&2
 | 
						|
 | 
						|
    if [ -n "$1" ]; then
 | 
						|
      echo "ERROR: Unknown command $1" >&2
 | 
						|
      exit 1
 | 
						|
    fi
 | 
						|
    ;;
 | 
						|
esac
 |