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

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

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

#--- FUNC ------------------------------
do_shell_()
{
	XVFB_DISPLAY=`if [ develop = \$USER ]; then echo ":98"; else echo ":99"; fi`
	cat <<-EndOfInlineData
		CASES_HOME=$HOME/component/cases
		FILTER_DATA=\$DATA/filter
		IMAGE_TMP=\$DATA/tmp
		IMAGE_DATA=\$DATA/image
		STUDY_DATA=\$DATA/study
		DICOM_DATA=\$DATA/dicom
		HASHED_DICOM_DATA=\$DICOM_DATA.hashed
		REPOSITORY_DICOM_DATA=\$DICOM_DATA.repository
		REPOSITORY_DATA_DICOM=\$REPOSITORY_DICOM_DATA
		USERS_DATA=\$DATA/users
		REPOSITORY_USERS=\$DATA/users.repository
		LOCK_VAR=\$VAR/lock
		PROCESSED=\$VAR/processed
		HASHED_PROCESSED=\$PROCESSED.hashed
		REPOSITORY_PROCESSED=\$PROCESSED.repository
		CACHE=\$VAR/cache
		HASHED_CACHE=\$CACHE.hashed
		REPOSITORY_CACHE=\$CACHE.repository
		MINIMAL_CACHE_SIZE=15
		SAFETY_FREE_LIMIT=10
		CACHE_DELNUM=3
		SPIHT_QUALITY=1
		SPIHT_THUMBNAIL_QUALITY=10
		JPG_THUMBNAIL_QUALITY=10
		PBIUIDPREFIX=1.2.826.0.1.3680043.2.93.1.1.1
		PBREPORT_SOPCLASS=1.2.826.0.1.3680043.2.93.1.0.1
		PBREPORT_SOPCLASSTEXT=PracticeBuilderReport
		PBREPORT_SOPCLASSPREFIX=PbR
		PBDICTATION_SOPCLASS=1.2.826.0.1.3680043.2.93.1.0.2
		PBDICTATION_SOPCLASSTEXT=PracticeBuilderDictation
		PBDICTATION_SOPCLASSPREFIX=PbD
		PBR_CURRENT_VERSION="2"
		STORESTATE_CURRENT_VERSION="1"
		TARGETTBL=Target
		STUDYTBL=Dcstudy
		OBJECTTBL=Dcobject
		REPORTTBL=Dcreport
		FIELDSTBL=Dcfields
		TYPESTBL=Dctypes
		FLDNDXTBL=Dcfldndx
		TABLESTBL=Dctables
		CACHETBL=CacheState
		DEVICECATTBL=Dcdevicecat
		ENVTBL=Env
		TRANSACTIONTBL=Dctransaction
		LISTSTBL=Lists
		JOBTBL=Jobs
		SUBJOBTBL=Subjobs
		TASKTBL=Tasks
		CALLBACKURLTBL=CallbackURL
		CALLBACKREGISTRYTBL=CallbackRegistry
		SCHEDULERPATIENTTBL=SchedulerPatient
		SCHEDULERPATIENTINSURERTBL=SchedulerPatientInsurer
		SCHEDULERDEVICETBL=SchedulerDevice
		SCHEDULERFACILITYTBL=SchedulerFacility
		SCHEDULERPROCEDURETBL=SchedulerProcedure
		SCHEDULERDEVPROCTBL=SchedulerDeviceProcedure
		SCHEDULERINSURERTBL=SchedulerInsurer
		SCHEDULERORDERTBL=SchedulerOrder
		SCHEDULERREFERRERTBL=SchedulerReferrer
		SCHEDULERLOGTBL=SchedulerLog
		SCHEDULERORDERREFERRERTBL=SchedulerOrderReferrer
		SCHEDULERORDERINSURERTBL=SchedulerOrderInsurer
		SCHEDULERCOMBPROCTBL=SchedulerCombinedProcedure
		SCHEDULERINTERTBL=SchedulerProcedureInterRelation
		SCHEDULERGENERATEDTBL=SchedulerGeneratedNumbers
		SCHEDULERICD9TBL=SchedulerICD9
		SCHEDULERPROCEDUREICD9TBL=SchedulerProcedureICD9
		UNITTESTTBL0=UnitTest0
		UNITTESTTBL1=UnitTest1
		UNITTESTTBL2=UnitTest2
		UNITTESTTBL3=UnitTest3
		DOCTYPETBL=Doctype
		DOCTYPEGROUPTBL=DoctypeGroup
		DOCTYPEUSERTBL=DoctypeUser
		LOCATIONTBL=Location
		USERLOCATIONTBL=UserLocation
		USERGROUPTBL=UserGroup
		SUMMARYTBL=Summary
		PRACTICETBL=Practice
		USERPRACTICETBL=UserPractice
		GROUPRIGHTSTBL=GroupRights
		USERRIGHTSTBL=UserRights
		GROUPVISIBLEGROUPSTBL=GroupVisibleGroups
		QUERYTIMELIMITTBL=QueryTimeLimit
		FAILEDLOGINTBL=FailedLogin
		PROFILE_FILE=profile.ini
		IMABOX=384
		RIGHTSVERSION=1
		XVFB_DISPLAY=$XVFB_DISPLAY
		XVFB_RUN=\$RUN/xvfb.run
		XVFB_PID=\$RUN/xvfb.pid
		MSGTHREAD=MsgThread
		MSGELEMENT=MsgElement
		MSGTHREADTOGROUPS=MsgThreadToGroups
		MSGTHREADTOUSERS=MsgThreadToUsers
		MSGELEMENTTOTARGET=MsgElementToTarget
		MSGELEMENTACK=MsgElementAcknowledged
		MSGELEMENTNEW=MsgElementNew
		MSGELEMENTDELETED=MsgElementDeleted
		MSGBROADCAST=MsgBroadcast
		MSGBROADCASTTOUSERS=MsgBroadcastToUsers
		MSGBROADCASTACK=MsgBroadcastAcknowledged
		WEBVIEWERSETTINGS=WebViewerSettings
		SEARCHACKNOWLEDGEMENT=SearchAcknowledgement
		SEARCHUSEREFFECTIVERIGHTS=SearchUserEffectiveRights
		USERWORKSTATIONTBL=UserWorkstation
		SERIALIZED_STATISTICS_FILE=\$DATA/query/serializedStatistics.dat
		JOBTRACKERTBL=Jobtracker
		LISTDESCRIPTIONTBL=ListDescription
		LISTSORTTBL=ListSort
		LISTFILTERTBL=ListFilter
		LISTCONDBGTBL=ListConditionBg
		LISTCOMPOUNDTBL=ListCompound
		LISTCELLTBL=ListCell
		LISTCELLFORMATTBL=ListCellFormat
		ACTIONCOMMONTBL=ActionCommon
		ACTIONCOMPTBL=ActionCompress
		ACTIONCOMPDATATBL=ActionCompressData
		ACTIONCOPYTBL=ActionCopy
		ACTIONDELETETBL=ActionDelete
		ACTIONFILTERTBL=ActionFilter
		ACTIONEDITTBL=ActionEdit
		ACTIONFORWARDTBL=ActionForward
		ACTIONNOTIFYTBL=ActionNotify
		ACTIONPREFETCHTBL=ActionPrefetch
		ACTIONPRINTREPTBL=ActionPrintRep
		ACTIONRETRIEVETBL=ActionRetrieve
		ACTIONSTOPSENDINGUPTBL=ActionStopSendingUpdates
		ACTIONSTUDYIDTBL=ActionStudyId
		ACTIONADDSTUDYIDTBL=ActionAddStudyId
		VERSIONHISTORYTBL=VersionHistory
	EndOfInlineData

} #do_shell_()

