5a13a3dc62338b1d4ac0176a397edc6d19394cc7
[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     if test -n "$CGROUP_MNT_PER_SS"; then
71         for ss in "${CGROUP_SUBSYS[@]}"; do
72             $_MKDIR -p "$CGROUP_MNT/$ss"
73             $_MOUNT -t cgroup -o "$ss" vserver "$CGROUP_MNT/$ss"
74         done
75     else
76         oIFS="$IFS"
77         IFS=,
78         ss="${CGROUP_SUBSYS[*]}"
79         IFS="$oIFS"
80         $_MOUNT -t cgroup -o "$ss" vserver "$CGROUP_MNT"
81     fi
82 }
83
84 function umount_cgroup()
85 {
86     _generateCgroupOptions
87     test -n "$CGROUP_MNT" || return 0
88     $_UMOUNT "$CGROUP_MNT"
89 }
90
91 function start()
92 {
93     _beginResult $"Creating required directories"
94     create_dirs
95     _endResult $?
96     _beginResult $"Setting path to vshelper"
97     set_helper
98     _endResult $?
99     local retval=$?
100     _beginResult $"Loading default device map"
101     handleDeviceMap --set 0 "$__CONFDIR/.defaults/apps/vdevmap"
102     _endResult $?
103     if hasCgroup; then
104         _beginResult $"Mounting cgroup-hierarchy"
105         mount_cgroup
106         _endResult $?
107     fi
108     test "$retval" -ne 0 || touch "$lockfile"
109     return $retval
110 }
111
112 function stop()
113 {
114     # Stop all running, but non-default guests"
115     _beginResult $"Stopping all running guests"
116     $_START_VSERVERS -j 1 --all --stop
117     _endResult $?
118     _beginResult $"Killing all running contexts"
119     kill_contexts
120     _endResult $?
121     local retval=$?
122     if hasCgroup; then
123         _beginResult $"Unmounting cgroup-hierarchy"
124         umount_cgroup
125         _endResult $?
126     fi
127     $_RM -f "$lockfile"
128     return $retval
129 }
130
131 function restart()
132 {
133     stop
134     start
135 }
136
137 case "$1" in
138     start|stop|restart) $1;;
139     reload)             ;;
140     condrestart)
141         test -f $lockfile && restart || :
142         ;;
143     status)
144         test -f $lockfile && {
145             echo $"Path to vshelper has been set"
146             exit 0
147         }
148         echo $"Path to vshelper has not been set"
149         exit 1
150         ;;
151     *)
152         echo "Usage: $0 {start|stop|reload|restart|condrestart|status}"
153         exit 2
154         ;;
155 esac