2 # Copyright (C) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
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:
8 # http://www.apache.org/licenses/LICENSE-2.0
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.
17 */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` ;;
20 . "$dir0/ovs-lib" || exit 1
22 for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do
33 insert_openvswitch_mod_if_required () {
34 # If openvswitch is already loaded then we're done.
35 test -e /sys/module/openvswitch -o -e /sys/module/openvswitch_mod && \
38 # Load openvswitch. If that's successful then we're done.
39 action "Inserting openvswitch module" modprobe openvswitch && return 0
41 # If the bridge module is loaded, then that might be blocking
42 # openvswitch. Try to unload it, if there are no bridges.
43 test -e /sys/module/bridge || return 1
44 bridges=`echo /sys/class/net/*/bridge | sed 's,/sys/class/net/,,g;s,/bridge,,g'`
45 if test "$bridges" != "*"; then
46 log_warning_msg "not removing bridge module because bridges exist ($bridges)"
49 action "removing bridge module" rmmod bridge || return 1
51 # Try loading openvswitch again.
52 action "Inserting openvswitch module" modprobe openvswitch
55 insert_mod_if_required () {
56 insert_openvswitch_mod_if_required || return 1
60 ovs-vsctl --no-wait --timeout=5 "$@"
64 ovsdb-tool -vconsole:off "$@"
68 action "Creating empty database $DB_FILE" ovsdb_tool create "$DB_FILE" "$DB_SCHEMA"
72 schemaver=`ovsdb_tool schema-version "$DB_SCHEMA"`
73 if test ! -e "$DB_FILE"; then
74 log_warning_msg "$DB_FILE does not exist"
75 install -d -m 755 -o root -g root `dirname $DB_FILE`
77 elif test X"`ovsdb_tool needs-conversion "$DB_FILE" "$DB_SCHEMA"`" != Xno; then
78 # Back up the old version.
79 version=`ovsdb_tool db-version "$DB_FILE"`
80 cksum=`ovsdb_tool db-cksum "$DB_FILE" | awk '{print $1}'`
81 backup=$DB_FILE.backup$version-$cksum
82 action "Backing up database to $backup" cp "$DB_FILE" "$backup" || return 1
84 # Compact database. This is important if the old schema did not enable
85 # garbage collection (i.e. if it did not have any tables with "isRoot":
86 # true) but the new schema does. In that situation the old database
87 # may contain a transaction that creates a record followed by a
88 # transaction that creates the first use of the record. Replaying that
89 # series of transactions against the new database schema (as "convert"
90 # does) would cause the record to be dropped by the first transaction,
91 # then the second transaction would cause a referential integrity
92 # failure (for a strong reference).
94 # Errors might occur on an Open vSwitch downgrade if ovsdb-tool doesn't
95 # understand some feature of the schema used in the OVSDB version that
96 # we're downgrading from, so we don't give up on error.
97 action "Compacting database" ovsdb_tool compact "$DB_FILE"
99 # Upgrade or downgrade schema.
100 if action "Converting database schema" ovsdb_tool convert "$DB_FILE" "$DB_SCHEMA"; then
103 log_warning_msg "Schema conversion failed, using empty database instead"
111 set ovs_vsctl set Open_vSwitch .
113 OVS_VERSION=`ovs-vswitchd --version | sed 's/.*) //;1q'`
114 set "$@" ovs-version="$OVS_VERSION"
118 id_file=$etcdir/system-id.conf
119 uuid_file=$etcdir/install_uuid.conf
120 if test -e "$id_file"; then
121 SYSTEM_ID=`cat "$id_file"`
122 elif test -e "$uuid_file"; then
123 # Migrate from old file name.
125 SYSTEM_ID=$INSTALLATION_UUID
126 echo "$SYSTEM_ID" > "$id_file"
127 elif SYSTEM_ID=`uuidgen`; then
128 echo "$SYSTEM_ID" > "$id_file"
130 log_failure_msg "missing uuidgen, could not generate system ID"
135 log_failure_msg "system ID not configured, please use --system-id"
141 set "$@" external-ids:system-id="\"$SYSTEM_ID\""
143 if test X"$SYSTEM_TYPE" != X; then
144 set "$@" system-type="\"$SYSTEM_TYPE\""
146 log_failure_msg "no default system type, please use --system-type"
149 if test X"$SYSTEM_VERSION" != X; then
150 set "$@" system-version="\"$SYSTEM_VERSION\""
152 log_failure_msg "no default system version, please use --system-version"
155 action "Configuring Open vSwitch system IDs" "$@" $extra_ids
158 check_force_cores () {
159 if test X"$FORCE_COREFILES" = Xyes; then
167 if daemon_is_running ovsdb-server; then
168 log_success_msg "ovsdb-server is already running"
170 # Create initial database or upgrade database schema.
171 upgrade_db || return 1
173 # Start ovsdb-server.
174 set ovsdb-server "$DB_FILE"
175 for db in $EXTRA_DBS; do
181 if test ! -f "$db"; then
182 log_warning_msg "$db (from \$EXTRA_DBS) does not exist."
183 elif ovsdb-tool db-version "$db" >/dev/null; then
186 log_warning_msg "$db (from \$EXTRA_DBS) cannot be read as a database (see error message above)"
189 set "$@" -vconsole:emer -vsyslog:err -vfile:info
190 set "$@" --remote=punix:"$DB_SOCK"
191 set "$@" --remote=db:Open_vSwitch,Open_vSwitch,manager_options
192 set "$@" --private-key=db:Open_vSwitch,SSL,private_key
193 set "$@" --certificate=db:Open_vSwitch,SSL,certificate
194 set "$@" --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert
195 start_daemon "$OVSDB_SERVER_PRIORITY" "$OVSDB_SERVER_WRAPPER" "$@" \
198 # Initialize database settings.
199 ovs_vsctl -- init -- set Open_vSwitch . db-version="$schemaver" \
201 set_system_ids || return 1
202 if test X"$DELETE_BRIDGES" = Xyes; then
203 for bridge in `ovs_vsctl list-br`; do
204 ovs_vsctl del-br $bridge
210 start_forwarding () {
213 insert_mod_if_required || return 1
215 if daemon_is_running ovs-vswitchd; then
216 log_success_msg "ovs-vswitchd is already running"
218 # Increase the limit on the number of open file descriptors.
219 # On Linux, ovs-vswitchd needs about one file descriptor per
220 # switch port, so this allows a very large number of switch
224 # Start ovs-vswitchd.
225 set ovs-vswitchd unix:"$DB_SOCK"
226 set "$@" -vconsole:emer -vsyslog:err -vfile:info
227 if test X"$MLOCKALL" != Xno; then
230 start_daemon "$OVS_VSWITCHD_PRIORITY" "$OVS_VSWITCHD_WRAPPER" "$@"
239 stop_daemon ovsdb-server
243 stop_daemon ovs-vswitchd
246 ## ----------------- ##
247 ## force-reload-kmod ##
248 ## ----------------- ##
250 internal_interfaces () {
251 # Outputs a list of internal interfaces:
253 # - There is an internal interface for every bridge, whether it
254 # has an Interface record or not and whether the Interface
255 # record's 'type' is properly set or not.
257 # - There is an internal interface for each Interface record whose
258 # 'type' is 'internal'.
260 # But ignore interfaces that don't really exist.
261 for d in `(ovs_vsctl --bare \
262 -- --columns=name find Interface type=internal \
263 -- list-br) | sort -u`
265 if test -e "/sys/class/net/$d"; then
272 bridges=`ovs_vsctl -- --real list-br`
273 if [ -n "${bridges}" ] && \
274 "$datadir/scripts/ovs-save" "$1" ${bridges} > "$2"; then
278 [ -z "${bridges}" ] && return 0
281 save_ofports_if_required () {
282 # Save ofports if we are upgrading from a pre-1.10 branch.
283 case `ovs-appctl version | sed 1q` in
284 "ovs-vswitchd (Open vSwitch) 1."[0-9].*)
285 action "Saving ofport values" ovs_save save-ofports \
294 "$datadir/scripts/ovs-save" save-interfaces ${ifaces} \
295 > "${script_interfaces}"
299 [ -x "${script_ofports}" ] && \
300 action "Restoring ofport values" "${script_ofports}"
304 [ -x "${script_flows}" ] && \
305 action "Restoring saved flows" "${script_flows}"
308 restore_interfaces () {
309 [ ! -x "${script_interfaces}" ] && return 0
310 action "Restoring interface configuration" "${script_interfaces}"
312 if test $rc = 0; then
317 log="logger -p daemon.$level -t ovs-save"
318 $log "force-reload-kmod interface restore script exited with status $rc:"
319 $log -f "$script_interfaces"
322 init_restore_scripts () {
323 script_interfaces=`mktemp`
324 script_flows=`mktemp`
325 script_ofports=`mktemp`
326 trap 'rm -f "${script_interfaces}" "${script_flows}" "${script_ofports}"' 0
329 force_reload_kmod () {
330 ifaces=`internal_interfaces`
331 action "Detected internal interfaces: $ifaces" true
335 action "Saving flows" ovs_save save-flows "${script_flows}"
337 save_ofports_if_required
339 # Restart the database first, since a large database may take a
340 # while to load, and we want to minimize forwarding disruption.
344 # Restore of ofports should happen before vswitchd is restarted.
349 if action "Saving interface configuration" save_interfaces; then
352 log_warning_msg "Failed to save configuration, not replacing kernel module"
356 chmod +x "$script_interfaces"
358 for dp in `ovs-dpctl dump-dps`; do
359 action "Removing datapath: $dp" ovs-dpctl del-dp "$dp"
362 # try both old and new names in case this is post upgrade
363 if test -e /sys/module/openvswitch_mod; then
364 action "Removing openvswitch module" rmmod openvswitch_mod
365 elif test -e /sys/module/openvswitch; then
366 action "Removing openvswitch module" rmmod openvswitch
375 "$datadir/scripts/ovs-check-dead-ifs"
383 if daemon_is_running ovsdb-server && daemon_is_running ovs-vswitchd; then
384 script_flows=`mktemp`
385 trap 'rm -f "${script_flows}"' 0
387 action "Saving flows" ovs_save save-flows "${script_flows}" \
391 # Restart the database first, since a large database may take a
392 # while to load, and we want to minimize forwarding disruption.
399 # Restore the saved flows. Do not return error if restore fails.
400 restore_flows || true
403 ## --------------- ##
404 ## enable-protocol ##
405 ## --------------- ##
408 # Translate the protocol name to a number, because "iptables -n -L" prints
409 # some protocols by name (despite the -n) and therefore we need to look for
412 # (iptables -S output is more uniform but old iptables doesn't have it.)
413 protonum=`grep "^$PROTOCOL[ ]" /etc/protocols | awk '{print $2}'`
414 if expr X"$protonum" : X'[0-9]\{1,\}$' > /dev/null; then :; else
415 log_failure_msg "unknown protocol $PROTOCOL"
420 match="(\$2 == \"$PROTOCOL\" || \$2 == $protonum)"
421 insert="iptables -I INPUT -p $PROTOCOL"
422 if test X"$DPORT" != X; then
423 name="$name to port $DPORT"
424 match="$match && /dpt:$DPORT/"
425 insert="$insert --dport $DPORT"
427 if test X"$SPORT" != X; then
428 name="$name from port $SPORT"
429 match="$match && /spt:$SPORT/"
430 insert="$insert --sport $SPORT"
432 insert="$insert -j ACCEPT"
434 if (iptables -n -L INPUT) >/dev/null 2>&1; then
435 if iptables -n -L INPUT | awk "$match { n++ } END { exit n == 0 }"
437 # There's already a rule for this protocol. Don't override it.
438 log_success_msg "iptables already has a rule for $name, not explicitly enabling"
440 action "Enabling $name with iptables" $insert
442 elif (iptables --version) >/dev/null 2>&1; then
443 action "cannot list iptables rules, not adding a rule for $name"
445 action "iptables binary not installed, not adding a rule for $name"
461 OVSDB_SERVER_PRIORITY=-10
462 OVS_VSWITCHD_PRIORITY=-10
463 OVSDB_SERVER_WRAPPER=
464 OVS_VSWITCHD_WRAPPER=
466 DB_FILE=$dbdir/conf.db
467 DB_SOCK=$rundir/db.sock
468 DB_SCHEMA=$datadir/vswitch.ovsschema
475 type_file=$etcdir/system-type.conf
476 version_file=$etcdir/system-version.conf
478 if test -e "$type_file" ; then
479 SYSTEM_TYPE=`cat $type_file`
480 SYSTEM_VERSION=`cat $version_file`
481 elif (lsb_release --id) >/dev/null 2>&1; then
482 SYSTEM_TYPE=`lsb_release --id -s`
483 system_release=`lsb_release --release -s`
484 system_codename=`lsb_release --codename -s`
485 SYSTEM_VERSION="${system_release}-${system_codename}"
488 SYSTEM_VERSION=unknown
495 $0: controls Open vSwitch daemons
496 usage: $0 [OPTIONS] COMMAND
498 This program is intended to be invoked internally by Open vSwitch startup
499 scripts. System administrators should not normally invoke it directly.
502 start start Open vSwitch daemons
503 stop stop Open vSwitch daemons
504 restart stop and start Open vSwitch daemons
505 status check whether Open vSwitch daemons are running
506 version print versions of Open vSwitch daemons
507 load-kmod insert modules if not already present
508 force-reload-kmod save OVS network device state, stop OVS, unload kernel
509 module, reload kernel module, start OVS, restore state
510 enable-protocol enable protocol specified in options with iptables
511 help display this help message
513 One of the following options is required for "start", "restart" and "force-reload-kmod":
514 --system-id=UUID set specific ID to uniquely identify this system
515 --system-id=random use a random but persistent UUID to identify this system
517 Other important options for "start", "restart" and "force-reload-kmod":
518 --system-type=TYPE set system type (e.g. "XenServer")
519 --system-version=VERSION set system version (e.g. "5.6.100-39265p")
520 --external-id="key=value"
521 add given key-value pair to Open_vSwitch external-ids
522 --delete-bridges delete all bridges just before starting ovs-vswitchd
524 Less important options for "start", "restart" and "force-reload-kmod":
525 --daemon-cwd=DIR set working dir for OVS daemons (default: $DAEMON_CWD)
526 --no-force-corefiles do not force on core dumps for OVS daemons
527 --no-mlockall do not lock all of ovs-vswitchd into memory
528 --ovsdb-server-priority=NICE set ovsdb-server's niceness (default: $OVSDB_SERVER_PRIORITY)
529 --ovs-vswitchd-priority=NICE set ovs-vswitchd's niceness (default: $OVS_VSWITCHD_PRIORITY)
531 Debugging options for "start", "restart" and "force-reload-kmod":
532 --ovsdb-server-wrapper=WRAPPER
533 --ovs-vswitchd-wrapper=WRAPPER
534 --ovs-vswitchd-wrapper=WRAPPER
535 run specified daemon under WRAPPER (either 'valgrind' or 'strace')
537 File location options:
538 --db-file=FILE database file name (default: $DB_FILE)
539 --db-sock=SOCKET JSON-RPC socket name (default: $DB_SOCK)
540 --db-schema=FILE database schema file name (default: $DB_SCHEMA)
542 Options for "enable-protocol":
543 --protocol=PROTOCOL protocol to enable with iptables (default: gre)
544 --sport=PORT source port to match (for tcp or udp protocol)
545 --dport=PORT ddestination port to match (for tcp or udp protocol)
548 -h, --help display this help message
549 -V, --version display version information
551 Default directories with "configure" option and environment variable override:
552 logs: @LOGDIR@ (--with-logdir, OVS_LOGDIR)
553 pidfiles and sockets: @RUNDIR@ (--with-rundir, OVS_RUNDIR)
554 conf.db: @DBDIR@ (--with-dbdir, OVS_DBDIR)
555 system configuration: @sysconfdir@ (--sysconfdir, OVS_SYSCONFDIR)
556 data files: @pkgdatadir@ (--pkgdatadir, OVS_PKGDATADIR)
557 user binaries: @bindir@ (--bindir, OVS_BINDIR)
558 system binaries: @sbindir@ (--sbindir, OVS_SBINDIR)
560 Please report bugs to bugs@openvswitch.org (see REPORTING-BUGS for details).
567 var=`echo "$option" | tr abcdefghijklmnopqrstuvwxyz- ABCDEFGHIJKLMNOPQRSTUVWXYZ_`
568 eval set=\${$var+yes}
569 eval old_value=\$$var
570 if test X$set = X || \
571 (test $type = bool && \
572 test X"$old_value" != Xno && test X"$old_value" != Xyes); then
573 echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
580 echo ovsdb-server ovs-vswitchd
593 echo "$0 (Open vSwitch) $VERSION"
597 value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
600 extra_ids="$extra_ids external-ids:$value"
603 echo >&2 "$0: --external-id argument not in the form \"key=value\""
609 option=`expr X"$arg" : 'X--\([^=]*\)'`
610 value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
615 option=`expr X"$arg" : 'X--no-\(.*\)'`
621 option=`expr X"$arg" : 'X--\(.*\)'`
627 echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
631 if test X"$command" = X; then
634 echo >&2 "$0: exactly one non-option argument required (use --help for help)"
654 for daemon in `daemons`; do
655 daemon_status $daemon || rc=$?
660 for daemon in `daemons`; do
668 insert_mod_if_required
677 echo >&2 "$0: missing command name (use --help for help)"
681 echo >&2 "$0: unknown command \"$command\" (use --help for help)"