Add the fai build method based on Sam Vilain's patch.
[util-vserver.git] / scripts / vserver-build.fai
1 #
2 # Copyright (C) 2006 Sam Vilain <sam.vilain@catalyst.net.nz>
3 #  
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; version 2 of the License.
7 #  
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
12 #  
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16
17 tmp=$(getopt -o '+d:f:n:a' --long debug,pkgmgmt -n "$0" -- "$@") || exit 1
18 eval set -- "$tmp"
19
20 . "$_LIB_VSERVER_BUILD_FUNCTIONS_PKGMGMT"
21 . "$__PKGLIBDIR/vserver.functions"
22
23 DISTRIBUTION=:
24
25 FAI_VSERVER=
26 FAI_NFSROOT=/usr/lib/fai/nfsroot
27 FAI_DIR=/usr/local/share/fai
28
29 use_pkgmgmt=
30 while true; do
31     case "$1" in
32         -f)             FAI_VSERVER=$2; shift; ;;
33         -n)             FAI_NFSROOT=$2; shift; ;;
34         -d)             FAI_DIR=$2; shift; ;;
35         -a)             AUTO=1; ;;
36         --debug)        DEBUG=1; SH_DEBUG=-x; set -x;;
37         --)             shift; break ;;
38         *)              echo "vserver-build.fai: internal error: unrecognized option '$1'" >&2
39                         exit 1
40                         ;;
41     esac
42     shift
43 done
44
45 getDistribution '' 1
46
47 base.init
48 base.initFilesystem "$OPTION_FORCE"
49
50 setup_writeOption "$VSERVER_NAME"
51 setup_writeInitialFstab
52
53 test -z "$BUILD_INITPRE"  || "$BUILD_INITPRE" "$SETUP_CONFDIR"  "$UTIL_VSERVER_VARS"
54
55 # if they specified a vserver where FAI is installed, then prefix its
56 # root to the FAI_NFSROOT etc (unless they have already specified a
57 # $ROOTDIR-relative path)
58 REAL_ROOTDIR=`getPhysicalDir "$ROOTDIR"`
59 REAL_VDIR=`getPhysicalDir "$VDIR"`
60 echo "ROOTDIR is $REAL_ROOTDIR"
61 echo "VDIR    is $REAL_VDIR"
62 if [ -n "$FAI_VSERVER" ]
63 then
64     echo "FAI_VSERVER is $FAI_VSERVER"
65     if [ `expr "$FAI_NFSROOT" : "$REAL_ROOTDIR"` -eq 0 ]
66     then
67         FAI_NFSROOT="$REAL_ROOTDIR/$FAI_VSERVER$FAI_NFSROOT"
68     fi
69     if [ `expr "$FAI_DIR" : "$REAL_ROOTDIR"` -eq 0 ]
70     then
71         FAI_DIR="$REAL_ROOTDIR/$FAI_VSERVER$FAI_DIR"
72     fi
73 fi
74 echo "FAI_NFSROOT is $FAI_NFSROOT"
75 echo "FAI_DIR     is $FAI_DIR"
76 FAI_ROOT=/tmp/target
77
78 if [ ! -e "$FAI_NFSROOT/usr/sbin/fai" ]
79 then
80     colpanic "NFSROOT not found - did you run fai-setup?"
81     exit 1
82 fi
83
84 if ! grep -qw VIRTUAL "$FAI_NFSROOT/usr/sbin/fai"
85 then
86     echo "*** Looks like you don't have the patched FAI."
87     echo "*** get it from svn://svn.debian.org/svn/fai/people/mugwump/vserver"
88     exit 1
89 fi
90
91 # setup a new filesystem namespace
92 set -e
93 #[ -d $FAI_NFSROOT/var/log/fai ] || mkdir $FAI_NFSROOT/var/log/fai
94
95 # suppresses color logo, as it does not leave the terminal in a nice
96 # state.
97 console=dummy
98
99 # set up interfaces, so that the vserver can be built with restricted
100 # network access.
101 generateOptions "$SETUP_CONFDIR"
102 enableInterfaces "$SETUP_CONFDIR"
103
104 # last chance to abort!
105 if [ -z "$AUTO" ]
106 then
107     echo -n "Press ENTER to begin, or Ctrl+C to cancel: "
108     read junk
109 fi
110
111 killprocs() {
112         base.__cleanup
113         if [ -e "/proc/virtual/$SETUP_CONTEXT" ]
114         then
115                 $_VKILL -c "$SETUP_CONTEXT" -s 15
116                 sleep 2
117                 $_VKILL -c "$SETUP_CONTEXT" -s 9
118         fi
119         set -x
120         disableInterfaces "$SETUP_CONFDIR"
121 }
122
123 trap killprocs INT EXIT
124
125 rwpaths="/var/lock /var/log /dev /var/run /etc/sysconfig"
126 [ -d "$FAI_NFSROOT/etc/network/run" ] && rwpaths="$rwpaths /etc/network/run"
127
128 export VDIR ROOTDIR FAI_VSERVER FAI_DIR FAI_NFSROOT FAI_ROOT console
129
130 [ -z "$AUTO" ] && FINAL_SHELL="exec /bin/sh -i"
131
132 mount -n -o ro --bind "$FAI_NFSROOT" /mnt
133 mount -n -t tmpfs -o size=64m,mode=1777 vm /mnt/tmp
134 mkdir -p /mnt/tmp/target
135 mount -n --bind "$VDIR" /mnt/tmp/target
136 mkdir -p /mnt/tmp/target/proc
137 mount -n -t proc proc /mnt/tmp/target/proc
138 for x in $rwpaths
139 do
140     /mnt/usr/lib/fai/mkrw -n "/mnt$x"
141 done
142 mount -n -o ro --bind "$FAI_DIR" /mnt/fai
143 mount -n -t proc proc /mnt/proc
144
145 cd /mnt
146 $_CHBIND "${CHBIND_OPTS[@]}" \
147     $_VCONTEXT --create "${OPTS_VCONTEXT_CREATE[@]}" -- \
148     $_VUNAME --xid self --set -t nodename="$SETUP_HOSTNAME" -- \
149     $_VATTRIBUTE --set --xid self "${OPTS_VATTRIBUTE[@]}" --ccap secure_mount \
150     $_VCONTEXT --migrate-self --endsetup --chroot $SILENT_OPT \
151         "${OPTS_VCONTEXT_MIGRATE[@]}" "${OPTS_VCONTEXT_ENTER[@]}" -- \
152     /bin/sh -c "/bin/sh $SH_DEBUG /etc/init.d/rcS -N vschild_build; $FINAL_SHELL"
153
154 test -z "$BUILD_INITPOST" || "$BUILD_INITPOST" "$SETUP_CONFDIR" "$UTIL_VSERVER_VARS"
155
156 base.setSuccess