#
# vserver-reference Updates VServer reference
#
-# Load before pl_conf, pl_nm, vcached, and vservers
+# Load before nm, vcached, and vservers
# chkconfig: 3 60 80
# description: Builds VServer reference image
#
# VServer definitions
. /usr/lib/util-vserver/util-vserver-vars
+# Save stdout and stderr
+exec 3>&1
+exec 4>&2
+
+# Redirect stdout and stderr to a log file
+exec 2>&1
+exec &>>/var/log/vserver-reference.log
+
+echo "--- STARTING $(date) ---" >&3 2>&4
+
# Parse PLC configuration
if [ -r /etc/planetlab/plc_config ] ; then
. /etc/planetlab/plc_config
PLC_BOOT_HOST="boot.planet-lab.org"
fi
-# Save stdout and stderr
-exec 3>&1
-exec 4>&2
+shopt -s nullglob
-# Redirect stdout and stderr to a log file
-exec 2>&1
-exec &>/var/log/vserver-reference.log
+# Make sure the barrier bit is set
+chmod 0000 "$__DEFAULT_VSERVERDIR"
+setattr --barrier "$__DEFAULT_VSERVERDIR"
-echo -n $"Updating VServer reference: " >&3 2>&4
+# Build reference images for system slices
+for systemvserver in "$__DEFAULT_VSERVERDIR/.vstub/"*.cloned ; do
+ NAME=$(basename $systemvserver .cloned)
-shopt -s nullglob
+ # Copy base reference image
+ if [ ! -d "$__DEFAULT_VSERVERDIR/.vref/$NAME" ] ; then
+ echo -n $"Building VServer reference image for $NAME: " >&3 2>&4
-VROOTS="$__DEFAULT_VSERVERDIR/vserver-reference $__DEFAULT_VSERVERDIR/.vcache/* $__DEFAULT_VSERVERDIR/${PLC_SLICE_PREFIX}_*"
+ # Build in temporary directory
+ mkdir -p "$__DEFAULT_VSERVERDIR/.vtmp"
+ TMP=$(mktemp -d "$__DEFAULT_VSERVERDIR/.vtmp/$NAME.XXXXXX")
+ mkdir -p "$__DEFAULT_VSERVERDIR/.vref"
-# Make sure the barrier bit is set
-chmod 0000 /vservers
-setattr --barrier /vservers
+ # build the systemvserver from the one it was originally cloned from
+ TYPE=$(cat $systemvserver)
+ REF="$__DEFAULT_VSERVERDIR/.vref/$TYPE"
+ "$_VCLONE" "$REF"/ "$TMP"/
+ RETVAL=$?
+
+ # merge the stub with the reference to get the system vserver
+ if [ $RETVAL -eq 0 ] ; then
+ (cd "$__DEFAULT_VSERVERDIR/.vstub/$NAME"/ && find . | cpio -m -d -u -p "$TMP"/)
+ RETVAL=$?
+ 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/RPM-GPG-KEY-fedora \
- /etc/pki/rpm-gpg/RPM-GPG-KEY-planetlab ; do
+ /etc/pki/rpm-gpg/* ; do
if [ -r $file ] ; then
for vroot in $VROOTS ; do
- if [ "$(dirname $file)" = "/etc/pki/rpm-gpg" -a \
- ! -f $vroot/$file ] ; then
- import=1
- else
- import=0
- fi
install -D -m 644 $file $vroot/$file
- if [ $import -eq 1 ] ; then
- chroot $vroot rpm --import $file
- fi
done
fi
done
+# 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
+
# 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
done
success >&3 2>&4
+echo "--- DONE $(date) ---" >&3 2>&4
echo >&3 2>&4
+
exit 0