Merge "citrix" branch into "master".
[sliver-openvswitch.git] / xenserver / etc_init.d_vswitch
1 #!/bin/bash
2 #
3 # vswitch
4 #
5 # chkconfig: 2345 09 91
6 # description: Manage vswitch kernel modules and user-space daemon
7
8 # Copyright (C) 2009, 2010 Nicira Networks, Inc.
9 #
10 # Licensed under the Apache License, Version 2.0 (the "License");
11 # you may not use this file except in compliance with the License.
12 # You may obtain a copy of the License at:
13 #
14 #     http://www.apache.org/licenses/LICENSE-2.0
15 #
16 # Unless required by applicable law or agreed to in writing, software
17 # distributed under the License is distributed on an "AS IS" BASIS,
18 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 # See the License for the specific language governing permissions and
20 # limitations under the License.
21
22 . /etc/init.d/functions
23
24 test -e /etc/sysconfig/vswitch && . /etc/sysconfig/vswitch
25
26 # General config variables in /etc/sysconfig/vswitch
27 : ${ENABLE_BRCOMPAT:=y}
28 : ${ENABLE_FAKE_PROC_NET:=y}
29 : ${ENABLE_MONITOR:=y}
30 : ${FORCE_COREFILES:=y}
31
32 # Config variables specific to ovsdb-server
33 : ${OVSDB_SERVER_REMOTES:=punix:/var/run/ovsdb-server db:Open_vSwitch,managers}
34 : ${OVSDB_SERVER_DB:=/etc/ovs-vswitchd.conf.db}
35 : ${OVSDB_SERVER_PIDFILE:=/var/run/ovsdb-server.pid}
36 : ${OVSDB_SERVER_RUN_DIR:=/var/xen/vswitch}
37 : ${OVSDB_SERVER_PRIORITY:=-10}
38 : ${OVSDB_SERVER_LOGFILE:=/var/log/ovsdb-server.log}
39 : ${OVSDB_SERVER_FILE_LOGLEVEL:=INFO}
40 : ${OVSDB_SERVER_SYSLOG_LOGLEVEL:=ERR}
41 : ${OVSDB_SERVER_MEMLEAK_LOGFILE:=}
42 : ${OVSDB_SERVER_STRACE_LOG:=}
43 : ${OVSDB_SERVER_STRACE_OPT:=}
44 : ${OVSDB_SERVER_VALGRIND_LOG:=}
45 : ${OVSDB_SERVER_VALGRIND_OPT:=}
46
47 # Config variables specific to ovs-vswitchd
48 : ${VSWITCHD_OVSDB_SERVER:=unix:/var/run/ovsdb-server}
49 : ${VSWITCHD_OVSDB_SCHEMA:=/usr/share/vswitch/vswitch.ovsschema}
50 : ${VSWITCHD_PIDFILE:=/var/run/ovs-vswitchd.pid}
51 : ${VSWITCHD_RUN_DIR:=/var/xen/vswitch}
52 : ${VSWITCHD_PRIORITY:=-10}
53 : ${VSWITCHD_MLOCKALL:=yes}
54 : ${VSWITCHD_LOGFILE:=/var/log/ovs-vswitchd.log}
55 : ${VSWITCHD_FILE_LOGLEVEL:=INFO}
56 : ${VSWITCHD_SYSLOG_LOGLEVEL:=ERR}
57 : ${VSWITCHD_MEMLEAK_LOGFILE:=}
58 : ${VSWITCHD_STRACE_LOG:=}
59 : ${VSWITCHD_STRACE_OPT:=}
60 : ${VSWITCHD_VALGRIND_LOG:=}
61 : ${VSWITCHD_VALGRIND_OPT:=}
62
63 # Config variables specific to ovs-brcompatd
64 : ${BRCOMPATD_PIDFILE:=/var/run/ovs-brcompatd.pid}
65 : ${BRCOMPATD_RUN_DIR:=/var/xen/vswitch}
66 : ${BRCOMPATD_PRIORITY:=-10}
67 : ${BRCOMPATD_LOGFILE:=/var/log/ovs-brcompatd.log}
68 : ${BRCOMPATD_FILE_LOGLEVEL:=INFO}
69 : ${BRCOMPATD_SYSLOG_LOGLEVEL:=ERR}
70 : ${BRCOMPATD_MEMLEAK_LOGFILE:=}
71 : ${BRCOMPATD_STRACE_LOG:=}
72 : ${BRCOMPATD_STRACE_OPT:=}
73 : ${BRCOMPATD_VALGRIND_LOG:=}
74 : ${BRCOMPATD_VALGRIND_OPT:=}
75
76 # Full paths to executables & modules
77 ovsdb_server="/usr/sbin/ovsdb-server"
78 ovsdb_tool="/usr/bin/ovsdb-tool"
79 vswitchd="/usr/sbin/ovs-vswitchd"
80 brcompatd="/usr/sbin/ovs-brcompatd"
81 dpctl="/usr/bin/ovs-dpctl"
82 appctl="/usr/bin/ovs-appctl"
83 ofctl="/usr/bin/ovs-ofctl"
84 vsctl="/usr/bin/ovs-vsctl"
85
86 if [ "$ENABLE_FAKE_PROC_NET" = "y" ]; then
87     if [ "$ENABLE_BRCOMPAT" != "y" ]; then
88         warning "FAKE_PROC_NET required BRCOMPAT which was disabled.  Force enabling."
89         ENABLE_BRCOMPAT="y"
90     fi
91 fi
92
93 if test "$ENABLE_MONITOR" = "y"; then
94     monitor_opt="--monitor"
95 else
96     monitor_opt=
97 fi
98
99 function dp_list {
100     "$dpctl" show | grep '^dp[0-9]\+:' | cut -d':' -f 1
101 }
102
103 function turn_on_corefiles {
104     ulimit -Sc 67108864
105 }
106
107 function remove_all_dp {
108     for dp in $(dp_list); do
109         action "Removing datapath: $dp" "$dpctl" del-dp "$dp"
110     done
111 }
112
113 function insert_modules_if_required {
114     if ! lsmod | grep -q "openvswitch_mod"; then
115         action "Inserting llc module" modprobe llc
116         action "Inserting openvswitch module" modprobe openvswitch_mod
117     fi
118     if [ -n "$BRCOMPATD_PIDFILE" ] && ! lsmod | grep -q "brcompat_mod"; then
119         action "Inserting brcompat module" modprobe brcompat_mod
120     fi
121     if [ -f "/lib/modules/`uname -r`/kernel/net/vswitch/ip_gre_mod.ko" ] && ! lsmod | grep -q "ip_gre_mod"; then
122         action "Inserting ip_gre module" modprobe ip_gre_mod
123     fi
124 }
125
126 function remove_modules {
127     if lsmod | grep -q "brcompat_mod"; then
128         action "Removing brcompat module" rmmod brcompat_mod.ko
129     fi
130     if lsmod | grep -q "openvswitch_mod"; then
131         action "Removing openvswitch module" rmmod openvswitch_mod.ko
132     fi
133     if lsmod | grep -q "ip_gre_mod"; then
134         action "Removing ip_gre module" rmmod ip_gre_mod.ko
135     fi
136 }
137
138 function start_ovsdb_server {
139     local syslog_opt="-vANY:SYSLOG:${OVSDB_SERVER_SYSLOG_LOGLEVEL}"
140     local logfile_file_opt=""
141     local logfile_level_opt=""
142     if [ ! -d "$OVSDB_SERVER_RUN_DIR" ]; then
143         mkdir -p "$OVSDB_SERVER_RUN_DIR"
144     fi
145     cd "$OVSDB_SERVER_RUN_DIR"
146     local remotes=
147     for remote in $OVSDB_SERVER_REMOTES; do
148         remotes="$remotes --remote=$remote"
149     done
150     if [ -n "$OVSDB_SERVER_FILE_LOGLEVEL" ]; then
151         logfile_level_opt="-vANY:FILE:${OVSDB_SERVER_FILE_LOGLEVEL}"
152         logfile_file_opt="--log-file=$OVSDB_SERVER_LOGFILE"
153     fi
154     local leak_opt=""
155     if [ -n "$OVSDB_SERVER_MEMLEAK_LOGFILE" ]; then
156         leak_opt="--check-leaks=$OVSDB_SERVER_MEMLEAK_LOGFILE"
157         if [ -e "$OVSDB_SERVER_MEMLEAK_LOGFILE" ]; then
158             mv "$OVSDB_SERVER_MEMLEAK_LOGFILE" "$OVSDB_SERVER_MEMLEAK_LOGFILE.prev"
159         fi
160     fi
161     local strace_opt=""
162     local daemonize="y"
163     if [ -n "$OVSDB_SERVER_STRACE_LOG" ] && [ -n "$OVSDB_SERVER_VALGRIND_LOG" ]; then
164         printf "Can not start with both VALGRIND and STRACE\n"
165         exit 1
166     fi
167     if [ -n "$OVSDB_SERVER_STRACE_LOG" ]; then
168         strace_opt="strace -o $OVSDB_SERVER_STRACE_LOG $OVSDB_SERVER_STRACE_OPT"
169         daemonize="n"
170     fi
171     if [ -n "$OVSDB_SERVER_VALGRIND_LOG" ]; then
172         valgrind_opt="valgrind --log-file=$OVSDB_SERVER_VALGRIND_LOG $OVSDB_SERVER_VALGRIND_OPT"
173         daemonize="n"
174     fi
175     ssl_opts="--private-key=db:SSL,private_key --certificate=db:SSL,certificate --bootstrap-ca-cert=db:SSL,ca_cert"
176     if [ "$daemonize" != "y" ]; then
177         # Start in background and force a "success" message
178         action "Starting ovsdb_server ($strace_opt$valgrind_opt)" true
179         (nice -n "$OVSDB_SERVER_PRIORITY" $strace_opt $valgrind_opt "$ovsdb_server" "$OVSDB_SERVER_DB" --pidfile="$OVSDB_SERVER_PIDFILE" --detach $monitor_opt --no-chdir -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt $remotes $ssl_opts) &
180     else
181         action "Starting ovsdb-server" nice -n "$OVSDB_SERVER_PRIORITY" "$ovsdb_server" "$OVSDB_SERVER_DB" --pidfile="$OVSDB_SERVER_PIDFILE" --detach $monitor_opt --no-chdir -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt $remotes $ssl_opts
182     fi
183 }
184
185 function start_vswitchd {
186     local syslog_opt="-vANY:SYSLOG:${VSWITCHD_SYSLOG_LOGLEVEL}"
187     local logfile_file_opt=""
188     local logfile_level_opt=""
189     if [ ! -d "$VSWITCHD_RUN_DIR" ]; then
190         mkdir -p "$VSWITCHD_RUN_DIR"
191     fi
192     cd "$VSWITCHD_RUN_DIR"
193     if [ -n "$VSWITCHD_FILE_LOGLEVEL" ]; then
194         logfile_level_opt="-vANY:FILE:${VSWITCHD_FILE_LOGLEVEL}"
195         logfile_file_opt="--log-file=$VSWITCHD_LOGFILE"
196     fi
197     local leak_opt=""
198     if [ -n "$VSWITCHD_MEMLEAK_LOGFILE" ]; then
199         leak_opt="--check-leaks=$VSWITCHD_MEMLEAK_LOGFILE"
200         if [ -e "$VSWITCHD_MEMLEAK_LOGFILE" ]; then
201             mv "$VSWITCHD_MEMLEAK_LOGFILE" "$VSWITCHD_MEMLEAK_LOGFILE.prev"
202         fi
203     fi
204     local strace_opt=""
205     local daemonize="y"
206     if [ -n "$VSWITCHD_STRACE_LOG" ] && [ -n "$VSWITCHD_VALGRIND_LOG" ]; then
207         printf "Can not start with both VALGRIND and STRACE\n"
208         exit 1
209     fi
210     if [ -n "$VSWITCHD_STRACE_LOG" ]; then
211         strace_opt="strace -o $VSWITCHD_STRACE_LOG $VSWITCHD_STRACE_OPT"
212         daemonize="n"
213     fi
214     if [ -n "$VSWITCHD_VALGRIND_LOG" ]; then
215         valgrind_opt="valgrind --log-file=$VSWITCHD_VALGRIND_LOG $VSWITCHD_VALGRIND_OPT"
216         daemonize="n"
217     fi
218     local fake_proc_net_opt=""
219     if [ "$ENABLE_FAKE_PROC_NET" = "y" ]; then
220         fake_proc_net_opt="--fake-proc-net"
221     fi
222     if [ "$VSWITCHD_MLOCKALL" != "no" ]; then
223         mlockall_opt="--mlockall"
224     fi
225     if [ "$daemonize" != "y" ]; then
226         # Start in background and force a "success" message
227         action "Starting ovs-vswitchd ($strace_opt$valgrind_opt)" true
228         (nice -n "$VSWITCHD_PRIORITY" $strace_opt $valgrind_opt "$vswitchd" --pidfile="$VSWITCHD_PIDFILE" --detach $monitor_opt --no-chdir $fake_proc_net_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt $mlockall_opt "$VSWITCHD_OVSDB_SERVER") &
229     else
230         action "Starting ovs-vswitchd" nice -n "$VSWITCHD_PRIORITY" "$vswitchd" --pidfile="$VSWITCHD_PIDFILE" --detach $monitor_opt --no-chdir $fake_proc_net_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt $mlockall_opt "$VSWITCHD_OVSDB_SERVER"
231     fi
232 }
233
234 function start_brcompatd {
235     local syslog_opt="-vANY:SYSLOG:${BRCOMPATD_SYSLOG_LOGLEVEL}"
236     local logfile_file_opt=""
237     local logfile_level_opt=""
238     if [ -d "$BRCOMPATD_RUN_DIR" ]; then
239         mkdir -p "$BRCOMPATD_RUN_DIR"
240     fi
241     cd "$BRCOMPATD_RUN_DIR"
242     if [ -n "$BRCOMPATD_FILE_LOGLEVEL" ]; then
243         logfile_level_opt="-vANY:FILE:${BRCOMPATD_FILE_LOGLEVEL}"
244         logfile_file_opt="--log-file=$BRCOMPATD_LOGFILE"
245     fi
246     local leak_opt=""
247     if [ -n "$BRCOMPATD_MEMLEAK_LOGFILE" ]; then
248         leak_opt="--check-leaks=$BRCOMPATD_MEMLEAK_LOGFILE"
249         if [ -e "$BRCOMPATD_MEMLEAK_LOGFILE" ]; then
250             mv "$BRCOMPATD_MEMLEAK_LOGFILE" "$BRCOMPATD_MEMLEAK_LOGFILE.prev"
251         fi
252     fi
253     local strace_opt=""
254     local daemonize="y"
255     if [ -n "$BRCOMPATD_STRACE_LOG" ] && [ -n "$BRCOMPATD_VALGRIND_LOG" ]; then
256         printf "Can not start with both VALGRIND and STRACE\n"
257         exit 1
258     fi
259     if [ -n "$BRCOMPATD_STRACE_LOG" ]; then
260         strace_opt="strace -o $BRCOMPATD_STRACE_LOG $BRCOMPATD_STRACE_OPT"
261         daemonize="n"
262     fi
263     if [ -n "$VALGRIND_LOG" ]; then
264         valgrind_opt="valgrind --log-file=$BRCOMPATD_VALGRIND_LOG $BRCOMPATD_VALGRIND_OPT"
265         daemonize="n"
266     fi
267     appctl_cmd="$appctl --target=/var/run/ovs-vswitchd.\`cat $VSWITCHD_PIDFILE\`.ctl %s"
268     if [ "$daemonize" != "y" ]; then
269         # Start in background and force a "success" message
270         action "Starting ovs-brcompatd ($strace_opt$valgrind_opt)" true
271         (nice -n "$VSWITCHD_PRIORITY" $strace_opt $valgrind_opt "$brcompatd"--no-chdir --appctl-command="$appctl_cmd" --pidfile=$BRCOMPATD_PIDFILE -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt "$VSWITCHD_OVSDB_SERVER") &
272     else
273         action "Starting ovs-brcompatd" nice -n "$BRCOMPATD_PRIORITY" $strace_opt $valgrind_opt "$brcompatd" --no-chdir --appctl-command="$appctl_cmd" --pidfile=$BRCOMPATD_PIDFILE --detach $monitor_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt "$VSWITCHD_OVSDB_SERVER"
274     fi
275 }
276
277 function stop_ovsdb_server {
278     if [ -f "$OVSDB_SERVER_PIDFILE" ]; then
279         local pid=$(cat "$OVSDB_SERVER_PIDFILE")
280         action "Killing ovsdb-server ($pid)" kill -TERM $pid
281         rm -f "$OVSDB_SERVER_PIDFILE"
282     fi
283 }
284
285 function stop_vswitchd {
286     if [ -f "$VSWITCHD_PIDFILE" ]; then
287         local pid=$(cat "$VSWITCHD_PIDFILE")
288         action "Killing ovs-vswitchd ($pid)" kill -TERM $pid
289         rm -f "$VSWITCHD_PIDFILE"
290     fi
291 }
292
293 function stop_brcompatd {
294     if [ -f "$BRCOMPATD_PIDFILE" ]; then
295         local pid=$(cat "$BRCOMPATD_PIDFILE")
296         action "Killing ovs-brcompatd ($pid)" kill -TERM $pid
297         rm -f "$BRCOMPATD_PIDFILE"
298     fi
299 }
300
301 function restart_approval {
302     if test ! -t 0; then
303         # Don't prompt if invoked non-interactively.
304         return 0
305     fi
306     cat <<EOF
307
308 WARNING!!!
309
310 Restarting vswitch on a live server is not guaranteed to work.  It is
311 provided as a convenience for those situations in which it does work.
312
313 EOF
314     read -s -r -n 1 -p "Countinue with restart (y/N): " response
315     printf "\n"
316     case "$response" in
317         y|Y)
318             return 0
319             ;;
320         *)
321             return 1
322             ;;
323     esac
324 }
325
326 function set_system_uuid {
327     system_uuid=$(. /etc/xensource-inventory && echo $INSTALLATION_UUID)
328     if test -n "$system_uuid"; then
329         action "Configuring Open vSwitch system UUID" true
330         $vsctl --no-wait set Open_vSwitch . external-ids:system-uuid="$system_uuid"
331     else
332         action "Configuring Open vSwitch system UUID" false
333     fi
334 }
335
336 function start {
337     if [ "$FORCE_COREFILES" = "y" ]; then
338         turn_on_corefiles
339     fi
340
341     insert_modules_if_required
342
343     # Increase the limit on the number of open file descriptors since
344     # ovs-vswitchd needs a few per bridge
345     ulimit -n 4096
346
347     # Allow GRE traffic.
348     iptables -I INPUT -p gre -j ACCEPT
349
350     if [ ! -e "$OVSDB_SERVER_DB" ]; then
351         warning "$OVSDB_SERVER_DB does not exist"
352
353         action "Creating empty database $OVSDB_SERVER_DB" true
354         $ovsdb_tool -vANY:console:emer create "$OVSDB_SERVER_DB" "$VSWITCHD_OVSDB_SCHEMA"
355     else
356         # Upgrade or downgrade schema and compact database.
357         $ovsdb_tool -vANY:console:emer convert "$OVSDB_SERVER_DB" "$VSWITCHD_OVSDB_SCHEMA"
358     fi
359
360     start_ovsdb_server
361     $vsctl --no-wait init
362     if [ ! -e /var/run/vswitch.booted ]; then
363         touch /var/run/vswitch.booted
364         for bridge in $($vsctl list-br); do
365             $vsctl --no-wait del-br $bridge
366         done
367     fi
368
369     set_system_uuid
370
371     start_vswitchd
372     start_brcompatd
373     touch /var/lock/subsys/vswitch
374 }
375
376 function stop {
377     stop_brcompatd
378     stop_vswitchd
379     stop_ovsdb_server
380     rm -f /var/lock/subsys/vswitch
381 }
382
383 function restart {
384     if restart_approval; then
385         stop
386         start
387     fi
388 }
389
390 case "$1" in
391     start)
392         start
393         ;;
394     stop)
395         stop
396         ;;
397     restart)
398         restart
399         ;;
400     strace-vswitchd)
401         shift
402         strace -p $(cat "$VSWITCHD_PIDFILE") "$@"
403         ;;
404     strace-brcompatd)
405         shift
406         strace -p $(cat "$BRCOMPATD_PIDFILE") "$@"
407         ;;
408     status)
409         status -p "$OVSDB_SERVER_PIDFILE" ovsdb-server
410         status -p "$VSWITCHD_PIDFILE" ovs-vswitchd
411         status -p "$BRCOMPATD_PIDFILE" ovs-brcompatd
412         ;;
413     version)
414         /usr/sbin/ovsdb-server -V
415         /usr/sbin/ovs-vswitchd -V
416         /usr/sbin/ovs-brcompatd -V
417         ;;
418     help)
419         printf "vswitch [start|stop|restart|unload|status|version]\n"
420         ;;
421     *)
422         printf "Unknown command: $1\n"
423         exit 1
424         ;;
425 esac