]> git.proxmox.com Git - mirror_ovs.git/blob - utilities/ovs-ctl.in
ovs-ctl: Clean up temporary file used for force-reload-kmod.
[mirror_ovs.git] / utilities / ovs-ctl.in
1 #! /bin/sh
2 # Copyright (C) 2009, 2010, 2011 Nicira Networks, Inc.
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at:
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15
16 case $0 in
17 */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` ;;
18 *) dir0=./ ;;
19 esac
20 . "$dir0/ovs-lib.sh" || exit 1
21
22 for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do
23 case :$PATH: in
24 *:$dir:*) ;;
25 *) PATH=$PATH:$dir ;;
26 esac
27 done
28
29 ## ----- ##
30 ## start ##
31 ## ----- ##
32
33 insert_modules_if_required () {
34 # If openvswitch_mod is already loaded then we're done.
35 test -e /sys/module/openvswitch_mod && return 0
36
37 # Load openvswitch_mod. If that's successful then we're done.
38 action "Inserting openvswitch module" modprobe openvswitch_mod && return 0
39
40 # If the bridge module is loaded, then that might be blocking
41 # openvswitch_mod. Try to unload it, if there are no bridges.
42 test -e /sys/module/bridge || return 1
43 bridges=`echo /sys/class/net/*/bridge | sed 's,/sys/class/net/,,g;s,/bridge,,g'`
44 if test "$bridges" != "*"; then
45 log_warning_msg "not removing bridge module because bridges exist ($bridges)"
46 return 1
47 fi
48 action "removing bridge module" rmmod bridge || return 1
49
50 # Try loading openvswitch_mod again.
51 action "Inserting openvswitch module" modprobe openvswitch_mod
52 }
53
54 ovs_vsctl () {
55 ovs-vsctl --no-wait --timeout=5 "$@"
56 }
57
58 ovsdb_tool () {
59 ovsdb-tool -vANY:console:emer "$@"
60 }
61
62 upgrade_db () {
63 schemaver=`ovsdb_tool schema-version "$DB_SCHEMA"`
64 if test ! -e "$DB_FILE"; then
65 log_warning_msg "$DB_FILE does not exist"
66 install -d -m 755 -o root -g root `dirname $DB_FILE`
67
68 action "Creating empty database $DB_FILE" true
69 ovsdb_tool create "$DB_FILE" "$DB_SCHEMA"
70 elif test X"`ovsdb_tool needs-conversion "$DB_FILE" "$DB_SCHEMA"`" != Xno; then
71 # Back up the old version.
72 version=`ovsdb_tool db-version "$DB_FILE"`
73 cksum=`ovsdb_tool db-cksum "$DB_FILE" | awk '{print $1}'`
74 cp "$DB_FILE" "$DB_FILE.backup$version-$cksum"
75
76 # Compact database. This is important if the old schema did not enable
77 # garbage collection (i.e. if it did not have any tables with "isRoot":
78 # true) but the new schema does. In that situation the old database
79 # may contain a transaction that creates a record followed by a
80 # transaction that creates the first use of the record. Replaying that
81 # series of transactions against the new database schema (as "convert"
82 # does) would cause the record to be dropped by the first transaction,
83 # then the second transaction would cause a referential integrity
84 # failure (for a strong reference).
85 ovsdb_tool compact "$DB_FILE"
86
87 # Upgrade or downgrade schema.
88 ovsdb_tool convert "$DB_FILE" "$DB_SCHEMA"
89 fi
90 }
91
92 set_system_ids () {
93 set ovs_vsctl set Open_vSwitch .
94
95 OVS_VERSION=`ovs-vswitchd --version | sed 's/.*) //;1q'`
96 set "$@" ovs-version="$OVS_VERSION"
97
98 case $SYSTEM_ID in
99 random)
100 id_file=$etcdir/system-id.conf
101 uuid_file=$etcdir/install_uuid.conf
102 if test -e "$id_file"; then
103 SYSTEM_ID=`cat "$id_file"`
104 elif test -e "$uuid_file"; then
105 # Migrate from old file name.
106 . "$uuid_file"
107 SYSTEM_ID=$INSTALLATION_UUID
108 echo "$SYSTEM_ID" > "$id_file"
109 elif SYSTEM_ID=`uuidgen`; then
110 echo "$SYSTEM_ID" > "$id_file"
111 else
112 log_failure_msg "missing uuidgen, could not generate system ID"
113 fi
114 ;;
115
116 '')
117 log_failure_msg "system ID not configured, please use --system-id"
118 ;;
119
120 *)
121 ;;
122 esac
123 set "$@" external-ids:system-id="\"$SYSTEM_ID\""
124
125 if test X"$SYSTEM_TYPE" != X; then
126 set "$@" system-type="\"$SYSTEM_TYPE\""
127 else
128 log_failure_msg "no default system type, please use --system-type"
129 fi
130
131 if test X"$SYSTEM_VERSION" != X; then
132 set "$@" system-version="\"$SYSTEM_VERSION\""
133 else
134 log_failure_msg "no default system version, please use --system-version"
135 fi
136
137 action "Configuring Open vSwitch system IDs" "$@" $extra_ids
138 }
139
140 start () {
141 if test X"$FORCE_COREFILES" = Xyes; then
142 ulimit -Sc 67108864
143 fi
144
145 insert_modules_if_required || return 1
146
147 if daemon_is_running ovsdb-server; then
148 log_success_msg "ovsdb-server is already running"
149 else
150 # Create initial database or upgrade database schema.
151 upgrade_db || return 1
152
153 # Start ovsdb-server.
154 set ovsdb-server "$DB_FILE"
155 set "$@" -vANY:CONSOLE:EMER -vANY:SYSLOG:ERR -vANY:FILE:INFO
156 set "$@" --remote=punix:"$DB_SOCK"
157 set "$@" --remote=db:Open_vSwitch,manager_options
158 set "$@" --private-key=db:SSL,private_key
159 set "$@" --certificate=db:SSL,certificate
160 set "$@" --bootstrap-ca-cert=db:SSL,ca_cert
161 start_daemon "$OVSDB_SERVER_PRIORITY" "$@" || return 1
162
163 # Initialize database settings.
164 ovs_vsctl -- init -- set Open_vSwitch . db-version="$schemaver" \
165 || return 1
166 set_system_ids || return 1
167 if test X"$DELETE_BRIDGES" = Xyes; then
168 for bridge in `ovs_vsctl list-br`; do
169 ovs_vsctl del-br $bridge
170 done
171 fi
172 fi
173
174 if daemon_is_running ovs-vswitchd; then
175 log_success_msg "ovs-vswitchd is already running"
176 else
177 # Increase the limit on the number of open file descriptors since
178 # ovs-vswitchd needs a few per bridge
179 ulimit -n 4096
180
181 # Start ovs-vswitchd.
182 set ovs-vswitchd unix:"$DB_SOCK"
183 set "$@" -vANY:CONSOLE:EMER -vANY:SYSLOG:ERR -vANY:FILE:INFO
184 if test X"$MLOCKALL" != Xno; then
185 set "$@" --mlockall
186 fi
187 start_daemon "$VSWITCHD_PRIORITY" "$@"
188 fi
189 }
190
191 ## ---- ##
192 ## stop ##
193 ## ---- ##
194
195 stop () {
196 stop_daemon ovs-vswitchd
197 stop_daemon ovsdb-server
198 }
199
200 ## ----------------- ##
201 ## force-reload-kmod ##
202 ## ----------------- ##
203
204 internal_interfaces () {
205 # Outputs a list of internal interfaces:
206 #
207 # - There is an internal interface for every bridge, whether it
208 # has an Interface record or not and whether the Interface
209 # record's 'type' is properly set or not.
210 #
211 # - There is an internal interface for each Interface record whose
212 # 'type' is 'internal'.
213 #
214 # But ignore interfaces that don't really exist.
215 for d in `(ovs_vsctl --bare \
216 -- --columns=name find Interface type=internal \
217 -- list-br) | sort -u`
218 do
219 if test -e "/sys/class/net/$d"; then
220 printf "%s " "$d"
221 fi
222 done
223 }
224
225 save_interfaces () {
226 "$datadir/scripts/ovs-save" $ifaces > "$script"
227 }
228
229 force_reload_kmod () {
230 ifaces=`internal_interfaces`
231 action "Detected internal interfaces: $ifaces" true
232
233 stop
234
235 script=`mktemp`
236 trap 'rm -f "$script"' 0 1 2 13 15
237 if action "Saving interface configuration" save_interfaces; then
238 :
239 else
240 log_warning_msg "Failed to save configuration, not replacing kernel module"
241 start
242 exit 1
243 fi
244 chmod +x "$script"
245
246 for dp in `ovs-dpctl dump-dps`; do
247 action "Removing datapath: $dp" "$dpctl" del-dp "$dp"
248 done
249
250 if test -e /sys/module/openvswitch_mod; then
251 action "Removing openvswitch module" rmmod openvswitch_mod
252 fi
253
254 start
255
256 action "Restoring interface configuration" "$script"
257 rc=$?
258 if test $rc = 0; then
259 level=debug
260 else
261 level=err
262 fi
263 log="logger -p daemon.$level -t ovs-save"
264 $log "force-reload-kmod interface restore script exited with status $rc:"
265 $log -f "$script"
266 }
267
268 ## ---- ##
269 ## main ##
270 ## ---- ##
271
272 set_defaults () {
273 SYSTEM_ID=
274
275 DELETE_BRIDGES=no
276
277 DAEMON_CWD=/
278 FORCE_COREFILES=yes
279 MLOCKALL=yes
280 OVSDB_SERVER_PRIORITY=-10
281 OVS_VSWITCHD_PRIORITY=-10
282
283 DB_FILE=$etcdir/conf.db
284 DB_SOCK=$rundir/db.sock
285 DB_SCHEMA=$datadir/vswitch.ovsschema
286
287 if (lsb_release --id) >/dev/null 2>&1; then
288 SYSTEM_TYPE=`lsb_release --id -s`
289 system_release=`lsb_release --release -s`
290 system_codename=`lsb_release --codename -s`
291 SYSTEM_VERSION="${system_release}-${system_codename}"
292 else
293 SYSTEM_TYPE=unknown
294 SYSTEM_VERSION=unknown
295 fi
296 }
297
298 usage () {
299 set_defaults
300 cat <<EOF
301 $0: controls Open vSwitch daemons
302 usage: $0 [OPTIONS] COMMAND
303
304 This program is intended to be invoked internally by Open vSwitch startup
305 scripts. System administrators should not normally invoke it directly.
306
307 Commands:
308 start start Open vSwitch daemons
309 stop stop Open vSwitch daemons
310 status check whether Open vSwitch daemons are running
311 version print versions of Open vSwitch daemons
312 force-reload-kmod save OVS network device state, stop OVS, unload kernel
313 module, reload kernel module, start OVS, restore state
314 help display this help message
315
316 One of the following options should be specified when starting Open vSwitch:
317 --system-id=UUID set specific ID to uniquely identify this system
318 --system-id=random use a random but persistent UUID to identify this system
319
320 Other important options for starting Open vSwitch:
321 --system-type=TYPE set system type (e.g. "XenServer")
322 --system-version=VERSION set system version (e.g. "5.6.100-39265p")
323 --external-id="key=value"
324 add given key-value pair to Open_vSwitch external-ids
325 --delete-bridges delete all bridges just before starting ovs-vswitchd
326
327 Less important options for starting Open vSwitch:
328 --daemon-cwd=DIR current working directory for OVS daemons (default: $DAEMON_CWD)
329 --no-force-corefiles
330 do not forcibly enable core dumps for OVS daemons
331 --no-mlockall do not lock all of ovs-vswitchd into memory
332 --ovsdb-server-priority=NICE
333 set ovsdb-server's niceness (default: $OVSDB_SERVER_PRIORITY)
334 --ovs-vswitchd-priority=NICE
335 set ovs-vswitchd's niceness (default: $OVS_VSWITCHD_PRIORITY)
336
337 File location options:
338 --db-file=FILE database file name (default: $DB_FILE)
339 --db-sock=SOCKET JSON-RPC socket name (default: $DB_SOCK)
340 --db-schema=FILE database schema file name (default: $DB_SCHEMA)
341
342 Other options:
343 -h, --help display this help message
344 -V, --version display version information
345
346 Default directories with "configure" option and environment variable override:
347 logs: @LOGDIR@ (--log-dir, OVS_LOGDIR)
348 pidfiles and sockets: @RUNDIR@ (--run-dir, OVS_RUNDIR)
349 system configuration: @sysconfdir@ (--sysconfdir, OVS_SYSCONFDIR)
350 data files: @pkgdatadir@ (--pkgdatadir, OVS_PKGDATADIR)
351 user binaries: @bindir@ (--bindir, OVS_BINDIR)
352 system binaries: @sbindir@ (--sbindir, OVS_SBINDIR)
353
354 Please report bugs to bugs@openvswitch.org (see REPORTING-BUGS for details).
355 EOF
356
357 exit 0
358 }
359
360 set_option () {
361 var=`echo "$option" | tr abcdefghijklmnopqrstuvwxyz- ABCDEFGHIJKLMNOPQRSTUVWXYZ_`
362 eval set=\${$var+yes}
363 eval old_value=\$$var
364 if test X$set = X || \
365 (test $type = bool && \
366 test X"$old_value" != Xno && test X"$old_value" != Xyes); then
367 echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
368 return
369 fi
370 eval $var=\$value
371 }
372
373 set_defaults
374 extra_ids=
375 command=
376 for arg
377 do
378 case $arg in
379 -h | --help)
380 usage
381 ;;
382 -V | --version)
383 echo "$0 (Open vSwitch) $VERSION$BUILDNR"
384 exit 0
385 ;;
386 --external-id=*)
387 value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
388 case $value in
389 *=*)
390 extra_ids="$extra_ids external-ids:$value"
391 ;;
392 *)
393 echo >&2 "$0: --external-id argument not in the form \"key=value\""
394 exit 1
395 ;;
396 esac
397 ;;
398 --[a-z]*=*)
399 option=`expr X"$arg" : 'X--\([^=]*\)'`
400 value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
401 type=string
402 set_option
403 ;;
404 --no-[a-z]*)
405 option=`expr X"$arg" : 'X--no-\(.*\)'`
406 value=no
407 type=bool
408 set_option
409 ;;
410 --[a-z]*)
411 option=`expr X"$arg" : 'X--\(.*\)'`
412 value=yes
413 type=bool
414 set_option
415 ;;
416 -*)
417 echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
418 exit 1
419 ;;
420 *)
421 if test X"$command" = X; then
422 command=$arg
423 else
424 echo >&2 "$0: exactly one non-option argument required (use --help for help)"
425 exit 1
426 fi
427 ;;
428 esac
429 done
430 case $command in
431 start)
432 start
433 ;;
434 stop)
435 stop
436 ;;
437 status)
438 daemon_status ovsdb-server && daemon_status ovs-vswitchd
439 ;;
440 version)
441 ovsdb-server --version && ovs-vswitchd --version
442 ;;
443 force-reload-kmod)
444 force_reload_kmod
445 ;;
446 help)
447 usage
448 ;;
449 '')
450 echo >&2 "$0: missing command name (use --help for help)"
451 exit 1
452 ;;
453 *)
454 echo >&2 "$0: unknown command \"$command\" (use --help for help)"
455 exit 1
456 ;;
457 esac
458