Epics@GSI Webhome

startEpicsIoc script: (re)start hadcon at reboot - startBackgroundEpicsIoc.sh

Usage


startEpicsIoc.sh
usage: startEpicsIoc.sh [options]

 caller for script calling EPICS IOCs with procServ in "Background",
  checks for matching hostnames with a given list of hostname,
  or a file with a lookuptable to be evaluated
  and calls the start script with the right argument

options:

   Caller:
   -H hostname     : hostname
                       [`etrax047']
   -s scriptname   : background starting script's name (absolute path)
                       [`/home/hadaq/EPICS/startupProcedures/startBackgroundEpicsIoc.sh']
   -e scriptname   : helper script internally used by `startEpicsIoc.sh' for checks
              defaults to be searched in the same directory as \'startEpicsIoc.sh'
                       [`./exitIfHelpers.sh']
   -l list         : quoted space separated list of hostnames, where an IOC should be started
                       [`"etrax047 etrax048"']
   -m              : allow several IOCs running [needs differing telnet ports to monitor/control]
                       [`"yes"']
   -f file         : file to retrieve hostnames, executables, dirs, arguments from,
                       overwrites all other relevant/default settings (absolute path)
                       [`iocListFile-Etrax.txt']
   -S char         : character separating the entries in the ioc list file
                       [`|']

   Callee:
   -w workingDir   : place where log (default) and pid files may be written (absolute path)
                       [`']
   -i iocBootDir   : place where to change to IOC's boot directory,
                       if not absolute path, taken relatively to `workingDir'
                       [`']
   -c commandExe   : executable to be executed by callee,
                       if not absolute path, taken relatively to `workingDir'
                       [`']
   -a commandArgs  : [quoted list] of argument[s] for executable to be executed by callee,
                       [`""']
   -A commandArgs  : [quoted list] of [additional] argument[s] for callee,
                       [`""']
   -I name         : name to assign to the process (ioc) the callee starts
                       [automatically set by callee]
   -g              : activate file logging for procServ [OFF]
   -G loggingDir   : file logging directory,
                       if not absolute path, taken relatively to `workingDir' [`']
                       [`']
   -p port         : set telnet port for active procServ access, (NOTE: readonly port will be port+1)
                       [`4813']
   -t logport      : set log readonly telnet port for active procServ access (NOTE: default log port will be port+1)
                       [`']
   -P procServExe  : procServ executable
                       if not absolute path, taken relatively to `baseHome' [`/home/hadaq']
                       [`/home/hadaq/EPICS/startupProcedures/procServ/procServ']
   -L              : [list of colon ':' separated] shared library paths to be added
                       to LD_LIBRARY_PATH (may be called repeatedly)
                       [`/home/hadaq/EPICS/startupProcedures/procServ/lib']

   General:
   -b baseHome     : home directory of hadaq
                       [`/home/hadaq']
   -n              : no caller action, just echos command instead of executing the caller [ON]
   -N              : no callee action, just echos command instead of executing the callee [OFF]
   -d              : debug mode of caller, sets set -xv [OFF]
   -D              : debug mode of callee, sets set -xv [OFF]
   -v              : verbosity of caller, can be called repeatedly  [ON(2)]
   -V              : verbosity of callee, can be called repeatedly  [OFF]
   -q              : sets verbosity of caller off [OFF]
   -Q              : sets verbosity of callee off  [OFF]
   -h              : this help

Code

%begin bash% #/bin/sh # startEpicsIoc.sh # # dispatcher for startEpicsIoc.sh # - checks for matching hostnames and # calls $myCalleeScript starting IOC in background using procServ depending on HOSTNAME content # # created: 13-01-2010 # author: p.zumbruch, GSI # modified: 08-02-2010

#debug - uncomment to debug # set -xv

#specific predefines function specificPredefines() { # more specific variables to be (un)set before running

myHostname=$(hostname) myBaseHome=/home/hadaq myStartupProcedures=${myBaseHome}/EPICS/startupProcedures myCalleeScript=${myStartupProcedures}/startBackgroundEpicsIoc.sh

myProcServTelnetPort=4813 unset myProcServTelnetLogPort #default: telnet port + 1 unset myProcServIocName # set by callee unset myWorkingDir # unset commandExecutable unset commandArguments unset myLoggingDir unset myIocBootDir myProcServExecutable=$(which procServ) myProcServDefaultExecutable=${myStartupProcedures}/procServ/procServ myProcServExecutable=${myProcServExecutable:-${myProcServDefaultExecutable}} myLdLibPaths=${myStartupProcedures}/procServ/lib myList='etrax046 etrax047 etrax048' unset multipleIocs }

#predefines function predefines() { # general variables to be (un)set before running

scriptname=startEpicsIoc.sh myExitIfHelperScript=$(dirname $0)/exitIfHelpers.sh

unset myIocListFile myIocListFileSeparator='|' unset calleeArguments unset myProcServFileLogging

myVerbosity=0; myVerbosityCallee=0; unset myDebug unset myDebugCallee unset myEcho; unset myEchoCallee; unset myHelp unset myQuiet; unset myQuietCallee;

myLevel=0 myListLength=0; }

#unset function unsets() { set +xv # cleaning up, i.e. unsetting all variables used unset scriptname unset myHostname unset myCalleeScript unset myList unset myIocListFile unset myWorkingDir unset myIocBootDir unset commandExecutable unset commandArguments unset calleeArguments unset myProcServFileLogging unset myLoggingDir unset myProcServTelnetPort unset myProcServTelnetLogPort unset myProcServExecutable unset myProcServDefaultExecutable unset myLdLibPaths unset myBaseHome unset myEcho unset myEchoCallee unset myDebug unset myDebugCallee unset myVerbosity unset myVerbosityCallee unset myExitIfHelperScript unset oldIFS unset myHelp unset myIocListFileSeparator unset myListLength unset myProcServIocName

unset myHostnameOpt; unset myHostnameOptArg unset myCalleeScriptOpt; unset myCalleeScriptOptArg unset myExitIfHelperScriptOpt; unset myExitIfHelperScriptOptArg unset myListOpt; unset myListOptArg unset multipleIocsOpt; unset myIocListFileOpt; unset myIocListFileOptArg unset myIocListFileSeparatorOpt; unset myIocListFileSeparatorOptArg unset myWorkingDirOpt; unset myWorkingDirOptArg unset myIocBootDirOpt; unset myIocBootDirOptArg unset commandExecutableOpt; unset commandExecutableOptArg unset commandArgumentsOpt; unset commandArgumentsOptArg unset calleeArgumentsOpt; unset calleeArgumentsOptArg unset myProcServFileLoggingOpt; unset myLoggingDirOpt; unset myLoggingDirOptArg unset myProcServTelnetPortOpt; unset myProcServTelnetPortOptArg unset myProcServTelnetLogPortOpt; unset myProcServTelnetLogPortOptArg unset myProcServExecutableOpt; unset myProcServExecutableOptArg unset myLdLibPathsOpt; unset myLdLibPathsOptArg unset myBaseHomeOpt; unset myBaseHomeOptArg unset myEchoOpt; unset myEchoCalleeOpt; unset myDebugOpt; unset myDebugCalleeOpt; unset myVerbosityOpt; unset myVerbosityCalleeOpt; unset myHelpOpt; unset myProcServIocNameOpt; unset myProcServIocNameOptArg return 0; }

#dump function dump() { # print out all necessary information on variables used and set local function=dump [ 3 -le $myVerbosity ] && myLevel=$(($myLevel+1)) && echo [${myLevel}] entering function \"$function $*\"

echo -e " settings are:\n" local mv=$myVerbosity; local mvc=$myVerbosityCallee; echo -e " \"scriptname \": \t" ${scriptname} echo -e " \"myHostname \": \t" ${myHostname} echo -e " \"myExitIfHelperScript \": \t" ${myExitIfHelperScript} echo -e " \"myCalleeScript \": \t" ${myCalleeScript} echo -e " \"myList \": \t" ${myList} echo -e " \"myIocListFile \": \t" ${myIocListFile} echo -e " \"myIocListFileSeparator \": \t" ${myIocListFileSeparator} echo -e " \"myWorkingDir \": \t" ${myWorkingDir} echo -e " \"myIocBootDir \": \t" ${myIocBootDir} echo -e " \"commandExecutable \": \t" ${commandExecutable} echo -e " \"commandArguments \": \t" ${commandArguments} echo -e " \"calleeArguments \": \t" ${calleeArguments} echo -e " \"myProcServIocName \": \t" ${myProcServIocName} echo -e " \"myProcServFileLogging \": \t" "[$([ -z ${myProcServFileLogging} ] && echo OFF || echo ON)]" echo -e " \"multipleIocs \": \t" "[$([ -z ${multipleIocs} ] && echo OFF || echo ON)]" echo -e " \"myLoggingDir \": \t" ${myLoggingDir} echo -e " \"myProcServTelnetPort \": \t" ${myProcServTelnetPort} echo -e " \"myProcServTelnetLogPort \": \t" ${myProcServTelnetLogPort} echo -e " \"myProcServExecutable \": \t" ${myProcServExecutable} echo -e " \"myLdLibPaths \": \t" ${myLdLibPaths} echo -e " \"myBaseHome \": \t" ${myBaseHome} echo -e " \"myEcho \": \t" "[$([ -z ${myEcho} ] && echo OFF || echo ON)]" echo -e " \"myEchoCallee \": \t" "[$([ -z ${myEchoCallee} ] && echo OFF || echo ON)]" echo -e " \"myDebug \": \t" "[$([ -z ${myDebug} ] && echo OFF || echo ON)]" echo -e " \"myDebugCallee \": \t" "[$([ -z ${myDebugCallee} ] && echo OFF || echo ON)]" echo -e " \"myVerbosity \": \t" "[$([ 0 -eq ${mv} ] && echo OFF || echo ON)$([ 1 -lt ${mv} ] && echo \($mv\))]" echo -e " \"myVerbosityCallee \": \t" "[$([ 0 -eq ${mvc} ] && echo OFF || echo ON)$([ 1 -lt ${mvc} ] && echo \($mvc\))]"

[ 3 -le $myVerbosity ] && echo [${myLevel}] " leaving" function \"$function\" && myLevel=$(($myLevel-1)) }

#usage function usage() { # How to use the script

echo echo "$scriptname" echo "usage: $scriptname [options]" echo echo " caller for script calling EPICS IOCs with procServ in \"Background\"," echo " checks for matching hostnames with a given list of hostname," echo " or a file with a lookuptable to be evaluated" echo " and calls the start script with the right argument" echo echo "options:" echo echo " Caller: " echo -e " -"${myHostnameOpt} "hostname : hostname" echo -e " [\`${myHostname}']" echo -e " -"${myCalleeScriptOpt} "scriptname : background starting script's name (absolute path) " echo -e " [\`${myCalleeScript}']" echo -e " -"${myExitIfHelperScriptOpt} "scriptname : helper script internally used by \`$scriptname' for checks" echo -e " defaults to be searched in the same directory as \'$scriptname'" echo -e " [\`${myExitIfHelperScript}']" echo -e " -"${myListOpt} "list : quoted space separated list of hostnames, where an IOC should be started" echo -e " [\`\"$myList\"']" echo -e " -"${multipleIocsOpt} " : allow several IOCs running [needs differing telnet ports to monitor/control]" echo -e " [\`\"$multipleIocs\"']" echo -e " -"${myIocListFileOpt} "file : file to retrieve hostnames, executables, dirs, arguments from, " echo -e " overwrites all other relevant/default settings (absolute path)" echo -e " [\`$myIocListFile']" echo -e " -"${myIocListFileSeparatorOpt} "char : character separating the entries in the ioc list file" echo -e " [\`$myIocListFileSeparator']" echo -e echo -e " Callee: " echo -e " -"${myWorkingDirOpt} "workingDir : place where log (default) and pid files may be written (absolute path)" echo -e " [\`$myWorkingDir']" echo -e " -"${myIocBootDirOpt} "iocBootDir : place where to change to IOC's boot directory," echo -e " if not absolute path, taken relatively to \`workingDir'" echo -e " [\`$myIocBootDir']" echo -e " -"${commandExecutableOpt} "commandExe : executable to be executed by callee," echo -e " if not absolute path, taken relatively to \`workingDir'" echo -e " [\`$commandExecutable']" echo -e " -"${commandArgumentsOpt} "commandArgs : [quoted list] of argument[s] for executable to be executed by callee," echo -e " [\`\"$commandArguments\"']" echo -e " -"${calleeArgumentsOpt} "commandArgs : [quoted list] of [additional] argument[s] for callee," echo -e " [\`\"$calleeArguments\"']" echo -e " -"${myProcServIocNameOpt} "name : name to assign to the process (ioc) the callee starts" echo -e " [$([ -z ${myProcServIocName} ] && echo automatically set by callee || echo \`\"$myProcServIocName\"\')]" echo -e " -"${myProcServFileLoggingOpt} " : activate file logging for procServ [$([ -z "${myProcServFileLogging}" ] && echo -e OFF || echo -e ON)]" echo -e " -"${myLoggingDirOpt} "loggingDir : file logging directory," echo -e " if not absolute path, taken relatively to \`workingDir' [\`$myWorkingDir']" echo -e " [\`$myLoggingDir']" echo -e " -"${myProcServTelnetPortOpt} "port : set telnet port for active procServ access, (NOTE: readonly port will be port+1)" echo -e " [\`$myProcServTelnetPort']" echo -e " -"${myProcServTelnetLogPortOpt} "logport : set log readonly telnet port for active procServ access (NOTE: default log port will be port+1)" echo -e " [\`$myProcServTelnetLogPort']" echo -e " -"${myProcServExecutableOpt} "procServExe : procServ executable" echo -e " if not absolute path, taken relatively to \`baseHome' [\`$myBaseHome']" echo -e " [\`$myProcServExecutable']" echo -e " -"${myLdLibPathsOpt} " : [list of colon ':' separated] shared library paths to be added" echo -e " to LD_LIBRARY_PATH (may be called repeatedly)" echo -e " [\`$myLdLibPaths']" echo -e echo -e " General: " echo -e " -"${myBaseHomeOpt} "baseHome : home directory of hadaq" echo -e " [\`$myBaseHome']" echo -e -n " -"${myEchoOpt} " : no caller action, just echos command instead of executing the caller" echo -e " [$([ -z ${myEcho} ] && echo OFF || echo ON)]" echo -e -n " -"${myEchoCalleeOpt} " : no callee action, just echos command instead of executing the callee" echo -e " [$([ -z ${myEchoCallee} ] && echo OFF || echo ON)]" echo -e -n " -"${myDebugOpt} " : debug mode of caller, sets set -xv" echo -e " [$([ -z ${myDebug} ] && echo OFF || echo ON)]" echo -e -n " -"${myDebugCalleeOpt} " : debug mode of callee, sets set -xv" echo -e " [$([ -z ${myDebugCallee} ] && echo OFF || echo ON)]" echo -e -n " -"${myVerbosityOpt} " : verbosity of caller, can be called repeatedly " echo -e " [$([ 0 -eq ${myVerbosity} ] && echo OFF || echo ON)$([ 1 -lt ${myVerbosity} ] && echo \($myVerbosity\))]" echo -e -n " -"${myVerbosityCalleeOpt} " : verbosity of callee, can be called repeatedly " echo -e " [$([ 0 -eq ${myVerbosityCallee} ] && echo OFF || echo ON)$([ 1 -lt ${myVerbosityCallee} ] && echo \($myVerbosityCallee\))]" echo -e -n " -"${myQuietOpt} " : sets verbosity of caller off" echo " [$([ -z ${myQuiet} ] && echo OFF || echo ON)]" echo -e -n " -"${myQuietCalleeOpt} " : sets verbosity of callee off " echo -e " [$([ -z ${myQuietCallee} ] && echo OFF || echo ON)]" echo -e " -"${myHelpOpt} " : this help" echo }

#eval options function evalOptions() { #evalOptions $@ #evaluates the options of the command line

#options definitions myHostnameOpt="H"; myHostnameOptArg=':' myCalleeScriptOpt="s"; myCalleeScriptOptArg=':' myExitIfHelperScriptOpt="e"; myExitIfHelperScriptOptArg=':' myListOpt="l"; myListOptArg=':' multipleIocsOpt="m"; myIocListFileOpt="f"; myIocListFileOptArg=':' myIocListFileSeparatorOpt="S"; myIocListFileSeparatorOptArg=':' myWorkingDirOpt="w"; myWorkingDirOptArg=':' myIocBootDirOpt="i"; myIocBootDirOptArg=':' commandExecutableOpt="c"; commandExecutableOptArg=':' commandArgumentsOpt="a"; commandArgumentsOptArg=':' calleeArgumentsOpt="A"; calleeArgumentsOptArg=':' myProcServFileLoggingOpt="g"; myLoggingDirOpt="G"; myLoggingDirOptArg=':' myProcServTelnetPortOpt="p"; myProcServTelnetPortOptArg=':' myProcServTelnetLogPortOpt="t"; myProcServTelnetLogPortOptArg=':' myProcServExecutableOpt="P"; myProcServExecutableOptArg=':' myLdLibPathsOpt="L"; myLdLibPathsOptArg=':' myBaseHomeOpt="b"; myBaseHomeOptArg=':' myProcServIocNameOpt="I"; myProcServIocNameOptArg=':' myEchoOpt="n"; myEchoCalleeOpt="N"; myDebugOpt="d"; myDebugCalleeOpt="D"; myVerbosityOpt="v"; myVerbosityCalleeOpt="V"; myQuietOpt="q"; myQuietCalleeOpt="Q"; myHelpOpt="h";

local opts="myHostname myCalleeScript myExitIfHelperScript myList multipleIocs myIocListFile myWorkingDir myIocBootDir commandExecutable commandArguments calleeArguments myProcServFileLogging myLoggingDir myProcServTelnetPort myProcServTelnetLogPort myProcServExecutable myLdLibPaths myBaseHome myEcho myEchoCallee myDebug myDebugCallee myVerbosity myVerbosityCallee myQuiet myQuietCallee myHelp myIocListFileSeparator myProcServIocName"

for item in $(echo $opts | sed -e "s/ /$IFS/g") do options="${options}\${${item}Opt}\${${item}OptArg}" done options=$(eval echo $options)

while getopts $options arg do case $arg in ${myHostnameOpt}) myHostname=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${myCalleeScriptOpt}) myCalleeScript=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${myListOpt}) myList=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${multipleIocsOpt}) multipleIocs=yes shift;; ${myIocListFileOpt}) myIocListFile=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${myIocListFileSeparatorOpt}) myIocListFileSeparator=$(echo $OPTARG | sed -e 's/"//g' | sed 's/(.).*/\1/g') shift 2;; ${myWorkingDirOpt}) myWorkingDir=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${myIocBootDirOpt}) myIocBootDir=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${commandExecutableOpt}) commandExecutable=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${commandArgumentsOpt}) commandArguments=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${calleeArgumentsOpt}) calleeArguments=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${myProcServFileLoggingOpt}) myProcServFileLogging=yes shift;; ${myProcServIocNameOpt}) myProcServIocName=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${myLoggingDirOpt}) myLoggingDir=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${myProcServTelnetPortOpt}) myProcServTelnetPort=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${myProcServTelnetLogPortOpt}) myProcServTelnetLogPort=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${myProcServExecutableOpt}) myProcServExecutable=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${myLdLibPathsOpt} ) [ -d $(echo $OPTARG | sed -e 's/"//g') ] && myLdLibPaths=${myLdLibPaths:+${myLdLibPaths}\:}$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${myBaseHomeOpt}) myBaseHome=$(echo $OPTARG | sed -e 's/"//g') shift 2;; ${myExitIfHelperScriptOpt}) myExitIfHelperScript=$(echo $OPTARG | sed -e 's/"//g') [ ! -z "${myExitIfHelperScript##/*}" ] && myExitIfHelperScript="$(cd $(dirname ${0}) 2>/dev/null && pwd)/${myExitIfHelperScript}" shift 2;; ${myEchoOpt}) myEcho=echo shift;; ${myEchoCalleeOpt}) myEchoCallee=echo shift;; ${myDebugOpt}) myDebug=yes shift;; ${myDebugCalleeOpt}) myDebugCallee=yes shift;; ${myVerbosityOpt}) myVerbosity=$(($myVerbosity + 1)) shift;; ${myVerbosityCalleeOpt}) myVerbosityCallee=$(($myVerbosityCallee + 1)) shift;; ${myQuietOpt}) myQuiet=yes myVerbosity=0 shift;; ${myQuietCalleeOpt}) myQuietCallee=yes myVerbosityCallee=0 shift;; ${myHelpOpt} ) myHelp=yes shift;; esac done return 0; }

#checks function checks() { # checks and twiddling run # performs checks on all settings # depending on the run number (allowed: {1,2,} # and complete path and pathnames # different stages are checked

local function=checks [ 3 -le $myVerbosity ] && myLevel=$(($myLevel+1)) && echo [${myLevel}] entering function \"$function $*\"

if [ 1 -eq "$1" ] then #checks first round [ 3 -le $myVerbosity ] && echo [${myLevel}] \"... checks first round\"

# Checks for non empty # - mandatory callee script if [ -z "${myCalleeScript}" ] then echo "$scriptname: callee script name not set or empty ... exiting" 1>&2 unsets exit 1; fi # - mandatory hostname if [ -z "${myHostname}" ] then echo "$scriptname: hostname not available, set or empty ... exiting" 1>&2 unsets exit 1; fi

# Check is file / directory and complete path # - optional IocListFile if [ ! -z ${myIocListFile} ] then [ 3 -le $myVerbosity ] && echo [${myLevel}] "\" ... IOC list file:\"" isAbsolutePath ${myIocListFile} || myIocListFile=$(pwd)/${myIocListFile} exitIfNotAFile ${myIocListFile} "IOC list file" myIocListFile="$(cd $(dirname ${myIocListFile}) 2>/dev/null && pwd)/$(basename ${myIocListFile})" fi

# Checks for mandatory absolute paths, if not exit exitIfNotAbsolutePath $myCalleeScript "callee script" [ ! -z ${myCalleeScript} ] && exitIfNotAbsolutePath $myCalleeScript "callee script" # Executable permission # - mandatory callee script

exitIfNotExecutable ${myCalleeScript} "caller script" && myCalleeScript="$(cd $(dirname ${myCalleeScript}) 2>/dev/null && pwd)/$(basename ${myCalleeScript})" elif [ 2 -eq "$1" ] then #checks second round [ 3 -le $myVerbosity ] && echo [${myLevel}] \"... checks second round\"

# Checks for mandatory absolute paths, if not exit

[ 3 -le $myVerbosity ] && echo [${myLevel}] "\"... checks for mandatory absolute paths: myBaseHome\"" if [ ! -z ${myBaseHome} ] then exitIfNotAbsolutePath ${myBaseHome} "base home" && exitIfNotADirectory ${myBaseHome} "base home" && myBaseHome="$(cd ${myBaseHome} 2>/dev/null && pwd)" fi

[ 3 -le $myVerbosity ] && echo [${myLevel}] "\"... checks for mandatory absolute paths: workingDir - $myWorkingDir\"" if [ ! -z ${myWorkingDir} ] then exitIfNotAbsolutePath ${myWorkingDir} "working Directory" && exitIfNotADirectory ${myWorkingDir} "working Directory" && myWorkingDir="$(cd ${myWorkingDir} 2>/dev/null && pwd)" else [ 3 -le $myVerbosity ] && echo [${myLevel}] "\"... workingDir not set, set it to pwd\"" myWorkingDir=$(pwd) fi

# Convert the rest to absolute paths [ 3 -le $myVerbosity ] && echo [${myLevel}] "\"... convert the rest to absolute paths and check them:\""

if [ ! -z "${myIocBootDir}" ] then [ 3 -le $myVerbosity ] && echo [${myLevel}] "\" ... iocBootDir:\"" isAbsolutePath ${myIocBootDir} || myIocBootDir=${myWorkingDir}/${myIocBootDir} && [ 3 -le $myVerbosity ] && echo [${myLevel}] "iocBootDir: \"$myIocBootDir\"" exitIfNotADirectory ${myIocBootDir} "IOC Boot directory" myIocBootDir="$(cd ${myIocBootDir} 2>/dev/null && pwd)" fi

if [ ! -z "${myLoggingDir}" ] then [ 3 -le $myVerbosity ] && echo [${myLevel}] "\" ... iocLoggingDir:\"" isAbsolutePath ${myLoggingDir} || myLoggingDir=${myWorkingDir}/${myLoggingDir} exitIfNotADirectory ${myLoggingDir} "procServ Logging directory" myLoggingDir="$(cd ${myLoggingDir} 2>/dev/null && pwd)" fi

if [ ! -z "${commandExecutable}" ] then [ 3 -le $myVerbosity ] && echo [${myLevel}] "\" ... commandExecutable:\"" isAbsolutePath ${commandExecutable} && if 1 then exitIfNotExecutable ${commandExecutable} "command executable" else if [ ! -z "${myIocBootDir}" ] then if [ -f "${myIocBootDir}/${commandExecutable}" ] then exitIfNotExecutable ${myIocBootDir}/${commandExecutable} "iocBootDir extended command executable" fi else commandExecutable=${myWorkingDir:+${myWorkingDir}/}${commandExecutable} exitIfNotExecutable ${commandExecutable} "myWorkingDir extended command executable" fi fi isAbsolutePath "${commandExecutable}" && commandExecutable="$(cd $(dirname ${commandExecutable}) 2>/dev/null && pwd)/$(basename ${commandExecutable})" fi

if [ ! -z ${myProcServExecutable} ] then [ 3 -le $myVerbosity ] && echo [${myLevel}] "\" ... myProcServExecutable:\"" isAbsolutePath ${myProcServExecutable} || myProcServExecutable=${myBaseHome}/${myProcServExecutable} exitIfNotExecutable "${myProcServExecutable}" "procServ executable" myProcServExecutable="$(cd $(dirname ${myProcServExecutable}) 2>/dev/null && pwd)/$(basename ${myProcServExecutable})" fi else echo "$scriptname: function $0 called with wrong argument only \"1\" or \"2\" is allowed ... exiting" 1>&2 unsets exit 1; fi [ 3 -le $myVerbosity ] && echo [${myLevel}] " leaving" function \"$function\" && myLevel=$(($myLevel-1)) }

# analyze IocListFile for given hostname analyzeIocListFile() { # analyzeIocListFile hostname iocEntryCounter # find iocEntryCounter-nth apperance of hostname in the IOC List File # and # assign found settings

local function=analyzeIocListFile [ 3 -le $myVerbosity ] && myLevel=$(($myLevel+1)) && echo [${myLevel}] entering function \"$function $*\" local counter=0;

# IOC list file # # hostname | command exe | command arguments | telnet | telnet | logging directory | working dir a.k.a application dir | IOC boot directory | procServ exe | procServ libs | name | baseHome # | | | control | log | | | | | | | # | | | port | port | | | | | | | # [ 1 -le $myVerbosity ] && echo -e "\t" "reading in IOC list file: \"$myIocListFile\"" [ 3 -le $myVerbosity ] && echo -e "\t" "content of IOC list file:\n" && cat $myIocListFile

unset record record=$(grep $1 ${myIocListFile} | sed -e "s/ *${myIocListFileSeparator} */${myIocListFileSeparator}/g" -e "s/ */ /g" -e "s/^ *//g" | awk -F "${myIocListFileSeparator}" -v no=$2 -v s=$(echo ${myIocListFileSeparator}) 'BEGIN{ctr=0}(/^[^#]/) && (!/^ *$/) {if (++ctr==no) {print $2s$3s$4s$5s$6s$7s$8s$9s$10s$11s$12}}')

if [ ! -z "$record" ] then record=$(echo ${record} | sed -e "s/ (${myIocListFileSeparator}) /\1/g" | sed -e 's/^ *//g' | sed -e 's/ *$//g' ) [ 2 -le $myVerbosity ] && echo -e "\t\t matching record found: \"$record\"" commandExecutable=$(echo "$record" | cut -d ${myIocListFileSeparator} -f 1 | sed -e 's/^ *//g' | sed -e 's/ *$//g' ) [ 3 -le $myVerbosity ] && echo -e "\t\t\t assigned: commandExecutable to \"${commandExecutable}\"" commandArguments=$(echo "$record" | cut -d ${myIocListFileSeparator} -f 2 | sed -e 's/^ *//g' | sed -e 's/ *$//g' ) [ 3 -le $myVerbosity ] && echo -e "\t\t\t assigned: commandArguments to \"${commandArguments}\"" myProcServTelnetPort=$(echo "$record" | cut -d ${myIocListFileSeparator} -f 3 | sed -e 's/^ *//g' | sed -e 's/ *$//g' ) [ 3 -le $myVerbosity ] && echo -e "\t\t\t assigned: myProcServTelnetPort to \"${myProcServTelnetPort}\"" myProcServTelnetLogPort=$(echo "$record" | cut -d ${myIocListFileSeparator} -f 4 | sed -e 's/^ *//g' | sed -e 's/ *$//g' ) [ 3 -le $myVerbosity ] && echo -e "\t\t\t assigned: myProcServTelnetLogPort to \"${myProcServTelnetLogPort}\"" myLoggingDir=$(echo "$record" | cut -d ${myIocListFileSeparator} -f 5 | sed -e 's/^ *//g' | sed -e 's/ *$//g' ) [ 3 -le $myVerbosity ] && echo -e "\t\t\t assigned: myLoggingDir to \"${myLoggingDir}\"" myWorkingDir=$(echo "$record" | cut -d ${myIocListFileSeparator} -f 6 | sed -e 's/^ *//g' | sed -e 's/ *$//g' ) [ 3 -le $myVerbosity ] && echo -e "\t\t\t assigned: myWorkingDir to \"${myWorkingDir}\"" myIocBootDir=$(echo "$record" | cut -d ${myIocListFileSeparator} -f 7 | sed -e 's/^ *//g' | sed -e 's/ *$//g' ) [ 3 -le $myVerbosity ] && echo -e "\t\t\t assigned: myIocBootDir to \"${myIocBootDir}\"" myProcServExecutable=$(echo "$record" | cut -d ${myIocListFileSeparator} -f 8 | sed -e 's/^ *//g' | sed -e 's/ *$//g' ) [ 3 -le $myVerbosity ] && echo -e "\t\t\t assigned: myProcServExecutable to \"${myProcServExecutable}\"" myLdLibPaths=$(echo "$record" | cut -d ${myIocListFileSeparator} -f 9 | sed -e 's/^ *//g' | sed -e 's/ *$//g' ) [ 3 -le $myVerbosity ] && echo -e "\t\t\t assigned: myLdLibPaths to \"${myLdLibPaths}\"" myProcServIocName=$(echo "$record" | cut -d ${myIocListFileSeparator} -f 10 | sed -e 's/^ *//g' | sed -e 's/ *$//g' ) [ 3 -le $myVerbosity ] && echo -e "\t\t\t assigned: myProcServIocName to \"${myProcServIocName}\"" myBaseHome=$(echo "$record" | cut -d ${myIocListFileSeparator} -f 11 | sed -e 's/^ *//g' | sed -e 's/ *$//g' ) [ 3 -le $myVerbosity ] && echo -e "\t\t\t assigned: myBaseHome to \"${myBaseHome}\"" unset record returnValue=0 else [ 2 -le $myVerbosity ] && echo -e "\t\t no matching record found\"$record\"" returnValue=1 fi

[ 3 -le $myVerbosity ] && echo [${myLevel}] " leaving" function \"$function\" && myLevel=$(($myLevel-1)) return $returnValue; }

#execute execute() { # main code which calls the callee local function=execute [ 3 -le $myVerbosity ] && myLevel=$(($myLevel+1)) && echo [${myLevel}] entering function \"$function $*\"

myList=$(echo $myList | sed -e 's/"//g') [ 1 -le $myVerbosity ] && echo -e "\t checking for matching item in list of hostnames:" $myList

iocEntryCounter=0

for item in $myList do if [ "$item" = "$myHostname" ] then [ 1 -le $myVerbosity ] && echo -e "\t found match: \"$item\""

# if IOC List File is used if [ ! -z "${myIocListFile}" ] then [ 1 -le $myVerbosity ] && echo -e "\t get settings from file \"${myIocListFile}\"" iocEntryCounter=$(($iocEntryCounter +1 )) analyzeIocListFile $item $iocEntryCounter || continue; # do the second check [ 1 -le $myVerbosity ] && echo -e "\t "'consistency checks (2)...' checks 2 fi

[ 1 -le $myVerbosity ] && echo -e "\t calling callee ..."

local arguments; counter=0; while [ $counter -lt $myVerbosityCallee ]; do arguments=${arguments}" -v"; counter=$(($counter+1)); done

arguments=${arguments}"${myWorkingDir:+ -${myWorkingDirOpt} ${myWorkingDir}}" arguments=${arguments}"${myIocBootDir:+ -${myIocBootDirOpt} ${myIocBootDir}}" arguments=${arguments}"${commandExecutable:+ -${commandExecutableOpt} ${commandExecutable}}" arguments=${arguments}"${commandArguments:+ -${commandArgumentsOpt} ${commandArguments}}" [ -z "${myLoggingDir}" ] && arguments="${arguments}${myProcServFileLogging:+ -${myProcServFileLoggingOpt}}" arguments=${arguments}"${myLoggingDir:+ -${myLoggingDirOpt} ${myLoggingDir} -${myProcServFileLoggingOpt}}" arguments=${arguments}"${myProcServTelnetPort:+ -${myProcServTelnetPortOpt} ${myProcServTelnetPort}}" arguments=${arguments}"${myProcServTelnetLogPort:+ -${myProcServTelnetLogPortOpt} ${myProcServTelnetLogPort}}" arguments=${arguments}"${myProcServExecutable:+ -${myProcServExecutableOpt} ${myProcServExecutable}}" arguments=${arguments}"${myLdLibPaths:+ -${myLdLibPathsOpt} ${myLdLibPaths}}" arguments=${arguments}"${myBaseHome:+ -${myBaseHomeOpt} ${myBaseHome}}" arguments=${arguments}"${myEchoCallee:+ -${myEchoOpt} ${myEchoCallee}}" arguments=${arguments}"${myDebugCallee:+ -${myDebugOpt} ${myDebugCallee}}" arguments=${arguments}"${myProcServIocName:+ -${myProcServIocNameOpt} ${myProcServIocName}}" arguments=${arguments}"${calleeArguments:+ ${calleeArguments}}"

${myEcho} export HOSTNAME=${HOSTNAME:=${myHostname}} eval ${myEcho} ${myCalleeScript} ${arguments}

#multiple IOC are allowed? if [ -z "$multipleIocs" ] then break else [ 1 -le $myVerbosity ] && echo -e "\t since multiple IOCs are allowed: heat $iocEntryCounter finished" fi fi done [ 3 -le $myVerbosity ] && echo [${myLevel}] " leaving" function \"$function\" && myLevel=$(($myLevel-1))

[ 3 -le $myVerbosity ] && echo [${myLevel}] " leaving" function \"execute\" && myLevel=$(($myLevel-1)) }

# function help help() { usage ; unsets; exit 0; }

### main #init functions predefines specificPredefines

#eval options oldIFS=$IFS #store old IFS IFS="|" #change IFS to handle quotes when passing args to functions evalOptions $(echo "$*""$IFS" | sed -e "s/\(-[a-zA-Z0-9]$IFS\)\([^-]*\)\($IFS\)/\1\"\2\"\3/g") IFS=$oldIFS #reset IFS

#call Help if help option is set [ ! -z "$myHelp" ] && help;

#load helper functions if [ -f "$myExitIfHelperScript" ] then . ${myExitIfHelperScript} else echo "$scriptname: helper script \`$myExitIfHelperScript' does not exists ... exiting" 1>&2 unsets exit 1; fi

[ 1 -le $myVerbosity ] && echo $scriptname ... [ 2 -le $myVerbosity ] && dump;

# debug settings [ ! -z $myDebug ] && set -x -v

#if log port not set, then logport = port + 1 [ -z "$myProcServTelnetLogPort" ] && myProcServTelnetLogPort=$((${myProcServTelnetPort} + 1))

[ 1 -le $myVerbosity ] && echo -e "\t "'consistency checks (1)...'

#checks first round checks 1

# IOC list file # - get list of hostnames from IOC list file if [ ! -z "${myIocListFile}" ] then [ 1 -le $myVerbosity ] && echo -e "\t reading in IOC list file: \"$myIocListFile\"" [ 3 -le $myVerbosity ] && echo -e "\t content of IOC list file:\n" && cat $myIocListFile myList=$(sed -e "s/ *${myIocListFileSeparator} */${myIocListFileSeparator}/g" -e "s/ */ /g" -e "s/^ *//g" ${myIocListFile} | awk -F "${myIocListFileSeparator}" '(/^[^#]/) && (!/^ *$/) {print $1}') myListLength=$(echo $myList | wc -w) # myList=$(grep -v '^#' ${myIocListFile} | sed -e "s/ */ /g" | cut -d "${myIocListFileSeparator}" -f 1 ) [ 2 -le $myVerbosity ] && echo -e "\t\t" "found hostnames: "\`$myList\' fi

# if IOC list is not used/set, do the second round of check if [ -z "${myIocListFile}" ] then [ 1 -le $myVerbosity ] && echo -e "\t"' consistency checks (2) ...' checks 2; fi

# execute callee caller, etc.. execute # clean unsets exit 0

%end%

This topic: Epics > WebHome > EpicsProjectsAndActivities > HadesControlSystem > HowToSetupHadesIOCsRestartAtReboot > HowToSetupHadesIOCsRestartAtRebootHadconStartEpicsIocScript
Topic revision: 2010-02-11, PeterZumbruch
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding GSI Wiki? Send feedback | Legal notice | Privacy Policy (german)