umount them all
[util-vserver.git] / sysv / util-vserver
index 8e54016..8cc173f 100755 (executable)
@@ -4,6 +4,16 @@
 #
 # chkconfig: 2345 10 90
 # description: Sets the path to vshelper and kills all guest processes
+# 
+### BEGIN INIT INFO
+# Provides:          util-vserver
+# Required-Start:    $remote_fs $syslog $time
+# Required-Stop:     $remote_fs $syslog $time
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Sets the path to vshelper and kills all guest processes
+# Description:       Sets the path to vshelper and kills all guest processes
+### END INIT INFO
 
 : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars}
 test -e "$UTIL_VSERVER_VARS" || {
@@ -14,6 +24,8 @@ test -e "$UTIL_VSERVER_VARS" || {
 
 LOCKFILE=util-vserver
 . "$_LIB_VSERVER_INIT_FUNCTIONS"
+. "$_LIB_FUNCTIONS"
+. "$__PKGLIBDIR/vserver.functions"
 
 
 function set_helper()
@@ -29,21 +41,76 @@ function set_helper()
 
 function kill_contexts()
 {
-    for xid in `ls -1 /proc/virtual`; do
-       test "$xid" = "info" -o "$xid" = "status" && continue
+    local xid
+    for xid in `ls -1 /proc/virtual 2>/dev/null`; do
+       [ "$xid" = "info" -o "$xid" = "status" ] && continue
        $_VATTRIBUTE --xid $xid --set --flag ~persistent
        $_VKILL --xid $xid -s 15
        sleep 3
        $_VKILL --xid $xid -s 9
     done
+    local alive=0
+    for xid in `ls -1 /proc/virtual 2>/dev/null`; do
+       [ "$xid" = "info" -o "$xid" = "status" ] && continue
+       let alive+=1
+    done
+    test $alive = 0
+}
+
+function create_dirs()
+{
+    $_MKDIR -p "$__RUNDIR" && $_MKDIR -p "$__VSHELPERSTATEDIR" && $_MKDIR -p `$_READLINK "$__PKGSTATEREVDIR"`
+}
+
+function mount_cgroup()
+{
+    _generateCgroupOptions
+    test -n "$CGROUP_MNT" || return 0
+    $_MKDIR -p "$CGROUP_MNT"
+    if test -n "$CGROUP_MNT_PER_SS"; then
+       for ss in "${CGROUP_SUBSYS[@]}"; do
+           $_MKDIR -p "$CGROUP_MNT/$ss"
+           $_MOUNT -t cgroup -o "$ss" vserver "$CGROUP_MNT/$ss"
+       done
+    else
+       oIFS="$IFS"
+       IFS=,
+       ss="${CGROUP_SUBSYS[*]}"
+       IFS="$oIFS"
+       $_MOUNT -t cgroup -o "$ss" vserver "$CGROUP_MNT"
+    fi
+}
+
+function umount_cgroup()
+{
+    _generateCgroupOptions
+    test -n "$CGROUP_MNT" || return 0
+    if test -n "$CGROUP_MNT_PER_SS"; then
+       for ss in "${CGROUP_SUBSYS[@]}"; do
+           $_UMOUNT "$CGROUP_MNT/$ss"
+       done
+    else
+       $_UMOUNT "$CGROUP_MNT"
+    fi
 }
 
 function start()
 {
+    _beginResult $"Creating required directories"
+    create_dirs
+    _endResult $?
     _beginResult $"Setting path to vshelper"
     set_helper
     _endResult $?
     local retval=$?
+    _beginResult $"Loading default device map"
+    handleDeviceMap --set 0 "$__CONFDIR/.defaults/apps/vdevmap"
+    _endResult $?
+    if hasCgroup; then
+       _beginResult $"Mounting cgroup-hierarchy"
+       mount_cgroup
+       _endResult $?
+    fi
     test "$retval" -ne 0 || touch "$lockfile"
     return $retval
 }
@@ -54,11 +121,17 @@ function stop()
     _beginResult $"Stopping all running guests"
     $_START_VSERVERS -j 1 --all --stop
     _endResult $?
-    local retval=$?
     _beginResult $"Killing all running contexts"
     kill_contexts
     _endResult $?
+    local retval=$?
+    if hasCgroup; then
+       _beginResult $"Unmounting cgroup-hierarchy"
+       umount_cgroup
+       _endResult $?
+    fi
     $_RM -f "$lockfile"
+    return $retval
 }
 
 function restart()
@@ -75,10 +148,10 @@ case "$1" in
        ;;
     status)
        test -f $lockfile && {
-           echo $"/proc entries were fixed"
+           echo $"Path to vshelper has been set"
            exit 0
        }
-       echo $"/proc entries are not fixed"
+       echo $"Path to vshelper has not been set"
        exit 1
        ;;
     *)