declare -a INITKILL_SEQ=()
declare -a ENTER_SHELL=()
+declare -a OPTS_VCONTEXT_CREATE=()
+declare -a OPTS_VCONTEXT_MIGRATE=()
+declare -a OPTS_VATTRIBUTE=()
+USE_VNAMESPACE=
+
INTERFACE_CMDS_IDX=0
_HAVE_INTERFACE_OPTIONS=
_HAVE_CHBIND_OPTIONS=
case x"$cap" in
x|x#) ;;
!CAP_SYSCHROOT)
+ OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]" --cap "$cap" )
CAP_OPTS=( "${CAP_OPTS[@]}" --cap "$cap" )
CAPCHROOT_OPTS=( "${CAPCHROOT_OPTS[@]}" --nochroot )
;;
*)
+ OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]" --cap "$cap" )
CAP_OPTS=( "${CAP_OPTS[@]}" --cap "$cap" );;
esac
done <"$vdir"/capabilities
INITCMD_START=( /sbin/init )
INITCMD_STOP=( /sbin/init )
CHCONTEXT_INIT_OPTS=( --disconnect --flag fakeinit )
+ OPTS_VCONTEXT_MIGRATE=( "${OPTS_VCONTEXT_MIGRATE[@]}" --fakeinit --disconnect )
test -z "$runlevel_start" || INITCMD_START=( "${INITCMD_START[@]}" "$runlevel_start" )
test -z "$runlevel_stop" || INITCMD_STOP=( "${INITCMD_STOP[@]}" "$runlevel_stop" )
;;
CHCONTEXT_INIT_OPTS=( --disconnect --flag fakeinit )
INITCMD_START_SYNC=( "$_INITSYNC_MINIT_START" "$vdir" )
INITCMD_STOP_SYNC=( "$_INITSYNC_MINIT_STOP" "$vdir" )
+ OPTS_VCONTEXT_MIGRATE=( "${OPTS_VCONTEXT_MIGRATE[@]}" --fakeinit --disconnect )
test -z "$runlevel_start" || INITCMD_START=( "${INITCMD_START[@]}" "$runlevel_start" )
test -z "$runlevel_stop" || INITCMD_STOP=( "${INITCMD_STOP[@]}" "$runlevel_stop" )
;;
xnamespace) ;;
xfakeinit)
CHCONTEXT_INIT_OPTS=( --disconnect --flag fakeinit )
+ OPTS_VCONTEXT_MIGRATE=( "${OPTS_VCONTEXT_MIGRATE[@]}" --fakeinit --disconnect )
;;
*)
+ OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]}" --flag "$flag" )
CHCONTEXT_FLAG_OPTS=( "${CHCONTEXT_FLAG_OPTS[@]}"
--flag "$flag" )
;;
esac
done <"$vdir"/flags
- isAvoidNamespace "$cfgdir" || \
+ isAvoidNamespace "$cfgdir" || {
+ USE_VNAMESPACE=1
CHCONTEXT_FLAG_OPTS=( "${CHCONTEXT_FLAG_OPTS[@]}" --flag namespace )
+ }
}
function _generateChcontextOptions
${ctx:+--ctx "$ctx"} \
${hostname:+--hostname "$hostname"} \
${domainname:+--domainname "$domainname"} )
+
+ OPTS_VCONTEXT_CREATE=( $SILENT_OPT \
+ ${ctx:+--xid "$ctx"} )
+ ## put '--secure' at front so that it can be overridden
+ OPTS_VATTRIBUTE=( --secure "${OPTS_VATTRIBUTE[@]}" )
}
function _getInterfaceValue
popd >/dev/null
test "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$cfgdir"
+
+ test -z "$NAMESPACE_CLEANUP" || isAvoidNamespace "$cfgdir" || \
+ $_VNAMESPACE --cleanup
+
$_CHBIND "${CHBIND_OPTS[@]}" \
$_SECURE_MOUNT -a --chroot "$vdir" --fstab "$cfgdir"/fstab
execScriptlets "$VSERVER_DIR" "$VSERVER_NAME" pre-start
cd "$VSERVER_DIR"/vdir/
-"${NICE_CMD[@]}" \
+
+if $_VSERVER_INFO - FEATURE migrate; then
+ $_CHBIND "${CHBIND_OPTS[@]}" \
+ $_VCONTEXT --create "${OPTS_VCONTEXT_CREATE[@]}" \
+ ${USE_VNAMESPACE:+$_VNAMESPACE --set} \
+ $_VLIMIT --dir "$VSERVER_DIR/rlimits" --missingok \
+ $_VATTRIBUTE --set "${OPTS_VATTRIBUTE[@]}" \
+ $_VCONTEXT --migrate --chroot $SILENT_OPT "${OPTS_VCONTEXT_MIGRATE[@]}" \
+ -- "${INITCMD_START[@]}"
+else
+ "${NICE_CMD[@]}" \
"$_CHBIND" "${CHBIND_OPTS[@]}" \
"$_EXEC_ULIMIT" "$VSERVER_DIR/ulimits" \
"$_CHCONTEXT" "${CHCONTEXT_OPTS[@]}" "${CHCONTEXT_INIT_OPTS[@]}" \
"$_SAVE_CTXINFO" "$VSERVER_DIR" \
"$_CLEARENV" \
- "$_CAPCHROOT" "${CAPCHROOT_OPTS[@]}" . "${INITCMD_START[@]}"
+ "$_CAPCHROOT" "${CAPCHROOT_OPTS[@]}" . \
+ -- "${INITCMD_START[@]}"
+fi
"${INITCMD_START_SYNC[@]}"
execScriptlets "$VSERVER_DIR" "$VSERVER_NAME" pre-stop
cd "$VSERVER_DIR"/vdir/
-"${NICE_CMD[@]}" \
+
+if $_VSERVER_INFO - FEATURE migrate; then
+ ${USE_VNAMESPACE:+$_VNAMESPACE --enter "$S_CONTEXT"} \
+ $_VCONTEXT $SILENT_OPT --migrate --chroot --xid "$S_CONTEXT" \
+ -- "${INITCMD_STOP_SYNC[@]}" || :
+else
+ "${NICE_CMD[@]}" \
"$_CHBIND" "${CHBIND_OPTS[@]}" \
"$_EXEC_ULIMIT" "$VSERVER_DIR/ulimits" \
+ ${USE_VNAMESPACE:+$_VNAMESPACE --enter "$S_CONTEXT"} \
"$_CHCONTEXT" "${CHCONTEXT_OPTS[@]}" \
"$_CAPCHROOT" "${CAPCHROOT_OPTS[@]}" . "${INITCMD_STOP[@]}" && \
- "${INITCMD_STOP_SYNC[@]}" || :
+ -- "${INITCMD_STOP_SYNC[@]}" || :
+fi
sendKillSequence "$S_CONTEXT" "${INITKILL_SEQ[@]}"
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-isVserverRunning "$VSERVER_DIR" S_CONTEXT || :
+isVserverRunning "$VSERVER_DIR" S_CONTEXT || {
+ echo $"'vserver ... suexec' is support for running vservers only; aborting..." >&2
+ exit 1
+}
generateOptions "$VSERVER_DIR"
user=$1
shift
cd "$VSERVER_DIR"/vdir/
-exec \
-"${NICE_CMD[@]}" \
+
+if $_VSERVER_INFO - FEATURE migrate; then
+ exec \
+ ${USE_VNAMESPACE:+$_VNAMESPACE --enter "$S_CONTEXT"} \
+ $_VCONTEXT $SILENT_OPT --migrate --chroot --xid "$S_CONTEXT" --uid "$user" \
+ -- "$@"
+else
+ exec \
+ "${NICE_CMD[@]}" \
"$_CHBIND" "${CHBIND_OPTS[@]}" \
"$_EXEC_ULIMIT" "$VSERVER_DIR/ulimits" \
+ ${USE_VNAMESPACE:+$_VNAMESPACE --enter "$S_CONTEXT"} \
"$_CHCONTEXT" "${CHCONTEXT_OPTS[@]}" \
- "$_CAPCHROOT" "${CAPCHROOT_OPTS[@]}" --suid "$user" . "$@"
-
+ "$_CAPCHROOT" "${CAPCHROOT_OPTS[@]}" --suid "$user" . \
+ -- "$@"
+fi