X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Fscripts%2Fchcontext;h=9fa67cda3ac447c412ae9cf0e86ffe4a57a0e621;hb=faa778968d1a7dfeaebc9fe4b847e691dc62fd15;hp=41f1582d830041197be330db0bf1e43eec87693e;hpb=66ff8eb2e4f7e51fab7bf0eae4a756c9f54b7132;p=util-vserver.git diff --git a/util-vserver/scripts/chcontext b/util-vserver/scripts/chcontext index 41f1582..9fa67cd 100755 --- a/util-vserver/scripts/chcontext +++ b/util-vserver/scripts/chcontext @@ -18,7 +18,7 @@ : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars} test -e "$UTIL_VSERVER_VARS" || { - echo "Can not find util-vserver installation; aborting..." >&2 + echo $"Can not find util-vserver installation (the file '$UTIL_VSERVER_VARS' would be expected); aborting..." >&2 exit 1 } . "$UTIL_VSERVER_VARS" @@ -27,7 +27,7 @@ test -e "$UTIL_VSERVER_VARS" || { function showHelp() { echo \ -$"Usage: /usr/sbin/chcontext [--cap [!]] [--secure] [--ctx ] [--disconnect] +$"Usage: /usr/sbin/chcontext [--cap [!]] [--secure] [--xid ] [--disconnect] [--domainname ] [--hostname ] [--flag +] [--silent] [--] command arguments ... @@ -48,12 +48,12 @@ By default, a new/unused context is allocated repeated several time. See /usr/include/linux/capability.h ---ctx num +--xid num Select the context. On root in context 0 is allowed to select a specific context. Context number 1 is special. It can see all processes in any contexts, but can't kill them though. - Option --ctx may be repeated several times to specify up to 16 contexts. + Option --xid may be repeated several times to specify up to 16 contexts. --disconnect Start the command in background and make the process a child of process 1. @@ -93,25 +93,15 @@ function showVersion() $"chcontext $PACKAGE_VERSION -- allocates/enters a security context This program is part of $PACKAGE_STRING -Copyright (C) 2003 Enrico Scholz +Copyright (C) 2004 Enrico Scholz This program is free software; you may redistribute it under the terms of the GNU General Public License. This program has absolutely no warranty." exit $1 } -function cleanup() -{ - if test -d "$tmpdir"; then - local S="$tmpdir"/socket - test ! -S "$S" || $_KEEP_CTX_ALIVE --quit "$S" &>/dev/null - rm -rf "$tmpdir" - fi -} - - $_VSERVER_INFO - FEATURE migrate || exec $_CHCONTEXT_COMPAT "$@" -tmp=$(getopt -o + --long cap:,ctx:,disconnect,domainname:,flag:,hostname:,secure,silent,help,version -n "$0" -- "$@") || exit 1 +tmp=$(getopt -o + --long cap:,ctx:,xid:,disconnect,domainname:,flag:,hostname:,secure,silent,help,version -n "$0" -- "$@") || exit 1 eval set -- "$tmp" OPT_CAPS=() @@ -120,17 +110,22 @@ OPT_DISCONNECT= OPT_FLAGS=() OPT_SECURE= OPT_SILENT= +OPT_INITPID= while true; do case "$1" in --help) showHelp $0 ;; --version) showVersion ;; - --cap) OPT_CAPS=( "${OPT_CAPS[@]}" "$1" ); shift;; - --ctx) OPT_CTX=$1; shift;; - --disconnect) OPT_DISCONNECT=1; - --domainname) OPT_DOMAINNAME=$1; shift;; - --hostname) OPT_HOSTNAME=$1; shift;; - --flag) OPT_FLAGS=( "${OPT_FLAGS[@]}" "$1" ); shift;; + --cap) OPT_CAPS=( "${OPT_CAPS[@]}" "$2" ); shift;; + --ctx|--xid) OPT_CTX=$2; shift;; + --disconnect) OPT_DISCONNECT=1;; + --domainname) OPT_DOMAINNAME=$2; shift;; + --hostname) OPT_HOSTNAME=$2; shift;; + --flag) + test "$2" != "fakeinit" || OPT_INITPID=--initpid + OPT_FLAGS=( "${OPT_FLAGS[@]}" "$2" ) + shift + ;; --secure) OPT_SECURE=1;; --silent) OPT_SILENT=1;; --) shift; break;; @@ -139,42 +134,43 @@ while true; do shift done -tmpdir= -tmpdir=$(mktemp -d /tmp/chcontext.XXXXXX) -trap "cleanup" EXIT - -xid=$($_VCONTEXT --create ${OPT_SILENT:+--silent} ${OPT_CTX:+--xid "$OPT_CTX"} -- $_CTX_KEEP_ALIVE --socket "$tmpdir"/socket --timeout 60) -rc=$? -test "$rc" -ne 255 || - echo $"chcontext: Failed to create the context; aborting..." >&2 - exit 1 -} - -test "$rc" -ne 254 || xid=$OPT_CTX -test "$xid" || { - echo $"chcontext: Failed to determine context xid; aborting..." >&2 - exit 1 -} - -set -e -test "$rc" -ne 0 || { - rm -rf "$tmpdir" - unset rc -} - -if test "$rc" -ne 254; then - $_VATTRIBUTE --xid "$xid" -s \ - ${OPT_CAPS:+--cap "${OPT_CAPS[@]}"} - ${OPT_FLAGS:+--flag "${OPT_FLAGS[@]}"} \ - ${OPT_SECURE:+--secure} - - $_VUNAME --xid "$xid" -s \ - ${OPT_DOMAINNAME:+--domainname "$OPT_DOMAINNAME"} \ - ${OPT_HOSTNAME:+--nodename "$OPT_HOSTNAME"} +create_cmd=( $_VCONTEXT --create --silentexist + ${OPT_SILENT:+--silent} + ${OPT_CTX:+--xid "$OPT_CTX"} ) + +chain_cmd=() + +old_IFS=$IFS +IFS=,$IFS + +test -z "$OPT_DOMAINNAME$OPT_HOSTNAME" || \ + chain_cmd=( "${chain_cmd[@]}" + -- + $_VUNAME --set --xid self + ${OPT_DOMAINNAME:+-t domainname="$OPT_DOMAINNAME"} + ${OPT_HOSTNAME:+ -t nodename="$OPT_HOSTNAME"} ) + +chain_cmd=( "${chain_cmd[@]}" + -- + $_VATTRIBUTE --set + ${OPT_CAPS:+--bcap "${OPT_CAPS[*]}"} + ${OPT_FLAGS:+--flag "${OPT_FLAGS[*]}"} + ${OPT_SECURE:+--secure} ) + +migrate_cmd=( $_VCONTEXT + ${OPT_SILENT:+--silent} + ${OPT_DISCONNECT:+--disconnect} + $OPT_INITPID ) + +IFS=$old_IFS + +if test -z "$OPT_CTX" || $_VSERVER_INFO -q "$OPT_CTX" XIDTYPE static; then + "${create_cmd[@]}" "${chain_cmd[@]}" -- \ + "${migrate_cmd[@]}" --endsetup --migrate-self -- "$@" + rc=$? +else + rc=254 fi -exec $_VCONTEXT --migrate --xid "$xid" \ - ${OPT_SILENT:+--silent} \ - ${OPT_DISCONNECT:+--disconnect} \ - ${rc:--syncsock "$tmpdir"/socket} \ - -- "$@" +test "$rc" -ne 254 || exec "${migrate_cmd[@]}" --xid "$OPT_CTX" --migrate -- "$@" +exit $rc