forked from phbaer/lxc-tools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
init
executable file
·148 lines (135 loc) · 3.45 KB
/
init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#! /bin/sh
### BEGIN INIT INFO
# Provides: lxc
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts/stops linux containers
# Description: Provides linux container management: start, stop or
# restart containers.
### END INIT INFO
# Author: Nigel McNie <[email protected]>
#set -x
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="linux containers"
NAME=lxc
SCRIPTNAME=/etc/init.d/$NAME
LXC_HALT_ARGS=
# Exit if the package is not installed
[ -x /usr/bin/lxc-start ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/lxc ] && . /etc/default/lxc
. /lib/init/vars.sh
. /lib/lsb/init-functions
# Get all container names in order.
# (Seeing /var/lib/lxc/$C/priority)
get_containers() {
for i in $(ls -1 /var/lib/lxc); do
n="$(cat /var/lib/lxc/$i/priority 2>/dev/null)"
(echo "$n" | grep '^[0-9]\+$' >/dev/null) || n=10
echo "$n/$i"
done | sort -n | sed 's:^[0-9]\+/::'
}
do_start()
{
for C in $(get_containers); do
if [ -r /var/lib/lxc/$C/autostart ]; then
if [ "$(cat /var/lib/lxc/$C/autostart)" = "1" ]; then
log_progress_msg "$C"
if lxc-info -n $C | grep STOPPED > /dev/null 2>&1; then
if [ -x /usr/bin/screen ]; then
/usr/bin/screen -dmS init-${C} /usr/bin/lxc-start -n $C
else
lxc-start -n $C -d
fi
lxc-wait -n $C -s RUNNING
if [ $? -gt 0 ]; then
return 2
fi
fi
fi
fi
done
}
do_stop()
{
halt=$(which lxc-halt)
for C in $(get_containers | /usr/bin/tac); do
log_progress_msg "$C"
if lxc-info -n $C | grep RUNNING > /dev/null 2>&1; then
if [ -n "$halt" ]; then
$halt -n $C $LXC_HALT_ARGS &
else
/usr/bin/lxc-stop -n $C
if [ $? -gt 0 ]; then
return 2
fi
fi
fi
done
if [ -n "$halt" ]; then
# Wait for all containers to be shutdown
wait
# Check all containers are halted
for C in $(get_containers); do
lxc-info -n $C
done | grep -vE "RUNNING|STOPPING" >/dev/null
if [ $? -eq 0 ]; then
return 0
else
return 2
fi
fi
}
# Check if cgroup is already mounted to avoid that lxc-wait hangs up at 'do_start'.
if ! grep -w 'cgroup' /etc/mtab > /dev/null; then
echo 'error: you must first mount cgroup filesystem' >&2
exit 1
fi
case "$1" in
start)
log_daemon_msg "Starting $DESC" #"$NAME"
do_start
case "$?" in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
stop)
log_daemon_msg "Stopping $DESC" #"$NAME"
do_stop
case "$?" in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" #"$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
status)
for C in $(get_containers); do
lxc-info -n $C
done
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac
: