#!/bin/bash
#
# epics
# login for EPICS 
# for version 3.14.8.2 and higher
# Task: Setting of environment variables
#
# Author:Peter Zumbruch, P.Zumbruch@gsi.de
# Date: 09-Nov-2008
# Last Modification: 05-Jun-2009
#######################################################

#name of this scripts
epicsScriptname='epics'

#default settings of local variables
epicsDefaultHome=/home/epics/EPICS
epicsHome=${EPICS_LOCAL_HOME:-${epicsDefaultHome}}

epicsDirDefaultPrefix=EPICS-
epicsDirPrefix=${EPICS_LOCAL_DIR_PREFIX:-${epicsDirDefaultPrefix}}

version=
defaultVersion=${EPICS_LOCAL_DEFAULT_VERSION:-3.15.4}

defaultLoginScript=./myepicslogin.sh
loginScript=${EPICS_LOCAL_LOGIN_SCRIPT:-${defaultLoginScript}}

defaultScriptBeforeLogin=
scriptBeforeLogin=${EPICS_LOCAL_SCRIPT_BEFORE_LOGIN:-${defaultScriptBeforeLogin}}
defaultScriptAfterLogin=
scriptAfterLogin=${EPICS_LOCAL_SCRIPT_AFTER_LOGIN:-${defaultScriptAfterLogin}}

#flags 
verbose=FALSE
argument=FALSE
stay=FALSE
listVers=FALSE
Help=FALSE

#flags if set then active
quiet=
debug=

die()
{
   local a=0;
   if [ "-bash" != "$0" ]
   then
        exit
   else
        echo -n "$*${*:+ }(press CTRL+C to stop)"
        for ((; ! $a; ));
        do
                read;
                a=$?;
        done
   fi
}

myEpicsUnsetVars()
{
	unset version argument stay verbose Help homeDir epicsDefaultHome debug
	unset Option epicsHome epicsDirPrefix listVers defaultVersion old 
	unset printHelp myEpicsUnsetVars unSourced sourcedCheck listVersions epicsDirDefaultPrefix defaultLoginScript
	unset defaultScriptBeforeLogin scriptBeforeLogin defaultScriptBeforeLogin scriptAfterLogin epicsScriptname
	return $*
}

