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
81 test -n "$_HAVE_INTERFACE_OPTIONS" || _generateInterfaceOptions "$vdir"
83 local f=$vdir/interfaces/bcast
84 getFileValue bcast "$f"
86 CHBIND_OPTS=( $SILENT_OPT ${bcast:+--bcast "$bcast"} )
88 for i in "${INTERFACES[@]}"; do
89 CHBIND_OPTS=( "${CHBIND_OPTS[@]}" --ip "$i" )
92 _HAVE_CHBIND_OPTIONS=1
95 function _generateNiceCommand
100 test -r "$vdir/nice" || return 0;
101 read nice <"$vdir"/nice
103 NICE_CMD=( $_NICE -$nice )
107 function _generatePersonalityOptions
110 local f="$vdir"/personality
113 test -s "$f" || return 0
122 (*) flags=$flags$delim$tmp
129 OPTS_VCONTEXT_ENTER=( "${OPTS_VCONTEXT_ENTER[@]}"
130 --personality-type "$type"
131 ${flags:+--personality-flags "$flags"} )
134 function _generateCCapabilityOptions
138 local f="$vdir"/ccapabilities
140 test -e "$f" || return 0
144 (*) OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]}" --ccap "$cap" );;
149 function _generateBCapabilityOptions
153 local f="$vdir"/bcapabilities
155 test -e "$f" || return 0
159 (*) OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]}" --bcap "$cap" );;
164 function _generateCapabilityOptions
169 _generateBCapabilityOptions "$vdir"
170 _generateCCapabilityOptions "$vdir"
172 test -e "$vdir"/capabilities || return 0
181 CAP_OPTS=( "${CAP_OPTS[@]}" --cap "$cap" )
182 CAPCHROOT_OPTS=( "${CAPCHROOT_OPTS[@]}" --nochroot )
185 CAP_OPTS=( "${CAP_OPTS[@]}" --cap "$cap" )
188 done <"$vdir"/capabilities
191 function getEnterShell
198 getFileValue ENTER_SHELL "$vdir"/shell "$__CONFDIR"/.defaults/shell
200 test -n "$ENTER_SHELL" || {
202 for i in "/bin/bash -login" "/bin/sh -l" /bin/csh; do
204 test -x "$vdir/vdir/$1" || continue
211 ## Usage: sendKillSequence <ctx> <signal> [<wait> <signal>]*
212 function sendKillSequence
218 while isCtxRunning "$ctx"; do
219 test -z "$wait" || sleep "$wait"
221 killContext "$ctx" "$1"
222 test -n "$2" || break
228 function _generateInitOptions
231 local cfgdir=$vdir/apps/init
236 INITCMD_START_SYNC=()
241 INITKILL_SEQ=( 15 5 9 )
242 CHCONTEXT_INIT_OPTS=()
245 getFileValue INITSTYLE "$cfgdir"/style
246 getFileValue RUNLEVEL_START "$cfgdir"/runlevel
247 getFileValue RUNLEVEL_START "$cfgdir"/runlevel.start
248 getFileValue RUNLEVEL_STOP "$cfgdir"/runlevel.stop
249 getFileArray INITKILL_SEQ "$cfgdir"/killseq || :
251 case x"$INITSTYLE" in
253 INITCMD_START=( "${INITCMD_RESCUE[@]}" )
254 INITCMD_STOP=( /sbin/killall5 )
260 test -n "$RUNLEVEL_START" || RUNLEVEL_START=3
261 test -n "$RUNLEVEL_STOP" || RUNLEVEL_STOP=6
263 for i in /etc/init.d/rc /etc/rc.d/rc; do
264 test -x "$vdir/vdir/$i" || continue
265 INITCMD_START=( "$i" "$RUNLEVEL_START" )
266 INITCMD_STOP=( "$i" "$RUNLEVEL_STOP" )
268 INITCMD_PREPARE=( $_FAKE_RUNLEVEL "$RUNLEVEL_START" /var/run/utmp )
272 INITCMD_START=( /sbin/init )
273 INITCMD_STOP=( /sbin/init )
275 _NEED_VSHELPER_SYNC=1
276 test -z "$RUNLEVEL_START" || INITCMD_START=( "${INITCMD_START[@]}" "$RUNLEVEL_START" )
277 test -z "$RUNLEVEL_STOP" || INITCMD_STOP=( "${INITCMD_STOP[@]}" "$RUNLEVEL_STOP" )
281 INITCMD_START=( /sbin/minit-start )
282 INITCMD_STOP=( /sbin/minit-stop )
284 INITCMD_START_SYNC=( "$_INITSYNC_MINIT_START" "$vdir" )
285 _NEED_VSHELPER_SYNC=1
286 test -z "$RUNLEVEL_START" || INITCMD_START=( "${INITCMD_START[@]}" "$RUNLEVEL_START" )
287 test -z "$RUNLEVEL_STOP" || INITCMD_STOP=( "${INITCMD_STOP[@]}" "$RUNLEVEL_STOP" )
288 ! isNumber "${RUNLEVEL_START:-3}" || INITCMD_PREPARE=( $_FAKE_RUNLEVEL "${RUNLEVEL_START:-3}" /var/run/utmp )
292 INITCMD_START=( /sbin/rc default )
293 INITCMD_STOP=( /sbin/rc shutdown )
297 (*) panic "Unknown init-style '$INITSTYLE'; aborting";;
300 if test x"$INITSTYLE" != xrescue; then
301 getFileArray INITCMD_START "$cfgdir"/cmd.start || :
302 getFileArray INITCMD_STOP "$cfgdir"/cmd.stop || :
303 getFileArray INITCMD_START_SYNC "$cfgdir"/cmd.start-sync || :
304 getFileArray INITCMD_STOP_SYNC "$cfgdir"/cmd.stop-sync || :
305 getFileArray INITCMD_PREPARE "$cfgdir"/cmd.prepare || :
308 test -n "$OPTION_FORCE_SYNC" -o -e "$cfgdir"/sync || {
309 INITCMD_START_SYNC=()
314 if vshelper.isEnabled; then
315 vshelper.getSyncTimeout "$vdir" VSHELPER_SYNC_TIMEOUT || :
321 function _generateFlagOptions
325 CHCONTEXT_FLAG_OPTS=()
327 test ! -e "$vdir"/flags || \
336 OPTS_VATTRIBUTE=( "${OPTS_VATTRIBUTE[@]}" --flag "$flag" )
337 CHCONTEXT_FLAG_OPTS=( "${CHCONTEXT_FLAG_OPTS[@]}"
343 isAvoidNamespace "$vdir" || {
345 CHCONTEXT_FLAG_OPTS=( "${CHCONTEXT_FLAG_OPTS[@]}" --flag namespace )
349 function _generateChcontextOptions
352 local ctx hostname domainname
357 read ctx <"$vdir"/context || :
359 read hostname <"$vdir"/uts/nodename || read hostname <"$vdir"/hostname || :
360 read domainname <"$vdir"/uts/domainname || read domainname <"$vdir"/domainname || :
363 test -z "$S_CONTEXT" || ctx=$S_CONTEXT
365 _generateCapabilityOptions "$vdir"
366 _generateFlagOptions "$vdir"
368 CHCONTEXT_OPTS=( $SILENT_OPT \
369 "${CHCONTEXT_FLAG_OPTS[@]}" \
372 ${ctx:+--ctx "$ctx"} \
373 ${hostname:+--hostname "$hostname"} \
374 ${domainname:+--domainname "$domainname"} )
376 OPTS_VCONTEXT_CREATE=( $SILENT_OPT \
377 ${ctx:+--xid "$ctx"} )
378 ## put '--secure' at front so that it can be overridden
379 OPTS_VATTRIBUTE=( --secure --flag default "${OPTS_VATTRIBUTE[@]}" )
382 function _generateScheduleOptions
385 local f="$vdir"/schedule
386 test -e "$f" || return 0
388 local fill_rate interval tokens tokens_min tokens_max prio_bias
396 read prio_bias || prio_bias=
400 test -n "$prio_bias" || {
401 echo $"Bad content in '$f'; aborting..." >&2
405 OPTS_VSCHED=( --fill-rate "$fill_rate" --interval "$interval" \
406 --tokens "$tokens" --tokens_min "$tokens_min" \
407 --tokens_max "$tokens_max" --priority-bias "$prio_bias" )
410 function _getInterfaceValue
420 read _giv_tmp <"$_giv_i/$_giv_val" && break || :
423 : ${_giv_tmp:=$_giv_dflt}
424 eval $_giv_val=\$_giv_tmp
427 ## Usage: _transformMask2Prefix <result-varname> <prefix> <mask>
428 function _transformMask2Prefix
432 test -n "$_tm2p_tmp" || {
433 $_MASK2PREFIX "$3" || _tm2p_tmp=$?
440 function _addInterfaceCmd
442 eval INTERFACE_CMDS_${INTERFACE_CMDS_IDX}='( "$@" )'
443 let ++INTERFACE_CMDS_IDX
446 ## Usage: _generateMac <var> <iface> <ctx>
447 function _generateMac
450 echo $"Interface basename '$iface' must be either a number, or the mac must be configured explicitly" >&2
454 eval $1=$(printf "f0:ff:%02x:%02x:%02x:%02x" $[ (~($2>>8)) & 0xff ] $[ ($2 & 0xff) ] $[ ($3>>8) & 0xff ] $[ $3 & 0xff ])
457 function _getVLANInfo
462 creation of VLAN_PLUS_VID devices is not supported; please create them
463 before starting the vserver and use the 'nodev' flag then"
464 echo "$1 vlan ${1##vlan} VLAN_PLUS_VID"
468 creation of VLAN_PLUS_VID_NO_PAD devices is not supported; please
469 create them before starting the vserver and use the 'nodev' flag then"
470 echo "$1 vlan ${1##vlan} VLAN_PLUS_VID_N0_PAD"
472 (*.????) echo "$1 ${1%%.*} ${1##*.} DEV_PLUS_VID";;
473 (*.*) echo "$1 ${1%%.*} ${1##*.} DEV_PLUS_VID_NO_PAD";;
480 ## Usage: _processSingleInterface <interface-directory>
481 function _processSingleInterface
496 _getInterfaceValue ip '' "$iface"
497 _getInterfaceValue extip '' "$iface" "$iface/.."
498 _getInterfaceValue dev '' "$iface" "$iface/.."
499 _getInterfaceValue prefix '' "$iface" "$iface/.."
500 _getInterfaceValue mask '' "$iface" "$iface/.."
501 _getInterfaceValue bcast '' "$iface" "$iface/.."
502 _getInterfaceValue name '' "$iface"
503 _getInterfaceValue scope '' "$iface" "$iface/.."
504 _getInterfaceValue mac '' "$iface"
506 test -n "$ip" || { echo $"Can not read ip for '$iface'" >&2; return 1; }
507 test -n "$dev" -o -e "$iface"/nodev || {
508 echo $"No device specified for '$iface'" >&2
512 test ! -e "$iface"/down || up=
515 _transformMask2Prefix prefix "$prefix" "$mask"
516 INTERFACES=( "${INTERFACES[@]}" "$ip${prefix:+/$prefix}" )
518 test ! -e "$iface"/nodev || break
520 test ! -e "$iface"/only_ip || break
523 if vlan_info=$(_getVLANInfo "$dev"); then
524 test -d /proc/net/vlan || {
525 echo -e $"VLAN device-name used, but vlan subsystem not enabled.\nTry to execute 'modprobe 8021q' before starting the vservers" >&2
528 test -f /proc/net/vlan -o -e "$iface"/novlandev || {
529 _addInterfaceCmd VCONFIG $vlan_info
533 if ! test -e "$iface"/indirect; then
534 _addInterfaceCmd IP_ADDR "$ip${prefix:+/$prefix}" broadcast ${bcast:-+} ${name:+label "$dev:$name"} dev "$dev"
535 #_addInterfaceCmd IP_ROUTE "$ip${prefix:+/$prefix}" dev "$dev"
536 _addInterfaceCmd IP_LINK "$dev" $up
537 elif ! test -n "$ctx"; then
538 echo $"Using 'dummy' (indirect) for interface '$dev' requires a fixed context number; dynamic ctx are not supported" >&2
541 test -z "$mac" || _generateMac mac "$(basename $iface)" "$ctx" || return 1
542 _addInterfaceCmd MODPROBE dummy "$dev"
543 _addInterfaceCmd IP_LINK dev dummy0 address "$mac"
544 _addInterfaceCmd NAMEIF "$dev" "$mac"
545 _addInterfaceCmd IP_ADDR "$ip${prefix:+/$prefix}" dev "$dev"
546 test -z "$extip" || _addInterfaceCmd IPTABLES "$ip${prefix:+/$prefix}" ${name:+label "$dev:$name"} "$ctx" "$extip"
553 ## Usage: _generateInterfaceOptions <vserver-directory>
554 function _generateInterfaceOptions
559 test ! -e "$1"/context || read ctx <"$1"/context
561 for iface in "$1/interfaces/"*; do
562 test -d "$iface" || continue
563 test ! -e "$iface"/disabled || continue
565 _processSingleInterface "$iface"
567 _HAVE_INTERFACE_OPTIONS=1
570 function enableInterfaces
575 lock "$__LOCKDIR"/vserver.interfaces
577 while test $i -lt $INTERFACE_CMDS_IDX; do
578 eval var='( "${INTERFACE_CMDS_'$i'[@]}" )'
589 $_MODPROBE ${name:+-o "$name"} "$mod" "$@"
591 NAMEIF) $_NAMEIF "$@";;
592 VCONFIG) $_VCONFIG set_name_type "$4" >/dev/null
593 $_VCONFIG add "$2" "$3" >/dev/null;;
594 IP_ADDR) $_IP addr add "$@";;
595 IP_ADDR_FLUSH) $_IP addr flush "$@";;
596 IP_LINK) $_IP link set "$@";;
597 IP_ROUTE) $_IP route add "$@";;
598 *) echo "Unknown interface-command type '$type'" >&2; false;;
607 function disableInterfaces
609 test -n "$_HAVE_INTERFACE_OPTIONS" || _generateInterfaceOptions "$1"
611 local i=$INTERFACE_CMDS_IDX
614 lock "$__LOCKDIR"/vserver.interfaces
616 while test $i -gt 0; do
619 eval var='( "${INTERFACE_CMDS_'$i'[@]}" )'
626 MODPROBE) $_RMMOD "${2:-$1}";;
628 VCONFIG) $_VCONFIG rem "$2.$3" >/dev/null;;
629 IP_ADDR) $_IP addr del "$@";;
631 IP_LINK) ;; ## Ignore the link-down command for now
632 IP_ROUTE) $_IP route del "$@";;
633 *) echo "Unknown interface-command type '$type'" >&2; false;;
640 ## Usage: prepareInit <vserver-directory>
643 pushd "$1/vdir" >/dev/null
646 { find var/run ! -type d -print0; \
647 find var/lock ! -type d -print0; } | xargs -0r $_CHROOT_SH rm
650 $_CHROOT_SH rm .autofsck forcefsck 2>/dev/null || :
651 : | $_CHROOT_SH truncate fastboot 2>/dev/null || :
656 "${INITCMD_PREPARE[@]}"
660 ## Usage: prepareInit <vserver-directory>
663 pushd "$1/vdir" >/dev/null
666 export PREVLEVEL=$RUNLEVEL_START # required by Debian's initscripts
669 "${STOPCMD_PREPARE[@]}"
674 function generateOptions
676 _generateInterfaceOptions "$1"
677 test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$1"
678 _generateNiceCommand "$1"
679 _generateInitOptions "$1"
680 _generateChcontextOptions "$1"
681 _generateScheduleOptions "$1"
682 _generatePersonalityOptions "$1"
684 if test -n "$_IS_FAKEINIT"; then
685 CHCONTEXT_INIT_OPTS=( --disconnect --flag fakeinit )
686 OPTS_VCONTEXT_MIGRATE=( "${OPTS_VCONTEXT_MIGRATE[@]}" --initpid --disconnect )
690 function _mountVserverInternal
695 test -e "$fstab" || return 0
698 pushd "$vdir" >/dev/null
699 # check whether / is mounted readonly or whether there is special
700 # magic regarding the mtab file; when etc/mtab can not be touched,
701 # add the '-n' flag to mount
702 test -w etc -o -w etc/mtab || xflag=-n
703 "$@" $_SECURE_MOUNT -a $xflag --chroot --fstab "$fstab" --rootfs no
711 local fstab="$cfgdir"/fstab
714 test -e "$fstab" || return 0
715 pushd "$vdir" >/dev/null
716 # check whether / is mounted readonly or whether there is special
717 # magic regarding the mtab file; when etc/mtab can not be touched,
718 # add the '-n' flag to mount
719 test -w etc -o -w etc/mtab || xflag=-n
720 $_SECURE_MOUNT -a $xflag --chroot --fstab "$fstab" --rootfs only -n
724 function mountVserver
731 test -e "$cfgdir"/fstab -o \
732 -e "$cfgdir"/fstab.local -o \
733 -e "$cfgdir"/fstab.remote || return 0
735 findObject -r mtab_src "$cfgdir"/apps/init/mtab "$__CONFDIR"/.defaults/init/mtab "$__PKGLIBDEFAULTDIR"/mtab /dev/null
737 pushd "$vdir" >/dev/null
738 $_CHROOT_SH truncate /etc/mtab <"$mtab_src"
741 test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$cfgdir"
743 test -z "$NAMESPACE_CLEANUP" || isAvoidNamespace "$cfgdir" || \
744 $_VNAMESPACE --cleanup
746 _mountVserverInternal "$cfgdir"/fstab
747 _mountVserverInternal "$cfgdir"/fstab.local
748 _mountVserverInternal "$cfgdir"/fstab.remote $_CHBIND "${CHBIND_OPTS[@]}"
750 isAvoidNamespace "$cfgdir" || \
751 $_SECURE_MOUNT --rbind -n "$vdir" "/"
754 function _umountVserverInternal
757 test -e "$fstab" || return 0
762 while read src dst tmp; do
763 test -n "$tmp" || continue
769 "$@" $_EXEC_CD "$dst" $_UMOUNT -lfn . || is_ok=
775 function umountVserver
781 isAvoidNamespace "$cfgdir" || return 0
782 test -e "$cfgdir"/fstab -o \
783 -e "$cfgdir"/fstab.local || return 0
784 test -n "$_HAVE_CHBIND_OPTIONS" || _generateChbindOptions "$cfgdir"
786 pushd "$vdir/" >/dev/null || return 1
787 _umountVserverInternal "$cfgdir"/fstab.local || is_ok=
788 _umountVserverInternal "$cfgdir"/fstab $_CHBIND "${CHBIND_OPTS[@]}" || is_ok=
789 popd >/dev/null || return 1
794 ## Usage: waitForSync <vserver> <context> <vshelper-fifo-varname>
798 test -n "$_NEED_VSHELPER_SYNC" && \
799 ! $_VSERVER_INFO - FEATURE vwait || _is_meth=async
801 vshelper.initSync "$1" "$3" "$_is_meth"
804 ## Usage: initWait <vserver> <context> <vwait-tmpdir-varname>
807 if $_VSERVER_INFO - FEATURE vwait; then
809 _is_tmpdir=$($_MKTEMPDIR /tmp/vwaitstat.XXXXXX)
812 $_VWAIT --timeout "$VSHELPER_SYNC_TIMEOUT" \
814 >>$_is_tmpdir/out 2>$_is_tmpdir/err 3>$_is_tmpdir/fifo
817 if test "$rc" -ne 0 -a "$rc" -ne 1; then
818 $_VPS axf | $_EGREP -e "^[^ \t]+[ \t]+$S_CONTEXT[ \t]+" >&4
819 killContext "$S_CONTEXT" 9
823 ) 4>$_is_tmpdir/procs &
825 echo "$!" >$_is_tmpdir/pid
826 eval "$3"=$_is_tmpdir
831 ## Usage: _waitForVWait <vserver> <fifo> <pid> <procs>
832 function _waitForVWait
837 declare -r procs=$(cat $4)
839 getFileArray status "$2"
844 'vwait' exited with error '$2' which indicates that vserver could not
849 A timeout occured while waiting for the vserver to finish and it was
850 killed by sending a SIGKILL signal. Please investigate the reasons
851 and/or increase the timeout in apps/vshelper/sync-timeout."
854 (TIMEOUT) warning $"\
855 A timeout occured while waiting for the vserver to finish and it will
856 be killed by sending a SIGKILL signal. The following process list
857 might be useful for finding out the reason of this behavior:
859 ----------------------------------------------------------------------
861 }----------------------------------------------------------------------"
864 (\?\?\?|*) warning $"\
865 internal error: 'vwait' exited with an unexpected status '$1'; I will
866 try to continue but be prepared for unexpected events."
873 ## Usage: waitForSync <vserver> [<vshelper-fifo>] [<vwait-statdir>]
878 local vwait_statdir=$3
881 if test -d "$vwait_statdir"; then
882 _waitForVWait "$cfgdir" "$vwait_statdir/fifo" "$( <$vwait_statdir/pid )" "$vwait_statdir/procs"
883 elif test -n "$_NEED_VSHELPER_SYNC"; then
884 $_VSHELPER_SYNC "$fifo" "$VSHELPER_SYNC_TIMEOUT" || \
886 A timeout or other error occured while waiting for the synchronization
887 signal from vserver '$VSERVER_NAME'.
888 The vserver will be killed nevertheless..."
889 elif test "${#INITCMD_STOP_SYNC[@]}" -ne 0; then
890 "${INITCMD_STOP_SYNC[@]}" || \
892 Stop-synchronization for vserver '$VSERVER_NAME' failed. The vserver
893 will be killed nevertheless..."
896 test -z "$OPTION_FORCE_SYNC" -a ! -e "$cfgdir"/sync ||
902 local vdir name flavor start i already_handled base
906 ## Usage: execScriptlets <vserver-cfgdir> <vserver-name> <script-flavor>
907 function execScriptlets
914 for base in "$vdir"/scripts "$__CONFDIR"/.defaults/scripts; do
915 local DONT_SKIP_DEFAULTS=
916 local already_handled=
918 for i in "$base/$flavor" "$base/$flavor.d"/*; do
919 isRegularFile "$i" || continue
920 test -r "$i" || continue
924 test -x "$i" || start=_sourceWrap
925 $start "$i" "$flavor" "$name"
928 test -z "$already_handled" -o -n "$DONT_SKIP_DEFAULTS" || break
937 ! test -e "$cfgdir"/fstab.local ||
939 WARNING: 'fstab' will *not* be executed in the network context of the
940 vserver anymore. Therefore, 'fstab.local' has the same functionality
941 and is obsoleted. When you need the old behaviour, put the mounts
944 ! test -e "$cfgdir"/hostname -a ! -L "$cfgdir"/hostname ||
946 WARNING: The hostname is now configured in 'uts/nodename' but not in
949 ! test -e "$cfgdir"/domainname -a ! -L "$cfgdir"/domainname ||
951 WARNING: The domainname is now configured in 'uts/domainname' but not
952 in 'domainname'." >&2
956 for i in "$cfgdir"/interfaces/*/only_ip; do
957 if test -e "$i"; then
959 iface=${i##$cfgdir/interfaces/}
960 iface=${iface%%/only_ip}
962 WARNING: The 'only_ip' flag for interface '$iface' is deprecated; use
967 find "$cfgdir" -type f -exec "$_CHECK_UNIXFILE" '{}' ';'
969 vshelper.doSanityCheck
971 $_VSERVER_INFO - VERIFYCAP ||
972 panic $"capabilities are not enabled in kernel-setup"
974 $_VSERVER_INFO - VERIFYPROC ||
976 /proc/uptime can not be accessed. Usually, this is caused by
977 procfs-security. Please read the FAQ for more details
978 http://www.linux-vserver.org/index.php?page=Linux-Vserver+FAQ"