Remove leading /
[util-vserver.git] / scripts / vserver-build.fai
index 9c6506d..6e2333f 100644 (file)
@@ -25,6 +25,7 @@ DISTRIBUTION=:
 FAI_VSERVER=
 FAI_NFSROOT=/usr/lib/fai/nfsroot
 FAI_DIR=/usr/local/share/fai
+AUTO=1
 
 use_pkgmgmt=
 while true; do
@@ -32,7 +33,7 @@ while true; do
        -f)             FAI_VSERVER=$2; shift; ;;
        -n)             FAI_NFSROOT=$2; shift; ;;
        -d)             FAI_DIR=$2; shift; ;;
-       -a)             AUTO=1; ;;
+       -a)             AUTO=;;
        --debug)        DEBUG=1; SH_DEBUG=-x; set -x;;
        --)             shift; break ;;
        *)              echo "vserver-build.fai: internal error: unrecognized option '$1'" >&2
@@ -52,13 +53,20 @@ setup_writeInitialFstab
 
 test -z "$BUILD_INITPRE"  || "$BUILD_INITPRE" "$SETUP_CONFDIR"  "$UTIL_VSERVER_VARS"
 
+# migrate is a 2.6 feature, we need 2.6 for the secure_mount ccap
+if ! $_VSERVER_INFO - FEATURE migrate; then
+    panic $"\
+The fai build method requires kernel features that are not present
+in your kernel."
+fi
+
 # if they specified a vserver where FAI is installed, then prefix its
 # root to the FAI_NFSROOT etc (unless they have already specified a
 # $ROOTDIR-relative path)
 REAL_ROOTDIR=`getPhysicalDir "$ROOTDIR"`
 REAL_VDIR=`getPhysicalDir "$VDIR"`
-echo "ROOTDIR is $REAL_ROOTDIR"
-echo "VDIR    is $REAL_VDIR"
+echo $"ROOTDIR is $REAL_ROOTDIR"
+echo $"VDIR    is $REAL_VDIR"
 if [ -n "$FAI_VSERVER" ]
 then
     echo "FAI_VSERVER is $FAI_VSERVER"
@@ -71,35 +79,47 @@ then
         FAI_DIR="$REAL_ROOTDIR/$FAI_VSERVER$FAI_DIR"
     fi
 fi
-echo "FAI_NFSROOT is $FAI_NFSROOT"
-echo "FAI_DIR     is $FAI_DIR"
+echo $"FAI_NFSROOT is $FAI_NFSROOT"
+echo $"FAI_DIR     is $FAI_DIR"
 FAI_ROOT=/tmp/target
 
 if [ ! -e "$FAI_NFSROOT/usr/sbin/fai" ]
 then
-    colpanic "NFSROOT not found - did you run fai-setup?"
-    exit 1
+    panic $"NFSROOT not found - did you run fai-setup?"
 fi
 
 if ! grep -qw VIRTUAL "$FAI_NFSROOT/usr/sbin/fai"
 then
-    echo "*** Looks like you don't have the patched FAI."
-    echo "*** get it from svn://svn.debian.org/svn/fai/people/mugwump/vserver"
-    exit 1
+    panic $"\
+ERROR: Looks like you don't have the patched FAI.
+See http://faiwiki.informatik.uni-koeln.de/index.php/Using_FAI_as_a_vserver_build_method
+for information on where to get it."
 fi
 
-# setup a new filesystem namespace
 set -e
-#[ -d $FAI_NFSROOT/var/log/fai ] || mkdir $FAI_NFSROOT/var/log/fai
 
 # suppresses color logo, as it does not leave the terminal in a nice
 # state.
 console=dummy
 
-# set up interfaces, so that the vserver can be built with restricted
-# network access.
-generateOptions "$SETUP_CONFDIR"
-enableInterfaces "$SETUP_CONFDIR"
+killprocs() {
+    set +e
+    S_CONTEXT=
+    if isVserverRunning "$SETUP_CONFDIR" S_CONTEXT
+    then
+       $_VKILL -c "$S_CONTEXT" -s 15
+       sleep 2
+       $_VKILL -c "$S_CONTEXT" -s 9
+       sleep 2
+       isVserverRunning "$SETUP_CONFDIR" && warning $"\
+Vserver '$VSERVER_NAME' still running unexpectedly; please investigate it
+manually."
+    fi
+    [ -n "$HAVE_INTERFACES" ] && disableInterfaces "$SETUP_CONFDIR"
+    base.__cleanup
+}
+
+trap killprocs INT EXIT
 
 # last chance to abort!
 if [ -z "$AUTO" ]
