X-Git-Url: http://git.onelab.eu/?p=util-vserver.git;a=blobdiff_plain;f=scripts%2Fvcached;h=3bd027d164cd4a56a0ca5b3281e90c4e7b28b3be;hp=b810c2a425abe289b7b427cb6f04bb70eeddc2d4;hb=ec4370f7ebd7fb0ce7f002f5bf2c74f03acd3ec1;hpb=36d570a5fa187812c161144fd5df56490c6d6751 diff --git a/scripts/vcached b/scripts/vcached index b810c2a..3bd027d 100755 --- a/scripts/vcached +++ b/scripts/vcached @@ -1,11 +1,11 @@ #!/bin/bash # -# vcached: VServer cache daemon +# vcached: VServer cache allocator # -# Description: A daemon that periodically 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 start/stop/restart from /etc/init.d. +# 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: # @@ -14,69 +14,93 @@ # William Wung - wungism@uclink.berkeley.edu # # Mark Huang -# Copyright (c) 2004 The Trustees of Princeton University (Trustees). +# Copyright (c) 2004-2005 The Trustees of Princeton University # -# $Id: vcached,v 1.3 2004/08/25 14:58:45 mlh-pl_kernel Exp $ +# $Id: vcached,v 1.14 2007/06/28 21:02:41 dhozac Exp $ # -# get configuration -. /etc/vcached.conf +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 'fd' OPT ; do +while getopts 's:p:l:dh' OPT ; do case "$OPT" in - f) foreground=1 ;; + s) slots=$OPTARG ;; + p) pidfile=$OPTARG ;; + l) logfile=$OPTARG ;; d) debug=1 ;; + h|*) usage ;; esac done -# check if we are already running -[ -f $pidfile ] && exit 1 +# append output to log file +exec 1>>$logfile +exec 2>>$logfile -# daemonize -if [ $foreground -eq 0 ] ; then - nohup nice -n $nice -- $0 $* -f >>$logfile 2>&1 & - exit 0 +# 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 - -# record PID -trap "rm -f $pidfile ; exit 255" EXIT echo $$ > $pidfile -: ${UTIL_VSERVER_VARS:=$(dirname $0)/util-vserver-vars} +# 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 -chattr -R -i "$VROOTDIR/.vtmp" -rm -rf "$VROOTDIR/.vtmp" - -mkdir -p "$VROOTDIR/.vcache" -mkdir -p "$VROOTDIR/.vtmp" - -# loop forever -while : ; do - [ $debug -ne 0 ] && echo "$(date) Checking the cache" - for i in $(seq 0 $(($slots - 1))) ; do - if [ ! -d "$VROOTDIR/.vcache/v$i" ] ; then - echo "$(date) Caching v$i" - # build image in .vtmp - TMP=$(mktemp -d "$VROOTDIR/.vtmp/v$i.XXXXXX") - "$PKGLIBDIR/vbuild" "$VROOTDIR/vserver-reference" "$TMP" - RETVAL=$? - # move it to .vcache when complete - if [ $RETVAL -eq 0 ] ; then - mv "$TMP" "$VROOTDIR/.vcache/v$i" - echo "$(date) v$i ready" - else - echo "$(date) Error $RETVAL building v$i" - rm -rf "$TMP" - fi +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") + "$_VCLONE" "$__DEFAULT_VSERVERDIR/.vref/default/" "$TMP"/ + RETVAL=$? + # move it to .vcache when complete + if [ $RETVAL -eq 0 ] ; then + mv "$TMP" "$__DEFAULT_VSERVERDIR/.vcache/v$i" + echo "$(date) v$i ready" + else + echo "$(date) Error $RETVAL building v$i" + rm -rf "$TMP" fi - done - [ $debug -ne 0 ] && echo "$(date) Sleeping for $period seconds" - sleep $period + fi done + +exit 0