diff --git a/support/bin/rtcds.in b/support/bin/rtcds.in index 3dae21dc1dd9cca0f0a5814adedc3a9956bb4337..8595c13b101746d73b1805f6c0dd5544bd9748ea 100755 --- a/support/bin/rtcds.in +++ b/support/bin/rtcds.in @@ -12,8 +12,13 @@ fi # this should define all USER_VARS (see below) ENV_FILE=${RTS_ENV:-/etc/advligorts/env} +HOST_ENV_FILE=/etc/advligorts/systemd_env_`hostname` set -o allexport source "$ENV_FILE" 2>/dev/null || true +if [[ -e $HOST_ENV_FILE ]] ; then + log "found host specific environment file '$HOST_ENV_FILE'" + source $HOST_ENV_FILE 2>/dev/null || true +fi set +o allexport SITE=${SITE^^*} @@ -21,6 +26,9 @@ site=${SITE,,*} IFO=${IFO^^*} ifo=${IFO,,*} +IS_DOLPHIN_NODE=${IS_DOLPHIN_NODE:-false} +DAQ_STREAMING=${DAQ_STREAMING:-false} + RCG_SRC=${RCG_SRC:-/usr/share/advligorts/src} RCG_BUILD_ROOT=${RCG_BUILD_ROOT:-/var/cache/advligorts} RCG_BUILDD=${RCG_BUILDD:-$RCG_BUILD_ROOT/rcg-$RTS_VERSION} @@ -48,6 +56,26 @@ umask 0002 ################################################## +contains() { + local x=$1 + shift + [[ $@ =~ (^|[[:space:]])$x($|[[:space:]]) ]] && return 0 || return 1 +} + +epics_only_model() { + contains $1 $EPICS_ONLY_MODELS && return 0 || return 1 +} + +# echo the systemd unit that should be used to control the model +get_model_unit() { + local sys=$1 + if epics_only_model ${sys} ; then + echo "rts-epics@${sys}" + else + echo "rts@${sys}.target" + fi +} + check_env() { for var in ${USER_VARS[*]} ; do if [ ! "${!var}" ] ; then @@ -136,7 +164,8 @@ check_host_sys_enabled() { check_host_sys_active() { for sys ; do check_unit_available ${sys} - if ! systemctl is-active rts@${sys}.target > /dev/null ; then + local unit_name=`get_model_unit ${sys}` + if ! systemctl is-active $unit_name > /dev/null ; then log "System '${sys}' is not active on this system'." exit 4 fi @@ -146,7 +175,8 @@ check_host_sys_active() { check_host_sys_inactive() { for sys ; do check_unit_available ${sys} - if systemctl is-active rts@${sys}.target > /dev/null ; then + local unit_name=`get_model_unit ${sys}` + if systemctl is-active $unit_name > /dev/null ; then log "System '$sys' is already active on this system'." exit 4 fi @@ -186,7 +216,9 @@ install_world() { start_sys() { for sys ; do log "### starting $sys..." - sudo systemctl start rts@${sys}.target + local unit_name=`get_model_unit ${sys}` + sudo systemctl start $unit_name + # pause needed to avoid timing glitch when user model started immediately after IOP log "... waiting for start of ${sys} to complete" sleep 15 @@ -198,7 +230,8 @@ stop_sys() { for sys ; do log "### stopping $sys..." #${SCRIPTD}/kill${sys} - sudo systemctl stop rts@${sys}.target + local unit_name=`get_model_unit ${sys}` + sudo systemctl stop $unit_name done } @@ -222,7 +255,11 @@ _lsmod() { local dolphin=(dis_kosif dis_ix_ntb dis_ix_dma dis_irm dis_sisci dis_intel_dma) # FIXME: how to test for needed modules? - modules=(${rts[*]} ${dolphin[*]}) + if $IS_DOLPHIN_NODE ; then + local modules=(${rts[*]} ${dolphin[*]}) + else + local modules=(${rts[*]}) + fi local allloaded= for m in ${modules[*]}; do @@ -237,12 +274,16 @@ _lsmod() { if [ "$systems" ] ; then echo for m in ${systems[*]}; do - md=$(lsmod | grep "^${m}\s") || true - if [ -z "$md" ] ; then - printf "%-18s ***NOT LOADED***\n" "$m" - allloaded=1 + if epics_only_model $m ; then + test 0 else - echo "$md" + md=$(lsmod | grep "^${m}") || true + if [ -z "$md" ] ; then + printf "%-18s ***NOT LOADED***\n" "$m" + allloaded=1 + else + echo "$md" + fi fi done fi @@ -267,18 +308,22 @@ systems_status() { echo "------------------------------------------------------" for sys in ${systems[*]} ; do - printf '%-15s' $sys + printf '%-15s ' $sys for subsys in ${subsystems[*]} ; do local subsysstatus='OFF' - if systemctl is-failed "rts-${subsys}@${sys}" > /dev/null ; then - subsysstatus='FAILED' - systems_health=10 + if ! epics_only_model $sys || [[ $subsys == 'epics' ]] ; then + if systemctl is-failed "rts-${subsys}@${sys}" > /dev/null ; then + subsysstatus='FAILED' + systems_health=10 + else + if systemctl is-active "rts-${subsys}@${sys}" > /dev/null ; then + subsysstatus='ON' + else + systems_health=10 + fi + fi else - if systemctl is-active "rts-${subsys}@${sys}" > /dev/null ; then - subsysstatus='ON' - else - systems_health=10 - fi + subsysstatus='N/A' fi printf '%-15s' $subsysstatus done @@ -334,13 +379,16 @@ global_status() { fi echo + local streamer_health=0 - echo - if streamer_status ; then - echo "Streamer Status = ALL ACTIVE" - else - echo "Streamer Status = DEGRADED" - streamer_health=12 + if $DAQ_STREAMING ; then + echo + if streamer_status ; then + echo "Streamer Status = ALL ACTIVE" + else + echo "Streamer Status = DEGRADED" + streamer_health=12 + fi fi echo