3 # Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; version 2 of the License.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 # $VSERVER_DIR ... path to vserver-cfg dir
20 # $VSERVER_NAME ... name of vserver
22 declare -a NICE_CMD=()
23 declare -a CHBIND_OPTS=()
24 declare -a CAP_OPTS=()
25 declare -a CHCONTEXT_INIT_OPTS=()
26 declare -a CHCONTEXT_FLAG_OPTS=()
27 declare -a CHCONTEXT_OPTS=()
28 declare -a CAPCHROOT_OPTS=()
29 declare -a INTERFACES=()
31 declare -a INITCMD_RESCUE=( /bin/sleep 900 )
32 declare -a INITCMD_START=()
33 declare -a INITCMD_START_SYNC=()
34 declare -a INITCMD_STOP=()
35 declare -a INITCMD_STOP_SYNC=()
36 declare -a INITCMD_PREPARE=()
37 declare -a INITKILL_SEQ=()
38 declare -a ENTER_SHELL=()
40 declare -a OPTS_VCONTEXT_CREATE=()
41 declare -a OPTS_VCONTEXT_MIGRATE=()
42 declare -a OPTS_VCONTEXT_ENTER=()
43 declare -a OPTS_VATTRIBUTE=( --flag fakeinit )
44 declare -a OPTS_VSCHED=()
46 declare -a STOPCMD_PREPARE=()
48 declare -a VSERVER_EXTRA_CMDS=()
51 VSHELPER_SYNC_TIMEOUT=30
56 _HAVE_INTERFACE_OPTIONS=
67 : ${VSERVER_NAME:=$(basename "$VSERVER_DIR")}
69 if test -e "$VSERVER_DIR"/noisy -o -n "$OPTION_VERBOSE"; then
75 function _generateChbindOptions
82 test -n "$_HAVE_INTERFACE_OPTIONS" || _generateInterfaceOptions "$vdir"
84 local f=$vdir/interfaces/bcast
85 getFileValue bcast "$f"
87 getFileValue nid "$vdir/ncontext" "$vdir/context"
89 CHBIND_OPTS=( $SILENT_OPT ${nid:+--nid "$nid"} ${bcast:+--bcast "$bcast"} )
91 for i in "${INTERFACES[@]}"; do
92 CHBIND_OPTS=( "${CHBIND_OPTS[@]}" --ip "$i" )
95 _HAVE_CHBIND_OPTIONS=1
98 function _generateNiceCommand
103 test -r "$vdir/nice" || return 0;
104 read nice <"$vdir"/nice
106 NICE_CMD=( $_NICE -$nice )
110 function _generatePersonalityOptions
113 local f="$vdir"/personality
116 test -s "$f" || return 0
125 (*) flags=$flags$delim$tmp
132 OPTS_VCONTEXT_ENTER=( "${OPTS_VCONTEXT_ENTER[@]}"
133 --personality-type "$type"
134 ${flags:+--personality-flags "$flags"} )
137 function _generateCCapabilityOptions
141 local f="$vdir"/ccapabilities
143 test -e "$f" || return 0
147 (*) OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]}" --ccap "$cap" );;
152 function _generateBCapabilityOptions
156 local f="$vdir"/bcapabilities
158 test -e "$f" || return 0
162 (*) OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]}" --bcap "$cap" );;
167 function _generateCapabilityOptions
172 _generateBCapabilityOptions "$vdir"
173 _generateCCapabilityOptions "$vdir"
175 test -e "$vdir"/capabilities || return 0
184 CAP_OPTS=( "${CAP_OPTS[@]}" --cap "$cap" )
185 CAPCHROOT_OPTS=( "${CAPCHROOT_OPTS[@]}" --nochroot )
188 CAP_OPTS=( "${CAP_OPTS[@]}" --cap "$cap" )
191 done <"$vdir"/capabilities
194 function getEnterShell
201 getFileValue ENTER_SHELL "$vdir"/shell "$__CONFDIR"/.defaults/shell
203 test -n "$ENTER_SHELL" || {
205 for i in "/bin/bash -login" "/bin/sh -l" /bin/csh; do
207 test -x "$vdir/vdir/$1" || continue
214 ## Usage: sendKillSequence <ctx> <signal> [<wait> <signal>]*
215 function sendKillSequence
221 while isCtxRunning "$ctx"; do
222 test -z "$wait" || sleep "$wait"
224 killContext "$ctx" "$1"
225 test -n "$2" || break
231 function _generateInitOptions
234 local cfgdir=$vdir/apps/init
239 INITCMD_START_SYNC=()
244 INITKILL_SEQ=( 15 5 9 )
245 CHCONTEXT_INIT_OPTS=()
248 getFileValue INITSTYLE "$cfgdir"/style
249 getFileValue RUNLEVEL_START "$cfgdir"/runlevel
250 getFileValue RUNLEVEL_START "$cfgdir"/runlevel.start
251 getFileValue RUNLEVEL_STOP "$cfgdir"/runlevel.stop
252 getFileArray INITKILL_SEQ "$cfgdir"/killseq || :
254 case x"$INITSTYLE" in
256 INITCMD_START=( "${INITCMD_RESCUE[@]}" )
257 INITCMD_STOP=( /sbin/killall5 )
263 test -n "$RUNLEVEL_START" || RUNLEVEL_START=3
264 test -n "$RUNLEVEL_STOP" || RUNLEVEL_STOP=6
266 for i in /etc/init.d/rc /etc/rc.d/rc; do
267 test -x "$vdir/vdir/$i" || continue
268 INITCMD_START=( "$i" "$RUNLEVEL_START" )
269 INITCMD_STOP=( "$i" "$RUNLEVEL_STOP" )
271 INITCMD_PREPARE=( $_FAKE_RUNLEVEL "$RUNLEVEL_START" /var/run/utmp )
275 INITCMD_START=( /sbin/init )
276 INITCMD_STOP=( /sbin/init )
278 _NEED_VSHELPER_SYNC=1
279 test -z "$RUNLEVEL_START" || INITCMD_START=( "${INITCMD_START[@]}" "$RUNLEVEL_START" )
280 test -z "$RUNLEVEL_STOP" || INITCMD_STOP=( "${INITCMD_STOP[@]}" "$RUNLEVEL_STOP" )
284 INITCMD_START=( /sbin/minit-start )
285 INITCMD_STOP=( /sbin/minit-stop )
287 INITCMD_START_SYNC=( "$_INITSYNC_MINIT_START" "$vdir" )
288 _NEED_VSHELPER_SYNC=1
289 test -z "$RUNLEVEL_START" || INITCMD_START=( "${INITCMD_START[@]}" "$RUNLEVEL_START" )
290 test -z "$RUNLEVEL_STOP" || INITCMD_STOP=( "${INITCMD_STOP[@]}" "$RUNLEVEL_STOP" )
291 ! isNumber "${RUNLEVEL_START:-3}" || INITCMD_PREPARE=( $_FAKE_RUNLEVEL "${RUNLEVEL_START:-3}" /var/run/utmp )
295 panic "init-style '$INITSTYLE' is no longer supported; please use plain instead; aborting";;
298 (*) panic "Unknown init-style '$INITSTYLE'; aborting";;
301 if test x"$INITSTYLE" != xrescue; then
302 getFileArray INITCMD_START "$cfgdir"/cmd.start || :
303 getFileArray INITCMD_STOP "$cfgdir"/cmd.stop || :
304 getFileArray INITCMD_START_SYNC "$cfgdir"/cmd.start-sync || :
305 getFileArray INITCMD_STOP_SYNC "$cfgdir"/cmd.stop-sync || :
306 getFileArray INITCMD_PREPARE "$cfgdir"/cmd.prepare || :
309 test -n "$OPTION_FORCE_SYNC" -o -e "$cfgdir"/sync || {
310 INITCMD_START_SYNC=()
315 if vshelper.isEnabled; then
316 vshelper.getSyncTimeout "$vdir" VSHELPER_SYNC_TIMEOUT || :
322 function _generateFlagOptions
326 CHCONTEXT_FLAG_OPTS=()
328 test ! -e "$vdir"/flags || \
337 OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]}" --flag "$flag" )
338 CHCONTEXT_FLAG_OPTS=( "${CHCONTEXT_FLAG_OPTS[@]}"
344 isAvoidNamespace "$vdir" || {
346 CHCONTEXT_FLAG_OPTS=( "${CHCONTEXT_FLAG_OPTS[@]}" --flag namespace )
350 function _generateChcontextOptions
353 local ctx hostname domainname
358 read ctx <"$vdir"/context || :
360 read hostname <"$vdir"/uts/nodename || read hostname <"$vdir"/hostname || :
361 read domainname <"$vdir"/uts/domainname || read domainname <"$vdir"/domainname || :
364 test -z "$S_CONTEXT" || ctx=$S_CONTEXT
366 _generateCapabilityOptions "$vdir"
367 _generateFlagOptions "$vdir"
369 CHCONTEXT_OPTS=( $SILENT_OPT \
370 "${CHCONTEXT_FLAG_OPTS[@]}" \
373 ${ctx:+--ctx "$ctx"} \
374 ${hostname:+--hostname "$hostname"} \
375 ${domainname:+--domainname "$domainname"} )
377 OPTS_VCONTEXT_CREATE=( $SILENT_OPT \
378 ${ctx:+--xid "$ctx"} )
379 ## put '--secure' at front so that it can be overridden
380 OPTS_VATTRIBUTE=( --secure --flag default "${OPTS_VATTRIBUTE[@]}" )
383 function _generateScheduleOptions
386 local f="$vdir"/schedule
387 test -e "$f" || return 0
389 local fill_rate interval tokens tokens_min tokens_max prio_bias
397 read prio_bias || prio_bias=
401 test -n "$prio_bias" || {
402 echo $"Bad content in '$f'; aborting..." >&2
406 OPTS_VSCHED=( --fill-rate "$fill_rate" --interval "$interval" \
407 --tokens "$tokens" --tokens_min "$tokens_min" \
408 --tokens_max "$tokens_max" --priority-bias "$prio_bias" )
411 function _getInterfaceValue
421 read _giv_tmp <"$_giv_i/$_giv_val" && break || :
424 : ${_giv_tmp:=$_giv_dflt}
425 eval $_giv_val=\$_giv_tmp
428 ## Usage: _transformMask2Prefix <result-varname> <prefix> <mask>
429 function _transformMask2Prefix
433 test -n "$_tm2p_tmp" || {
434 $_MASK2PREFIX "$3" || _tm2p_tmp=$?
441 function _addInterfaceCmd
443 eval INTERFACE_CMDS_${INTERFACE_CMDS_IDX}='( "$@" )'
444 let ++INTERFACE_CMDS_IDX
447 ## Usage: _generateMac <var> <iface> <ctx>
448 function _generateMac
451 echo $"Interface basename '$iface' must be either a number, or the mac must be configured explicitly" >&2
455 eval $1=$(printf "f0:ff:%02x:%02x:%02x:%02x" $[ (~($2>>8)) & 0xff ] $[ ($2 & 0xff) ] $[ ($3>>8) & 0xff ] $[ $3 & 0xff ])
458 function _getVLANInfo
463 creation of VLAN_PLUS_VID devices is not supported; please create them
464 before starting the vserver and use the 'nodev' flag then"
465 echo "$1 vlan ${1##vlan} VLAN_PLUS_VID"
469 creation of VLAN_PLUS_VID_NO_PAD devices is not supported; please
470 create them before starting the vserver and use the 'nodev' flag then"
471 echo "$1 vlan ${1##vlan} VLAN_PLUS_VID_N0_PAD"
473 (*.????) echo "$1 ${1%%.*} ${1##*.} DEV_PLUS_VID";;
474 (*.*) echo "$1 ${1%%.*} ${1##*.} DEV_PLUS_VID_NO_PAD";;
481 ## Usage: _processSingleInterface <interface-directory>
482 function _processSingleInterface
497 _getInterfaceValue ip '' "$iface"
498 _getInterfaceValue extip '' "$iface" "$iface/.."
499 _getInterfaceValue dev '' "$iface" "$iface/.."
500 _getInterfaceValue prefix '' "$iface" "$iface/.."
501 _getInterfaceValue mask '' "$iface" "$iface/.."
502 _getInterfaceValue bcast '' "$iface" "$iface/.."
503 _getInterfaceValue name '' "$iface"
504 _getInterfaceValue scope '' "$iface" "$iface/.."
505 _getInterfaceValue mac '' "$iface"
507 test -n "$ip" || { echo $"Can not read ip for '$iface'" >&2; return 1; }
508 test -n "$dev" -o -e "$iface"/nodev || {
509 echo $"No device specified for '$iface'" >&2
513 test ! -e "$iface"/down || up=
516 _transformMask2Prefix prefix "$prefix" "$mask"
517 INTERFACES=( "${INTERFACES[@]}" "$ip${prefix:+/$prefix}" )
519 test ! -e "$iface"/nodev || break
521 test ! -e "$iface"/only_ip || break
524 if vlan_info=$(_getVLANInfo "$dev"); then
525 test -d /proc/net/vlan || {
526 echo -e $"VLAN device-name used, but vlan subsystem not enabled.\nTry to execute 'modprobe 8021q' before starting the vservers" >&2
529 test -f /proc/net/vlan -o -e "$iface"/novlandev || {
530 _addInterfaceCmd VCONFIG $vlan_info
534 if ! test -e "$iface"/indirect; then
535 _addInterfaceCmd IP_ADDR "$ip${prefix:+/$prefix}" broadcast ${bcast:-+} ${name:+label "$dev:$name"} dev "$dev"
536 #_addInterfaceCmd IP_ROUTE "$ip${prefix:+/$prefix}" dev "$dev"
537 _addInterfaceCmd IP_LINK "$dev" $up
538 elif ! test -n "$ctx"; then
539 echo $"Using 'dummy' (indirect) for interface '$dev' requires a fixed context number; dynamic ctx are not supported" >&2
542 test -z "$mac" || _generateMac mac "$(basename $iface)" "$ctx" || return 1
543 _addInterfaceCmd MODPROBE dummy "$dev"
544 _addInterfaceCmd IP_LINK dev dummy0 address "$mac"
545 _addInterfaceCmd NAMEIF "$dev" "$mac"
546 _addInterfaceCmd IP_ADDR "$ip${prefix:+/$prefix}" dev "$dev"
547 test -z "$extip" || _addInterfaceCmd IPTABLES "$ip${prefix:+/$prefix}" ${name:+label "$dev:$name"} "$ctx" "$extip"
554 ## Usage: _generateInterfaceOptions <vserver-directory>
555 function _generateInterfaceOptions
560 test ! -e "$1"/context || read ctx <"$1"/context
562 for iface in "$1/interfaces/"*; do
563 test -d "$iface" || continue
564 test ! -e "$iface"/disabled || continue
566 _processSingleInterface "$iface"
568 _HAVE_INTERFACE_OPTIONS=1
571 function enableInterfaces
576 lock "$__LOCKDIR"/vserver.interfaces
578 while test $i -lt $INTERFACE_CMDS_IDX; do
579 eval var='( "${INTERFACE_CMDS_'$i'[@]}" )'
590 $_MODPROBE ${name:+-o "$name"} "$mod" "$@"
592 NAMEIF) $_NAMEIF "$@";;
593 VCONFIG) $_VCONFIG set_name_type "$4" >/dev/null
594 $_VCONFIG add "$2" "$3" >/dev/null;;
595 IP_ADDR) $_IP addr add "$@";;
596 IP_ADDR_FLUSH) $_IP addr flush "$@";;
597 IP_LINK) $_IP link set "$@";;
598 IP_ROUTE) $_IP route add "$@";;
599 *) echo "Unknown interface-command type '$type'" >&2; false;;
608 function disableInterfaces
610 test -n "$_HAVE_INTERFACE_OPTIONS" || _generateInterfaceOptions "$1"
612 local i=$INTERFACE_CMDS_IDX
615 lock "$__LOCKDIR"/vserver.interfaces
617 while test $i -gt 0; do
620 eval var='( "${INTERFACE_CMDS_'$i'[@]}" )'
627 MODPROBE) $_RMMOD "${2:-$1}";;
629 VCONFIG) $_VCONFIG rem "$2.$3" >/dev/null;;
630 IP_ADDR) $_IP addr del "$@";;
632 IP_LINK) ;; ## Ignore the link-down command for now
633 IP_ROUTE) $_IP route del "$@";;
634 *) echo "Unknown interface-command type '$type'" >&2; false;;
641 ## Usage: prepareInit <vserver-directory>
644 pushd "$1/vdir" >/dev/null
647 { find var/run ! -type d -print0; \
648 find var/lock ! -type d -print0; } | xargs -0r $_CHROOT_SH rm
651 $_CHROOT_SH rm .autofsck forcefsck 2>/dev/null || :
652 : | $_CHROOT_SH truncate fastboot 2>/dev/null || :
657 "${INITCMD_PREPARE[@]}"
661 ## Usage: prepareInit <vserver-directory>
664 pushd "$1/vdir" >/dev/null
667 export PREVLEVEL=$RUNLEVEL_START # required by Debian's initscripts
670 "${STOPCMD_PREPARE[@]}"
675 function generateOptions
677 _generateInterfaceOptions "$1"
678 test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$1"
679 _generateNiceCommand "$1"
680 _generateInitOptions "$1"
681 _generateChcontextOptions "$1"
682 _generateScheduleOptions "$1"
683 _generatePersonalityOptions "$1"
685 if test -n "$_IS_FAKEINIT"; then
686 CHCONTEXT_INIT_OPTS=( --disconnect --flag fakeinit )
687 OPTS_VCONTEXT_MIGRATE=( "${OPTS_VCONTEXT_MIGRATE[@]}" --initpid --disconnect )
691 function _mountVserverInternal
696 test -e "$fstab" || return 0
699 pushd "$vdir" >/dev/null
700 # check whether / is mounted readonly or whether there is special
701 # magic regarding the mtab file; when etc/mtab can not be touched,
702 # add the '-n' flag to mount
703 test -w etc -o -w etc/mtab || xflag=-n
704 "$@" $_SECURE_MOUNT -a $xflag --chroot --fstab "$fstab" --rootfs no
712 local fstab="$cfgdir"/fstab
715 test -e "$fstab" || return 0
716 pushd "$vdir" >/dev/null
717 # check whether / is mounted readonly or whether there is special
718 # magic regarding the mtab file; when etc/mtab can not be touched,
719 # add the '-n' flag to mount
720 test -w etc -o -w etc/mtab || xflag=-n
721 $_SECURE_MOUNT -a $xflag --chroot --fstab "$fstab" --rootfs only -n
725 function mountVserver
732 test -e "$cfgdir"/fstab -o \
733 -e "$cfgdir"/fstab.local -o \
734 -e "$cfgdir"/fstab.remote || return 0
736 findObject -r mtab_src "$cfgdir"/apps/init/mtab "$__CONFDIR"/.defaults/init/mtab "$__PKGLIBDEFAULTDIR"/mtab /dev/null
738 pushd "$vdir" >/dev/null
739 $_CHROOT_SH truncate /etc/mtab <"$mtab_src"
742 test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$cfgdir"
744 test -z "$NAMESPACE_CLEANUP" || isAvoidNamespace "$cfgdir" || \
745 $_VNAMESPACE --cleanup
747 _mountVserverInternal "$cfgdir"/fstab
748 _mountVserverInternal "$cfgdir"/fstab.local
749 _mountVserverInternal "$cfgdir"/fstab.remote $_CHBIND "${CHBIND_OPTS[@]}"
751 isAvoidNamespace "$cfgdir" || \
752 $_SECURE_MOUNT --rbind -n "$vdir" "/"
755 function _umountVserverInternal
758 test -e "$fstab" || return 0
763 while read src dst tmp; do
764 test -n "$tmp" || continue
770 "$@" $_EXEC_CD "$dst" $_UMOUNT -lfn . || is_ok=
776 function umountVserver
782 isAvoidNamespace "$cfgdir" || return 0
783 test -e "$cfgdir"/fstab -o \
784 -e "$cfgdir"/fstab.local -o \
785 -e "$cfgdir"/fstab.remote || return 0
786 test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$cfgdir"
788 pushd "$vdir/" >/dev/null || return 1
789 _umountVserverInternal "$cfgdir"/fstab.remote $_CHBIND "${CHBIND_OPTS[@]}" || is_ok=
790 _umountVserverInternal "$cfgdir"/fstab.local || is_ok=
791 _umountVserverInternal "$cfgdir"/fstab || is_ok=
792 popd >/dev/null || return 1
797 ## Usage: waitForSync <vserver> <context> <vshelper-fifo-varname>
801 test -n "$_NEED_VSHELPER_SYNC" && \
802 ! $_VSERVER_INFO - FEATURE vwait || _is_meth=async
804 vshelper.initSync "$1" "$3" "$_is_meth"
807 ## Usage: initWait <vserver> <context> <vwait-tmpdir-varname>
810 if $_VSERVER_INFO - FEATURE vwait; then
812 _is_tmpdir=$($_MKTEMPDIR vwaitstat.XXXXXX)
815 $_VWAIT --timeout "$VSHELPER_SYNC_TIMEOUT" \
817 >>$_is_tmpdir/out 2>$_is_tmpdir/err 3>$_is_tmpdir/fifo
820 if test "$rc" -ne 0 -a "$rc" -ne 1; then
821 $_VPS axf | $_EGREP -e "^[^ \t]+[ \t]+$S_CONTEXT[ \t]+" >&4
822 killContext "$S_CONTEXT" 9
826 ) 4>$_is_tmpdir/procs &
828 echo "$!" >$_is_tmpdir/pid
829 eval "$3"=$_is_tmpdir
834 ## Usage: _waitForVWait <vserver> <fifo> <pid> <procs>
835 function _waitForVWait
840 declare -r procs=$(cat $4)
842 getFileArray status "$2"
847 'vwait' exited with error '$2' which indicates that vserver could not
852 A timeout occured while waiting for the vserver to finish and it was
853 killed by sending a SIGKILL signal. Please investigate the reasons
854 and/or increase the timeout in apps/vshelper/sync-timeout."
857 (TIMEOUT) warning $"\
858 A timeout occured while waiting for the vserver to finish and it will
859 be killed by sending a SIGKILL signal. The following process list
860 might be useful for finding out the reason of this behavior:
862 ----------------------------------------------------------------------
864 }----------------------------------------------------------------------"
867 (\?\?\?|*) warning $"\
868 internal error: 'vwait' exited with an unexpected status '$1'; I will
869 try to continue but be prepared for unexpected events."
876 ## Usage: waitForSync <vserver> [<vshelper-fifo>] [<vwait-statdir>]
881 local vwait_statdir=$3
884 if test -d "$vwait_statdir"; then
885 _waitForVWait "$cfgdir" "$vwait_statdir/fifo" "$( <$vwait_statdir/pid )" "$vwait_statdir/procs"
886 elif test -n "$_NEED_VSHELPER_SYNC"; then
887 $_VSHELPER_SYNC "$fifo" "$VSHELPER_SYNC_TIMEOUT" || \
889 A timeout or other error occured while waiting for the synchronization
890 signal from vserver '$VSERVER_NAME'.
891 The vserver will be killed nevertheless..."
892 elif test "${#INITCMD_STOP_SYNC[@]}" -ne 0; then
893 "${INITCMD_STOP_SYNC[@]}" || \
895 Stop-synchronization for vserver '$VSERVER_NAME' failed. The vserver
896 will be killed nevertheless..."
899 test -z "$OPTION_FORCE_SYNC" -a ! -e "$cfgdir"/sync ||
905 local vdir name flavor start i already_handled base
909 ## Usage: execScriptlets <vserver-cfgdir> <vserver-name> <script-flavor>
910 function execScriptlets
917 for base in "$vdir"/scripts "$__CONFDIR"/.defaults/scripts; do
918 local DONT_SKIP_DEFAULTS=
919 local already_handled=
921 for i in "$base/$flavor" "$base/$flavor.d"/*; do
922 isRegularFile "$i" || continue
923 test -r "$i" || continue
927 test -x "$i" || start=_sourceWrap
928 $start "$i" "$flavor" "$name"
931 test -z "$already_handled" -o -n "$DONT_SKIP_DEFAULTS" || break
940 ! test -e "$cfgdir"/fstab.local ||
942 WARNING: 'fstab' will *not* be executed in the network context of the
943 vserver anymore. Therefore, 'fstab.local' has the same functionality
944 and is obsoleted. When you need the old behaviour, put the mounts
947 ! test -e "$cfgdir"/hostname -a ! -L "$cfgdir"/hostname ||
949 WARNING: The hostname is now configured in 'uts/nodename' but not in
952 ! test -e "$cfgdir"/domainname -a ! -L "$cfgdir"/domainname ||
954 WARNING: The domainname is now configured in 'uts/domainname' but not
955 in 'domainname'." >&2
959 for i in "$cfgdir"/interfaces/*/only_ip; do
960 if test -e "$i"; then
962 iface=${i##$cfgdir/interfaces/}
963 iface=${iface%%/only_ip}
965 WARNING: The 'only_ip' flag for interface '$iface' is deprecated; use
970 test ! -d "$cfgdir"/dlimits -o -L "$cfgdir/cache" || \
972 WARNING: There is no cachedirectory configured for this vserver;
973 please create '$cfgdir/cache' e.g. by executing
975 ln -s ../.defaults/cachebase/$VSERVER_NAME $cfgdir/cache
978 find "$cfgdir" -type f -exec "$_CHECK_UNIXFILE" '{}' ';'
980 vshelper.doSanityCheck
982 $_VSERVER_INFO - VERIFYCAP ||
983 panic $"capabilities are not enabled in kernel-setup"
985 $_VSERVER_INFO - VERIFYPROC ||
987 /proc/uptime can not be accessed. Usually, this is caused by
988 procfs-security. Please read the FAQ for more details
989 http://www.linux-vserver.org/index.php?page=Linux-Vserver+FAQ"
993 function _setSingleDiskLimit
1005 getFileValue ctx "$vdir/context"
1006 getFileValue directory "$dlimit/directory" || return 0
1007 getFileValue space_total "$dlimit/space_total" || return 0
1008 getFileValue inodes_total "$dlimit/inodes_total" || return 0
1009 getFileValue reserved "$dlimit/reserved" || return 0
1011 local cachename=$ctx$directory
1012 cachename=dlimits/${cachename//\//_}
1014 test -e "$vdir/cache/$cachename" && . "$vdir/cache/$cachename"
1015 # Remove the cache so if the machine goes down unexpectedly, we won't have a stale cache
1016 $_RM -f "$vdir/cache/$cachename"
1018 if test -z "$inodes_used" -o -z "$space_used"; then
1020 tmpvdu=`$_VDU --xid $ctx --space --inodes --script "$directory"`
1021 inodes_used=${tmpvdu##* }
1022 space_used=${tmpvdu%% *}
1025 $_VDLIMIT --xid $ctx \
1026 --set space_used=$space_used \
1027 --set space_total=$space_total \
1028 --set inodes_used=$inodes_used \
1029 --set inodes_total=$inodes_total \
1030 --set reserved=$reserved \
1035 function setDiskLimits
1040 # Disk Limits without a static context are useless
1041 test -e "$vdir"/context || return 0
1043 for dlimit in "$vdir/dlimits/"*; do
1044 test -d "$dlimit" || continue
1045 test ! -e "$dlimit/disabled" || continue
1047 _setSingleDiskLimit "$vdir" "$dlimit"
1052 function _saveSingleDiskLimit
1059 getFileValue ctx "$vdir/context"
1060 getFileValue directory "$dlimit/directory" || return 0
1062 local cachename=$ctx$directory
1063 cachename=${cachename//\//_}
1065 # Things are getting ugly here... LFS says that /var/cache (where
1066 # cachename is usually pointing to) can vanish and applications
1067 # have to deal with it. So, we have to interprete the $vdir/cache
1068 # symlink and have to create the needed directories manually.
1069 if test -d "$vdir/cache"; then
1070 : # ok, exists already
1071 elif test -L "$vdir/cache"; then
1072 # it's a dangling symlink
1074 link=$($_READLINK "$vdir/cache")
1075 ( cd $vdir && $_MKDIR -p "$link" )
1080 test -d "$vdir/cache"
1081 $_MKDIR -p "$vdir"/cache/dlimits
1083 $_VDLIMIT --xid $ctx "$directory" | \
1084 $_GREP '_used=' > "$vdir/cache/dlimits/$cachename"
1088 function saveDiskLimits
1093 test -e "$vdir"/context || return 0
1095 for dlimit in "$vdir/dlimits/"*; do
1096 test -d "$dlimit" || continue
1097 test ! -e "$dlimit/disabled" || continue
1099 _saveSingleDiskLimit "$vdir" "$dlimit"