This commit was manufactured by cvs2svn to create branch
[util-vserver.git] / scripts / vcached
diff --git a/scripts/vcached b/scripts/vcached
new file mode 100755 (executable)
index 0000000..570a1db
--- /dev/null
@@ -0,0 +1,113 @@
+#!/bin/bash
+#
+# vcached: VServer cache allocator
+#
+# Description: A script that preallocates vservers and stores them in
+# a cache.  Preallocated vservers from the cache may be then used to
+# instantiate real vservers. Requires that /var/run/vcached.pid does
+# not exist on startup. Should run periodically as a cron job.
+#
+# Based on work by:
+# 
+# Brent Chun - bnc@intel-research.net
+# Tristan Koo - tristan.koo@intel-research.net
+# William Wung - wungism@uclink.berkeley.edu
+#
+# Mark Huang <mlhuang@cs.princeton.edu>
+# Copyright (c) 2004-2005 The Trustees of Princeton University
+#
+# $Id: vcached,v 1.11 2005/08/21 21:37:10 mlhuang Exp $
+#
+
+PATH=/sbin:/usr/sbin:$PATH
+
+# number of images to keep cached
+slots=32
+
+# PID file
+pidfile=/var/run/vcached.pid
+
+# log file
+logfile=/var/log/vcached.log
+
+# debug
+debug=0
+
+usage()
+{
+    echo "usage: vcached [OPTION...]"
+    echo "     -s [slots]      number of images to keep cached"
+    echo "     -p [pidfile]    PID file"
+    echo "     -l [logfile]    log file"
+    echo "     -d              debug"
+    exit 1
+}
+
+# parse options
+while getopts 's:p:l:dh' OPT ; do
+    case "$OPT" in
+       s) slots=$OPTARG ;;
+       p) pidfile=$OPTARG ;;
+       l) logfile=$OPTARG ;;
+        d) debug=1 ;;
+       h|*) usage ;;
+    esac
+done
+
+# append output to log file
+exec 1>>$logfile
+exec 2>>$logfile
+
+# check if we are already running
+if [ -f $pidfile ] && kill -0 `cat $pidfile` >/dev/null 2>&1 ; then
+    echo "vcached(`cat $pidfile`) already running"
+    exit 1
+fi
+echo $$ > $pidfile
+
+# clean up lock file before exiting
+trap "rm -f $pidfile" EXIT
+
+: ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars}
+test -e "$UTIL_VSERVER_VARS" || {
+    echo "Can not find util-vserver installation; aborting..."
+    exit 1
+}
+. "$UTIL_VSERVER_VARS"
+
+# make sure barrier bit is set on /vservers to prevent chroot() escapes
+setattr --barrier $__DEFAULT_VSERVERDIR
+
+# take out the trash
+rm -rf "$__DEFAULT_VSERVERDIR/.vtmp"
+
+mkdir -p "$__DEFAULT_VSERVERDIR/.vcache"
+mkdir -p "$__DEFAULT_VSERVERDIR/.vtmp"
+
+[ $debug -ne 0 ] && echo "$(date) Checking the cache"
+for i in $(seq 0 $(($slots - 1))) ; do
+    if [ ! -d "$__DEFAULT_VSERVERDIR/.vcache/v$i" ] ; then
+       echo "$(date) Caching v$i"
+       # build image in .vtmp
+       TMP=$(mktemp -d "$__DEFAULT_VSERVERDIR/.vtmp/v$i.XXXXXX")
+       "$__PKGLIBDIR/vbuild" "$__DEFAULT_VSERVERDIR/vserver-reference" "$TMP"
+       RETVAL=$?
+       # move it to .vcache when complete
+       if [ $RETVAL -eq 0 ] ; then
+           # sanity check
+           vnewsize=$(du -s "$TMP" | awk "{ print \$1 }")
+           vrefsize=$(du -s "$__DEFAULT_VSERVERDIR/vserver-reference" | awk "{ print \$1 }")
+           if [ $vnewsize -lt $vrefsize ] ; then
+               echo "WARNING: Unexpected for 'du -s $__DEFAULT_VSERVERDIR/$NAME'=$vnewsize to be less than 'du -s $__DEFAULT_VSERVERDIR/vserver-reference'=$vrefsize"
+           fi
+
+           mv "$TMP" "$__DEFAULT_VSERVERDIR/.vcache/v$i"
+           echo "$(date) v$i ready"
+       else
+           echo "$(date) Error $RETVAL building v$i"
+           rm -rf "$TMP"
+       fi
+    fi
+done
+
+exit 0