#!/bin/bash
#
# epicslogin.sh
#
# login for EPICS 
# for version 3.14.8.2 and later
# Task: Setting of environment variables
#
# Author:Peter Zumbruch, P.Zumbruch@gsi.de
# Date: 22-Aug-2006
# Last Modification: 09-Aug-2013
#######################################################

#name of this scripts
scriptname='epicslogin.sh'
account=epics
sourcedHelperScript=~epics/bin/fcn_addtopath.bash
uniqpathsScript=
defaultUniqpathsScript=~epics/bin/uniqpaths

# if using variables mind to put into single ' quotes
sourcedSiteProfile='${baseDir}/startup/Site.profile'

#default settings of local variables
printhelp=FALSE
verbose=
argument=FALSE
temporaer=
unsourced=
homeofuser=${HOME}
version=
defaultVersion=3.14.10
defaultEpicsbase=base-${defaultVersion} # TODO: to be changed later on to be version/base
defaultEpicshome=~epics/EPICS-${defaultVersion}
epicshome=
epicsbase=
epicsbaseSet=FALSE

#evaluation of the options
while [ $# -gt 0 ]
do
     Option=$1
	case $Option in
	   -h ) printhelp=TRUE
		shift 
		;;
    	   -v ) verbose=TRUE
		shift 
		;;
           -H ) epicshome=$2;
                shift;                
                shift
                ;;                
           -B ) epicsbase=$2;
		epicsbaseSet=TRUE;
                shift;
                shift;
                ;;
           -P ) sourcedSiteProfile=$2;
                shift;                
                shift
                ;;                
           -A ) sourcedHelperScript=$2;
                shift;                
                shift
                ;;                
	    * ) argument=TRUE
		temporaer=$Option;
		shift 
		;;
         esac
done

version=$temporaer

