- PL2437 fix: build new vserver-reference image in /vservers/.vtmp, then
Mark Huang [Wed, 13 Oct 2004 04:53:07 +0000 (04:53 +0000)]
  swap with /vservers/vserver-reference only when done. Bail and clean
  up on any error.

vserver-reference.spec

index decb529..86b188a 100644 (file)
@@ -35,24 +35,41 @@ rm -rf $RPM_BUILD_ROOT
 
 %post
 . /usr/lib/util-vserver/util-vserver-vars
-VROOT=$VROOTDIR/vserver-reference
 
-# Pause vcached
-service vcached stop
-
-# Remove old installation first
-if [ -d $VROOT ] ; then
-    if grep -q $VROOT/proc /proc/mounts ; then
-       umount $VROOT/proc
-    fi
-    if grep -q $VROOT/dev/pts /proc/mounts ; then
-       umount $VROOT/dev/pts
-    fi
-    chattr -R -i $VROOT
-    rm -rf $VROOT
-fi
-
-$PKGLIBDIR/install-pre.sh vserver-reference
+# Make /vservers
+mkdir -p $VROOTDIR
+chmod 000 $VROOTDIR
+chattr +t $VROOTDIR
+
+# Build image in /vservers/.vtmp
+mkdir -p $VROOTDIR/.vtmp
+VROOT=$(mktemp -d $VROOTDIR/.vtmp/vserver-reference.XXXXXX)
+
+# Make /vservers/.vtmp/vserver-reference.XXXXXX
+mkdir -p $VROOT
+chattr -t $VROOT
+chmod 755 $VROOT
+
+# Clean up before exiting if anything goes wrong
+set -e
+trap "umount $VROOT/proc ; umount $VROOT/dev/pts ; chattr -R -i $VROOT ; rm -rf $VROOT" EXIT
+
+MAKEDEV ()
+{
+    rm -rf $VROOT/dev
+    mkdir -p $VROOT/dev
+    mknod -m 666 $VROOT/dev/null c 1 3
+    mknod -m 666 $VROOT/dev/zero c 1 5
+    mknod -m 666 $VROOT/dev/full c 1 7
+    mknod -m 644 $VROOT/dev/random c 1 8
+    mknod -m 644 $VROOT/dev/urandom c 1 9
+    mknod -m 666 $VROOT/dev/tty c 5 0
+    mknod -m 666 $VROOT/dev/ptmx c 5 2
+    touch $VROOT/dev/hdv1
+}
+
+# Initialize /dev in reference image
+MAKEDEV
 
 # Mount /dev/pts in reference image
 mkdir -p $VROOT/dev/pts
@@ -62,6 +79,13 @@ mount -t devpts none $VROOT/dev/pts
 mkdir -p $VROOT/proc
 mount -t proc none $VROOT/proc
 
+# Create a dummy /etc/fstab in reference image
+mkdir -p $VROOT/etc
+cat > $VROOT/etc/fstab <<EOF
+# This fake fstab exists only to please df and linuxconf.
+/dev/hdv1      /       ext2    defaults        1 1
+EOF
+
 # Prevent all locales from being installed in reference image
 mkdir -p $VROOT/etc/rpm
 cat > $VROOT/etc/rpm/macros <<EOF
@@ -98,6 +122,13 @@ if [ -f $TMP/yum.pid ] ; then
 fi
 rmdir $TMP
 
+# Clean up /dev in reference image
+umount $VROOT/dev/pts
+MAKEDEV
+
+# Disable all services in reference image
+chroot $VROOT /bin/sh -c "chkconfig --list | awk '{ print \$1 }' | xargs -i chkconfig {} off"
+
 # Copy configuration files from host to reference image
 for file in /etc/hosts /etc/resolv.conf /etc/yum.conf ; do
     if [ -f $file ] ; then
@@ -107,15 +138,27 @@ done
 
 # Clean up
 umount $VROOT/proc
-umount $VROOT/dev/pts
 
-$PKGLIBDIR/install-post.sh vserver-reference
+# Reset trap
+trap - EXIT
 
-# Disable all services in reference image
-chroot $VROOT /bin/sh -c "chkconfig --list | awk '{ print \$1 }' | xargs -i chkconfig {} off"
+# Swap them when complete
+mv $VROOT $VROOTDIR
+if [ -d $VROOTDIR/vserver-reference ] ; then
+    mv $VROOTDIR/vserver-reference $VROOT
+    # Let vcached clean it up later
+fi
+mv $VROOTDIR/$(basename $VROOT) $VROOTDIR/vserver-reference
+
+%postun
+. /usr/lib/util-vserver/util-vserver-vars
 
-# Restart vcached
-service vcached start
+mkdir -p $VROOTDIR/.vtmp
+TMP=$(mktemp -d $VROOTDIR/.vtmp/vserver-reference.XXXXXX)
+if [ -d $VROOTDIR/vserver-reference ] ; then
+    mv $VROOTDIR/vserver-reference $TMP
+    # Let vcached clean it up later
+fi
 
 %files
 %defattr(-,root,root)