#!/bin/bash

###################################################################
#                                                                 #
# (c) Copyright HCL Technologies Ltd. 2022. All rights reserved.  #
#                                                                 #
################################################################### 

# 
# USAGE:  ./install [silent]
# 
# If "silent" argument is included this script will gather response information from the installer.properties file. 
# 
#  Make sure we're running from the install script directory
#
	SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
	echo "Changing to folder: $SCRIPT_DIR"
	cd $SCRIPT_DIR
#
# VERIFY RUNNING WITH ELEVATED PRIVILEGES 
if [ "$EUID" -ne 0 ]; then 
	echo ""
	echo "**********************************"
    echo " Please run as root"
	echo " Installation aborted.  "
	echo "**********************************"
	echo "" && exit 1 
fi


#DEFAULT VALUES 
DOMINO_PROGRAM_DIRECTORY="/opt/hcl/domino"
DOMINO_DATA_DIRECTORY=""

# CHECK IF SILENT 
SILENT=0
PROPERTIES_SOURCE="installer.properties" 
PROPERTY_TEMP="/tmp/volt_installer.tmp"
rm -rf $PROPERTY_TEMP 

PROPERTY_FILE="/tmp/volt_installer.properties"
rm -rf $PROPERTY_FILE 

if [ -z "$1" ]; then
	clear 