#sourced call of this routine "leading ." ?, if not print help
if [ ${0##*/} = $scriptname ]; 
then 
  unsourced=TRUE;
  printhelp=TRUE; 
fi

if [ $printhelp = TRUE ]
then 
  echo "$scriptname [Options] [version]"
  echo '-- sets environment variables for EPICS'
  echo "-- calls the Site Profile: set via \"-P\" or default: \"$sourcedSiteProfile\""
  echo '-- '
  echo '-- version: EPICS version'
  echo '--          (default: "'${defaultVersion}'")' 
  echo '-- options:'
  echo '----- -v : verbose mode'
  echo '----- -h : prints this help'
  echo '----- -H argument : sets $EPICS_HOME to argument'
  echo '-----               (default: "'$(eval echo ${defaultEpicshome})'")' 
  echo '----- -B argument : sets $EPICS_BASE to argument or'
  echo '-----               if argument is a relative path it extends to $EPICS_HOME/argument '
  echo '-----               (default: "'$(eval echo ${defaultEpicsbase})'")'
  echo '----- -P argument : sets Site Profile to be sourced to argument'
  echo '-----               (default: "'${sourcedSiteProfile}'"'
  echo '-----                where $basedir behaves like EPICS_BASE'
  echo "-----                as described for option \"-B\")"
  echo '----- -A argument : sets path to necessary helper script "fcn_addtopath.bash":'
  echo '-----               (default: "'$(eval echo ${sourcedHelperScript})'")'
  echo '----- '
  echo '----- if MY_EPICS_BASE (="'${MY_EPICS_BASE}'") is externally set as base directory: '
  echo '-----    case "option -B not used": '  
  echo '-----                       EPICS_BASE set to MY_EPICS_BASE'
  echo '-----    case "option -B used: '
  echo '-----                       MY_EPICS_BASE set to EPICS_BASE'
  echo '----- '
  echo '----- version: version of EPICS '
  echo '-----          (used in the path <epicshome>/base-version)'
  echo '----- '
  echo "-- you have to call this script with a leading '. '"
  echo "--> i.e.: '. $scriptname'"               

  # exiting
  if [ $unsourced ]; 
  then 
    echo
    echo Error: $scriptname: script has not been called with a leading '. ', exiting!
    exit 1; 
  else 
    return 1; 
  fi
  
else
   # some helper function
   if [ -f $sourcedHelperScript ]; 
   then 
   	source $sourcedHelperScript; 
   else 
   	echo $scriptname: cannot find script \"$sourcedHelperScript\" ... exiting; 
        return 2; 
   fi

   # some helper' helper function  
   if [ -f $(dirname $sourcedHelperScript)/uniqpaths ]
   then
   	export uniqpathsScript=$(dirname $sourcedHelperScript)/uniqpaths
   elif [ -f $defaultUniqpathsScript ]
   then 
	export uniqpathsScript=$defaultUniqpathsScript
   else
	unset uniqpathsScript
   fi	

   # setting epicshome
   homeofuser=$(eval echo ~${account})
   eval epicshome=${epicshome:=$defaultEpicshome}
   if [ ! -d $epicshome ]; 
   then 
   	echo $scriptname: cannot find $epicshome ... exiting; 
        return 2; 
   fi

   # setting epicsversion
   epicsversion=${version:=${defaultVersion}}; 
   export MYEPICS_VERSION=$epicsversion;
   [ $verbose ] && echo -e "MYEPICS_VERSION \t set to $MYEPICS_VERSION" 
   export EPICS_VERSION=$epicsversion;
   [ $verbose ] && echo -e "EPICS_VERSION \t\t set to $EPICS_VERSION" 

   # setting epicsbase
   eval epicsbase=${epicsbase:=$defaultEpicsbase} 

   # setting base directory
   baseDir=$epicsbase
   if [ ! -z ${epicsbase/\/*/} ];  
   then 
   	baseDir=${epicshome}/${epicsbase}; 
   fi;

   # accomodate for org EPICS variable epics base
   if [ $epicsbaseSet = "FALSE"  ] # i.e. epicsbase not set
   then
   	if [ -z "${MY_EPICS_BASE}" ] ; 
        then
		MY_EPICS_BASE=$baseDir               
        else
                baseDir=${MY_EPICS_BASE}
		echo "$scriptname: baseDir set to the value of MY_EPICS_BASE: ${MY_EPICS_BASE}"
		echo "$scriptname          use \`unset MY_EPICS_BASE' when problems occur"
	fi
   else
        MY_EPICS_BASE=$baseDir               
   fi
   # # check valid path
   if [ ! -d $baseDir ]; 
   then 
   	echo Error: $scriptname: cannot find baseDir: \`$baseDir\' ... exiting; 
        return 2; 
   fi
   
   # building correct path to sourced file after baseDir is defined
   eval sourcedSiteProfile=${sourcedSiteProfile}
   if [ ! -f $sourcedSiteProfile ]; 
   then 
       echo $scriptname: cannot find $sourcedSiteProfile ... exiting; 
       return -1; 
   fi

   #sourcing the modified Site.profile provided by EPICS modified for verbosity
   #option 'v' -- verbose 
   if [ -z $verbose ]
   then
      source ${sourcedSiteProfile}
   else
      echo sourcing ${sourcedSiteProfile}
      source ${sourcedSiteProfile} -v 
   fi
   #add bin path to PATH
   addToPath "${EPICS_EXTENSIONS}/bin/${EPICS_HOST_ARCH}"
   addToPath "${EPICS_BASE}/bin/${EPICS_HOST_ARCH}"
   addToPath "/u/epics/bin"
   addToPath "/u/epics/programs/bin"
   checkAndCleanPath 
   export PATH

   #Channel Access Address List
   # HADES example: export EPICS_CA_ADDR_LIST="e7had2 hadsc1 hadeb01 hadeb02 hadeb03 lxhadesdaq"
   export EPICS_CA_ADDR_LIST=$(hostname)
   if [ $verbose ]; then echo -e "EPICS_CA_ADDR_LIST \t set to $EPICS_CA_ADDR_LIST"; fi
   #switch autosearch off
   export EPICS_CA_AUTO_ADDR_LIST=YES
   if [ $verbose ]; then echo -e "EPICS_CA_AUTO_ADDR_LIST  set to $EPICS_CA_AUTO_ADDR_LIST"; fi
   
   #create copies of EPICS_* variables named EPICS*_COPY
   #to be used in CONFIGURE scripts where EPICS_ variables might be overwritten

   epicsVars=$( set $([ ! -z "$ZSH_VERSION" ] && echo -n "+" ) | grep --color=never --binary-files=text '^EPICS' | sed -e 's/=.*//g' | grep -v '_COPY$'  )
   for item in $(echo $epicsVars | xargs)
   do 
      echo $item | grep -v _COPY$ >/dev/null 2>&1
      if [ $? -eq 0 ]
      then  
         eval export ${item%%=*}_COPY=\$${item%%=*}
      fi 
   done

   if [ $verbose ]; then echo -e '--> Created for each variable EPICS_* a copy EPICS_*_COPY'; fi  
   if [ $verbose ]; then echo -e "    to be used in CONFIGURE scripts where EPICS_ variables might be overwritten"; fi
fi

unset baseDir printhelp verbose argument temporaer Option epicshome defaultVersion version epicsversion epicsVars
unset scriptname account unsourced homeofuser epicsbase baseDir prepath adding defaultEpicsbase
unset sourcedHelperScript sourcedSiteProfile item epicsbase defaultEpicshome epicsbaseSet uniqpathsScript


