Ensure it's a valid cgroup mount point.
[util-vserver.git] / sysv / util-vserver
1 #!/bin/bash
2 #
3 # util-vserver  sets the path to vshelper and kills all guest processes
4 #
5 # chkconfig: 2345 10 90
6 # description: Sets the path to vshelper and kills all guest processes
7
8 ### BEGIN INIT INFO
9 # Provides:          util-vserver
10 # Required-Start:    $remote_fs $syslog $time
11 # Required-Stop:     $remote_fs $syslog $time
12 # Default-Start:     2 3 4 5
13 # Default-Stop:      0 1 6
14 # Short-Description: Sets the path to vshelper and kills all guest processes
15 # Description:       Sets the path to vshelper and kills all guest processes
16 ### END INIT INFO
17
18 : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars}
19 test -e "$UTIL_VSERVER_VARS" || {
20     echo $"Can not find util-vserver installation (the file '$UTIL_VSERVER_VARS' would be expected); aborting..." >&2
21     exit 1
22 }
23 . "$UTIL_VSERVER_VARS"
24
25 LOCKFILE=util-vserver
26 . "$_LIB_VSERVER_INIT_FUNCTIONS"
27 . "$_LIB_FUNCTIONS"
28 . "$__PKGLIBDIR/vserver.functions"
29
30
31 function set_helper()
32 {
33     local f="/proc/sys/kernel/vshelper"
34     if test -e "$f"; then
35         echo "$_VSHELPER" > "$f"
36         return 0
37     else
38         return 2
39     fi
40 }
41
42 function kill_contexts()
43 {
44     local xid
45     for xid in `ls -1 /proc/virtual 2>/dev/null`; do
46         [ "$xid" = "info" -o "$xid" = "status" ] && continue
47         $_VATTRIBUTE --xid $xid --set --flag ~persistent
48         $_VKILL --xid $xid -s 15
49         sleep 3
50         $_VKILL --xid $xid -s 9
51     done
52     local alive=0
53     for xid in `ls -1 /proc/virtual 2>/dev/null`; do
54         [ "$xid" = "info" -o "$xid" = "status" ] && continue
55         let alive+=1
56     done
57     test $alive = 0
58 }
59
60 function create_dirs()
61 {
62     $_MKDIR -p "$__RUNDIR" && $_MKDIR -p "$__VSHELPERSTATEDIR" && $_MKDIR -p `$_READLINK "$__PKGSTATEREVDIR"`
63 }
64
65 function mount_cgroup()
66 {
67     _generateCgroupOptions
68     test -n "$CGROUP_MNT" || return 0
69     $_MKDIR -p "$CGROUP_MNT"
70     $_MOUNT -t cgroup -o "$CGROUP_SUBSYS" vserver "$CGROUP_MNT"
71 }
72
73 function umount_cgroup()
74 {
75     _generateCgroupOptions
76     test -n "$CGROUP_MNT" || return 0
77     $_UMOUNT "$CGROUP_MNT"
78 }
79
80 function start()
81 {
82     _beginResult $"Creating required directories"
83     create_dirs
84     _endResult $?
85     _beginResult $"Setting path to vshelper"
86     set_helper
87     _endResult $?
88     local retval=$?
89     _beginResult $"Loading default device map"
90     handleDeviceMap --set 0 "$__CONFDIR/.defaults/apps/vdevmap"
91     _endResult $?
92     if hasCgroup; then
93         _beginResult $"Mounting cgroup-hierarchy"
94         mount_cgroup
95         _endResult $?
96     fi
97     test "$retval" -ne 0 || touch "$lockfile"
98     return $retval
99 }
100
101 function stop()
102 {
103     # Stop all running, but non-default guests"
104     _beginResult $"Stopping all running guests"
105     $_START_VSERVERS -j 1 --all --stop
106     _endResult $?
107     _beginResult $"Killing all running contexts"
108     kill_contexts
109     _endResult $?
110     local retval=$?
111     if hasCgroup; then
112         _beginResult $"Unmounting cgroup-hierarchy"
113         umount_cgroup
114         _endResult $?
115     fi
116     $_RM -f "$lockfile"
117     return $retval
118 }
119
120 function restart()
121 {
122     stop
123     start
124 }
125
126 case "$1" in
127     start|stop|restart) $1;;
128     reload)             ;;
129     condrestart)
130         test -f $lockfile && restart || :
131         ;;
132     status)
133         test -f $lockfile && {
134             echo $"Path to vshelper has been set"
135             exit 0
136         }
137         echo $"Path to vshelper has not been set"
138         exit 1
139         ;;
140     *)
141         echo "Usage: $0 {start|stop|reload|restart|condrestart|status}"
142         exit 2
143         ;;
144 esac