1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
|
// Copyright (c) 2020-2022, Sylabs Inc. All rights reserved.
// This software is licensed under a 3-clause BSD license. Please consult the
// LICENSE.md file distributed with the sources of this project regarding your
// rights to use or distribute this software.
package files
// ActionScript is the action script content.
var ActionScript = `#!/bin/sh
declare -r __exported_env__=$(getallenv)
declare -r __singularity_cmd__=${SINGULARITY_COMMAND:-}
if test -n "${SINGULARITY_APPNAME:-}"; then
readonly SINGULARITY_APPNAME
fi
export PWD
unsupported_builtin() {
sylog warning "$1 is not supported by this shell interpreter"
}
# create alias for unsupported builtin that trigger a panic
alias umask="umask_builtin"
alias trap="unsupported_builtin trap"
alias fg="unsupported_builtin fg"
alias bg="unsupported_builtin bg"
clear_env() {
local IFS=$'\n'
# disable globbing as __exported_env__ may contain
# wildcard evaluated by shell. It can cause serious
# performance issue when the current directory contains
# a lot of files/directories, see:
# https://github.com/hpcng/singularity/issues/5389
set -o noglob
for e in ${__exported_env__}; do
key=${e%%=*}
case "${key}" in
PWD|HOME|OPTIND|UID|SINGULARITY_APPNAME|SINGULARITY_SHELL)
;;
SINGULARITY_NAME|SINGULARITY_CONTAINER|SINGULARITY_INSTANCE)
readonly "${key}"
;;
*)
unset "${key}"
;;
esac
done
set +o noglob
}
restore_env() {
local IFS=$'\n'
# disable globbing as __exported_env__ and the export
# statement below may contain wildcard evaluated by shell.
# It can cause serious performance issue when the current
# directory contains a lot of files/directories, see:
# https://github.com/hpcng/singularity/issues/5389
set -o noglob
# restore environment variables which haven't been
# defined by docker or virtual file above, empty
# variables are also unset
for e in ${__exported_env__}; do
key=${e%%=*}
if ! test -v "${key}"; then
export "${e//'\u000A'/$IFS}"
elif test -z "${!key}"; then
unset "${key}"
fi
done
set +o noglob
}
clear_env
shopt -s expand_aliases
if test -d "/.singularity.d/env"; then
for __script__ in /.singularity.d/env/*.sh; do
if test -f "${__script__}"; then
sylog debug "Sourcing ${__script__}"
case "${__script__}" in
/.singularity.d/env/90-environment.sh)
# docker files below may not be present depending of image source
# and build, so we also fix the PATH if not defined here
if ! test -v PATH; then
export PATH="$(fixpath)"
fi
source "${__script__}"
;;
/.singularity.d/env/10-docker2singularity.sh| \
/.singularity.d/env/10-docker.sh)
source "${__script__}"
# append potential missing path from the default PATH
# used by Singularity
export PATH="$(fixpath)"
;;
/.singularity.d/env/99-base.sh)
# this file is the common denominator in image built since
# Singularity 2.3, inject forwarded variables right after
source "${__script__}"
source "/.inject-singularity-env.sh"
;;
*)
source "${__script__}"
;;
esac
fi
done
else
# this is for old images built with Singularity version prior to 2.3
if test -f "/environment"; then
source "/environment"
export PATH="$(fixpath)"
fi
source "/.inject-singularity-env.sh"
fi
if ! test -f "/.singularity.d/env/99-runtimevars.sh"; then
source "/.singularity.d/env/99-runtimevars.sh"
fi
shopt -u expand_aliases
restore_env
# See https://github.com/hpcng/singularity/issues/5340
# If there is no .singularity.d then a custom PS1 wasn't set.
# If we were called through a script and PS1 is empty this
# gives a confusing silent prompt. Force a PS1 if it's empty.
if test -z "${PS1:-}"; then
export PS1="Singularity> "
fi
# See https://github.com/sylabs/singularity/issues/2721,
# as bash is often used as the current shell it may confuse
# users if the provided command is /bin/bash implying to
# override PS1 set by singularity, then we may end up
# with a shell prompt identical to the host one, so we
# force PS1 through bash PROMPT_COMMAND
if test -z "${PROMPT_COMMAND:-}"; then
export PROMPT_COMMAND="PS1=\"${PS1}\"; unset PROMPT_COMMAND"
else
export PROMPT_COMMAND="${PROMPT_COMMAND:-}; PROMPT_COMMAND=\"\${PROMPT_COMMAND%%; PROMPT_COMMAND=*}\"; PS1=\"${PS1}\""
fi
export SINGULARITY_ENVIRONMENT="${SINGULARITY_ENVIRONMENT:-/.singularity.d/env/91-environment.sh}"
sylog debug "Running action command ${__singularity_cmd__}"
case "${__singularity_cmd__}" in
exec)
exec "$@" ;;
shell)
if test -n "${SINGULARITY_SHELL:-}" -a -x "${SINGULARITY_SHELL:-}"; then
exec "${SINGULARITY_SHELL:-}" "$@"
elif test -x "/bin/bash"; then
export SHELL=/bin/bash
exec "/bin/bash" --norc "$@"
elif test -x "/bin/sh"; then
export SHELL=/bin/sh
exec "/bin/sh" "$@"
fi
sylog error "/bin/sh does not exist in container"
exit 1 ;;
run)
if test -n "${SINGULARITY_APPNAME:-}"; then
if test -x "/scif/apps/${SINGULARITY_APPNAME:-}/scif/runscript"; then
exec "/scif/apps/${SINGULARITY_APPNAME:-}/scif/runscript" "$@"
fi
sylog error "no runscript for contained app: ${SINGULARITY_APPNAME:-}"
exit 1
elif test -x "/.singularity.d/runscript"; then
exec "/.singularity.d/runscript" "$@"
elif test -x "/singularity"; then
exec "/singularity" "$@"
elif test -x "/bin/sh"; then
sylog info "No runscript found in container, executing /bin/sh"
exec "/bin/sh" "$@"
fi
sylog error "No runscript and no /bin/sh executable found in container, aborting"
exit 1 ;;
test)
if test -n "${SINGULARITY_APPNAME:-}"; then
if test -x "/scif/apps/${SINGULARITY_APPNAME:-}/scif/test"; then
exec "/scif/apps/${SINGULARITY_APPNAME:-}/scif/test" "$@"
fi
sylog error "No tests for contained app: ${SINGULARITY_APPNAME:-}"
exit 1
elif test -x "/.singularity.d/test"; then
exec "/.singularity.d/test" "$@"
fi
sylog info "No test script found in container, exiting"
exit 0 ;;
start)
if test -n "${SINGULARITY_APPNAME:-}"; then
if test -x "/scif/apps/${SINGULARITY_APPNAME:-}/scif/startscript"; then
exec "/scif/apps/${SINGULARITY_APPNAME:-}/scif/startscript" "$@"
fi
sylog error "No startscript for contained app: ${SINGULARITY_APPNAME:-}"
exit 1
elif test -x "/.singularity.d/startscript"; then
exec "/.singularity.d/startscript" "$@"
fi
sylog info "No instance start script found in container"
exit 0 ;;
*)
sylog error "Unknown action ${__singularity_cmd__}"
exit 1 ;;
esac
`
// RuntimeVars is the runtime variables script.
var RuntimeVars = `#!/bin/sh
if test -n "${SING_USER_DEFINED_PREPEND_PATH:-}"; then
PATH="${SING_USER_DEFINED_PREPEND_PATH}:${PATH}"
unset SING_USER_DEFINED_PREPEND_PATH
fi
if test -n "${SING_USER_DEFINED_APPEND_PATH:-}"; then
PATH="${PATH}:${SING_USER_DEFINED_APPEND_PATH}"
unset SING_USER_DEFINED_APPEND_PATH
fi
if test -n "${SING_USER_DEFINED_PATH:-}"; then
PATH="${SING_USER_DEFINED_PATH}"
unset SING_USER_DEFINED_PATH
fi
export PATH
`
|