#!/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: Couldn'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
