#! /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:
  initial-setup
  create-single-tenant
  create-user
  list-users
  create-personal-api-key (Deprecated. Please use create-named-personal-api-key instead)
  create-named-personal-api-key
  list-personal-api-keys
  delete-personal-api-key
  set-user-password
  register-aws-vpc
  register-azure-vnet
  create-tenant
  regenerate-config
  update-image-list
  create-fm-images-in-gallery
  run-diagnosis [OPTIONS] OUTPUT_FILE
  export-db DB_BACKUP_FOLDER
  import-db DB_BACKUP_FOLDER
"
	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 FM under superuser account is not supported."
	exit 1
fi

# Load basic environment
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
source "$DKUINSTALLDIR/scripts/_startup.inc.sh"
DKUSCRIPTS_PATH="$DKUINSTALLDIR/scripts"

fm_set_global_env
fm_set_py_env

##############################################
# 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" "$DKUINSTALLDIR"/scripts/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" "$DKUINSTALLDIR"/scripts/dkuinstall/supervisor_config.py \
		>"$DIP_HOME"/install-support/supervisord.conf
	chmod 600 "$DIP_HOME"/install-support/supervisord.conf
}

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" "$DKUINSTALLDIR"/scripts/dkuinstall/install_config.py -getbool collectd enabled)
  if [ "$collectd_enabled" -eq 1 ]; then
    echo "[+] Generating collectd configuration"
    "$DKUPYTHONBIN" "$DKUINSTALLDIR"/scripts/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 logBanner() {
	echo "[+] Saving installation log to $logFile"
	cat >>"$logFile" <<EOF
*********************************************************
FM admin tool: $(date +%Y/%m/%d-%H:%M:%S)
Command line: $cmdLine
DIP_HOME: $DIP_HOME

EOF
}

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

case "$ACTION" in
	regenerate-config)
		if [ -z "$logFile" ]; then
			regenerate_config
		else
			logBanner
			set -o pipefail
			regenerate_config 2>&1 | tee -a "$logFile"
		fi
		;;

	update-image-list)
		logBanner
		set -o pipefail
		"$DKUPYTHONBIN" -u "$DKUINSTALLDIR"/scripts/dkuinstall/fm_update_image_list.py "$@" 2>&1 | tee -a "$logFile"
		;;

	create-tenant)
		logBanner
		set -o pipefail
		"$DIP_HOME"/bin/internal-fmcli create-tenant "$@" 2>&1 | tee -a "$logFile"
		;;

	create-single-tenant)
		logBanner
		set -o pipefail
		"$DIP_HOME"/bin/internal-fmcli create-single-tenant "$@" 2>&1 | tee -a "$logFile"
		;;

	create-user)
		logBanner
		set -o pipefail
		"$DIP_HOME"/bin/internal-fmcli create-user "$@" 2>&1 | tee -a "$logFile"
		;;

	list-users)
		logBanner
		set -o pipefail
		"$DIP_HOME"/bin/internal-fmcli list-users "$@" 2>&1 | tee -a "$logFile"
		;;

	create-personal-api-key)
		logBanner
		set -o pipefail
		"$DIP_HOME"/bin/internal-fmcli create-personal-api-key "$@" 2>&1 | tee -a "$logFile"
		;;

	create-named-personal-api-key)
		logBanner
		set -o pipefail
		"$DIP_HOME"/bin/internal-fmcli create-named-personal-api-key "$@" 2>&1 | tee -a "$logFile"
		;;

	list-personal-api-keys)
		logBanner
		set -o pipefail
		"$DIP_HOME"/bin/internal-fmcli list-personal-api-keys "$@" 2>&1 | tee -a "$logFile"
		;;

	delete-personal-api-key)
		logBanner
		set -o pipefail
		"$DIP_HOME"/bin/internal-fmcli delete-personal-api-key "$@" 2>&1 | tee -a "$logFile"
		;;

	set-user-password)
		logBanner
		set -o pipefail
		"$DIP_HOME"/bin/internal-fmcli set-user-password "$@" 2>&1 | tee -a "$logFile"
		;;

	register-aws-vpc)
		logBanner
		set -o pipefail
		"$DIP_HOME"/bin/internal-fmcli register-aws-vpc "$@" 2>&1 | tee -a "$logFile"
		;;

    register-azure-vnet)
        logBanner
        set -o pipefail
        "$DIP_HOME"/bin/internal-fmcli register-azure-vnet "$@" 2>&1 | tee -a "$logFile"
        ;;

    register-gcp-vpc)
        logBanner
        set -o pipefail
        "$DIP_HOME"/bin/internal-fmcli register-gcp-vpc "$@" 2>&1 | tee -a "$logFile"
        ;;

	initial-setup)
		logBanner
		set -o pipefail
		"$DIP_HOME"/bin/internal-fmcli initial-setup "$@" 2>&1 | tee -a "$logFile"
		;;

	run-diagnosis)
	  logBanner
	  set -o pipefail
		"$DKUINSTALLDIR/scripts/_run_diagnosis.sh" "$@"
		;;

	export-db)
	  logBanner
	  set -o pipefail
		"$DKUINSTALLDIR/scripts/_dump_postgres_tables.sh" "$@"
		;;

	import-db)
	  logBanner
	  set -o pipefail
		"$DKUINSTALLDIR/scripts/_reload_postgres_dump.sh" "$@"
		;;
		
	*)
		echo "[-] Unsupported action $ACTION" >&2
		Usage
		;;
esac