@@ -108,19 +128,11 @@ then
     read junk
 fi
 
-killprocs() {
-       base.__cleanup
-       if [ -e "/proc/virtual/$SETUP_CONTEXT" ]
-       then
-               $_VKILL -c "$SETUP_CONTEXT" -s 15
-               sleep 2
-               $_VKILL -c "$SETUP_CONTEXT" -s 9
-       fi
-       set -x
-       disableInterfaces "$SETUP_CONFDIR"
-}
-
-trap killprocs INT EXIT
+# set up interfaces, so that the vserver can be built with restricted
+# network access.
+generateOptions "$SETUP_CONFDIR"
+enableInterfaces "$SETUP_CONFDIR"
+HAVE_INTERFACES=1
 
 rwpaths="/var/lock /var/log /dev /var/run /etc/sysconfig"
 [ -d "$FAI_NFSROOT/etc/network/run" ] && rwpaths="$rwpaths /etc/network/run"
@@ -129,24 +141,27 @@ export VDIR ROOTDIR FAI_VSERVER FAI_DIR FAI_NFSROOT FAI_ROOT console
 
 [ -z "$AUTO" ] && FINAL_SHELL="exec /bin/sh -i"
 
-mount -n -o ro --bind "$FAI_NFSROOT" /mnt
-mount -n -t tmpfs -o size=64m,mode=1777 vm /mnt/tmp
-mkdir -p /mnt/tmp/target
-mount -n --bind "$VDIR" /mnt/tmp/target
-mkdir -p /mnt/tmp/target/proc
-mount -n -t proc proc /mnt/tmp/target/proc
+# set up /mnt with all the mounts required
+$_SECURE_MOUNT -n -o ro,dev --bind "$FAI_NFSROOT" /mnt
+$_SECURE_MOUNT -n -t tmpfs -o size=64m,mode=1777 vm /mnt/tmp
+$_MKDIR -p /mnt/tmp/target
+$_SECURE_MOUNT -n -o rw,dev --bind "$VDIR" /mnt/tmp/target
+$_MKDIR -p /mnt/tmp/target/proc
+$_SECURE_MOUNT -n -t proc proc /mnt/tmp/target/proc
 for x in $rwpaths
 do
     /mnt/usr/lib/fai/mkrw -n "/mnt$x"
 done
-mount -n -o ro --bind "$FAI_DIR" /mnt/fai
-mount -n -t proc proc /mnt/proc
+$_SECURE_MOUNT -n -o ro --bind "$FAI_DIR" /mnt/fai
+$_SECURE_MOUNT -n -t proc proc /mnt/proc
 
 cd /mnt
-$_CHBIND "${CHBIND_OPTS[@]}" \
+"${CHBIND_CMD[@]}" \
     $_VCONTEXT --create "${OPTS_VCONTEXT_CREATE[@]}" -- \
-    $_VUNAME --xid self --set -t nodename="$SETUP_HOSTNAME" -- \
+    $_VUNAME --xid self --set -t nodename="${SETUP_HOSTNAME:-fai-build}" \
+       -t context="$SETUP_CONFDIR" -- \
     $_VATTRIBUTE --set --xid self "${OPTS_VATTRIBUTE[@]}" --ccap secure_mount \
+    $_SAVE_CTXINFO "$SETUP_CONFDIR" \
     $_VCONTEXT --migrate-self --endsetup --chroot $SILENT_OPT \
        "${OPTS_VCONTEXT_MIGRATE[@]}" "${OPTS_VCONTEXT_ENTER[@]}" -- \
     /bin/sh -c "/bin/sh $SH_DEBUG /etc/init.d/rcS -N vschild_build; $FINAL_SHELL"