#
# 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 >>/var/log/vserver-reference.log
+exec 2>&1
+
+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
-
-# Redirect stdout and stderr to a log file
-exec 2>&1
-exec &>/var/log/vserver-reference.log
-
-echo -n $"Updating VServer reference: " >&3 2>&4
-
shopt -s nullglob
-VROOTS="$__DEFAULT_VSERVERDIR/vserver-reference $__DEFAULT_VSERVERDIR/.vcache/* $__DEFAULT_VSERVERDIR/${PLC_SLICE_PREFIX}_*"
-
# Make sure the barrier bit is set
-chmod 0000 /vservers
-setattr --barrier /vservers
+chmod 0000 "$__DEFAULT_VSERVERDIR"
+setattr --barrier "$__DEFAULT_VSERVERDIR"
+
+# Set the attribute to unlink so vclone does the right thing wrt to
+# conserving space by linking and not copying unified files.
+find "$__DEFAULT_VSERVERDIR/.vref/default" -type f -print0 | xargs -0 setattr --iunlink
+
+# Build reference images for system slices
+for systemvserver in "$__DEFAULT_VSERVERDIR/.vstub/"*.cloned ; do
+ NAME=$(basename $systemvserver .cloned)
+
+ # 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"
+
+ # 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 \
done
success >&3 2>&4
+echo "--- DONE $(date) ---" >&3 2>&4
echo >&3 2>&4
+
exit 0