#!/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 -n 's/^.*name \([^ ][^ ]*\).*$/\1/p')
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
