4 # Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; version 2 of the License.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars}
20 test -e "$UTIL_VSERVER_VARS" || {
21 echo $"Can not find util-vserver installation (the file '$UTIL_VSERVER_VARS' would be expected); aborting..." >&2
24 . "$UTIL_VSERVER_VARS"
30 $"Usage: $1 [--cap [!]<cap_name>] [--secure] [--xid <num>] [--disconnect]
31 [--domainname <name>] [--hostname <name>] [--flag <flags>+]
32 [--silent] [--] command arguments ...
34 chcontext allocate a new security context and executes
35 a command in that context.
36 By default, a new/unused context is allocated
39 Add a capability from the command. This option may be
40 repeated several time.
41 See /usr/include/linux/capability.h
42 In general, this option is used with the --secure option
43 --secure removes most critical capabilities and --cap
47 Remove a capability from the command. This option may be
48 repeated several time.
49 See /usr/include/linux/capability.h
52 Select the context. On root in context 0 is allowed to
53 select a specific context.
54 Context number 1 is special. It can see all processes
55 in any contexts, but can't kill them though.
56 Option --xid may be repeated several times to specify up to 16 contexts.
58 Start the command in background and make the process
60 --domainname new_domainname
61 Set the domainname (NIS) in the new security context.
62 Use "none" to unset the domain name.
64 Set one flag in the new or current security context. The following
65 flags are supported. The option may be used several time.
67 fakeinit: The new process will believe it is process number 1.
68 Useful to run a real /sbin/init in a vserver.
69 lock: The new process is trapped and can't use chcontext anymore.
70 sched: The new process and its children will share a common
72 nproc: Limit the number of process in the vserver according to
73 ulimit setting. Normally, ulimit is a per user thing.
74 With this flag, it becomes a per vserver thing.
75 private: No one can join this security context once created.
76 ulimit: Apply the current ulimit to the whole context
77 --hostname new_hostname
78 Set the hostname in the new security context
79 This is need because if you create a less privileged
80 security context, it may be unable to change its hostname
82 Remove all the capabilities to make a virtual server trustable
84 Do not print the allocated context number.
86 Report bugs to <$PACKAGE_BUGREPORT>."
90 function showVersion()
93 $"chcontext $PACKAGE_VERSION -- allocates/enters a security context
94 This program is part of $PACKAGE_STRING
96 Copyright (C) 2004 Enrico Scholz
97 This program is free software; you may redistribute it under the terms of
98 the GNU General Public License. This program has absolutely no warranty."
102 $_VSERVER_INFO - FEATURE migrate || exec $_CHCONTEXT_COMPAT "$@"
104 tmp=$(getopt -o + --long cap:,ctx:,xid:,disconnect,domainname:,flag:,hostname:,secure,silent,help,version -n "$0" -- "$@") || exit 1
117 --help) showHelp $0 0;;
118 --version) showVersion 0;;
119 --cap) OPT_CAPS=( "${OPT_CAPS[@]}" "$2" ); shift;;
120 --ctx|--xid) OPT_CTX=$2; shift;;
121 --disconnect) OPT_DISCONNECT=1;;
122 --domainname) OPT_DOMAINNAME=$2; shift;;
123 --hostname) OPT_HOSTNAME=$2; shift;;
125 test "$2" != "fakeinit" || OPT_INITPID=--initpid
126 OPT_FLAGS=( "${OPT_FLAGS[@]}" "$2" )
129 --secure) OPT_SECURE=1;;
130 --silent) OPT_SILENT=1;;
132 *) echo $"chcontext: internal error; arg=='$1'" >&2; exit 1;;
137 create_cmd=( $_VCONTEXT --create --silentexist
138 ${OPT_SILENT:+--silent}
139 ${OPT_CTX:+--xid "$OPT_CTX"} )
146 test -z "$OPT_DOMAINNAME$OPT_HOSTNAME" || \
147 chain_cmd=( "${chain_cmd[@]}"
149 $_VUNAME --set --xid self
150 ${OPT_DOMAINNAME:+-t domainname="$OPT_DOMAINNAME"}
151 ${OPT_HOSTNAME:+ -t nodename="$OPT_HOSTNAME"} )
153 chain_cmd=( "${chain_cmd[@]}"
156 ${OPT_SECURE:+--secure}
157 ${OPT_CAPS:+--bcap "${OPT_CAPS[*]}"}
158 ${OPT_FLAGS:+--flag "${OPT_FLAGS[*]}"} )
160 migrate_cmd=( $_VCONTEXT
161 ${OPT_SILENT:+--silent}
162 ${OPT_DISCONNECT:+--disconnect}
167 if test -z "$OPT_CTX" || $_VSERVER_INFO -q "$OPT_CTX" XIDTYPE static; then
168 "${create_cmd[@]}" "${chain_cmd[@]}" -- \
169 "${migrate_cmd[@]}" --endsetup --migrate-self -- "$@"
175 test "$rc" -ne 254 || exec "${migrate_cmd[@]}" --xid "$OPT_CTX" --migrate -- "$@"