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