#! /bin/bash -e
#
# Must be called from DIP_HOME/bin
#
# Performs various maintenance/administrative tasks on DSS
# Preconditions :
#  - DIP_HOME/bin/env-default.sh must contain the DKUINSTALLDIR
#  - Python environment must be functional
#  - Java environment must be functional

me=$(basename "$0")
BINDIR=$(cd "$(dirname "$0")" && pwd -P)
export DIP_HOME=$(dirname "$BINDIR")


Usage() {
	echo >&2 "Usage: $me ACTION [ARGUMENT ...]
Actions:
	install-monitoring-integration -graphiteServer HOSTNAME:PORT [-prefix PREFIX] [-pkg LOCAL_COLLECTD_PACKAGE]
	regenerate-config
	run-diagnosis [OPTIONS] OUTPUT_FILE
	encrypt-password PASSWORD
	verify-installation-integrity
	init-db
"
	exit 1
}

# Log output to installation log file unless specified
if [ "$1" = "-noLog" ]; then
	logFile=
	shift
else
	logFile="$DIP_HOME"/run/install.log
fi

if [ $# -eq 0 ]; then
	Usage
fi
cmdLine="$0 $@"
ACTION="$1"
shift

if [ $(id -u) -eq 0 -a "$ACTION" != "install-impersonation" ]; then
#	echo >&2 "*** $me: running DSS under superuser account is not supported."
	echo >&2 "*** $me: running Dataiku Govern under superuser account is not supported."
	exit 1
fi

# Load basic environment only (not env-hadoop/env-spark/env-site)
source "$BINDIR"/env-default.sh
if [ -z "$DKUINSTALLDIR" ]
then
	echo >&2 "FATAL: DKUINSTALLDIR is not defined. Please check $DIR/env-default.sh"
	exit 1
fi

if [ "x$DEV_MODE" = "x" ] || [ "x$DEV_MODE" = "xFalse" ]
then
	DKUSCRIPTS_PATH="$DKUINSTALLDIR/scripts"
	DKUSCRIPTS_STUDIO_PATH="$DKUSCRIPTS_PATH"
else
	echo "dssadmin running in DEV_MODE"
	DKUSCRIPTS_PATH="$DKUINSTALLDIR/packagers"
	DKUSCRIPTS_STUDIO_PATH="$DKUSCRIPTS_PATH/studio/scripts"
fi

source "$DKUSCRIPTS_STUDIO_PATH/_startup.inc.sh"

bkdl_set_global_env
bkdl_set_py_env
bkdl_set_java_home

##############################################
# Actions definitions
##############################################

# Regenerate the env-default.sh
function generate_env_default() {
    echo "[+] Generating default env file"
    cp -p "$BINDIR"/env-default.sh "$BINDIR"/env-default.sh.BAK
    "$DKUPYTHONBIN" "$DKUSCRIPTS_PATH"/dkuinstall/envfiles.py -save
    rm -f "$BINDIR"/env-default.sh.BAK
}

function generate_supervisor_config() {
	echo "[+] Generating supervisor configuration"
	# Load Hadoop specific environment if any
	if [ -f "$BINDIR"/env-hadoop.sh ]; then
  		source "$BINDIR"/env-hadoop.sh
	fi
	mkdir -p "$DIP_HOME"/install-support
	"$DKUPYTHONBIN" "$DKUSCRIPTS_PATH"/dkuinstall/supervisor_config.py \
		>"$DIP_HOME"/install-support/supervisord.conf
	if [ -z "$DKU_DSSADMIN_NO_CHMOD_SUPERVISORD" ]
	then
		chmod 600 "$DIP_HOME"/install-support/supervisord.conf
	fi
}

function generate_nginx_config() {
	echo "[+] Generating nginx configuration"
	mkdir -p "$DIP_HOME"/install-support
	mkdir -p "$DIP_HOME"/run/nginx
	"$DKUSCRIPTS_PATH"/_check-tls-config.sh
	ECDH_CURVES=$("$DKUSCRIPTS_PATH"/_find-ecdh-curves.sh)
	"$DKUPYTHONBIN" "$DKUINSTALLDIR"/scripts/dkuinstall/nginx_config.py --ecdh-curves "$ECDH_CURVES" >"$DIP_HOME"/install-support/nginx.conf
}

function generate_collectd_config() {
  collectd_enabled=$("$DKUPYTHONBIN" "$DKUSCRIPTS_PATH"/dkuinstall/install_config.py -getbool collectd enabled)
  if [ "$collectd_enabled" -eq 1 ]; then
    echo "[+] Generating collectd configuration"
    "$DKUPYTHONBIN" "$DKUSCRIPTS_PATH"/dkuinstall/collectd_config.py >"$DIP_HOME"/install-support/collectd.conf
  fi
}

function regenerate_config () {
	generate_env_default
	source "$BINDIR"/env-default.sh
	generate_supervisor_config
	generate_nginx_config
  generate_collectd_config
}

function verify_installation_integrity() {
#    bkdl_set_R_libs

    if [ -z "$logFile" ]; then
        "$DKUPYTHONBIN" "-u" "$DKUSCRIPTS_STUDIO_PATH/_installation-verifier.py" "$@"
    else
        logBanner
        set -o pipefail
        "$DKUPYTHONBIN" "-u" "$DKUSCRIPTS_STUDIO_PATH/_installation-verifier.py" "$@" 2>&1 | tee -a "$logFile"
    fi
}

function logBanner() {
	echo "[+] Saving installation log to $logFile"
	cat >>"$logFile" <<EOF
*********************************************************
Dataiku Govern admin tool: $(date +%Y/%m/%d-%H:%M:%S)
Command line: $cmdLine
DIP_HOME: $DIP_HOME

EOF
}

##############################################
# Main
##############################################

case "$ACTION" in
	install-monitoring-integration)
		# This one is complex, so it's in a separate file
		if [ -z "$logFile" ]; then
			"$DKUSCRIPTS_STUDIO_PATH"/_install-monitoring-integration-govern.sh "$@"
			regenerate_config
		else
			logBanner
			set -o pipefail
			"$DKUSCRIPTS_STUDIO_PATH"/_install-monitoring-integration-govern.sh "$@" 2>&1 | tee -a "$logFile"
      regenerate_config 2>&1 | tee -a "$logFile"
		fi
		;;
	regenerate-config)
		if [ -z "$logFile" ]; then
			regenerate_config
		else
			logBanner
			set -o pipefail
			regenerate_config 2>&1 | tee -a "$logFile"
		fi
		;;

	verify-installation-integrity)
		verify_installation_integrity "$@"
		;;

	run-diagnosis)
		"$DKUSCRIPTS_STUDIO_PATH/_run_diagnosis_govern.sh" "$@"
		;;

	encrypt-password)
		"$DIP_HOME"/bin/dkugovern encrypt-password $1 2>/dev/null
		;;

	init-db)
		if [ -z "$logFile" ]; then
			"$DIP_HOME"/bin/dkugovern init-db
		else
			logBanner
			set -o pipefail
			"$DIP_HOME"/bin/dkugovern init-db 2>&1 | tee -a "$logFile"
		fi
		;;

	*)
		echo "[-] Unsupported action $ACTION" >&2
		Usage
		;;
esac
