replacing pldistro-fcdistro-*.lst with a pldistro-*.lst with variants embedded
[build.git] / vbuild-init-vserver.sh
1 #!/bin/bash
2 # -*-shell-*-
3
4 COMMAND=$(basename $0)
5
6 # lst parsing utilities
7 PATH=$(dirname $0):$PATH . build.common
8
9 function failure () {
10     echo "$COMMAND : Bailing out"
11     exit 1
12 }
13
14 # overwrite vserver's internal yum config from what is in
15 # .distributions/<distrib>/yum/yum.conf and /yum.repos.d 
16 # note : on fc6 I've had trouble with yum.conf, I haven't created a custom yum.conf
17 # when using the default yum.conf, 
18 # vserver build -m yum complained that /vservers/<v>/var/log/yum.log could not be created
19
20 function configure_yum_in_vserver () {
21     set -x 
22     set -e 
23     trap failure ERR INT
24
25     vserver=$1; shift
26     fcdistro=$1; shift
27
28     cd /etc/vservers/.distributions/${fcdistro}
29     if [ -f yum/yum.conf ] ; then
30         echo "Initializing yum.conf in $vserver from $(pwd)/yum"
31         cp yum/yum.conf /vservers/$vserver/etc/yum.conf
32     else
33         echo "Cannot initialize yum.conf in $vserver - using $fcdistro default"
34     fi
35
36     if [ -d yum.repos.d ] ; then
37         echo "Initializing yum.repos.d in $vserver from $(pwd)/yum.repos.d"
38         rm -rf /vservers/$vserver/etc/yum.repos.d
39         tar cf - yum.repos.d | tar -C /vservers/$vserver/etc -xvf -
40     else
41         echo "Cannot initialize yum.repos.d in $vserver"
42     fi
43     cd -
44 }    
45
46 function setup_vserver () {
47
48     set -x
49     set -e
50     trap failure ERR INT
51
52     vserver=$1; shift
53     fcdistro=$1; shift
54     personality=$1; shift
55
56     # create the new vserver
57     [ ! -d /etc/vservers/$vserver ] && $personality vserver $VERBOSE $vserver build -m yum -- -d $fcdistro
58
59     if [ ! -z "$personality" ] ; then
60         l32=$(grep $personality /etc/vservers/$vserver/personality | wc -l)
61         [ $l32 -eq 0 ] && echo $personality >> /etc/vservers/$vserver/personality
62     fi
63
64     # set up appropriate vserver capabilities to mount, mknod and IPC_LOCK
65     BCAPFILE=/etc/vservers/$vserver/bcapabilities
66     touch $BCAPFILE
67     cap=$(grep ^CAP_SYS_ADMIN /etc/vservers/$vserver/bcapabilities | wc -l)
68     [ $cap -eq 0 ] && echo 'CAP_SYS_ADMIN' >> /etc/vservers/$vserver/bcapabilities
69     cap=$(grep ^CAP_MKNOD /etc/vservers/$vserver/bcapabilities | wc -l)
70     [ $cap -eq 0 ] && echo 'CAP_MKNOD' >> /etc/vservers/$vserver/bcapabilities
71     cap=$(grep ^CAP_IPC_LOCK /etc/vservers/$vserver/bcapabilities | wc -l)
72     [ $cap -eq 0 ] && echo 'CAP_IPC_LOCK' >> /etc/vservers/$vserver/bcapabilities
73
74     # start the vserver so we can do the following operations
75     $personality vyum $vserver -- -y install yum
76     $personality vserver $VERBOSE $vserver pkgmgmt internalize
77     $personality vserver $VERBOSE $vserver start
78     $personality vserver $VERBOSE $vserver exec rm -f /var/lib/rpm/__db*
79     $personality vserver $VERBOSE $vserver exec rpm --rebuilddb
80
81     configure_yum_in_vserver $vserver $fcdistro
82
83     # set up resolv.conf
84     cp /etc/resolv.conf /vservers/$vserver/etc/resolv.conf
85
86 }
87
88 function devel_tools () {
89
90     set -x 
91     set -e 
92     trap failure ERR INT
93
94     vserver=$1; shift
95     fcdistro=$1; shift
96     pldistro=$1; shift
97     personality=$1; shift
98
99     # check for .lst file based on pldistro
100     lst=${pldistro}-devel.lst
101     if [ -f $lst ] ; then
102         echo "$COMMAND: Using $lst"
103     else
104         echo "$COMMAND : Cannot locate $lst - exiting"
105         usage
106     fi
107
108     # install individual packages, then groups
109     packages=$(pl_getPackages2 ${fcdistro} $lst)
110     groups=$(pl_getGroups2 ${fcdistro} $lst)
111
112     [ -n "$packages" ] && $personality vserver $vserver exec yum -y install $packages
113     [ -n "$groups" ] && $personality vserver $vserver exec yum -y groupinstall $groups
114     return 0
115 }
116
117 function post_install () {
118
119     set -x 
120     set -e 
121     trap failure ERR INT
122
123     vserver=$1; shift
124     personality=$1; shift
125
126 ### From myplc-devel-native.spec
127 # be careful to backslash $ in this, otherwise it's the root context that's going to do the evaluation
128     cat << EOF | $personality vserver $VERBOSE $vserver exec bash -x
129     # set up /dev/loop* in vserver
130     for i in \$(seq 0 255) ; do
131         mknod -m 640 /dev/loop\$i b 7 \$i
132     done
133     
134     # create symlink for /dev/fd
135     ln -fs /proc/self/fd /dev/fd
136
137     # modify /etc/rpm/macros to not use /sbin/new-kernel-pkg
138     sed -i 's,/sbin/new-kernel-pkg:,,' /etc/rpm/macros
139     if [ -h "/sbin/new-kernel-pkg" ] ; then
140         filename=\$(readlink -f /sbin/new-kernel-pkg)
141         if [ "\$filename" == "/sbin/true" ] ; then
142                 echo "WARNING: /sbin/new-kernel-pkg symlinked to /sbin/true"
143                 echo "\tmost likely /etc/rpm/macros has /sbin/new-kernel-pkg declared in _netsharedpath."
144                 echo "\tPlease remove /sbin/new-kernel-pkg from _netsharedpath and reintall mkinitrd."
145                 exit 1
146         fi
147     fi
148     
149     uid=2000
150     gid=2000
151     
152     # add a "build" user to the system
153     builduser=\$(grep "^build:" /etc/passwd | wc -l)
154     if [ \$builduser -eq 0 ] ; then
155         groupadd -o -g \$gid build;
156         useradd -o -c 'Automated Build' -u \$uid -g \$gid -n -M -s /bin/bash build;
157     fi
158
159 # Allow build user to build certain RPMs as root
160     if [ -f /etc/sudoers ] ; then
161         buildsudo=\$(grep "^build.*ALL=(ALL).*NOPASSWD:.*ALL"  /etc/sudoers | wc -l)
162         if [ \$buildsudo -eq 0 ] ; then
163             echo "build   ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers
164         fi
165         sed -i 's,^Defaults.*requiretty,#Defaults requiretty,' /etc/sudoers
166     fi
167 #
168 EOF
169
170 }
171
172 function usage () {
173     set +x 
174     echo "Usage: $COMMAND [-s] [-p] [-v] vserver-name distribution pldistro [personality]"
175     echo "Requirements: you need to have a vserver-compliant kernel,"
176     echo "  as well as the util-vserver RPM installed"
177     echo "Description:"
178     echo "  This command creates a fresh vserver instance, with the specified name"
179     echo "  The root filesystem is created from the specified distribution, e.g. fc6"
180     echo "  The third argument denotes a pldistro, e.g. onelab"
181     echo "  The last, optional, argument defaults to linux32"
182     echo "This is done in three steps"
183     echo " (*) setup phase : vserver creation, yum internalization and config (from /etc/vservers)"
184     echo " (*) tools install : the tools required for building are installed"
185     echo "    to this end we search for a .lst file that specifies the pkgs & groups"
186     echo "    assuming the above that pldistro is onelab:"
187     echo "    (*) we first check for onelab-devel-fc6.lst"
188     echo "    (*) and then for onelab-devel.lst"
189     echo " (*) post-install : create a build user, + various tunings required"
190     echo "Options:"
191     echo " -s : skips the setup phase"
192     echo " -t : skips the tools phase"
193     echo " -p : skips the post-install"
194     echo " -v : passes -v to calls to vserver"
195     exit 1
196 }
197
198 ### parse args and 
199 function main () {
200
201     set -e
202     trap failure ERR INT
203
204     DO_SETUP=true
205     DO_TOOLS=true
206     DO_POST=true
207     VERBOSE=
208     while getopts "stpvh" opt ; do
209         case $opt in
210             s) DO_SETUP="" ;;
211             t) DO_TOOLS="" ;;
212             p) DO_POST="" ;;
213             v) VERBOSE="-v" ;;
214             h|*) usage ;;
215         esac
216     done
217         
218     shift $(($OPTIND - 1))
219     
220     [[ -z "$@" ]] && usage
221     vserver=$1 ; shift
222     [[ -z "$@" ]] && usage
223     fcdistro=$1 ; shift
224     [[ -z "$@" ]] && usage
225     pldistro=$1 ; shift
226     if [[ -z "$@" ]] ; then
227         personality=linux32
228     else
229         personality=$1; shift
230     fi
231     [[ -n "$@" ]] && usage
232
233     [ -n "$DO_SETUP" ] && setup_vserver $vserver $fcdistro $personality
234     [ -n "$DO_TOOLS" ] && devel_tools $vserver $fcdistro $pldistro $personality
235     [ -n "$DO_POST" ] && post_install $vserver $personality
236
237 }
238
239 main "$@"