Setting tag util-vserver-pl-0.4-29
[util-vserver-pl.git] / scripts / vuseradd
1 #!/bin/bash
2 #
3 # useradd(8) wrapper for vservers
4 #
5 # Mark Huang <mlhuang@cs.princeton.edu>
6 # Copyright (C) 2004-2006 The Trustees of Princeton University
7 #
8 # $Id$
9 #
10
11 : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars}
12 test -e "$UTIL_VSERVER_VARS" || {
13     echo "Can not find util-vserver installation; aborting..."
14     exit 1
15 }
16 . "$UTIL_VSERVER_VARS"
17
18 shopt -s nullglob
19
20 # Defaults
21 TYPE="default"
22
23 usage()
24 {
25     TYPES=
26     pushd "$__DEFAULT_VSERVERDIR/.vref" >/dev/null
27     for ref in * ; do
28         if [ -z "$TYPES" ] ; then
29             TYPES=$ref
30         else
31             TYPES="$TYPES, $ref"
32         fi
33     done
34     popd >/dev/null
35
36     echo "Usage: vuseradd [OPTION]... [NAME]"
37     echo "      -t      Reference image type ($TYPES)"
38     exit 1
39 }
40
41 # Get options
42 ISOLATE=false
43 while getopts "it:" opt ; do
44     case $opt in
45         t)
46             TYPE="$OPTARG"
47             ;;
48         i)
49             ISOLATE=true
50             ;;
51         *)
52             usage
53             ;;
54     esac
55 done
56 shift $(($OPTIND - 1))
57
58 # Get slice name
59 [ -z "$1" ] && usage
60 NAME=$1
61
62 # Add slices group to /etc/group if not already present
63 groupadd slices 2>/dev/null || :
64
65 # Add slice name to /etc/passwd
66 useradd -g slices -s /bin/vsh $NAME -p '*'
67
68 USERID=`id -u $NAME`
69 GROUPID=`id -g $NAME`
70 GROUPNAME=`id -gn $NAME`
71
72 # Create /etc/vservers configuration files
73 if [ ! -d $__CONFDIR/$NAME ] ; then
74     # Move away the guest contents for now
75     if [ -d $__DEFAULT_VSERVERDIR/$NAME ] ; then
76         mkdir -p "$__DEFAULT_VSERVERDIR/.vtmp"
77         TMP=$(mktemp -d "$__DEFAULT_VSERVERDIR/.vtmp/$NAME.XXXXXX")
78         mv $__DEFAULT_VSERVERDIR/$NAME "$TMP"
79         HAS_VSERVERDIR=1
80     else
81         HAS_VSERVERDIR=0
82     fi
83
84     if [ "$ISOLATE" = "true" ] ; then
85         $_VSERVER $NAME build -m skeleton --context $USERID \
86                 --interface nodev:`hostname -i` \
87                 --flags persistent,~info_init
88     else 
89         $_VSERVER $NAME build -m skeleton --context $USERID \
90                 --interface nodev:`hostname -i` \
91                 --interface nodev:127.0.0.1 \
92                 --flags persistent,~info_init
93     fi
94
95     RETVAL=$?
96     DIR=$__CONFDIR/$NAME
97     if [ $RETVAL -ne 0 ] ; then
98         echo "Error $RETVAL building $DIR"
99         rm -rf $DIR $__DEFAULT_VSERVERDIR/$NAME
100     fi
101     mkdir -p $DIR/apps/init $DIR/rlimits $DIR/sched $DIR/cgroup $DIR/dlimits/0 $DIR/sysctl/0
102     echo default > $DIR/apps/init/mark
103
104     # Set persistent for the network context
105     if [ "$ISOLATE" = "true" ]; then
106         echo persistent,lback_allow,hide_lback,lback_remap > $DIR/nflags
107     else 
108         echo persistent,lback_allow > $DIR/nflags
109     fi
110
111     # Set default capabilities
112     echo "CAP_NET_RAW" > $DIR/bcapabilities
113     touch $DIR/ccapabilities
114
115     # Set up the scheduler
116     echo 100 > $DIR/sched/interval
117     echo 1000 > $DIR/sched/interval2
118     echo 0 > $DIR/sched/fill-rate
119     echo 1 > $DIR/sched/fill-rate2
120     touch $DIR/sched/idle-time
121     echo 100 > $DIR/sched/tokens
122     echo 50 > $DIR/sched/tokens-min
123     echo 100 > $DIR/sched/tokens-max
124
125     echo 1024 > $DIR/cgroup/cpu.shares
126
127     # Set up disk limits (10 GB)
128     echo `$_READLINK $DIR/vdir` > $DIR/dlimits/0/directory
129     echo 2 > $DIR/dlimits/0/reserved
130     echo -1 > $DIR/dlimits/0/inodes_total
131     echo 10000000 > $DIR/dlimits/0/space_total
132
133     # Set up sysctl variables
134     echo net.ipv4.ip_forward > $DIR/sysctl/0/setting
135     echo 1 > $DIR/sysctl/0/value
136     
137     # Add spaces directory
138     mkdir -p $DIR/spaces
139
140     # Remove the basically empty guest directory
141     rm -rf $__DEFAULT_VSERVERDIR/$NAME
142     # Move the guest back
143     if [ "$HAS_VSERVERDIR" = 1 ] ; then
144         mv "$TMP/$NAME" $__DEFAULT_VSERVERDIR/$NAME
145         rm -rf "$TMP"
146     fi
147 fi
148
149 if [ ! -d "$__DEFAULT_VSERVERDIR/$NAME" ] ; then
150     # Check the cache
151     if [ "$TYPE" = "default" ] ; then
152         for i in "$__DEFAULT_VSERVERDIR/.vcache/"* ; do
153             [ -d "$i" ] && mv "$i" "$__DEFAULT_VSERVERDIR/$NAME" && break
154         done
155     fi
156
157     # Build slice from reference image
158     if [ ! -d "$__DEFAULT_VSERVERDIR/$NAME" ] ; then
159         REF="$__DEFAULT_VSERVERDIR/.vref/$TYPE"
160
161         # Build in temporary directory
162         mkdir -p "$__DEFAULT_VSERVERDIR/.vtmp"
163         TMP=$(mktemp -d "$__DEFAULT_VSERVERDIR/.vtmp/$NAME.XXXXXX")
164         "$_VCLONE" "$REF"/ "$TMP"/
165         RETVAL=$?
166
167         # Move it to its permanent location when complete
168         if [ $RETVAL -eq 0 ] ; then 
169             mv "$TMP" "$__DEFAULT_VSERVERDIR/$NAME"
170         else
171             echo "Error $RETVAL building $__DEFAULT_VSERVERDIR/$NAME"
172             rm -rf "$TMP" $__CONFDIR/$NAME $__PKGSTATEDIR/$NAME.ctx
173             userdel -r $NAME
174             exit $RETVAL
175         fi
176     fi
177 fi
178
179 if [ -d "$__DEFAULT_VSERVERDIR/$NAME" ] ; then
180     # Fix permissions
181     chmod 755 "$__DEFAULT_VSERVERDIR/$NAME"
182
183     # Add user in vserver
184     $_VSERVER $NAME start --rescue sh -c \
185         "groupadd -g $GROUPID $GROUPNAME ; useradd -m -u $USERID -g $GROUPID -p '' $NAME"
186
187     # Stop the guest (since it's persistent)
188     $_VSERVER $NAME stop
189
190     # Add an unrestricted entry to /etc/sudoers file
191     if [ -f "$__DEFAULT_VSERVERDIR/$NAME/etc/sudoers" ] && \
192        ! grep -q "^$NAME" "$__DEFAULT_VSERVERDIR/$NAME/etc/sudoers" ; then
193         echo "$NAME     ALL=(ALL)       ALL" >> "$__DEFAULT_VSERVERDIR/$NAME/etc/sudoers"
194     fi
195
196     cp -a /dev/fuse $__DEFAULT_VSERVERDIR/$NAME/dev/
197
198 fi
199
200 exit 0