#!/bin/ksh
#
# Component: main
#
# Description:
#  Control script of component main
#

#--- INIT ------------------------------
#needs $HOME
. $HOME/etc/ctrl.main.shi

[ -f $HOME/etc/setenv.sh ] && . $HOME/etc/setenv.sh

#--- FUNC ------------------------------
do_shell_()
{
	MAIN_HOME=$HOME/component/main

	cat <<-EndOfInlineData
		MAIN_HOME=\$HOME/component/main
		MAIN_DATA=\$DATA/main
		LAYOUT_TEMPLATE=\$DATA/layout_template
		LOGIN_TMP=\$TMP/login
		SESSIONTBL=Session
		LDAP_CONF=\$CONF/ldap.conf
		LOGIN_DISABLED_FLAG=\$VAR/login.disabled
	EndOfInlineData

	if [ -f $HOME/etc/product.conf ] ; then
		cat $HOME/etc/product.conf
	else
		cat $MAIN_HOME/product.conf
	fi
} #do_shell_()

do_aftersubmit_()
{
	do_start_

} #do_aftersubmit_

do_crontab_()
{
#
##  Right now we only use LDAP for password checking, so this crontab entry is not needed.
##	If/when we will support using user properties from LDAP (like name, phone numbers, address and email) we should enable this crontab entry again. 
##  In this case ldapUpdate.sh should check the existence of the $LDAP_CONF config file to see if it exists and ldap is enabled. 
##  We should also use runjavacmd instead of direct java call in ldapUpdate.sh to avoid starting a separate java VM. 
#
#	# Get time for starting ldapUpdate.sh from crontabSchedule settings
#	[ -f "$CONF/crontabSchedule.shi" ] && . $CONF/crontabSchedule.shi
#	[ -z "$LDAPUpdate" ] && LDAPUpdate="25 *"
#
#	cat <<-EOI
#		$LDAPUpdate * * * $MAIN_HOME/ldapUpdate.sh >>$LOG/ldapUpdate.log 2>&1
#	EOI
} #do_crontab_()


