2 # Copyright (C) 2009, 2010, 2011, 2012 Nicira Networks, 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_mod is already loaded then we're done.
35 test -e /sys/module/openvswitch_mod && return 0
37 # Load openvswitch_mod. If that's successful then we're done.
38 action "Inserting openvswitch module" modprobe openvswitch_mod && return 0
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)"
48 action "removing bridge module" rmmod bridge || return 1
50 # Try loading openvswitch_mod again.
51 action "Inserting openvswitch module" modprobe openvswitch_mod
54 insert_brcompat_mod_if_required () {
55 test -e /sys/module/brcompat_mod && return 0
56 action "Inserting brcompat module" modprobe brcompat_mod
59 insert_mod_if_required () {
60 insert_openvswitch_mod_if_required || return 1
61 if test X"$BRCOMPAT" = Xyes; then
62 insert_brcompat_mod_if_required || return 1
67 ovs-vsctl --no-wait --timeout=5 "$@"
71 ovsdb-tool -vANY:console:off "$@"
75 action "Creating empty database $DB_FILE" ovsdb_tool create "$DB_FILE" "$DB_SCHEMA"
79 schemaver=`ovsdb_tool schema-version "$DB_SCHEMA"`
80 if test ! -e "$DB_FILE"; then
81 log_warning_msg "$DB_FILE does not exist"
82 install -d -m 755 -o root -g root `dirname $DB_FILE`
84 elif test X"`ovsdb_tool needs-conversion "$DB_FILE" "$DB_SCHEMA"`" != Xno; then
85 # Back up the old version.
86 version=`ovsdb_tool db-version "$DB_FILE"`
87 cksum=`ovsdb_tool db-cksum "$DB_FILE" | awk '{print $1}'`
88 backup=$DB_FILE.backup$version-$cksum
89 action "Backing up database to $backup" cp "$DB_FILE" "$backup" || return 1
91 # Compact database. This is important if the old schema did not enable
92 # garbage collection (i.e. if it did not have any tables with "isRoot":
93 # true) but the new schema does. In that situation the old database
94 # may contain a transaction that creates a record followed by a
95 # transaction that creates the first use of the record. Replaying that
96 # series of transactions against the new database schema (as "convert"
97 # does) would cause the record to be dropped by the first transaction,
98 # then the second transaction would cause a referential integrity
99 # failure (for a strong reference).
101 # Errors might occur on an Open vSwitch downgrade if ovsdb-tool doesn't
102 # understand some feature of the schema used in the OVSDB version that
103 # we're downgrading from, so we don't give up on error.
104 action "Compacting database" ovsdb_tool compact "$DB_FILE"
106 # Upgrade or downgrade schema.
107 if action "Converting database schema" ovsdb_tool convert "$DB_FILE" "$DB_SCHEMA"; then
110 log_warning_msg "Schema conversion failed, using empty database instead"
118 set ovs_vsctl set Open_vSwitch .
120 OVS_VERSION=`ovs-vswitchd --version | sed 's/.*) //;1q'`
121 set "$@" ovs-version="$OVS_VERSION"
125 id_file=$etcdir/system-id.conf
126 uuid_file=$etcdir/install_uuid.conf
127 if test -e "$id_file"; then
128 SYSTEM_ID=`cat "$id_file"`
129 elif test -e "$uuid_file"; then
130 # Migrate from old file name.
132 SYSTEM_ID=$INSTALLATION_UUID
133 echo "$SYSTEM_ID" > "$id_file"
134 elif SYSTEM_ID=`uuidgen`; then
135 echo "$SYSTEM_ID" > "$id_file"
137 log_failure_msg "missing uuidgen, could not generate system ID"
142 log_failure_msg "system ID not configured, please use --system-id"
148 set "$@" external-ids:system-id="\"$SYSTEM_ID\""
150 if test X"$SYSTEM_TYPE" != X; then
151 set "$@" system-type="\"$SYSTEM_TYPE\""
153 log_failure_msg "no default system type, please use --system-type"
156 if test X"$SYSTEM_VERSION" != X; then
157 set "$@" system-version="\"$SYSTEM_VERSION\""
159 log_failure_msg "no default system version, please use --system-version"
162 action "Configuring Open vSwitch system IDs" "$@" $extra_ids
166 if test X"$FORCE_COREFILES" = Xyes; then
170 insert_mod_if_required || return 1
172 if daemon_is_running ovsdb-server; then
173 log_success_msg "ovsdb-server is already running"
175 # Create initial database or upgrade database schema.
176 upgrade_db || return 1
178 # Start ovsdb-server.
179 set ovsdb-server "$DB_FILE"
180 set "$@" -vANY:CONSOLE:EMER -vANY:SYSLOG:ERR -vANY:FILE:INFO
181 set "$@" --remote=punix:"$DB_SOCK"
182 set "$@" --remote=db:Open_vSwitch,manager_options
183 set "$@" --private-key=db:SSL,private_key
184 set "$@" --certificate=db:SSL,certificate
185 set "$@" --bootstrap-ca-cert=db:SSL,ca_cert
186 start_daemon "$OVSDB_SERVER_PRIORITY" "$@" || return 1
188 # Initialize database settings.
189 ovs_vsctl -- init -- set Open_vSwitch . db-version="$schemaver" \
191 set_system_ids || return 1
192 if test X"$DELETE_BRIDGES" = Xyes; then
193 for bridge in `ovs_vsctl list-br`; do
194 ovs_vsctl del-br $bridge
199 if daemon_is_running ovs-vswitchd; then
200 log_success_msg "ovs-vswitchd is already running"
202 # Increase the limit on the number of open file descriptors.
203 # ovs-vswitchd needs 16 per datapath, plus a few extra, so this
204 # should allow for 256 (or more) bridges.
207 # Start ovs-vswitchd.
208 set ovs-vswitchd unix:"$DB_SOCK"
209 set "$@" -vANY:CONSOLE:EMER -vANY:SYSLOG:ERR -vANY:FILE:INFO
210 if test X"$MLOCKALL" != Xno; then
213 start_daemon "$OVS_VSWITCHD_PRIORITY" "$@"
216 if daemon_is_running ovs-brcompatd; then
217 log_success_msg "ovs-brcompatd is already running"
218 elif test X"$BRCOMPAT" = Xyes; then
220 set "$@" -vANY:CONSOLE:EMER -vANY:SYSLOG:ERR -vANY:FILE:INFO
221 start_daemon "$OVS_BRCOMPATD_PRIORITY" "$@"
230 stop_daemon ovs-brcompatd
231 stop_daemon ovs-vswitchd
232 stop_daemon ovsdb-server
235 ## ----------------- ##
236 ## force-reload-kmod ##
237 ## ----------------- ##
239 internal_interfaces () {
240 # Outputs a list of internal interfaces:
242 # - There is an internal interface for every bridge, whether it
243 # has an Interface record or not and whether the Interface
244 # record's 'type' is properly set or not.
246 # - There is an internal interface for each Interface record whose
247 # 'type' is 'internal'.
249 # But ignore interfaces that don't really exist.
250 for d in `(ovs_vsctl --bare \
251 -- --columns=name find Interface type=internal \
252 -- list-br) | sort -u`
254 if test -e "/sys/class/net/$d"; then
261 "$datadir/scripts/ovs-save" $ifaces > "$script"
264 force_reload_kmod () {
265 ifaces=`internal_interfaces`
266 action "Detected internal interfaces: $ifaces" true
271 trap 'rm -f "$script"' 0 1 2 13 15
272 if action "Saving interface configuration" save_interfaces; then
275 log_warning_msg "Failed to save configuration, not replacing kernel module"
281 for dp in `ovs-dpctl dump-dps`; do
282 action "Removing datapath: $dp" ovs-dpctl del-dp "$dp"
285 if test -e /sys/module/brcompat_mod; then
286 action "Removing brcompat module" rmmod brcompat_mod
288 if test -e /sys/module/openvswitch_mod; then
289 action "Removing openvswitch module" rmmod openvswitch_mod
294 action "Restoring interface configuration" "$script"
296 if test $rc = 0; then
301 log="logger -p daemon.$level -t ovs-save"
302 $log "force-reload-kmod interface restore script exited with status $rc:"
306 ## --------------- ##
307 ## enable-protocol ##
308 ## --------------- ##
311 # Translate the protocol name to a number, because "iptables -n -L" prints
312 # some protocols by name (despite the -n) and therefore we need to look for
315 # (iptables -S output is more uniform but old iptables doesn't have it.)
316 protonum=`grep "^$PROTOCOL[ ]" /etc/protocols | awk '{print $2}'`
317 if expr X"$protonum" : X'[0-9]\{1,\}$' > /dev/null; then :; else
318 log_failure_msg "unknown protocol $PROTOCOL"
323 match="(\$2 == \"$PROTOCOL\" || \$2 == $protonum)"
324 insert="iptables -I INPUT -p $PROTOCOL"
325 if test X"$DPORT" != X; then
326 name="$name to port $DPORT"
327 match="$match && /dpt:$DPORT/"
328 insert="$insert --dport $DPORT"
330 if test X"$SPORT" != X; then
331 name="$name from port $SPORT"
332 match="$match && /spt:$SPORT/"
333 insert="$insert --sport $SPORT"
335 insert="$insert -j ACCEPT"
337 if (iptables -n -L INPUT) >/dev/null 2>&1; then
338 if iptables -n -L INPUT | awk "$match { n++ } END { exit n == 0 }"
340 # There's already a rule for this protocol. Don't override it.
341 log_success_msg "iptables already has a rule for $name, not explicitly enabling"
343 action "Enabling $name with iptables" $insert
345 elif (iptables --version) >/dev/null 2>&1; then
346 action "cannot list iptables rules, not adding a rule for $name"
348 action "iptables binary not installed, not adding a rule for $name"
365 OVSDB_SERVER_PRIORITY=-10
366 OVS_VSWITCHD_PRIORITY=-10
367 OVS_BRCOMPATD_PRIORITY=-10
369 DB_FILE=$etcdir/conf.db
370 DB_SOCK=$rundir/db.sock
371 DB_SCHEMA=$datadir/vswitch.ovsschema
377 type_file=$etcdir/system-type.conf
378 version_file=$etcdir/system-version.conf
380 if test -e "$type_file" ; then
381 SYSTEM_TYPE=`cat $type_file`
382 SYSTEM_VERSION=`cat $version_file`
383 elif (lsb_release --id) >/dev/null 2>&1; then
384 SYSTEM_TYPE=`lsb_release --id -s`
385 system_release=`lsb_release --release -s`
386 system_codename=`lsb_release --codename -s`
387 SYSTEM_VERSION="${system_release}-${system_codename}"
390 SYSTEM_VERSION=unknown
397 $0: controls Open vSwitch daemons
398 usage: $0 [OPTIONS] COMMAND
400 This program is intended to be invoked internally by Open vSwitch startup
401 scripts. System administrators should not normally invoke it directly.
404 start start Open vSwitch daemons
405 stop stop Open vSwitch daemons
406 status check whether Open vSwitch daemons are running
407 version print versions of Open vSwitch daemons
408 load-kmod insert modules if not already present
409 force-reload-kmod save OVS network device state, stop OVS, unload kernel
410 module, reload kernel module, start OVS, restore state
411 enable-protocol enable protocol specified in options with iptables
412 help display this help message
414 One of the following options is required for "start" and "force-reload-kmod":
415 --system-id=UUID set specific ID to uniquely identify this system
416 --system-id=random use a random but persistent UUID to identify this system
418 Other important options for "start" and "force-reload-kmod":
419 --system-type=TYPE set system type (e.g. "XenServer")
420 --system-version=VERSION set system version (e.g. "5.6.100-39265p")
421 --external-id="key=value"
422 add given key-value pair to Open_vSwitch external-ids
423 --delete-bridges delete all bridges just before starting ovs-vswitchd
425 Less important options for "start" and "force-reload-kmod":
426 --daemon-cwd=DIR set working dir for OVS daemons (default: $DAEMON_CWD)
427 --no-force-corefiles do not force on core dumps for OVS daemons
428 --no-mlockall do not lock all of ovs-vswitchd into memory
429 --ovsdb-server-priority=NICE set ovsdb-server's niceness (default: $OVSDB_SERVER_PRIORITY)
430 --ovs-vswitchd-priority=NICE set ovs-vswitchd's niceness (default: $OVS_VSWITCHD_PRIORITY)
431 --ovs-brcompatd-priority=NICE set ovs-brcompatd's niceness (default: $OVS_BRCOMPATD_PRIORITY)
433 Options for "start", "force-reload-kmod", "load-kmod", "status", and "version":
434 --brcompat enable Linux bridge compatibility module and daemon
436 File location options:
437 --db-file=FILE database file name (default: $DB_FILE)
438 --db-sock=SOCKET JSON-RPC socket name (default: $DB_SOCK)
439 --db-schema=FILE database schema file name (default: $DB_SCHEMA)
441 Options for "enable-protocol":
442 --protocol=PROTOCOL protocol to enable with iptables (default: gre)
443 --sport=PORT source port to match (for tcp or udp protocol)
444 --dport=PORT ddestination port to match (for tcp or udp protocol)
447 -h, --help display this help message
448 -V, --version display version information
450 Default directories with "configure" option and environment variable override:
451 logs: @LOGDIR@ (--log-dir, OVS_LOGDIR)
452 pidfiles and sockets: @RUNDIR@ (--run-dir, OVS_RUNDIR)
453 system configuration: @sysconfdir@ (--sysconfdir, OVS_SYSCONFDIR)
454 data files: @pkgdatadir@ (--pkgdatadir, OVS_PKGDATADIR)
455 user binaries: @bindir@ (--bindir, OVS_BINDIR)
456 system binaries: @sbindir@ (--sbindir, OVS_SBINDIR)
458 Please report bugs to bugs@openvswitch.org (see REPORTING-BUGS for details).
465 var=`echo "$option" | tr abcdefghijklmnopqrstuvwxyz- ABCDEFGHIJKLMNOPQRSTUVWXYZ_`
466 eval set=\${$var+yes}
467 eval old_value=\$$var
468 if test X$set = X || \
469 (test $type = bool && \
470 test X"$old_value" != Xno && test X"$old_value" != Xyes); then
471 echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
478 echo ovsdb-server ovs-vswitchd
479 if test X"$BRCOMPAT" = Xyes; then
494 echo "$0 (Open vSwitch) $VERSION$BUILDNR"
498 value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
501 extra_ids="$extra_ids external-ids:$value"
504 echo >&2 "$0: --external-id argument not in the form \"key=value\""
510 option=`expr X"$arg" : 'X--\([^=]*\)'`
511 value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
516 option=`expr X"$arg" : 'X--no-\(.*\)'`
522 option=`expr X"$arg" : 'X--\(.*\)'`
528 echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
532 if test X"$command" = X; then
535 echo >&2 "$0: exactly one non-option argument required (use --help for help)"
550 for daemon in `daemons`; do
551 daemon_status $daemon || rc=$?
556 for daemon in `daemons`; do
564 insert_mod_if_required
573 echo >&2 "$0: missing command name (use --help for help)"
577 echo >&2 "$0: unknown command \"$command\" (use --help for help)"