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