#!/bin/sh

# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

canonical_readlink ()
  {
  FILE=$(dirname "$1")/$(basename "$1");
  if [ -h "$FILE" ]; then
    cd $(dirname "$1")
    canonical_readlink $(readlink "$FILE");
  else
    cd "${1%/*}" && pwd -P;
  fi
}
COUCHDB_BIN_DIR=$(canonical_readlink "$0")
ERTS_BIN_DIR=$COUCHDB_BIN_DIR/../
ROOTDIR=${ERTS_BIN_DIR%/*}
START_ERL=$(cat "$ROOTDIR/releases/start_erl.data")
ERTS_VSN=${START_ERL% *}
APP_VSN=${START_ERL#* }
BINDIR=$ROOTDIR/erts-$ERTS_VSN/bin

PROGNAME=${0##*/}
VERBOSE=""
DEFAULT_NODE="couchdb@127.0.0.1"
LHOST=127.0.0.1

ARGS_FILE="${COUCHDB_ARGS_FILE:-$ROOTDIR/etc/vm.args}"

# If present, extract cookie from ERL_FLAGS
# This is used by the CouchDB Dockerfile and Helm chart
NODE=$(echo "$ERL_FLAGS" | sed 's/^.*name \([^ ][^ ]*\).*$/\1/g')
if test -f "$ARGS_FILE"; then
# else attempt to extract from vm.args
  ARGS_FILE_COOKIE=$(awk '$1=="-name"{print $2}' "$ARGS_FILE")
  NODE="${NODE:-$ARGS_FILE_COOKIE}"
fi
NODE="${NODE:-$DEFAULT_NODE}"

# If present, extract cookie from ERL_FLAGS
# This is used by the CouchDB Dockerfile and Helm chart
COOKIE=$(echo "$ERL_FLAGS" | sed -r '
  s/.*-setcookie[ ]*['\''](.*)['\''].*/\1/
  s/.*-setcookie[ ]*["](.*)["].*/\1/
  s/.*-setcookie[ ]*([^ ]*).*/\1/
')
if test -f "$ARGS_FILE"; then
# else attempt to extract from vm.args
  ARGS_FILE_COOKIE=$(awk '$1=="-setcookie"{st=index($0," "); print substr($0,st+1)}' "$ARGS_FILE" | tr -d \" | tr -d \')
  COOKIE="${COOKIE:-$ARGS_FILE_COOKIE}"
fi

printHelpAndExit() {
  echo "Usage: ${PROGNAME} [OPTION]... [-- <additional Erlang cli options>]"
  echo "  -c cookie         specify shared Erlang cookie"
  echo "  -l HOST           specify remsh's host name (default: 127.0.0.1)"
  echo "  -m                use output of \`hostname -f\` as remsh's host name"
  echo "  -n NAME@HOST      specify couchdb's Erlang node name (-name in vm.args)"
  echo "  -v                verbose; print invocation line"
  echo "  -t path/to/conf   enable TLS distribution (customize in vm.args)"
  echo "  -h                this help message"
  exit
}

while getopts ":hn:c:l:mvt:" optionName; do
  case "$optionName" in
    h)
      printHelpAndExit 0
      ;;
    n)
      NODE=$OPTARG
      ;;
    c)
      COOKIE=$OPTARG
      ;;
    l)
      LHOST=$OPTARG
      ;;
    m)
      LHOST=$(hostname -f)
      ;;
    v)
      VERBOSE=0
      ;;
    t)
      TLSCONF=$OPTARG
      if [ ! -f "$TLSCONF" ]; then
        echo "ERROR: Could't find the file \"$TLSCONF\"." >&2
        exit 1
      fi
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      printHelpAndExit 0
      ;;
  esac
done

shift $((OPTIND - 1))

if [ ! -z "$VERBOSE" ]; then
  # cheap but it works
  set -x
fi

# If present, strip -name or -setcookie from ERL_FLAGS
# to avoid conflicts with the cli parameters
ERL_FLAGS_CLEAN=$(echo "$ERL_FLAGS" | sed -r '
  s/-setcookie[ ]*['\''].*['\'']//
  s/-setcookie[ ]*["].*["]//
  s/-setcookie[ ]*[^ ]*//
  s/-name[ ]*[^ ]*//
')

if [ -z "${COOKIE}" ]; then
    echo "No Erlang cookie could be found, please specify with -c" >&2
    exit 1
fi

if [ -z "$TLSCONF" ]; then
  exec env ERL_FLAGS="$ERL_FLAGS_CLEAN" "$BINDIR/erl" -boot "$ROOTDIR/releases/$APP_VSN/start_clean" \
      -name remsh$$@$LHOST -remsh $NODE -hidden -setcookie "$COOKIE" \
      "$@"
else
  exec env ERL_FLAGS="$ERL_FLAGS_CLEAN" "$BINDIR/erl" -boot "$ROOTDIR/releases/$APP_VSN/start_clean" \
      -name remsh$$@$LHOST -remsh $NODE -hidden -setcookie "$COOKIE" \
      -proto_dist inet_tls -ssl_dist_optfile $TLSCONF \
      "$@"
fi
