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