socket-util: Move get_mtime() here from stream-ssl.
[openvswitch] / 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/extra/openvswitch/veth_mod.ko" ] && ! lsmod | grep -q "veth_mod"; then
130         action "Inserting veth module" modprobe veth_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 }
142
143 function start_ovsdb_server {
144     local syslog_opt="-vANY:SYSLOG:${OVSDB_SERVER_SYSLOG_LOGLEVEL}"
145     local logfile_file_opt=""
146     local logfile_level_opt=""
147     if [ ! -d "$OVSDB_SERVER_RUN_DIR" ]; then
148         install -d -m 755 -o root -g root "$OVSDB_SERVER_RUN_DIR"
149     fi
150     cd "$OVSDB_SERVER_RUN_DIR"
151     local remotes=
152     for remote in $OVSDB_SERVER_REMOTES; do
153         remotes="$remotes --remote=$remote"
154     done
155
156     install -d -m 755 -o root -g root `dirname $OVSDB_SERVER_LOGFILE`
157     if [ -n "$OVSDB_SERVER_FILE_LOGLEVEL" ]; then
158         logfile_level_opt="-vANY:FILE:${OVSDB_SERVER_FILE_LOGLEVEL}"
159         logfile_file_opt="--log-file=$OVSDB_SERVER_LOGFILE"
160     fi
161
162     local leak_opt=""
163     if [ -n "$OVSDB_SERVER_MEMLEAK_LOGFILE" ]; then
164         leak_opt="--check-leaks=$OVSDB_SERVER_MEMLEAK_LOGFILE"
165         if [ -e "$OVSDB_SERVER_MEMLEAK_LOGFILE" ]; then
166             mv "$OVSDB_SERVER_MEMLEAK_LOGFILE" "$OVSDB_SERVER_MEMLEAK_LOGFILE.prev"
167         fi
168     fi
169     local strace_opt=""
170     local daemonize="y"
171     if [ -n "$OVSDB_SERVER_STRACE_LOG" ] && [ -n "$OVSDB_SERVER_VALGRIND_LOG" ]; then
172         printf "Can not start with both VALGRIND and STRACE\n"
173         exit 1
174     fi
175     if [ -n "$OVSDB_SERVER_STRACE_LOG" ]; then
176         strace_opt="strace -o $OVSDB_SERVER_STRACE_LOG $OVSDB_SERVER_STRACE_OPT"
177         daemonize="n"
178     fi
179     if [ -n "$OVSDB_SERVER_VALGRIND_LOG" ]; then
180         valgrind_opt="valgrind --log-file=$OVSDB_SERVER_VALGRIND_LOG $OVSDB_SERVER_VALGRIND_OPT"
181         daemonize="n"
182     fi
183     ssl_opts="--private-key=db:SSL,private_key --certificate=db:SSL,certificate --bootstrap-ca-cert=db:SSL,ca_cert"
184     install -d -m 755 -o root -g root `dirname $OVSDB_SERVER_PIDFILE`
185     if [ "$daemonize" != "y" ]; then
186         # Start in background and force a "success" message
187         action "Starting ovsdb_server ($strace_opt$valgrind_opt)" true
188         (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) &
189     else
190         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
191     fi
192 }
193
194 function start_vswitchd {
195     local syslog_opt="-vANY:SYSLOG:${VSWITCHD_SYSLOG_LOGLEVEL}"
196     local logfile_file_opt=""
197     local logfile_level_opt=""
198     if [ ! -d "$VSWITCHD_RUN_DIR" ]; then
199         install -d -m 755 -o root -g root "$VSWITCHD_RUN_DIR"
200     fi
201     cd "$VSWITCHD_RUN_DIR"
202
203     install -d -m 755 -o root -g root `dirname $VSWITCHD_LOGFILE`
204     if [ -n "$VSWITCHD_FILE_LOGLEVEL" ]; then
205         logfile_level_opt="-vANY:FILE:${VSWITCHD_FILE_LOGLEVEL}"
206         logfile_file_opt="--log-file=$VSWITCHD_LOGFILE"
207     fi
208
209     local leak_opt=""
210     if [ -n "$VSWITCHD_MEMLEAK_LOGFILE" ]; then
211         leak_opt="--check-leaks=$VSWITCHD_MEMLEAK_LOGFILE"
212         if [ -e "$VSWITCHD_MEMLEAK_LOGFILE" ]; then
213             mv "$VSWITCHD_MEMLEAK_LOGFILE" "$VSWITCHD_MEMLEAK_LOGFILE.prev"
214         fi
215     fi
216     local strace_opt=""
217     local daemonize="y"
218     if [ -n "$VSWITCHD_STRACE_LOG" ] && [ -n "$VSWITCHD_VALGRIND_LOG" ]; then
219         printf "Can not start with both VALGRIND and STRACE\n"
220         exit 1
221     fi
222     if [ -n "$VSWITCHD_STRACE_LOG" ]; then
223         strace_opt="strace -o $VSWITCHD_STRACE_LOG $VSWITCHD_STRACE_OPT"
224         daemonize="n"
225     fi
226     if [ -n "$VSWITCHD_VALGRIND_LOG" ]; then
227         valgrind_opt="valgrind --log-file=$VSWITCHD_VALGRIND_LOG $VSWITCHD_VALGRIND_OPT"
228         daemonize="n"
229     fi
230     local fake_proc_net_opt=""
231     if [ "$ENABLE_FAKE_PROC_NET" = "y" ]; then
232         fake_proc_net_opt="--fake-proc-net"
233     fi
234     if [ "$VSWITCHD_MLOCKALL" != "no" ]; then
235         mlockall_opt="--mlockall"
236     fi
237
238     install -d -m 755 -o root -g root `dirname $VSWITCHD_PIDFILE`
239     if [ "$daemonize" != "y" ]; then
240         # Start in background and force a "success" message
241         action "Starting ovs-vswitchd ($strace_opt$valgrind_opt)" true
242         (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") &
243     else
244         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"
245     fi
246 }
247
248 function start_brcompatd {
249     local syslog_opt="-vANY:SYSLOG:${BRCOMPATD_SYSLOG_LOGLEVEL}"
250     local logfile_file_opt=""
251     local logfile_level_opt=""
252     if [ -d "$BRCOMPATD_RUN_DIR" ]; then
253         install -d -m 755 -o root -g root "$BRCOMPATD_RUN_DIR"
254     fi
255     cd "$BRCOMPATD_RUN_DIR"
256
257     install -d -m 755 -o root -g root `dirname $BRCOMPATD_LOGFILE`
258     if [ -n "$BRCOMPATD_FILE_LOGLEVEL" ]; then
259         logfile_level_opt="-vANY:FILE:${BRCOMPATD_FILE_LOGLEVEL}"
260         logfile_file_opt="--log-file=$BRCOMPATD_LOGFILE"
261     fi
262
263     local leak_opt=""
264     if [ -n "$BRCOMPATD_MEMLEAK_LOGFILE" ]; then
265         leak_opt="--check-leaks=$BRCOMPATD_MEMLEAK_LOGFILE"
266         if [ -e "$BRCOMPATD_MEMLEAK_LOGFILE" ]; then
267             mv "$BRCOMPATD_MEMLEAK_LOGFILE" "$BRCOMPATD_MEMLEAK_LOGFILE.prev"
268         fi
269     fi
270     local strace_opt=""
271     local daemonize="y"
272     if [ -n "$BRCOMPATD_STRACE_LOG" ] && [ -n "$BRCOMPATD_VALGRIND_LOG" ]; then
273         printf "Can not start with both VALGRIND and STRACE\n"
274         exit 1
275     fi
276     if [ -n "$BRCOMPATD_STRACE_LOG" ]; then
277         strace_opt="strace -o $BRCOMPATD_STRACE_LOG $BRCOMPATD_STRACE_OPT"
278         daemonize="n"
279     fi
280     if [ -n "$VALGRIND_LOG" ]; then
281         valgrind_opt="valgrind --log-file=$BRCOMPATD_VALGRIND_LOG $BRCOMPATD_VALGRIND_OPT"
282         daemonize="n"
283     fi
284     appctl_cmd="$appctl --target=/var/run/openvswitch/ovs-vswitchd.\`cat $VSWITCHD_PIDFILE\`.ctl %s"
285
286     install -d -m 755 -o root -g root `dirname $BRCOMPATD_PIDFILE`
287     if [ "$daemonize" != "y" ]; then
288         # Start in background and force a "success" message
289         action "Starting ovs-brcompatd ($strace_opt$valgrind_opt)" true
290         (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") &
291     else
292         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"
293     fi
294 }
295
296 function stop_ovsdb_server {
297     if [ -f "$OVSDB_SERVER_PIDFILE" ]; then
298         local pid=$(cat "$OVSDB_SERVER_PIDFILE")
299         action "Killing ovsdb-server ($pid)" kill -TERM $pid
300         rm -f "$OVSDB_SERVER_PIDFILE"
301     fi
302 }
303
304 function stop_vswitchd {
305     if [ -f "$VSWITCHD_PIDFILE" ]; then
306         local pid=$(cat "$VSWITCHD_PIDFILE")
307         action "Killing ovs-vswitchd ($pid)" kill -TERM $pid
308         rm -f "$VSWITCHD_PIDFILE"
309     fi
310 }
311
312 function stop_brcompatd {
313     if [ -f "$BRCOMPATD_PIDFILE" ]; then
314         local pid=$(cat "$BRCOMPATD_PIDFILE")
315         action "Killing ovs-brcompatd ($pid)" kill -TERM $pid
316         rm -f "$BRCOMPATD_PIDFILE"
317     fi
318 }
319
320 function restart_approval {
321     if test ! -t 0; then
322         # Don't prompt if invoked non-interactively.
323         return 0
324     fi
325     cat <<EOF
326
327 WARNING!!!
328
329 Restarting Open vSwitch on a live server is not guaranteed to work.  It is
330 provided as a convenience for those situations in which it does work.
331
332 EOF
333     read -s -r -n 1 -p "Countinue with restart (y/N): " response
334     printf "\n"
335     case "$response" in
336         y|Y)
337             return 0
338             ;;
339         *)
340             return 1
341             ;;
342     esac
343 }
344
345 function set_system_uuid {
346     if test -n "$INSTALLATION_UUID"; then
347         action "Configuring Open vSwitch system UUID" true
348         $vsctl --no-wait set Open_vSwitch . external-ids:system-uuid="$INSTALLATION_UUID"
349     else
350         action "Configuring Open vSwitch system UUID" false
351     fi
352 }
353
354 function start {
355     if [ "$FORCE_COREFILES" = "y" ]; then
356         turn_on_corefiles
357     fi
358
359     insert_modules_if_required
360
361     # Increase the limit on the number of open file descriptors since
362     # ovs-vswitchd needs a few per bridge
363     ulimit -n 4096
364
365     # Allow GRE traffic.
366     iptables -I INPUT -p gre -j ACCEPT
367
368     if [ ! -e "$OVSDB_SERVER_DB" ]; then
369         warning "$OVSDB_SERVER_DB does not exist"
370         install -d -m 755 -o root -g root `dirname $OVSDB_SERVER_DB`
371
372         action "Creating empty database $OVSDB_SERVER_DB" true
373         $ovsdb_tool -vANY:console:emer create "$OVSDB_SERVER_DB" "$VSWITCHD_OVSDB_SCHEMA"
374     else
375         # Upgrade or downgrade schema and compact database.
376         $ovsdb_tool -vANY:console:emer convert "$OVSDB_SERVER_DB" "$VSWITCHD_OVSDB_SCHEMA"
377     fi
378
379     start_ovsdb_server
380     $vsctl --no-wait init
381     if [ ! -e /var/run/openvswitch.booted ]; then
382         touch /var/run/openvswitch.booted
383         for bridge in $($vsctl list-br); do
384             $vsctl --no-wait del-br $bridge
385         done
386     fi
387
388     set_system_uuid
389
390     start_vswitchd
391     if [ "${ENABLE_BRCOMPAT}" = "y" ] ; then
392         start_brcompatd
393     fi
394     touch /var/lock/subsys/openvswitch
395 }
396
397 function stop {
398     stop_brcompatd
399     stop_vswitchd
400     stop_ovsdb_server
401     rm -f /var/lock/subsys/openvswitch
402 }
403
404 function restart {
405     if restart_approval; then
406         stop
407         start
408     fi
409 }
410
411 case "$1" in
412     start)
413         start
414         ;;
415     stop)
416         stop
417         ;;
418     restart)
419         restart
420         ;;
421     strace-vswitchd)
422         shift
423         strace -p $(cat "$VSWITCHD_PIDFILE") "$@"
424         ;;
425     strace-brcompatd)
426         shift
427         strace -p $(cat "$BRCOMPATD_PIDFILE") "$@"
428         ;;
429     status)
430         status -p "$OVSDB_SERVER_PIDFILE" ovsdb-server &&
431         status -p "$VSWITCHD_PIDFILE" ovs-vswitchd &&
432         (test "$ENABLE_BRCOMPAT" != "y" || 
433             status -p "$BRCOMPATD_PIDFILE" ovs-brcompatd)
434         ;;
435     version)
436         /usr/sbin/ovsdb-server -V
437         /usr/sbin/ovs-vswitchd -V
438         /usr/sbin/ovs-brcompatd -V
439         ;;
440     help)
441         printf "openvswitch [start|stop|restart|unload|status|version]\n"
442         ;;
443     *)
444         printf "Unknown command: $1\n"
445         exit 1
446         ;;
447 esac