do_start_()
{
	# check if we need LOGIN_TMP and create it if doesn't exist
	if [ -n "$LOGIN_TMP" ] ; then
		[ ! -d "$LOGIN_TMP" ] && mkdir $LOGIN_TMP
	fi

	# create MAIN_DATA if doesn't exists
	if [ ! -d "$MAIN_DATA" ] ; then
		mkdir $MAIN_DATA
	fi

	# create LAYOUT_TEMPLATE if doesn't exists
	if [ ! -d "$LAYOUT_TEMPLATE" ] ; then
		if [ -d "$DATA/report_template" ] ; then
			mv "$DATA/report_template" "$LAYOUT_TEMPLATE"
			mkdir "$LAYOUT_TEMPLATE/report"
			mv $LAYOUT_TEMPLATE/*.xml "$LAYOUT_TEMPLATE/report/" 2>/dev/null
			mv "$LAYOUT_TEMPLATE/validators" "$LAYOUT_TEMPLATE/report/" 2>/dev/null
		else 
			mkdir $LAYOUT_TEMPLATE
		fi
	fi

	# if data link doesn't exist, create it
	if [ ! -L "$MAIN_HOME/data" ] ; then
		CWD=`pwd`
		cd $MAIN_HOME
		ln -sf $MAIN_DATA data
		cd $CWD
	fi

	# if index.jsp link doesn't exist, create it
	if [ ! -h "$HOME/htdocs/index.jsp" ] ; then
		CWD=`pwd`
		cd $HOME/htdocs/
		ln -sf $MAIN_HOME/index.jsp
		cd $CWD
	fi


	# moves old welcome.htmpi to welcome.html
	if [ ! -f $MAIN_DATA/welcome.html -a -f $MAIN_DATA/welcome.htmpi ] ; then
		mv $MAIN_DATA/welcome.htmpi $MAIN_DATA/welcome.html
	fi

	# if Session table doesn't exist, create it
	# otherwise check USERID's length (must be 15)
	$MYSQL_HOME/bin/mysqlshow $DBNAME $SESSIONTBL >/dev/null 2>/dev/null
	if [ "$?" -ne "0" ] ; then
		$MYSQL_HOME/bin/mysql $DBNAME < $MAIN_HOME/Session.ysql >/dev/null 2>/dev/null
	else
		USERID_LENGTH=`$MYSQL_HOME/bin/mysqlshow $DBNAME $SESSIONTBL | grep USERID | \
		sed 's/^.*(\(.*\)).*$/\1/'`
		if [ -z "$USERID_LENGTH" -o "20" -ne "$USERID_LENGTH" ] ; then
			echo "ALTER TABLE $SESSIONTBL change USERID USERID char(20) binary NOT NULL;" | \
			$MYSQL_HOME/bin/mysql $DBNAME >/dev/null 2>/dev/null
			# MySQL Bug Workaround
			echo "select SID from $SESSIONTBL where SID is null;" | $MYSQL_HOME/bin/mysql $DBNAME 2>/dev/null
		fi

		WSID_FIELD=`$MYSQL_HOME/bin/mysqlshow $DBNAME $SESSIONTBL | grep WSID`
		if [ -z "$WSID_FIELD" ] ; then
			echo "ALTER TABLE $SESSIONTBL DROP PRIMARY KEY;" | \
			$MYSQL_HOME/bin/mysql $DBNAME >/dev/null 2>/dev/null

			echo "ALTER TABLE $SESSIONTBL ADD COLUMN WSID char(255) AFTER IPADDR;" | \
			$MYSQL_HOME/bin/mysql $DBNAME >/dev/null 2>/dev/null

			echo "ALTER TABLE $SESSIONTBL ADD COLUMN OTHERS char(255) AFTER LASTSEEN;" | \
			$MYSQL_HOME/bin/mysql $DBNAME >/dev/null 2>/dev/null

			echo "ALTER TABLE $SESSIONTBL MODIFY COLUMN SID char(24) NOT NULL;" | \
			$MYSQL_HOME/bin/mysql $DBNAME >/dev/null 2>/dev/null
			# MySQL Bug Workaround
			echo "select SID from $SESSIONTBL where SID is null;" | $MYSQL_HOME/bin/mysql $DBNAME 2>/dev/null

			echo "UPDATE $SESSIONTBL SET WSID=IPADDR;" | \
			$MYSQL_HOME/bin/mysql $DBNAME >/dev/null 2>/dev/null

			echo "UPDATE $SESSIONTBL SET SID=USERID;" | \
			$MYSQL_HOME/bin/mysql $DBNAME >/dev/null 2>/dev/null

			echo "DELETE FROM $SESSIONTBL WHERE SIGNOFF is NULL AND SIGNSTAT='P';" | \
			$MYSQL_HOME/bin/mysql $DBNAME >/dev/null 2>/dev/null

			echo "UPDATE $SESSIONTBL SET USERID=SIGNOFF WHERE SIGNSTAT='P';" | \
			$MYSQL_HOME/bin/mysql $DBNAME >/dev/null 2>/dev/null

			# MySQL Bug Workaround
			echo "select SID from $SESSIONTBL where SID is null;" | $MYSQL_HOME/bin/mysql $DBNAME 2>/dev/null
		fi

		hasNdx=`echo "SHOW INDEX FROM $SESSIONTBL;" | $MYSQL_HOME/bin/mysql -N $DBNAME | \
				awk '($2 == "0" && $5 == "SID") {print "OK" }'`
		if [ "$hasNdx" != "OK" ] ; then
			# create unique key on SID
			# remove duplicates first
			echo "select SID from $SESSIONTBL group by SID having count(*)>1;" | \
					$MYSQL_HOME/bin/mysql -N $DBNAME | sed "s/^\(.*\)$/delete from $SESSIONTBL where SID='\1';/" | \
					$MYSQL_HOME/bin/mysql $DBNAME

			echo "ALTER TABLE $SESSIONTBL ADD PRIMARY KEY (SID);" | \
			$MYSQL_HOME/bin/mysql $DBNAME >/dev/null 2>/dev/null

			# MySQL Bug Workaround
			echo "select SID from $SESSIONTBL where SID is null;" | $MYSQL_HOME/bin/mysql $DBNAME 2>/dev/null
		fi

	fi

	[ ! -f "${DOCUMENT_ROOT}/favicon.ico" ] && ln -s "${MAIN_HOME}/favicon.ico" "${DOCUMENT_ROOT}/"

	if [ "$1" = "service" ] ; then
		touch "$LOGIN_DISABLED_FLAG"
		echo "update $SESSIONTBL set SIGNSTAT='N' where SIGNSTAT='Y';" | \
				$MYSQL_HOME/bin/mysql $DBNAME >/dev/null 2>/dev/null
	fi


	# Update link to help files in custom tabs.txt if any
	# This code can be removed for the 6.3 release
	if [ -f "$MAIN_DATA/tabs.txt" -a ! -f "$MAIN_DATA/.tabs.txt.backuphelp" ] ; then
		echo "Check and Covert old custom tabs.txt"
		if grep -q -m 1 "help/index.htm" "$MAIN_DATA/tabs.txt"; then
			echo "  - Update help links in custom tabs.txt"
			sed 's;help/index.htm;help/index.jsp;' "$MAIN_DATA/tabs.txt" > "$MAIN_DATA/.tabs.txt.new"
			mv "$MAIN_DATA/tabs.txt" "$MAIN_DATA/.tabs.txt.backuphelp"
			mv "$MAIN_DATA/.tabs.txt.new" "$MAIN_DATA/tabs.txt"
		fi
	fi

	# Copy web viewer acknowledge 
	
	# If the costumer has a customized acknowledgeWebviewer.html it has priority. If not, the default behavior is to consider the main/acknowledgeWebviewer.html
	if [ ! -f "$MAIN_DATA/acknowledgeWebviewer.html" ] ; then
		ln -s "$MAIN_HOME/acknowledgeWebviewer.html" "$MAIN_DATA/acknowledgeWebviewer.html" 		
	fi

	#create docs directory and link to htdocs
	if [ ! -d ${DATA}/docs ] ; then 
		mkdir ${DATA}/docs
	fi
	if [ ! -h ${DOCUMENT_ROOT}/docs ] ; then
		ln -s ${DATA}/docs ${DOCUMENT_ROOT}/docs
	fi

	#link to dragon_commands & fluency file (only if exists, otherwise delete the dead link)
	if [ -f ${VIEWER_HOME}/dragon_commands.xml ] ; then
		if [ ! -h ${MAIN_HOME}/docs/dragon_commands.xml ] ; then
			ln -s ${VIEWER_HOME}/dragon_commands.xml ${MAIN_HOME}/docs/dragon_commands.xml
		elif [ ! -e "${MAIN_HOME}/docs/dragon_commands.xml" ] ; then
			# Broken link, fix it
			ln -sf ${VIEWER_HOME}/dragon_commands.xml ${MAIN_HOME}/docs/dragon_commands.xml
		fi
	else
		rm -rf ${MAIN_HOME}/docs/dragon_commands.xml
	fi

	if [ -f ${VIEWER_HOME}/FluencyDirect-RadiologyRecognizer.msi ] ; then
		if [ ! -h ${MAIN_HOME}/docs/FluencyDirect-RadiologyRecognizer.msi ]  ; then
			ln -s ${VIEWER_HOME}/FluencyDirect-RadiologyRecognizer.msi ${MAIN_HOME}/docs/FluencyDirect-RadiologyRecognizer.msi
		elif [ ! -e "${MAIN_HOME}/docs/FluencyDirect-RadiologyRecognizer.msi" ] ; then
			ln -sf ${VIEWER_HOME}/FluencyDirect-RadiologyRecognizer.msi ${MAIN_HOME}/docs/FluencyDirect-RadiologyRecognizer.msi
		fi
	else
		rm -rf ${MAIN_HOME}/docs/FluencyDirect-RadiologyRecognizer.msi
	fi


} # do_start_()


do_stop_()
{
	[ -f "$LOGIN_DISABLED_FLAG" ] && rm -fr $LOGIN_DISABLED_FLAG
}


#
# List files/tables to be backed up grouped by categories
#
# output lines should be in '<category> <type> <names>' format
#
do_listbackup_()
{
	shMessages="messages"
	addFiles=""
	for f in `find ${MAIN_DATA} -mindepth 1 -maxdepth 1 | grep -v -e "\<$shMessages\>"` ; do
		addFiles="$addFiles ${f#$HOME/}"
	done

	[ -n "$addFiles" ] && echo "config.main FILE $addFiles"
	
	cat <<-EOFLISTBACKUP
		data.main FILE ${MAIN_DATA#$HOME/}/$shMessages
		config.attachment FILE ${ATTACHMENT_DATA#$HOME/}
		config.xml.report FILE ${LAYOUT_TEMPLATE#$HOME/}/report
		config.xml.notification FILE ${LAYOUT_TEMPLATE#$HOME/}/notification
		config.system FILE ${CONF#$HOME/}/passwd.conf
		config.users FILE ${LDAP_CONF#$HOME/}
		nobackup.nobackup FILE ${LOGIN_DISABLED_FLAG#$HOME/}
		nobackup.nobackup DATABASE $SESSIONTBL
	EOFLISTBACKUP
}


#--- MAIN ------------------------------
check_action_ $1
if [ 0 = $? ]; then
	cmd=$1
	shift
	do_${cmd}_ "$@"

else
	echo "--- Component main [ctrl $$]: Bad command: $1" >&2
	exit 1

fi