printHelp()
{
	echo "$epicsScriptname [Options] [version]"
	echo '   sets environment variables for EPICS'
	echo '  '
	echo '   * changes to corresponding EPICS HOME directory:' 
	echo '       [<HOME>/<PREFIX><VERSION>, default: '"${epicsHome}/${epicsDirPrefix}${defaultVersion}"']'
	echo '   * and calls the (local) login script for this version'
	echo '     * relies on having a (local) login script ( default: '"${loginScript}"' ) '
	echo '       in the home directory of the corresponding EPICS installation'
	echo '   * optionally might execute (source) scripts before and after the call to the login script'
	echo '     * defaults:'
	echo '        * before script: '${defaultScriptBeforeLogin:-[ not set ]}
	echo '        * after  script: '${defaultScriptAfterLogin:-[ not set ]}
	echo 
	echo '   arguments: '
	echo '       version: EPICS version (default: "'${defaultVersion}'")'
	echo 
	echo '   options:'
	echo '      -h : prints this Help'
	echo '      -l : list all available versions in home directory '${epicsHome}
	echo '      -s : stay at $EPICS_HOME directory'
	echo '      -q : quiet no output, but error messages'
	echo '      -v : verbose mode'
	echo '      -d : debug mode, just echo no action'
	echo '      -H argument : home directory of several EPICS versions' 
	echo '                    (default: "'${epicsHome}'")' 
	echo '      -P argument : version prefix for PREFIXversion' 
	echo '                    (default: "'${epicsDirPrefix}'")' 
	echo '      -L argument : login script looked for in $EPICS_HOME' 
	echo '                    (default: "'${loginScript}'")' 
	echo '      -B argument : script to be sourced before calling login script' 
	echo '                    (default: "'${defaultScriptBeforeLogin:-[ not set ]}'")' 
	echo '      -A argument : script to be sourced after calling login script' 
	echo '                    (default: "'${defaultScriptAfterLogin:-[ not set ]}'")' 
	echo 
	echo '   LOCAL environment variables:'
	echo '     '
	echo '      EPICS_LOCAL_HOME:'
	echo '        the default home directory of the several EPICS versions can be modified'
	echo '        by setting the environment variable '
	echo '        EPICS_LOCAL_HOME [at the moment '${EPICS_LOCAL_HOME:+set to: \'}${EPICS_LOCAL_HOME:-not set}${EPICS_LOCAL_HOME:+\'}]
	echo 
	echo '      EPICS_LOCAL_DIR_PREFIX:'
	echo '      the default search prefix for directories in '"${epicsHome}"' can be modified'
	echo '        by setting the environment variable '
	echo '        EPICS_LOCAL_DIR_PREFIX [at the moment '${EPICS_LOCAL_DIR_PREFIX:+set to: \'}${EPICS_LOCAL_DIR_PREFIX:-not set}${EPICS_LOCAL_DIR_PREFIX:+\'}]
	echo 
	echo '      EPICS_LOCAL_LOGIN_SCRIPT:'
	echo '      the default call to the (local) login script'
	echo '        in the epics installation directories can be modified'
	echo '        by setting the environment variable '
	echo '        EPICS_LOCAL_LOGIN_SCRIPT [at the moment '${EPICS_LOCAL_LOGIN_SCRIPT:+set to: \'}${EPICS_LOCAL_LOGIN_SCRIPT:-not set}${EPICS_LOCAL_LOGIN_SCRIPT:+\'}]
	echo 
	echo '      EPICS_LOCAL_DEFAULT_VERSION:'
	echo '      the EPICS version can be modified'
	echo '        by setting the environment variable '
	echo '        EPICS_LOCAL_DEFAULT_VERSION [at the moment '${EPICS_LOCAL_DEFAULT_VERSION:+set to: \'}${EPICS_LOCAL_DEFAULT_VERSION:-not set}${EPICS_LOCAL_DEFAULT_VERSION:+\'}]
	echo 
	echo '      EPICS_LOCAL_SCRIPT_BEFORE_LOGIN:'
	echo '      the local script default for a script sourced befored login can be modified'
	echo '        by setting the environment variable '
	echo '        EPICS_LOCAL_SCRIPT_BEFORE_LOGIN [at the moment '${EPICS_LOCAL_SCRIPT_BEFORE_LOGIN:+set to: \'}${EPICS_LOCAL_SCRIPT_BEFORE_LOGIN:-not set}${EPICS_LOCAL_SCRIPT_BEFORE_LOGIN:+\'}]
	echo 
	echo '      EPICS_LOCAL_SCRIPT_AFTER_LOGIN:'
	echo '      the local script default for a script sourced after login can be modified'
	echo '        by setting the environment variable '
	echo '        EPICS_LOCAL_SCRIPT_AFTER_LOGIN [at the moment '${EPICS_LOCAL_SCRIPT_AFTER_LOGIN:+set to: \'}${EPICS_LOCAL_SCRIPT_AFTER_LOGIN:-not set}${EPICS_LOCAL_SCRIPT_AFTER_LOGIN:+\'}]
	echo 
	echo "   you have to call this script with a leading '. ', i.e. source it"
	echo "--> i.e.: '. $epicsScriptname'"               
	
	return 0;
}

unSourced()
{
	echo
	echo Error: $epicsScriptname: script has not been called with a leading '. ', exiting!
	echo
	printHelp;
	myEpicsUnsetVars;
	exit 1;
}

sourcedCheck()
{
#sourced call of this routine "leading ." ?, if not print Help
	if [ ${0##*/} = $epicsScriptname ]; 
	then  
		unSourced;
		return 1;
	else
		return 0;
	fi
}

listVersions()
{
	if [ ! -d ${epicsHome} ]
	then
		echo $epicsScriptname: Error: EPICS Versions Home Directory \`${epicsHome}\' does not exists ... exiting.
		myEpicsUnsetVars;
		return 1;
	fi

	local item;
	local number;
	number=0;
	echo $epicsScriptname: Listing available EPICS versions ...
	echo

	for item in $(ls --color=none -1 ${epicsHome}| grep ^${epicsDirPrefix} 2>/dev/null)
	do 
		let number=$number+1;
		echo "   " ${item##${epicsDirPrefix}}
	done

	echo 
	echo $epicsScriptname: found $number available versions
	
	return 0;
}
## MAIN

# script sourced?
sourcedCheck;

# evaluate options and assign
OPTIND=1

while getopts ":hvlsqdH:L:P:B:A:" arg
do
	case $arg in
		\? | h ) Help=TRUE; ;;
		H ) 	 epicsHome=$OPTARG;;
		L ) 	 loginScript=$OPTARG;;
		P ) 	 epicsDirPrefix=$OPTARG;;
		B ) 	 scriptBeforeLogin=$OPTARG;;
		A ) 	 scriptAfterLogin=$OPTARG;;
		v ) 	 verbose=TRUE;;
		l ) 	 listVers=TRUE;;
		s ) 	 stay=TRUE;;
		q ) 	 quiet=TRUE;;
		d ) 	 debug=TRUE;;
         esac
done
shift $(($OPTIND - 1))

version=$1
[ -z $version ] && version=$defaultVersion;

# Help?
if [ 'TRUE' = "$Help" ]
then
	printHelp;
	myEpicsUnsetVars;
	return 0;
fi

#list Versions
if [ 'TRUE' = "$listVers" ]
then    
	listVersions
	if [ $? ]
	then 
		myEpicsUnsetVars;
		return 0;
	else
		myEpicsUnsetVars;
		return 1;
	fi    
fi

## login

old=$PWD;
homeDir=${epicsHome}/${epicsDirPrefix}${version}
if [ -d ${homeDir} ]
then
	cd ${homeDir}
	if [ -f ${loginScript} ]
	then
		# before script 

		if [ ${scriptBeforeLogin} ] 
		then 
			if [ -f "${scriptBeforeLogin}" ] 
                        then
				eval echo sourcing \"${scriptBeforeLogin}\" ${quiet:+1>/dev/null}
				eval ${debug:+echo} source ${scriptBeforeLogin} ${quiet:+1>/dev/null} # TODO:|| myEpicsUnsetVars && die "script Before login: ${scriptBeforeLogin} failed"
			else
				echo $epicsScriptname: WARNING: 'Before' script \`${scriptBeforeLogin}\' does not exist ... ignoring.
			fi
		fi
	
		# principal script

		eval echo sourcing \"${loginScript}\" seen from directory \"$PWD\" ${quiet:+1>/dev/null}
		eval ${debug:+echo} source ${loginScript} ${quiet:+1>/dev/null} # TODO: || die "login script $PWD/${loginScript} failed"
		
		# after script

		if [ ${scriptAfterLogin} ] 
		then 
			if [ -f "${scriptAfterLogin}" ] 
                        then
				eval echo sourcing \"${scriptAfterLogin}\" ${quiet:+1>/dev/null}
				eval ${debug:+echo} source ${scriptAfterLogin} ${quiet:+1>/dev/null} # TODO:|| myEpicsUnsetVars && die "script After login: ${scriptAfterLogin} failed"
			else
				echo $epicsScriptname: WARNING: 'After' script \`${scriptAfterLogin}\' does not exist ... ignoring.
			fi
		fi

	else
		echo $epicsScriptname: Error: EPICS 'login' script \`${loginScript}\' not found in \`${homeDir}\' does not exist ... exiting.
		myEpicsUnsetVars
		return 1;  
	fi
	[ 'FALSE' = "$stay" ] && cd $old; 
else
  	echo $epicsScriptname: Error: EPICS Version Home Directory \`${homeDir}\' does not exists ... exiting.
        myEpicsUnsetVars
        return 1;
fi 

# clean up
myEpicsUnsetVars