do_crontab_()
{
	# Get time for starting cron jobs from crontabSchedule settings
	[ -f "$CONF/crontabSchedule.shi" ] && . $CONF/crontabSchedule.shi
	# Default schedule times
	[ -z "$CheckRepositoryOverload" ] && CheckRepositoryOverload="00-58/2 *"
	[ -z "$CheckProcessedRepositoryOverload" ] && CheckProcessedRepositoryOverload="01-41/20 *"
	[ -z "$CheckDataRepositoryOverload" ] && CheckDataRepositoryOverload="11-51/20 *"
	[ -z "$CheckRepositoryStatus" ] && CheckRepositoryStatus="02-57/5 *"
	[ -z "$Actions" ] && Actions="03-58/5 *"
	[ -z "$CheckSpace" ] && CheckSpace="14 02"
	[ -z "$ArchiveTables" ] && ArchiveTables="44 03"
	[ -z "$AutoCorrection" ] && AutoCorrection="07-57/10 *"
	[ -z "$QueryHelper" ] && QueryHelper="01 01"
	[ -z "$AutoUnlockUsers" ] && AutoUnlockUsers="* *"
	[ -z "$CleanFailedLogins" ] && CleanFailedLogins="10 02"
	[ -z "$CheckCacheRepositoryOverloadNight" ] && CheckCacheRepositoryOverloadNight="05 00"
	[ -z "$CheckProcessedRepositoryOverloadNight" ] && CheckProcessedRepositoryOverloadNight="30 00"
	[ -z "$CheckDataRepositoryOverloadNight" ] && CheckDataRepositoryOverloadNight="10 01"
	[ -z "$CalcStudyVolume" ] && CalcStudyVolume="31 00"
	[ -z "$VersionHistory" ] && VersionHistory="0 *"
	[ -z "$CheckWeakPasswords" ] && CheckWeakPasswords="0 34"
	
	cat <<-EOI
		$CheckRepositoryOverload * * * $REPOSITORYHANDLER_HOME/scripts/checkOverload.sh $REPOSITORY_CACHE >/dev/null 2>&1
		$CheckProcessedRepositoryOverload * * * ( . $HOME/etc/setenv.sh ; $REPOSITORYHANDLER_HOME/scripts/checkOverload.sh $REPOSITORY_PROCESSED >/dev/null 2>&1)
		$CheckDataRepositoryOverload * * * ( . $HOME/etc/setenv.sh ; $REPOSITORYHANDLER_HOME/scripts/checkOverload.sh $REPOSITORY_DATA_DICOM >/dev/null 2>&1)
		$CheckRepositoryStatus * * * $CASES_HOME/checkRepositoryStatus.sh >/dev/null
		$Actions * * * $CURL_HOME/bin/curl -s http://$SERVERNAME:$HTTP_PORT/cases/action.jsp >/dev/null
		$CheckSpace * * * $CASES_HOME/checkspace.sh clean >/dev/null 2>&1
		$ArchiveTables * * * $CASES_HOME/archiveTables.sh >/dev/null 2>&1
		$QueryHelper * * * ( . $HOME/etc/setenv.sh ; $JAVA_HOME/bin/java imagemed.runperiodically.QueryDataCollector >/dev/null 2>&1)
		$AutoUnlockUsers * * * $CASES_HOME/checkLockedUsers.sh >/dev/null 2>&1
		$CleanFailedLogins * * * $CASES_HOME/cleanFailedLogins.sh >/dev/null 2>&1
		$CheckCacheRepositoryOverloadNight * * * $REPOSITORYHANDLER_HOME/scripts/checkOverload.sh $REPOSITORY_CACHE night >/dev/null 2>&1
		$CheckProcessedRepositoryOverloadNight * * * ( . $HOME/etc/setenv.sh ; $REPOSITORYHANDLER_HOME/scripts/checkOverload.sh $REPOSITORY_PROCESSED night >/dev/null 2>&1)
		$CheckDataRepositoryOverloadNight * * * ( . $HOME/etc/setenv.sh ; $REPOSITORYHANDLER_HOME/scripts/checkOverload.sh $REPOSITORY_DATA_DICOM night >/dev/null 2>&1)
		$CalcStudyVolume * * * $CASES_HOME/calcStudyVolume.sh  >/dev/null 2>&1
		$VersionHistory * * * ( . $HOME/etc/setenv.sh ; $JAVA_HOME/bin/java com.erad.pacs.toolbox.VersionHistory >/dev/null 2>&1)
		$CheckWeakPasswords * * * $TOOLS_HOME/checkWeakPasswords.sh crontab >/dev/null 2>&1
	EOI

	# Do not add AutoCorrection to cron jobs on a Database server
	ProcessMode="Process"
	[ -f "$CONF/self.rec" ] && . $CONF/self.rec
	[ "$ProcessMode" = "Database" ] && return;
	cat <<-EOAUTOCORRECTION
		$AutoCorrection * * * $TASKD_HOME/runjavacmd -c "0 imagemed.dcprocessing.AutoCorrection" -p $JAVA_SERVER_PORT
	EOAUTOCORRECTION

} #do_crontab_()