else 
	if [[ "$1" == "silent" ]]; then
		SILENT=1
		egrep -v '(^[[:space:]]*#|^[[:space:]]*$)' $PROPERTIES_SOURCE > $PROPERTY_TEMP 
		tr -d '\r' < $PROPERTY_TEMP > $PROPERTY_FILE
		ACCEPT_LICENSE=$(cat $PROPERTY_FILE | grep 'ACCEPT_LICENSE' | cut -d'=' -f2)
		if [ "$ACCEPT_LICENSE" != "true" ]; then
			echo ""
			echo "**********************************"
			echo " License NOT ACCEPTED."
			echo " ACCEPT_LICENSE value is not enabled in ""$PROPERTIES_SOURCE"
			echo "**********************************"
			echo "Installation Aborted" && exit 1 
			echo "" 
		fi
		
		DOMINO_LATEST_DIRECTORY=$(cat $PROPERTY_FILE | grep 'DOMINO_PROGRAM_DIRECTORY' | cut -d'=' -f2)
		DOMINO_DATA_DIRECTORY=$(cat $PROPERTY_FILE | grep 'DOMINO_DATA_DIRECTORY' | cut -d'=' -f2)

		DOMINO_USER=$(cat $PROPERTY_FILE | grep 'LINUX_USER_NAME' | cut -d'=' -f2)
		DOMINO_GROUP=$(cat $PROPERTY_FILE | grep 'LINUX_GROUP_NAME' | cut -d'=' -f2)
		
		IFS='/'
		read -ra CHUNKS <<< "$DOMINO_LATEST_DIRECTORY"
		DOMINO_PROGRAM_DIRECTORY=""
		for i in "${CHUNKS[@]}"; do 
			LEN=${#i}
			if [[ $LEN -ge 3 ]]; then 
				DOMINO_PROGRAM_DIRECTORY="$DOMINO_PROGRAM_DIRECTORY""/$i"
				DATAFILE=$DOMINO_PROGRAM_DIRECTORY"/.install.dat" 
				if [ -f "$DATAFILE" ]; then 			
					break 
				fi 
			fi 
		done 
	fi 
fi

if [ -z "$DOMINO_PROGRAM_DIRECTORY" ]; then 
	DOMINO_PROGRAM_DIRECTORY="/opt/hcl/domino"
fi 

LOGFILE="/var/log/leap_install_$(date +"%Y%m%d.%H%M").log" 
if [[ "$SILENT" -eq 0 ]]; then
	echo ""
	echo "**********************************"
	echo "**********************************"
	echo "*  HCL Domino Leap Installation  *"
	echo "**********************************"
	echo "**********************************"
	echo ""
	echo " This will install HCL Domino Leap on this server."
	echo "" 
	read -p " Do you accept the terms of the associated HCL Domino Leap license agreement? " -n 1 -r
	echo ""
	if [[ ! $REPLY =~ ^[Yy]$ ]]; then
		[[ "$0" == "$BASH_SOURCE" ]] && exit 1 || return 1 # handle exits from shell or function but don't exit interactive shell
	fi
	

	# REF: "redirect COPY of stdout to log file from within bash script itself"
	# @see https://stackoverflow.com/questions/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself
	# Redirect stdout ( > ) into a named pipe ( >() ) running "tee"
	# Without this, only stdout would be captured - and log file would not contain any error messages.
	exec > >(tee -i "$LOGFILE")
	exec 2>&1
	echo ""
	echo "############################################################"
	echo "# LOG FILE for automated installation of HCL Domino Leap   #"
	echo "############################################################"
	clear 
	echo ""
	echo "**********************************"
	echo "**********************************"
	echo "*  HCL Domino Leap Installation  *"
	echo "**********************************"
	echo "**********************************"
	echo ""

	echo " License Agreement Accepted by "$SUDO_USER 
	#DOMINO_PROGRAM_DIRECTORY
	echo ""
	echo -e " HCL Domino Program Directory [$DOMINO_PROGRAM_DIRECTORY]: \c "
	read value
	if [ -z $value ]; then
		echo " 	using default value: $DOMINO_PROGRAM_DIRECTORY"
	else 
		DOMINO_PROGRAM_DIRECTORY=$value
	fi
else 	
	# redirect stdout and stderr to logfile 
	# Without this, only stdout would be captured - and log file would not contain any error messages.
#	exec > >(tee -i "$LOGFILE")
	exec >> "$LOGFILE"
	exec 2>&1
	echo ""
	echo "############################################################"
	echo "# LOG FILE for automated installation of HCL Domino Leap"
	echo "############################################################"
	echo "" 
fi 


DOMINO_BIN_DIRECTORY="${DOMINO_PROGRAM_DIRECTORY}/bin" 
if [ ! -f "${DOMINO_BIN_DIRECTORY}/server" ]; then
	echo ""
	echo "**********************************"
    echo " Invalid HCL Domino Server Binary Directory."
	echo " Failed to find server executable in ""$DOMINO_BIN_DIRECTORY"
	echo "**********************************"
	exec &>/dev/tty && echo "Installation Aborted - check log $LOGFILE." && exit 1 
fi

#DATAFILE CONTENT
DATAFILE="$DOMINO_PROGRAM_DIRECTORY""/.install.dat" 
echo "processing ""$DATAFILE"

if [ -f "$DATAFILE" ]; then 
	# Get Group and User 
	echo ""
	echo "$DATAFILE"" contents" 
	while read -r line 
	do 
		if [[ "$line" == *"="* ]]; then 
			NAME=${line%%=*}
			NAME="${NAME#"${NAME%%[![:space:]]*}"}"
			NAME="${NAME%"${NAME##*[![:space:]]}"}" 

			VALUE=${line#*=}
			VALUE="${VALUE#"${VALUE%%[![:space:]]*}"}"
			VALUE="${VALUE%"${VALUE##*[![:space:]]}"}" 
			
			case $NAME in 
				data_UNIX_group) 
					DOMINO_GROUP=${VALUE//\"/} 
					;;
					
				data_UNIX_user)
					DOMINO_USER=${VALUE//\"/} 
					;;
			esac 
		fi 
	done < "$DATAFILE"	

	if [ -z "$DOMINO_DATA_DIRECTORY" ]; then 
		# Read the entire file into a single string, replace new lines with spaces 
		TEMP=$(tr '\n' ' ' <"$DATAFILE") 		
		leftbrace="{"	

		# include only text after the searchfor text 
		searchfor=" data_directories "$leftbrace 
		TEMP=${TEMP#*$searchfor}
		
		# include only text prior to the first found left brace 
		TEMP=${TEMP%%$leftbrace*}

		# remove leading and trailing whitespace
		TEMP="${TEMP#"${TEMP%%[![:space:]]*}"}"
		TEMP="${TEMP%"${TEMP##*[![:space:]]}"}" 

		# remove quote characters
		TEMP=${TEMP//\"/}
		
		# set the directory 
		DOMINO_DATA_DIRECTORY="$TEMP" 
	fi 
else 
	echo "$DATAFILE"" not found"
fi 	

if [[ "$SILENT" -eq 0 ]]; then 
	echo ""
	echo -e " HCL Domino Data Directory [$DOMINO_DATA_DIRECTORY]: \c "
	read value
	if [ -z "$value" ]; then
		echo " 	using default value: $DOMINO_DATA_DIRECTORY"
	else 
		DOMINO_DATA_DIRECTORY=$value
	fi 
fi 

#
#  Verify the bundles folder was unpacked and files exist where we expect
CHKFILE="../bundles/*jar"
if [ "$(ls $CHKFILE 2>/dev/null)" == "" ] ; then
        echo "**********************************"
		echo " Bundles folder does not contain necessary jar files."
		echo " Installation kit does not appear to be unpacked correctly."
		echo "**********************************"
        exec &>/dev/tty && echo "Installation Aborted - check log $LOGFILE." && exit 1 
fi

if [ -z "$DOMINO_DATA_DIRECTORY" ]; then 
	echo ""
	echo "**********************************"
    echo " Invalid HCL Domino Data Directory"
	echo " HCL Domino Data Directory cannot be determined. "
	echo "**********************************"
	exec &>/dev/tty && echo "Installation Aborted - check log $LOGFILE." && exit 1 
fi 	

if [[ ! -f "$DOMINO_DATA_DIRECTORY/names.nsf" ]]; then
	echo ""
	echo "**********************************"
    echo " Invalid HCL Domino Data Directory. "
	echo " Cannot find names.nsf in ""$DOMINO_DATA_DIRECTORY"
	echo "**********************************"
	exec &>/dev/tty && echo "Installation Aborted - check log $LOGFILE." && exit 1 
fi

if [[ -f "$DOMINO_DATA_DIRECTORY/~notes.lck" ]]; then
	echo ""
	echo "**********************************"
	echo " WARNING:  File ~notes.lck indicates"
	echo " the Domino server may still be running."
	echo "**********************************"
	exec &>/dev/tty && echo "Installation Aborted - check log $LOGFILE." && exit 1 
fi

if [ -z "$DOMINO_USER" ]; then 
	DOMINO_USER="notes"
fi 
if [ -z "$DOMINO_GROUP" ]; then 
	DOMINO_GROUP="notes"
fi 

if [[ "$SILENT" -eq 0 ]]; then 
	#DOMINO_USER 
	echo ""
	echo -e " HCL Domino User [$DOMINO_USER]: \c "
	read value
	if [ -z $value ]; then
		echo " 	using default value: $DOMINO_USER"
	else 
		DOMINO_USER=$value
	fi

	#DOMINO_GROUP  
	echo ""
	echo -e " HCL Domino Group [$DOMINO_GROUP]: \c "
	read value
	if [ -z $value ]; then
		echo " 	using default value: $DOMINO_GROUP"
	else 
		DOMINO_GROUP=$value
	fi

	# strip any quotes out of Domino User and Group
	DOMINO_USER=${DOMINO_USER//\"/}
	DOMINO_GROUP=${DOMINO_GROUP//\"/}

	echo ""
	echo ""
	echo "**********************************"
	echo " HCL Domino Leap Environment "
	echo "**********************************"
	echo " HCL Domino User: 	"$DOMINO_USER
	echo " HCL Domino Group: 	"$DOMINO_GROUP
	echo " Program Directory: 	""$DOMINO_PROGRAM_DIRECTORY"
	echo " Data Directory: 	""$DOMINO_DATA_DIRECTORY"
	echo ""
	read -p " Proceed with installation? " -n 1 -r
	echo ""
	if [[ ! $REPLY =~ ^[Yy]$ ]];
	then
		[[ "$0" == "$BASH_SOURCE" ]] && exit 1 || return 1 # handle exits from shell or function but don't exit interactive shell
	fi
	echo " Proceeding with installation by "$SUDO_USER 
	clear 
else 
	# strip any quotes out of Domino User and Group
	DOMINO_USER=${DOMINO_USER//\"/}
	DOMINO_GROUP=${DOMINO_GROUP//\"/}
	
	echo "**********************************"
	echo " HCL Domino Leap Environment "
	echo "**********************************"
	echo " HCL Domino User: 	"$DOMINO_USER
	echo " HCL Domino Group: 	"$DOMINO_GROUP
	echo " Program Directory: 	""$DOMINO_PROGRAM_DIRECTORY"
	echo " Data Directory: 	""$DOMINO_DATA_DIRECTORY"
	echo " License Accepted per setting in ""$PROPERTIES_SOURCE"
fi 

echo "" 
echo "**********************************"
echo " Beginning Configuration" 
echo "**********************************"
echo "" 

OSGI_FOLDER=$DOMINO_PROGRAM_DIRECTORY"/notes/latest/linux/osgi"
OSGI_VOLT_FOLDER=$OSGI_FOLDER"/volt"
PLUGINS_FOLDER=$OSGI_VOLT_FOLDER"/eclipse/plugins"
TEMPLATES_FOLDER=$DOMINO_DATA_DIRECTORY"/volt"
LINKS_FOLDER=$OSGI_FOLDER"/rcp/eclipse/links"
LINK_PATH=$OSGI_FOLDER"/volt"
LINK_FILE=$LINKS_FOLDER"/volt.link" 

if [[ -d "$OSGI_VOLT_FOLDER" ]]; then
  echo "$(date "+%T.%3N"): Removing OSGI content from previous HCL Domino Leap installation."
  rm -rf "$OSGI_VOLT_FOLDER"
fi

if [[ ! -d "$PLUGINS_FOLDER" ]]; then
	mkdir -p "$PLUGINS_FOLDER" 
	echo "$(date "+%T.%3N"): Created folder: ""$PLUGINS_FOLDER"
fi 

if [[ ! -d "$LINKS_FOLDER" ]]; then
	mkdir -p "$LINKS_FOLDER" 
	echo "$(date "+%T.%3N"): Created folder: ""$LINKS_FOLDER"
fi 

if [[ ! -d "$TEMPLATES_FOLDER" ]]; then
	mkdir -p "$TEMPLATES_FOLDER" 
	echo "$(date "+%T.%3N"): Created folder: ""$TEMPLATES_FOLDER"
fi 
echo ""

cd ../bundles
echo "$(date "+%T.%3N"): Copying bundles to ""$PLUGINS_FOLDER"
for filename in * ; 
do
	\cp -a "$filename" "$PLUGINS_FOLDER"
	echo " 	$(date "+%T.%3N"): ""$filename"
done
echo "$(date "+%T.%3N"): Copy completed."
echo "" 

if [[ -f "$LINK_FILE" ]]; then
	echo "$(date "+%T.%3N"): Replacing Link File: ""$LINK_FILE"
else 
	echo "$(date "+%T.%3N"): Creating Link File: ""$LINK_FILE"
fi 
echo 'path='"$LINK_PATH" > "$LINK_FILE"

echo "$(date "+%T.%3N"): Setting permissions for templates and preview folder"
echo -n " 	$(date "+%T.%3N"): " && chmod -v 755 "$TEMPLATES_FOLDER"

echo ""
cd ../templates 
echo "$(date "+%T.%3N"): Setting permissions for templates."
for filename in * ; 
do
	echo -n " 	$(date "+%T.%3N"): " && chmod -v 644 "$filename"
done

# chmod -vR 644 *

echo ""
echo "$(date "+%T.%3N"): Copying templates to ""$TEMPLATES_FOLDER"
for filename in * ; 
do
	\cp -a "$filename" "$TEMPLATES_FOLDER"
	echo " 	$(date "+%T.%3N"): ""$filename"
done
echo "$(date "+%T.%3N"): Copy completed."

echo ""
echo "$(date "+%T.%3N"): Setting owner of "$TEMPLATES_FOLDER" to "$DOMINO_USER:$DOMINO_GROUP
chown -R $DOMINO_USER:$DOMINO_GROUP "$TEMPLATES_FOLDER"
echo "$(date "+%T.%3N"): Ownership set."

#
#  These are the folders and files added to the program osgi folders
#  by this installer.  If someone has altered the default permissions
#  for files created by root, these may not be correct in all cases.
#  specifically the links file itself since it is created not copied.
#  this section will set the permission correctly.
#
echo ""
echo "$(date "+%T.%3N"): Setting permissions on plugin and link folders"

echo -n " 	$(date "+%T.%3N"): " && chmod -v 755 "$OSGI_VOLT_FOLDER"
echo -n " 	$(date "+%T.%3N"): " && chmod -v 755 "$LINKS_FOLDER"
echo -n " 	$(date "+%T.%3N"): " && chmod -v 644 "$LINK_FILE"
echo -n " 	$(date "+%T.%3N"): " && chmod -v 755 "$PLUGINS_FOLDER"

echo ""
cd "$PLUGINS_FOLDER"
echo "$(date "+%T.%3N"): Setting permissions for plugin files."
for filename in * ; 
do
	echo -n " 	$(date "+%T.%3N"): " && chmod -v 644 "$filename"
done

echo "$(date "+%T.%3N"): Permissions set."

echo "" 
echo "############################################################"
echo " HCL Domino Leap Installation Completed"
echo "############################################################"
echo "" 

# Stop logging and redirect output to the console.
exec &>/dev/tty 
if [[ "$SILENT" -eq 0 ]]; then
	clear 
	echo ""
	echo "**********************************"
	echo "**********************************"
	echo "*  HCL Domino Leap Installation  *"
	echo "**********************************"
	echo "**********************************"
	echo ""
	echo " HCL Domino Leap Installation Completed"
	echo " Log File: $LOGFILE"
	echo "" 
else 
	echo "HCL Domino Leap Installation Completed.  Log File: $LOGFILE"
fi 


