]> git.proxmox.com Git - mirror_ovs.git/blame - utilities/ovs-ctl.in
ovs-ctl: Remove code for upgrading from Open vSwitch 1.9 and earlier.
[mirror_ovs.git] / utilities / ovs-ctl.in
CommitLineData
43bb5f82 1#! /bin/sh
c416eaf8 2# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2016 Nicira, Inc.
43bb5f82
BP
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
16case $0 in
17 */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` ;;
18 *) dir0=./ ;;
19esac
d422c118 20. "$dir0/ovs-lib" || exit 1
43bb5f82
BP
21
22for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do
23 case :$PATH: in
24 *:$dir:*) ;;
25 *) PATH=$PATH:$dir ;;
26 esac
27done
28
29## ----- ##
30## start ##
31## ----- ##
32
a6df8ea0
TG
33# Keep track of removed vports so we can reload them if needed
34removed_vports=""
35
36insert_mods () {
37 # Try loading openvswitch again.
38 action "Inserting openvswitch module" modprobe openvswitch
39
40 for vport in $removed_vports; do
41 # Don't treat failures to load vports as fatal error
42 action "Inserting $vport module" modprobe $vport || true
43 done
44}
45
0a69a5e4 46insert_mod_if_required () {
42165119
PB
47 # If this kernel has no module support, expect we're done.
48 if test ! -e /proc/modules
49 then
50 log_success_msg "Kernel has no loadable module support. Skipping modprobe"
51 return 0
52 fi
53
9b80f761
CW
54 # If openvswitch is already loaded then we're done.
55 test -e /sys/module/openvswitch -o -e /sys/module/openvswitch_mod && \
56 return 0
43bb5f82 57
9b80f761 58 # Load openvswitch. If that's successful then we're done.
a6df8ea0 59 insert_mods && return 0
43bb5f82
BP
60
61 # If the bridge module is loaded, then that might be blocking
9b80f761 62 # openvswitch. Try to unload it, if there are no bridges.
43bb5f82
BP
63 test -e /sys/module/bridge || return 1
64 bridges=`echo /sys/class/net/*/bridge | sed 's,/sys/class/net/,,g;s,/bridge,,g'`
65 if test "$bridges" != "*"; then
66 log_warning_msg "not removing bridge module because bridges exist ($bridges)"
67 return 1
68 fi
69 action "removing bridge module" rmmod bridge || return 1
70
9b80f761 71 # Try loading openvswitch again.
a6df8ea0 72 insert_mods
43bb5f82
BP
73}
74
75ovs_vsctl () {
fba6bd1d 76 ovs-vsctl --no-wait "$@"
43bb5f82
BP
77}
78
43bb5f82
BP
79set_system_ids () {
80 set ovs_vsctl set Open_vSwitch .
81
82 OVS_VERSION=`ovs-vswitchd --version | sed 's/.*) //;1q'`
83 set "$@" ovs-version="$OVS_VERSION"
84
85 case $SYSTEM_ID in
86 random)
87 id_file=$etcdir/system-id.conf
88 uuid_file=$etcdir/install_uuid.conf
89 if test -e "$id_file"; then
90 SYSTEM_ID=`cat "$id_file"`
91 elif test -e "$uuid_file"; then
92 # Migrate from old file name.
93 . "$uuid_file"
94 SYSTEM_ID=$INSTALLATION_UUID
95 echo "$SYSTEM_ID" > "$id_file"
96 elif SYSTEM_ID=`uuidgen`; then
97 echo "$SYSTEM_ID" > "$id_file"
98 else
99 log_failure_msg "missing uuidgen, could not generate system ID"
100 fi
101 ;;
102
103 '')
104 log_failure_msg "system ID not configured, please use --system-id"
105 ;;
106
107 *)
108 ;;
109 esac
110 set "$@" external-ids:system-id="\"$SYSTEM_ID\""
111
112 if test X"$SYSTEM_TYPE" != X; then
113 set "$@" system-type="\"$SYSTEM_TYPE\""
114 else
115 log_failure_msg "no default system type, please use --system-type"
116 fi
117
118 if test X"$SYSTEM_VERSION" != X; then
119 set "$@" system-version="\"$SYSTEM_VERSION\""
120 else
121 log_failure_msg "no default system version, please use --system-version"
122 fi
123
124 action "Configuring Open vSwitch system IDs" "$@" $extra_ids
125}
126
522839ab 127check_force_cores () {
43bb5f82 128 if test X"$FORCE_COREFILES" = Xyes; then
a5d873f4 129 ulimit -c 67108864
43bb5f82 130 fi
522839ab 131}
43bb5f82 132
54b21db7
TLSC
133del_transient_ports () {
134 for port in `ovs-vsctl --bare -- --columns=name find port other_config:transient=true`; do
135 ovs_vsctl -- del-port "$port"
136 done
137}
138
522839ab
JP
139start_ovsdb () {
140 check_force_cores
43bb5f82
BP
141
142 if daemon_is_running ovsdb-server; then
c707d418 143 log_success_msg "ovsdb-server is already running"
43bb5f82 144 else
c707d418 145 # Create initial database or upgrade database schema.
2db1b5d8 146 upgrade_db $DB_FILE $DB_SCHEMA || return 1
c707d418
JP
147
148 # Start ovsdb-server.
149 set ovsdb-server "$DB_FILE"
b4e8d170
BP
150 for db in $EXTRA_DBS; do
151 case $db in
152 /*) ;;
153 *) db=$dbdir/$db ;;
154 esac
155
156 if test ! -f "$db"; then
157 log_warning_msg "$db (from \$EXTRA_DBS) does not exist."
158 elif ovsdb-tool db-version "$db" >/dev/null; then
159 set "$@" "$db"
160 else
161 log_warning_msg "$db (from \$EXTRA_DBS) cannot be read as a database (see error message above)"
162 fi
163 done
c707d418
JP
164 set "$@" -vconsole:emer -vsyslog:err -vfile:info
165 set "$@" --remote=punix:"$DB_SOCK"
4206b80f
HM
166 set "$@" --private-key=db:Open_vSwitch,SSL,private_key
167 set "$@" --certificate=db:Open_vSwitch,SSL,certificate
168 set "$@" --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert
c707d418 169 start_daemon "$OVSDB_SERVER_PRIORITY" "$OVSDB_SERVER_WRAPPER" "$@" \
d0c06099 170 || return 1
43bb5f82 171
c707d418
JP
172 # Initialize database settings.
173 ovs_vsctl -- init -- set Open_vSwitch . db-version="$schemaver" \
174 || return 1
175 set_system_ids || return 1
176 if test X"$DELETE_BRIDGES" = Xyes; then
43bb5f82 177 for bridge in `ovs_vsctl list-br`; do
c6f4d298 178 ovs_vsctl del-br $bridge
43bb5f82 179 done
c707d418 180 fi
54b21db7
TLSC
181 if test X"$DELETE_TRANSIENT_PORTS" = Xyes; then
182 del_transient_ports
183 fi
43bb5f82 184 fi
522839ab
JP
185}
186
1259a0c4
GS
187add_managers () {
188 # Now that ovs-vswitchd has started and completed its initial
189 # configuration, tell ovsdb-server to conenct to the remote managers. We
190 # used to do this at ovsdb-server startup time, but waiting for
191 # ovs-vswitchd to finish configuring means that remote managers see less
192 # churn in the database at startup or restart. (For example, managers
193 # won't briefly see empty datapath-id or ofport columns for records that
194 # exist at startup.)
195 action "Enabling remote OVSDB managers" \
196 ovs-appctl -t ovsdb-server ovsdb-server/add-remote \
197 db:Open_vSwitch,Open_vSwitch,manager_options
198}
199
522839ab
JP
200start_forwarding () {
201 check_force_cores
202
203 insert_mod_if_required || return 1
43bb5f82
BP
204
205 if daemon_is_running ovs-vswitchd; then
c707d418 206 log_success_msg "ovs-vswitchd is already running"
43bb5f82 207 else
c707d418 208 # Increase the limit on the number of open file descriptors.
991d922c 209 # On Linux, ovs-vswitchd needs about three file descriptors
7a6cf343
AW
210 # per bridge and "n-handler-threads" file descriptors per bridge
211 # port, so this allows a very large number of bridges and ports.
212 MAXFD=65535
bfe4277e
TG
213 if [ $(ulimit -n) -lt $MAXFD ]; then
214 ulimit -n $MAXFD
215 fi
c707d418
JP
216
217 # Start ovs-vswitchd.
218 set ovs-vswitchd unix:"$DB_SOCK"
219 set "$@" -vconsole:emer -vsyslog:err -vfile:info
220 if test X"$MLOCKALL" != Xno; then
221 set "$@" --mlockall
222 fi
223 start_daemon "$OVS_VSWITCHD_PRIORITY" "$OVS_VSWITCHD_WRAPPER" "$@"
43bb5f82
BP
224 fi
225}
226
227## ---- ##
228## stop ##
229## ---- ##
230
522839ab
JP
231stop_ovsdb () {
232 stop_daemon ovsdb-server
233}
234
235stop_forwarding () {
43bb5f82 236 stop_daemon ovs-vswitchd
43bb5f82
BP
237}
238
239## ----------------- ##
240## force-reload-kmod ##
241## ----------------- ##
242
243internal_interfaces () {
244 # Outputs a list of internal interfaces:
245 #
246 # - There is an internal interface for every bridge, whether it
247 # has an Interface record or not and whether the Interface
248 # record's 'type' is properly set or not.
249 #
250 # - There is an internal interface for each Interface record whose
251 # 'type' is 'internal'.
252 #
253 # But ignore interfaces that don't really exist.
254 for d in `(ovs_vsctl --bare \
255 -- --columns=name find Interface type=internal \
c707d418 256 -- list-br) | sort -u`
43bb5f82
BP
257 do
258 if test -e "/sys/class/net/$d"; then
c707d418
JP
259 printf "%s " "$d"
260 fi
43bb5f82
BP
261 done
262}
263
16774462
GS
264ovs_save () {
265 bridges=`ovs_vsctl -- --real list-br`
266 if [ -n "${bridges}" ] && \
267 "$datadir/scripts/ovs-save" "$1" ${bridges} > "$2"; then
268 chmod +x "$2"
269 return 0
a4175433 270 fi
16774462
GS
271 [ -z "${bridges}" ] && return 0
272}
273
24605d4e
SH
274save_flows_if_required () {
275 if test X"$DELETE_BRIDGES" != Xyes; then
276 action "Saving flows" ovs_save save-flows "${script_flows}"
277 fi
278}
279
751d0ddb 280save_interfaces () {
a4175433
GS
281 "$datadir/scripts/ovs-save" save-interfaces ${ifaces} \
282 > "${script_interfaces}"
283}
284
407b1473
GS
285flow_restore_wait () {
286 ovs_vsctl set open_vswitch . other_config:flow-restore-wait="true"
287}
288
289flow_restore_complete () {
290 ovs_vsctl --if-exists remove open_vswitch . other_config \
291 flow-restore-wait="true"
292}
293
a4175433 294restore_flows () {
737af96d 295 [ -x "${script_flows}" ] && \
a4175433 296 action "Restoring saved flows" "${script_flows}"
751d0ddb
BP
297}
298
737af96d
GS
299restore_interfaces () {
300 [ ! -x "${script_interfaces}" ] && return 0
301 action "Restoring interface configuration" "${script_interfaces}"
302 rc=$?
303 if test $rc = 0; then
304 level=debug
305 else
306 level=err
307 fi
308 log="logger -p daemon.$level -t ovs-save"
a3a0a7a0 309 $log "interface restore script exited with status $rc:"
737af96d
GS
310 $log -f "$script_interfaces"
311}
43bb5f82 312
737af96d 313init_restore_scripts () {
a4175433 314 script_interfaces=`mktemp`
a4175433 315 script_flows=`mktemp`
c416eaf8 316 trap 'rm -f "${script_interfaces}" "${script_flows}"' 0
737af96d 317}
a4175433 318
737af96d
GS
319force_reload_kmod () {
320 ifaces=`internal_interfaces`
321 action "Detected internal interfaces: $ifaces" true
322
323 init_restore_scripts
24605d4e 324 save_flows_if_required
a4175433 325
522839ab
JP
326 # Restart the database first, since a large database may take a
327 # while to load, and we want to minimize forwarding disruption.
328 stop_ovsdb
329 start_ovsdb
330
331 stop_forwarding
43bb5f82 332
bb9f6963 333 if action "Saving interface configuration" save_interfaces; then
43bb5f82
BP
334 :
335 else
336 log_warning_msg "Failed to save configuration, not replacing kernel module"
522839ab 337 start_forwarding
1259a0c4 338 add_managers
43bb5f82
BP
339 exit 1
340 fi
a4175433
GS
341 chmod +x "$script_interfaces"
342
0311d4f4 343 for dp in `ovs-dpctl dump-dps`; do
de061b24 344 action "Removing datapath: $dp" ovs-dpctl del-dp "$dp"
43bb5f82
BP
345 done
346
a6df8ea0
TG
347 for vport in `awk '/^vport_/ { print $1 }' /proc/modules`; do
348 action "Removing $vport module" rmmod $vport
349 if ! grep -q $vport /proc/modules; then
350 removed_vports="$removed_vports $vport"
351 fi
352 done
353
9b80f761 354 # try both old and new names in case this is post upgrade
43bb5f82
BP
355 if test -e /sys/module/openvswitch_mod; then
356 action "Removing openvswitch module" rmmod openvswitch_mod
9b80f761
CW
357 elif test -e /sys/module/openvswitch; then
358 action "Removing openvswitch module" rmmod openvswitch
43bb5f82
BP
359 fi
360
407b1473
GS
361 # Start vswitchd by asking it to wait till flow restore is finished.
362 flow_restore_wait
522839ab 363 start_forwarding
43bb5f82 364
407b1473 365 # Restore saved flows and inform vswitchd that we are done.
a4175433 366 restore_flows
407b1473 367 flow_restore_complete
1259a0c4 368 add_managers
a4175433 369
737af96d 370 restore_interfaces
2dc7590d
BP
371
372 "$datadir/scripts/ovs-check-dead-ifs"
43bb5f82
BP
373}
374
a4175433
GS
375## ------- ##
376## restart ##
377## ------- ##
378
379restart () {
03d589af 380 if daemon_is_running ovsdb-server && daemon_is_running ovs-vswitchd; then
a3a0a7a0 381 init_restore_scripts
24605d4e 382 save_flows_if_required
03d589af 383 fi
a4175433
GS
384
385 # Restart the database first, since a large database may take a
386 # while to load, and we want to minimize forwarding disruption.
387 stop_ovsdb
388 start_ovsdb
389
390 stop_forwarding
407b1473
GS
391
392 # Start vswitchd by asking it to wait till flow restore is finished.
393 flow_restore_wait
a4175433
GS
394 start_forwarding
395
407b1473 396 # Restore saved flows and inform vswitchd that we are done.
a3a0a7a0 397 restore_flows
407b1473 398 flow_restore_complete
1259a0c4 399 add_managers
a3a0a7a0
GS
400
401 # Restore the interfaces if required. Return true even if restore fails.
402 restore_interfaces || true
a4175433
GS
403}
404
b3a375f2
BP
405## --------------- ##
406## enable-protocol ##
407## --------------- ##
408
409enable_protocol () {
b053c7c1
BP
410 # Translate the protocol name to a number, because "iptables -n -L" prints
411 # some protocols by name (despite the -n) and therefore we need to look for
412 # both forms.
413 #
414 # (iptables -S output is more uniform but old iptables doesn't have it.)
415 protonum=`grep "^$PROTOCOL[ ]" /etc/protocols | awk '{print $2}'`
416 if expr X"$protonum" : X'[0-9]\{1,\}$' > /dev/null; then :; else
417 log_failure_msg "unknown protocol $PROTOCOL"
418 return 1
419 fi
420
b3a375f2 421 name=$PROTOCOL
b053c7c1
BP
422 match="(\$2 == \"$PROTOCOL\" || \$2 == $protonum)"
423 insert="iptables -I INPUT -p $PROTOCOL"
b3a375f2 424 if test X"$DPORT" != X; then
b3a375f2 425 name="$name to port $DPORT"
b053c7c1
BP
426 match="$match && /dpt:$DPORT/"
427 insert="$insert --dport $DPORT"
b3a375f2
BP
428 fi
429 if test X"$SPORT" != X; then
b3a375f2 430 name="$name from port $SPORT"
b053c7c1
BP
431 match="$match && /spt:$SPORT/"
432 insert="$insert --sport $SPORT"
b3a375f2 433 fi
b3a375f2
BP
434 insert="$insert -j ACCEPT"
435
b053c7c1
BP
436 if (iptables -n -L INPUT) >/dev/null 2>&1; then
437 if iptables -n -L INPUT | awk "$match { n++ } END { exit n == 0 }"
438 then
439 # There's already a rule for this protocol. Don't override it.
440 log_success_msg "iptables already has a rule for $name, not explicitly enabling"
441 else
442 action "Enabling $name with iptables" $insert
443 fi
b3a375f2 444 elif (iptables --version) >/dev/null 2>&1; then
b3a375f2 445 action "cannot list iptables rules, not adding a rule for $name"
2ae9d860
BP
446 else
447 action "iptables binary not installed, not adding a rule for $name"
b3a375f2
BP
448 fi
449}
450
43bb5f82
BP
451## ---- ##
452## main ##
453## ---- ##
454
455set_defaults () {
456 SYSTEM_ID=
457
458 DELETE_BRIDGES=no
54b21db7 459 DELETE_TRANSIENT_PORTS=no
43bb5f82
BP
460
461 DAEMON_CWD=/
462 FORCE_COREFILES=yes
463 MLOCKALL=yes
464 OVSDB_SERVER_PRIORITY=-10
465 OVS_VSWITCHD_PRIORITY=-10
d0c06099
BP
466 OVSDB_SERVER_WRAPPER=
467 OVS_VSWITCHD_WRAPPER=
43bb5f82 468
f973f2af 469 DB_FILE=$dbdir/conf.db
43bb5f82
BP
470 DB_SOCK=$rundir/db.sock
471 DB_SCHEMA=$datadir/vswitch.ovsschema
b4e8d170 472 EXTRA_DBS=
43bb5f82 473
b3a375f2
BP
474 PROTOCOL=gre
475 DPORT=
476 SPORT=
477
a685eb5a
GS
478 type_file=$etcdir/system-type.conf
479 version_file=$etcdir/system-version.conf
480
481 if test -e "$type_file" ; then
482 SYSTEM_TYPE=`cat $type_file`
483 SYSTEM_VERSION=`cat $version_file`
484 elif (lsb_release --id) >/dev/null 2>&1; then
43bb5f82
BP
485 SYSTEM_TYPE=`lsb_release --id -s`
486 system_release=`lsb_release --release -s`
487 system_codename=`lsb_release --codename -s`
488 SYSTEM_VERSION="${system_release}-${system_codename}"
489 else
490 SYSTEM_TYPE=unknown
491 SYSTEM_VERSION=unknown
492 fi
493}
494
495usage () {
496 set_defaults
497 cat <<EOF
498$0: controls Open vSwitch daemons
499usage: $0 [OPTIONS] COMMAND
500
501This program is intended to be invoked internally by Open vSwitch startup
502scripts. System administrators should not normally invoke it directly.
503
504Commands:
505 start start Open vSwitch daemons
506 stop stop Open vSwitch daemons
a4175433 507 restart stop and start Open vSwitch daemons
43bb5f82
BP
508 status check whether Open vSwitch daemons are running
509 version print versions of Open vSwitch daemons
da3db88f 510 load-kmod insert modules if not already present
43bb5f82
BP
511 force-reload-kmod save OVS network device state, stop OVS, unload kernel
512 module, reload kernel module, start OVS, restore state
b3a375f2 513 enable-protocol enable protocol specified in options with iptables
43bb5f82
BP
514 help display this help message
515
a4175433 516One of the following options is required for "start", "restart" and "force-reload-kmod":
43bb5f82
BP
517 --system-id=UUID set specific ID to uniquely identify this system
518 --system-id=random use a random but persistent UUID to identify this system
519
a4175433 520Other important options for "start", "restart" and "force-reload-kmod":
43bb5f82
BP
521 --system-type=TYPE set system type (e.g. "XenServer")
522 --system-version=VERSION set system version (e.g. "5.6.100-39265p")
523 --external-id="key=value"
524 add given key-value pair to Open_vSwitch external-ids
525 --delete-bridges delete all bridges just before starting ovs-vswitchd
526
a4175433 527Less important options for "start", "restart" and "force-reload-kmod":
9fc47ed7
BP
528 --daemon-cwd=DIR set working dir for OVS daemons (default: $DAEMON_CWD)
529 --no-force-corefiles do not force on core dumps for OVS daemons
530 --no-mlockall do not lock all of ovs-vswitchd into memory
531 --ovsdb-server-priority=NICE set ovsdb-server's niceness (default: $OVSDB_SERVER_PRIORITY)
532 --ovs-vswitchd-priority=NICE set ovs-vswitchd's niceness (default: $OVS_VSWITCHD_PRIORITY)
9fc47ed7 533
a4175433 534Debugging options for "start", "restart" and "force-reload-kmod":
d0c06099
BP
535 --ovsdb-server-wrapper=WRAPPER
536 --ovs-vswitchd-wrapper=WRAPPER
537 --ovs-vswitchd-wrapper=WRAPPER
538 run specified daemon under WRAPPER (either 'valgrind' or 'strace')
539
43bb5f82
BP
540File location options:
541 --db-file=FILE database file name (default: $DB_FILE)
542 --db-sock=SOCKET JSON-RPC socket name (default: $DB_SOCK)
543 --db-schema=FILE database schema file name (default: $DB_SCHEMA)
544
9fc47ed7 545Options for "enable-protocol":
b3a375f2
BP
546 --protocol=PROTOCOL protocol to enable with iptables (default: gre)
547 --sport=PORT source port to match (for tcp or udp protocol)
548 --dport=PORT ddestination port to match (for tcp or udp protocol)
549
43bb5f82
BP
550Other options:
551 -h, --help display this help message
552 -V, --version display version information
553
554Default directories with "configure" option and environment variable override:
f973f2af
BP
555 logs: @LOGDIR@ (--with-logdir, OVS_LOGDIR)
556 pidfiles and sockets: @RUNDIR@ (--with-rundir, OVS_RUNDIR)
557 conf.db: @DBDIR@ (--with-dbdir, OVS_DBDIR)
43bb5f82
BP
558 system configuration: @sysconfdir@ (--sysconfdir, OVS_SYSCONFDIR)
559 data files: @pkgdatadir@ (--pkgdatadir, OVS_PKGDATADIR)
560 user binaries: @bindir@ (--bindir, OVS_BINDIR)
561 system binaries: @sbindir@ (--sbindir, OVS_SBINDIR)
562
563Please report bugs to bugs@openvswitch.org (see REPORTING-BUGS for details).
564EOF
565
566 exit 0
567}
568
569set_option () {
570 var=`echo "$option" | tr abcdefghijklmnopqrstuvwxyz- ABCDEFGHIJKLMNOPQRSTUVWXYZ_`
571 eval set=\${$var+yes}
572 eval old_value=\$$var
573 if test X$set = X || \
574 (test $type = bool && \
575 test X"$old_value" != Xno && test X"$old_value" != Xyes); then
576 echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
577 return
578 fi
579 eval $var=\$value
580}
581
9fc47ed7
BP
582daemons () {
583 echo ovsdb-server ovs-vswitchd
9fc47ed7
BP
584}
585
43bb5f82
BP
586set_defaults
587extra_ids=
588command=
589for arg
590do
591 case $arg in
592 -h | --help)
593 usage
594 ;;
595 -V | --version)
8a07709c 596 echo "$0 (Open vSwitch) $VERSION"
43bb5f82
BP
597 exit 0
598 ;;
599 --external-id=*)
600 value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
601 case $value in
602 *=*)
603 extra_ids="$extra_ids external-ids:$value"
604 ;;
605 *)
606 echo >&2 "$0: --external-id argument not in the form \"key=value\""
607 exit 1
608 ;;
609 esac
610 ;;
611 --[a-z]*=*)
612 option=`expr X"$arg" : 'X--\([^=]*\)'`
613 value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
614 type=string
615 set_option
616 ;;
617 --no-[a-z]*)
618 option=`expr X"$arg" : 'X--no-\(.*\)'`
619 value=no
620 type=bool
621 set_option
622 ;;
623 --[a-z]*)
624 option=`expr X"$arg" : 'X--\(.*\)'`
625 value=yes
626 type=bool
627 set_option
628 ;;
629 -*)
630 echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
631 exit 1
632 ;;
633 *)
634 if test X"$command" = X; then
635 command=$arg
636 else
637 echo >&2 "$0: exactly one non-option argument required (use --help for help)"
638 exit 1
639 fi
640 ;;
641 esac
642done
643case $command in
644 start)
9fc789b9 645 start_ovsdb || exit 1
522839ab 646 start_forwarding
1259a0c4 647 add_managers
43bb5f82
BP
648 ;;
649 stop)
522839ab
JP
650 stop_forwarding
651 stop_ovsdb
43bb5f82 652 ;;
a4175433
GS
653 restart)
654 restart
655 ;;
43bb5f82 656 status)
9fc47ed7
BP
657 rc=0
658 for daemon in `daemons`; do
659 daemon_status $daemon || rc=$?
660 done
661 exit $rc
43bb5f82
BP
662 ;;
663 version)
9fc47ed7
BP
664 for daemon in `daemons`; do
665 $daemon --version
666 done
43bb5f82
BP
667 ;;
668 force-reload-kmod)
c707d418 669 force_reload_kmod
43bb5f82 670 ;;
da3db88f
SH
671 load-kmod)
672 insert_mod_if_required
673 ;;
b3a375f2
BP
674 enable-protocol)
675 enable_protocol
676 ;;
43bb5f82
BP
677 help)
678 usage
679 ;;
680 '')
681 echo >&2 "$0: missing command name (use --help for help)"
682 exit 1
683 ;;
684 *)
685 echo >&2 "$0: unknown command \"$command\" (use --help for help)"
686 exit 1
687 ;;
688esac