- remove daemon functionality entirely
[util-vserver.git] / scripts / vcached
1 #!/bin/bash
2 #
3 # vcached: VServer cache allocator
4 #
5 # Description: A script that preallocates vservers and stores them in
6 # a cache.  Preallocated vservers from the cache may be then used to
7 # instantiate real vservers. Requires that /var/run/vcached.pid does
8 # not exist on startup. Should run periodically as a cron job.
9 #
10 # Based on work by:
11
12 # Brent Chun - bnc@intel-research.net
13 # Tristan Koo - tristan.koo@intel-research.net
14 # William Wung - wungism@uclink.berkeley.edu
15 #
16 # Mark Huang <mlhuang@cs.princeton.edu>
17 # Copyright (c) 2004-2005 The Trustees of Princeton University
18 #
19 # $Id: vcached,v 1.10 2004/11/29 21:56:45 mlhuang Exp $
20 #
21
22 # number of images to keep cached
23 slots=32
24
25 # PID file
26 pidfile=/var/run/vcached.pid
27
28 # log file
29 logfile=/var/log/vcached.log
30
31 # debug
32 debug=0
33
34 usage()
35 {
36     echo "usage: vcached [OPTION...]"
37     echo "      -s [slots]      number of images to keep cached"
38     echo "      -p [pidfile]    PID file"
39     echo "      -l [logfile]    log file"
40     echo "      -d              debug"
41     exit 1
42 }
43
44 # parse options
45 while getopts 's:p:l:dh' OPT ; do
46     case "$OPT" in
47         s) slots=$OPTARG ;;
48         p) pidfile=$OPTARG ;;
49         l) logfile=$OPTARG ;;
50         d) debug=1 ;;
51         h|*) usage ;;
52     esac
53 done
54
55 # append output to log file
56 exec 1>>$logfile
57 exec 2>>$logfile
58
59 # check if we are already running
60 if [ -f $pidfile ] && kill -0 `cat $pidfile` >/dev/null 2>&1 ; then
61     echo "vcached(`cat $pidfile`) already running"
62     exit 1
63 fi
64 echo $$ > $pidfile
65
66 # clean up lock file before exiting
67 trap "rm -f $pidfile" EXIT
68
69 : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars}
70 test -e "$UTIL_VSERVER_VARS" || {
71     echo "Can not find util-vserver installation; aborting..."
72     exit 1
73 }
74 . "$UTIL_VSERVER_VARS"
75
76 # make sure barrier bit is set on /vservers to prevent chroot() escapes
77 setattr --barrier $__DEFAULT_VSERVERDIR
78
79 # take out the trash
80 rm -rf "$__DEFAULT_VSERVERDIR/.vtmp"
81
82 mkdir -p "$__DEFAULT_VSERVERDIR/.vcache"
83 mkdir -p "$__DEFAULT_VSERVERDIR/.vtmp"
84
85 [ $debug -ne 0 ] && echo "$(date) Checking the cache"
86 for i in $(seq 0 $(($slots - 1))) ; do
87     if [ ! -d "$__DEFAULT_VSERVERDIR/.vcache/v$i" ] ; then
88         echo "$(date) Caching v$i"
89         # build image in .vtmp
90         TMP=$(mktemp -d "$__DEFAULT_VSERVERDIR/.vtmp/v$i.XXXXXX")
91         "$__PKGLIBDIR/vbuild" "$__DEFAULT_VSERVERDIR/vserver-reference" "$TMP"
92         RETVAL=$?
93         # move it to .vcache when complete
94         if [ $RETVAL -eq 0 ] ; then
95             # sanity check
96             vnewsize=$(du -s "$TMP" | awk "{ print \$1 }")
97             vrefsize=$(du -s "$__DEFAULT_VSERVERDIR/vserver-reference" | awk "{ print \$1 }")
98             if [ $vnewsize -lt $vrefsize ] ; then
99                 echo "WARNING: Unexpected for 'du -s $__DEFAULT_VSERVERDIR/$NAME'=$vnewsize to be less than 'du -s $__DEFAULT_VSERVERDIR/vserver-reference'=$vrefsize"
100             fi
101
102             mv "$TMP" "$__DEFAULT_VSERVERDIR/.vcache/v$i"
103             echo "$(date) v$i ready"
104         else
105             echo "$(date) Error $RETVAL building v$i"
106             rm -rf "$TMP"
107         fi
108     fi
109 done
110
111 exit 0