# Checks if releasereference.cfg contains handlers
# for cases specific references, and add them if necessery
check_and_add_releasecfg_()
{
	if [ ! -f "${CONF}/releasereference.cfg" ] ; then
		sed "s;\$HOME;$HOME;" ${CASES_HOME}/cfg/releasereference.cfg >> ${CONF}/releasereference.cfg
	else
		# create grep pattern from existing configuration
		GREPP=`awk -vORS=" " '/^#/ {next} ($1 != "") {print "-e ^" $1}' $CONF/releasereference.cfg`
		# make sure that $CONF/releasereference.cfg is writable
		chmod u+w $CONF/releasereference.cfg
		eval "grep -v -e ^# $GREPP $CASES_HOME/cfg/releasereference.cfg" | sed "s;\$HOME;$HOME;" >> $CONF/releasereference.cfg
	fi
}

copy_non_empty_conf()
{
	if [ -s $1 -a ! -e $2 ]; then
		rm $2 2>/dev/null
		cp $1 $2 2>/dev/null
		chmod +w $2
	fi
}

do_start_()
{
	isNewInstall="false"
	[ ! -d "$FILTER_DATA" ] && mkdir $FILTER_DATA 2>/dev/null
	[ ! -d "$IMAGE_TMP" ] && mkdir $IMAGE_TMP 2>/dev/null
	[ ! -d "$IMAGE_DATA" ] && mkdir $IMAGE_DATA 2>/dev/null
	[ ! -d "$STUDY_DATA" ] && mkdir $STUDY_DATA 2>/dev/null
	
	if [ ! -d "$REPOSITORY_DICOM_DATA" ] ; then
		if [ -d "$HASHED_DICOM_DATA" ] ; then
			ln -s "$HASHED_DICOM_DATA" "$REPOSITORY_DICOM_DATA"
		else
			mkdir "$REPOSITORY_DICOM_DATA"
		fi
		touch "$REPOSITORY_DICOM_DATA/repositorypart.cfg"
		if [ -d "$DICOM_DATA" ] ; then
			echo "legacyDir=\"$DICOM_DATA\"" > "$REPOSITORY_DICOM_DATA/repository.cfg"
		else
			touch "$REPOSITORY_DICOM_DATA/repository.cfg"
			[ ! -d "$HASHED_DICOM_DATA" ] && isNewInstall="true"
		fi
	fi

	# set default worklist refresh time to 0 on new installations
	if [ "$isNewInstall" = "true" -a ! -f "$CONF/deflimit.conf" ] ; then
		touch "$CONF/refresh.cfg"
	fi

	# limit.conf should only be created for new installs, since
	# the default of NO_DELETE is changed (v5.2)
	if [ "$isNewInstall" = "true" -a ! -f "$CONF/limit.conf" ] ; then
		cp $CASES_HOME/cfg/limit.conf $CONF/
		chmod +w $CONF/limit.conf
	fi
	
	if [ "$isNewInstall" = "true" -a ! -f "$CONF/gui.conf" ] ; then
		echo 'reportEditor="server"' > $CONF/gui.conf
	fi
	
	# Creating CACHE and PROCESSED
	if [ ! -d "$REPOSITORY_CACHE" ] ; then
		if [ -d "$HASHED_CACHE" ] ; then
			ln -s "$HASHED_CACHE" "$REPOSITORY_CACHE"
		else
			mkdir "$REPOSITORY_CACHE"
		fi
		touch "$REPOSITORY_CACHE/repositorypart.cfg"
		echo "isClearable=\"true\"" > "$REPOSITORY_CACHE/repository.cfg"
		
		fullLim=95
		[ -f "$CONF/limit.conf" ] && . $CONF/limit.conf
		if [ -n ${SAFETY_FREE_LIMIT} ] ; then
			fullLim=$((100 - ${SAFETY_FREE_LIMIT}))
		fi
		echo "fullLimit=\"$fullLim\"" >> "$REPOSITORY_CACHE/repository.cfg"
		moveLim=$(($fullLim - 1))
		echo "moveLimit=\"$moveLim\"" >> "$REPOSITORY_CACHE/repository.cfg"
		cleanLim=$(($moveLim - 1))
		echo "cleanLimit=\"$cleanLim\"" >> "$REPOSITORY_CACHE/repository.cfg"
		switchLim=$(($cleanLim - 1))
		echo "switchLimit=\"$switchLim\"" >> "$REPOSITORY_CACHE/repository.cfg"
		[ -d "$CACHE" ] && rm -rf "$CACHE" 2>/dev/null
	fi

	if [ ! -d "$REPOSITORY_PROCESSED" ] ; then
		if [ -d "$HASHED_PROCESSED" ] ; then
			ln -s "$HASHED_PROCESSED" "$REPOSITORY_PROCESSED"
		else
			mkdir "$REPOSITORY_PROCESSED"
		fi
		touch "$REPOSITORY_PROCESSED/repositorypart.cfg"
		touch "$REPOSITORY_PROCESSED/repository.cfg"
		[ -d "$PROCESSED" ] && rm -rf "$PROCESSED" 2>/dev/null
	fi

	[ ! -d "$USERS_DATA" ] && mkdir $USERS_DATA 2>/dev/null

	if [ ! -d "${REPOSITORY_USERS}" ] ; then
		mkdir "${REPOSITORY_USERS}"
		cat > "${REPOSITORY_USERS}/repository.cfg" <<-EOFUSERSREPOCFG
			legacyDir="${USERS_DATA}"
			maintainLegacyLinks="true"
			followLegacyLinks="true"
		EOFUSERSREPOCFG
		touch "${REPOSITORY_USERS}/repositorypart.cfg"
	fi

	# Creating LOCK_VAR
	[ ! -d "$LOCK_VAR" ] && mkdir $LOCK_VAR 2>/dev/null

	# Remove cachelimit.conf if exists (obsolete)
	[ -f "$CONF/cachelimit.conf" ] && rm $CONF/cachelimit.conf

	# upgrade to v7.1
	#	Force new checkspacerecalc.cfg default (once only)
	if [ ! -f "${DATA}/update_flags/checkSpaceRecalc" ] ; then
		if [ -f "$CASES_HOME/checkspacerecalc.cfg" ] ; then
			chmod +rw $CONF/checkspacerecalc.cfg
			cp $CASES_HOME/checkspacerecalc.cfg $CONF/checkspacerecalc.cfg
			chmod +rw $CONF/checkspacerecalc.cfg
			touch "${DATA}/update_flags/checkSpaceRecalc"
		fi
	fi

	# Check for REPORTTBL before database is fixed up
	NEED_CONVERT="false"
	if $MYSQL_HOME/bin/mysqlshow $DBNAME >/dev/null 2>&1 ; then
		$MYSQL_HOME/bin/mysqlshow $DBNAME $REPORTTBL >/dev/null 2>&1
		[ $? -ne 0 ] && NEED_CONVERT="true"
	fi

	# Update table, field, types and index descriptor tables with PACS, Scheduler and User data
	${CASES_HOME}/updateSqlTables.sh

	# set classpath for java
	CLASSPATH=$CLASSPATH:$HOME/component
	export CLASSPATH

#removed from batch - not needed			imagemed.runonce.AddUserManageRights \

	$JAVA_HOME/bin/java $LOG4J_ARGS imagemed.util.BatchExecute com.erad.pacs.toolbox.VersionHistory \
			${CASES_HOME#$HOME/component/}.ResetLabels \
			imagemed.runonce.AddAdminRelatedRights \
			imagemed.sqltables.SqlUserFieldsAndCopiedTables \
			${CASES_HOME#$HOME/component/}.SqlTables \
			${CASES_HOME#$HOME/component/}.UpdateRights \
			${CASES_HOME#$HOME/component/}.SqlViews \
			${CASES_HOME#$HOME/component/}.ArchiveTables \
			imagemed.runonce.ConvertMatchingCfg \
			${CASES_HOME#$HOME/component/}.CollapseLogEntries \
			${CASES_HOME#$HOME/component/}.ConvertAcknowledge \
			${CASES_HOME#$HOME/component/}.CalcTimeZone \
			imagemed.runonce.FillEmptyTargetHUBInDoctypes \
			imagemed.runonce.ConvertExpired \
			${CASES_HOME#$HOME/component/}.UpdatePwExpDate \
			imagemed.runonce.DeleteEmptyFailedLogins \
			imagemed.runonce.SetDataRepositoryResolver \
			imagemed.runonce.PutObjectlessExplanation \
			imagemed.runonce.SetDataRepositoryWarnmove \
			imagemed.runonce.SetRepoMovetime 
			
	RES=$?
	if [ $RES -ne 0 ] ; then
		echo -ne "\e[31mTerminating the cases/ctrl start process!"
		# For some reason ${ErrorColor} doesn't work here, though I include func.shi (includes color.shi)  
		exit $RES
	fi
				
	CWD=`pwd`
	cd $TMP
	ls | grep storescp_reg | xargs rm 2>/dev/null
	cd $CWD

	# make sure that .forward is set up for bounced mails

	if [ ! -f "$HOME/.forward" -o "`cat $HOME/.forward 2>/dev/null`" = "support@eradimagemedical.com" -o "`cat $HOME/.forward 2>/dev/null`" = "pbserver-medsrv@eradimagemedical.com" ] ; then
		echo "pbserver-medsrv@erad.com" > $HOME/.forward
	fi


	# Check and create $CONF/types for type specific config files
	[ ! -e "$CONF/types" ] && mkdir $CONF/types

	# PurgeLimit setting to large number (using default, 18000) operation 
	# It will happen only once! (flag file)
	if [ ! -f $DATA/update_flags/newPurgeLimit ] ; then
		touch $DATA/update_flags/newPurgeLimit
		if [ -f "$CONF/daily.rec" ]; then
			# checking existing limit.conf file for autopurge ONLY if daily.rec already exists! (if not, daily.rec will be copied below, so we don't have to change it for sure (new install)
			echo "Checking if daily.rec PurgeLimit modification is needed"
			autopurge=""
			while IFS= read -r line || [ -n "$line" ]
			do
				if [[ $line != '#'* ]] ; then 
		  			if [[ $line == *"AUTO_PURGE=\"true\""* || $line == *"AUTO_PURGE=\"true\"" ]]; then
		  			    # the 2nd is because * doesn't include 'nothing there' - meaning without newline or any other character
		  				autopurge="yes"
		  			fi
		  		fi
			done < "$CONF/limit.conf"
			
			if [[ $autopurge != "yes" ]] ; then
				# if it's NOT autopurging at the moment, we remove their custom, so default (18000) will occur
				
				while IFS= read -r line || [ -n "$line" ]
				do
					# we remove the PurgeLimit line 
		  			if [[ $line != *"PurgeLimit"* ]]; then
		  				echo $line >> $TMP/daily.rec
		  			else
						echo "Not AutoPurge, custom PurgeLimit found and removed (default 18000 will be used)"
			  		fi
				done < "$CONF/daily.rec"
				mv $TMP/daily.rec $CONF/daily.rec
				
			else 
				# if it's autopurging at the moment, and there is no custom (# line doesn't count!), we add the old default (7) as a custom value			
				custompurge=""
				while IFS= read -r line || [ -n "$line" ]
				do
					if [[ $line != '#'* && $line == *"PurgeLimit"* ]] ; then
						custompurge="yes" 
			  		fi
				done < "$CONF/daily.rec"
				
				if [[ $custompurge != "yes" ]]; then
					echo "PurgeLimit=\"7\"" >> $CONF/daily.rec
					echo "AutoPurge without custom value, so custom PurgeLimit=\"7\" added for consistency"
				fi 
			fi
		fi 
	fi

	
	# Check existing *.cfg files

	for file in matching.cfg matching2.cfg merge.cfg daily.rec cpt4.cfg icd9.cfg; do
#		echo $file;
		if [ ! -f "$CONF/$file" ] ; then
			cp $CASES_HOME/cfg/$file  $CONF/$file
			chmod +w $CONF/$file
		fi
	done

	# Check and add new fields to merge.cfg
	# INSN - Institution Name
	if ! grep -q ^INSN $CONF/merge.cfg ; then
		awk '($1 == "" || $2 == "") { next; } ( a[ $1 ] == "" ) { print $0; a[ $1 ] = $2; }' $CONF/merge.cfg $CASES_HOME/cfg/merge.cfg > $CONF/merge.cfg.new
		mv $CONF/merge.cfg.new $CONF/merge.cfg
	fi
	# INSA - Institution Address (defaults to the same as INSN)
	if ! grep -q ^INSA $CONF/merge.cfg ; then
		valINSN=$( awk '($1 == "INSN") {print $2; exit}' "$CONF/merge.cfg" 2>/dev/null)
		# Should not happen, but for safety
		[ -z "${valINSN}" ] && valINSN='S'
		cp "$CONF/merge.cfg" $CONF/merge.cfg.new
		echo "INSA ${valINSN}" >> "$CONF/merge.cfg.new"
		cp -p "$CONF/merge.cfg" "$TMP/merge.cfg.bck-$$"
		mv $CONF/merge.cfg.new $CONF/merge.cfg
	fi



	# copy legacy enum type config files to $CONF/types
	copy_non_empty_conf $CONF/cpt4.cfg $CONF/types/CPT4.lst
	copy_non_empty_conf $CONF/icd9.cfg $CONF/types/ICD9.lst
	copy_non_empty_conf $CONF/PHRF.lst $CONF/types/PHRF.lst
	copy_non_empty_conf $CONF/PHPR.lst $CONF/types/PHPR.lst
	
	# Check if releasereference.cfg and necessary entries exists
	check_and_add_releasecfg_

	if [ "$NEED_CONVERT" = "true" ] ; then
		echo "Start converting reports"
		echo "$CASES_HOME/convertreports.sh" | at now
	fi

	# link depolyed custom templates/logos (Crux #21677)
	cd ${CASES_HOME}/report_templates
	mkdir -p $DATA/layout_template/report
	for xml in customTemplate*.xml ; do
		[ ! -e $DATA/layout_template/report/$xml ] && ln -s ${CASES_HOME}/report_templates/$xml $DATA/layout_template/report/$xml 
	done
	# V8-RSNA-2
	[ ! -e $DATA/layout_template/report/V8-RSNA-2.xml ] && ln -s ${CASES_HOME}/report_templates/V8-RSNA-2.xml $DATA/layout_template/report/V8-RSNA-2.xml

	mkdir -p $DATA/layout_template/reportPart
	for xml in PFReportView*.xml ; do
		[ ! -e $DATA/layout_template/reportPart/$xml ] && ln -s ${CASES_HOME}/report_templates/$xml $DATA/layout_template/reportPart/$xml 
	done
	mkdir -p $DATA/layout_template/patientFolder
	for xml in PFMainStructure*.xml ; do
		[ ! -e $DATA/layout_template/patientFolder/$xml ] && ln -s ${CASES_HOME}/report_templates/$xml $DATA/layout_template/patientFolder/$xml 
	done
	mkdir -p $DATA/layout_template/pacsStudy
	for xml in PFStudyDetails*.xml ; do
		[ ! -e $DATA/layout_template/pacsStudy/$xml ] && ln -s ${CASES_HOME}/report_templates/$xml $DATA/layout_template/pacsStudy/$xml 
	done
	
	for subdir in "pacsStudyEdit wvreport report" ; do
		mkdir -p $DATA/layout_template/$subdir
		for xml in $subdir/*.xml ; do
		[ ! -e $DATA/layout_template/$xml ] && ln -s ${CASES_HOME}/report_templates/$xml $DATA/layout_template/$xml 
	done
	done

	for jpg in *.jpg ; do
		[ ! -e $MAIN_DATA/$jpg ] && ln -s ${CASES_HOME}/report_templates/$jpg $MAIN_DATA/$jpg 
	done
	cd $PWD
	
	# Automatically create the Old PACS Logs date (newversion.conf file) when upgrading.
	if [ ! -f "${CONF}/newversion.conf" ] ; then
		echo "creating newversion.conf file" 
		echo "date=\""`date +%Y%m%d`\" >${CONF}/newversion.conf
	fi
	
	if [ ! -f "$SERIALIZED_STATISTICS_FILE" ] ; then
		echo "Generating initial statistics for query qualification..."
		$JAVA_HOME/bin/java imagemed.runperiodically.QueryDataCollector
	fi

	#check and merge/create wkhtmltopdf config
	
	[ ! -f $CONF/wkhtmltopdf.cfg ] && $JAVA_HOME/bin/java cases.GwpConfigMerger

    # link classes into $HOME/htdocs/WEB-INF/classes
    if [ ! -h $HOME/htdocs/WEB-INF/classes ] ; then
	CWD=`pwd`
	cd $HOME/htdocs/WEB-INF/classes
	if [ ! -h $HOME/htdocs/WEB-INF/classes/cases ] ; then
	    ln -s $CASES_HOME/classes/cases
	fi
	cd $CWD
    fi
    
    # SRV-1399: removing csv exports from htdocs
    numOfCsv=$(ls $HOME/htdocs/*.csv 2>/dev/null|wc -l 2>/dev/null)
    if [ "$numOfCsv" -ge 1 ]; then
	echo "Removing $numOfCsv legacy exported .csv file from htdocs"
	rm $HOME/htdocs/*.csv 2>/dev/null
    fi
	
	exit 0
} #do_start_()


do_stop_()
{
} #do_stop_()



do_beforesubmit_()
{
	do_stop_

} #do_beforesubmit_()

do_aftersubmit_()
{
	$TASKD_HOME/ctrl stop
	$TASKD_HOME/ctrl start
	do_start_

} #do_aftersubmit_()


speed_()
{
	// need a dummy cookie to prevent NullPointerException in our handler
	time -p $CURL_HOME/bin/curl --location --max-time 30 --cookie "dummyid=speedtester" "http://$SERVERNAME:$HTTP_PORT/cases/loadDefaultWorklist.jsp"
}

do_monitor_()
{
    local mode="$1"
    if [ "$mode" == "snapshot" ] ; then
        echo "SNAPSHOT - skipping realtime"
    else
        if [ ! -f "$TOMCAT_INITFILE" ]; then 
            realTime=$( speed_ 2>&1 >/dev/null | awk '$1 == "real" {print $2}' )
        else
            realTime=0.00
        fi
        
        echo "page_downloading=$realTime"
    fi
	exit 0
}


#
# List files/tables to be backed up grouped by categories
#
# output lines should be in '<category> <type> <names>' format
#
do_listbackup_()
{
	sCONF=${CONF#$HOME/}
	cat <<-EOFLISTBACKUP
		data.image FILE ${REPOSITORY_DICOM_DATA#$HOME/} ${HASHED_DICOM_DATA#$HOME/} ${DICOM_DATA#$HOME/}
		data.image DATABASE $STUDYTBL $OBJECTTBL $REPORTTBL
		misc.processed FILE ${PROCESSED#$HOME/} ${HASHED_PROCESSED#$HOME/} ${REPOSITORY_PROCESSED#$HOME/}
		misc.cache FILE ${CACHE#$HOME/} ${HASHED_CACHE#$HOME/} ${REPOSITORY_CACHE#$HOME/}
		config.system FILE $sCONF/matching.cfg $sCONF/matching2.cfg $sCONF/merge.cfg $sCONF/daily.rec $sCONF/system.rec $sCONF/preftime.txt $sCONF/limit.conf $sCONF/checkspacerecalc.cfg $sCONF/lpprinter.cfg
		config.system FILE $sCONF/archivetables.conf $sCONF/cdburn.conf $sCONF/dcfields.conf $sCONF/dcfldndx.conf $sCONF/dctables.conf $sCONF/Views.prp 
		config.gui FILE $sCONF/cpt4.cfg $sCONF/icd9.cfg $sCONF/fieldNames.rec $sCONF/tabprefcfg.conf $sCONF/searchSelectOptionsLimit.cfg $sCONF/types $sCONF/gui.conf
		config.gui FILE $sCONF/fax.conf $sCONF/scan.conf
		config.users FILE $sCONF/pluginsPerUser.cfg
		nobackup.nobackup FILE ${IMAGE_TMP#$HOME/} ${LOCK_VAR#$HOME/} ${CONF#$HOME/}/releasereference.cfg ${VAR#$HOME/}/disk_info
		nobackup.nobackup DATABASE $FIELDSTBL $TYPESTBL $FLDNDXTBL $TABLESTBL $CACHETBL
		misc.upgrade FILE ${DATA}/update_flags/ 
	EOFLISTBACKUP
}

#--- MAIN ------------------------------
check_action_ $1
if [ 0 = $? ]; then
	do_$1_ $2

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

fi
