X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=vserver-reference.init;h=52964c9a83bb518ef3774b8246478204faaa9fd3;hb=08eec02b97ab936532d3d08601b2b7edaece26c9;hp=f31d89d2ae5f89acfb51589ebd623d86875dc447;hpb=7a29192ffcc2b34bb44d00580be1262240a8c363;p=vserver-reference.git diff --git a/vserver-reference.init b/vserver-reference.init index f31d89d..52964c9 100755 --- a/vserver-reference.init +++ b/vserver-reference.init @@ -1,112 +1,146 @@ #!/bin/bash # -# Builds VServer reference image. Requires the web and boot servers to -# be up, which complicates bootstrap. Alternatively, we could require -# the build server to host a local yum repository. Already, it is -# required to run the same major version of yum as the nodes. +# vserver-reference Updates VServer reference +# +# Load before nm, vcached, and vservers +# chkconfig: 3 60 80 +# description: Builds VServer reference image # # Mark Huang -# Copyright (C) 2004-2005 The Trustees of Princeton University +# Copyright (C) 2004 The Trustees of Princeton University # -# $Id: vserver-reference.init,v 1.15 2005/09/02 01:43:49 mlhuang Exp $ +# $Id$ # -# Get the URL for the production /etc/yum.conf file -YUM_CONF=http://www.planet-lab.org/$(curl -q --form node_id=0 --form file=/etc/yum.conf https://www.planet-lab.org/db/plnodeconf/getsinglefile.php) - -# Make /vservers -VROOT=$PWD/vservers/vserver-reference -install -d -m 755 $VROOT - -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 - # For bash command substitution - ln -nsf ../proc/self/fd /dev/fd - # For df and linuxconf - touch $VROOT/dev/hdv1 - # For TUN/TAP - mkdir -p $VROOT/dev/net - mknod -m 600 $VROOT/dev/net/tun c 10 200 -} - -# Initialize /dev in reference image -MAKEDEV - -# Mount /dev/pts in reference image -mkdir -p $VROOT/dev/pts -mount -t devpts none $VROOT/dev/pts - -# Mount /proc in reference image -mkdir -p $VROOT/proc -mount -t proc none $VROOT/proc - -# Clean up before exiting if anything goes wrong -trap "umount $VROOT/proc ; umount $VROOT/dev/pts ; exit 255" ERR - -# Create a dummy /etc/fstab in reference image -mkdir -p $VROOT/etc -cat > $VROOT/etc/fstab < $VROOT/etc/rpm/macros <&1 +exec 4>&2 + +# Redirect stdout and stderr to a log file +exec 2>&1 +exec &>/var/log/vserver-reference.log + +shopt -s nullglob + +# Make sure the barrier bit is set +chmod 0000 "$__DEFAULT_VSERVERDIR" +setattr --barrier "$__DEFAULT_VSERVERDIR" + +# Build reference images for system slices +# XXX Use Stork? +for lst in "$__DEFAULT_VSERVERDIR/system-packages/"*.lst ; do + NAME=$(basename $lst .lst) + + # Copy base reference image + if [ ! -d "$__DEFAULT_VSERVERDIR/.vref/$NAME" ] ; then + echo -n $"Building VServer reference image for $NAME: " >&3 2>&4 + + # Build in temporary directory + mkdir -p "$__DEFAULT_VSERVERDIR/.vtmp" + TMP=$(mktemp -d "$__DEFAULT_VSERVERDIR/.vtmp/$NAME.XXXXXX") + mkdir -p "$__DEFAULT_VSERVERDIR/.vref" + "$__PKGLIBDIR/vbuild" "$__DEFAULT_VSERVERDIR/.vref/default" "$TMP" + RETVAL=$? + + # Install/update additional packages + if [ $RETVAL -eq 0 ] ; then + pushd "$__DEFAULT_VSERVERDIR/system-packages" >/dev/null + xargs rpm --root "$TMP" --install < "$NAME.lst" + RETVAL=$? + popd >/dev/null + fi + + # Clean RPM state + rm -f "$TMP/var/lib/rpm/__db"* + + # Move it to its permanent location when complete + if [ $RETVAL -eq 0 ] ; then + mv "$TMP" "$__DEFAULT_VSERVERDIR/.vref/$NAME" + success >&3 2>&4 + else + failure >&3 2>&4 + fi + echo >&3 2>&4 + fi +done + +echo -n $"Updating VServer reference images: " >&3 2>&4 + +VROOTS="$__DEFAULT_VSERVERDIR/.vref/* $__DEFAULT_VSERVERDIR/.vcache/* $__DEFAULT_VSERVERDIR/${PLC_SLICE_PREFIX}_*" + +# Copy configuration files from host to slices +for file in /etc/hosts /etc/resolv.conf /etc/yum.conf /etc/planetlab/node_id \ + /etc/planetlab/plc_config* /etc/planetlab/php/* \ + /etc/pki/rpm-gpg/* ; do + if [ -r $file ] ; then + for vroot in $VROOTS ; do + install -D -m 644 $file $vroot/$file + done + fi +done -# Disable all services in reference image -/usr/sbin/chroot $VROOT /bin/sh -c "/sbin/chkconfig --list | awk '{ print \$1 }' | xargs -i /sbin/chkconfig {} off" +# Remove stale RPM locks +rm -f $vroot/var/lib/rpm/__db* + +# (Re)install GPG signing keys +if [ -d /etc/pki/rpm-gpg ] ; then + for vroot in $VROOTS ; do + chroot $vroot rpm --allmatches -e gpg-pubkey || : + chroot $vroot rpm --import /etc/pki/rpm-gpg/* || : + done +fi -# Clean up -umount $VROOT/proc +# Old versions of the Boot Manager copied portions of the Boot CD to +# /mnt/cdrom/bootme, to support old scripts which assumed that the +# Boot CD was mounted even in production mode. Now, it just copies it +# to /usr/boot/cacert.pem. In any case, copy the boot server +# certificate to the place(s) where BootServerRequest expects to find +# it (/usr/boot/cacert.pem by default, /mnt/cdrom/bootme in old +# versions). +CACERT="/usr/boot/cacert.pem /mnt/cdrom/bootme/cacert/$PLC_BOOT_HOST/cacert.pem" +for cacert in $CACERT ; do + if [ -r $cacert ] ; then + for vroot in $VROOTS ; do + # Install boot server certificate + install -D -m 644 $cacert $vroot/usr/boot/cacert.pem + echo $PLC_BOOT_HOST > $vroot/usr/boot/boot_server + + # Also install in /mnt/cdrom/bootme for backward compatibility + install -D -m 644 $cacert $vroot/mnt/cdrom/bootme/cacert/$PLC_BOOT_HOST/cacert.pem + echo $PLC_BOOT_HOST > $vroot/mnt/cdrom/bootme/BOOTSERVER + done + break + fi +done + +success >&3 2>&4 +echo >&3 2>&4 exit 0