]>
Commit | Line | Data |
---|---|---|
43bb5f82 | 1 | #! /bin/sh |
a7577088 | 2 | # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 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 | ||
16 | case $0 in | |
17 | */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` ;; | |
18 | *) dir0=./ ;; | |
19 | esac | |
d422c118 | 20 | . "$dir0/ovs-lib" || exit 1 |
43bb5f82 BP |
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 | ||
a6df8ea0 TG |
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 | ||
0a69a5e4 | 46 | insert_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 | ||
75 | ovs_vsctl () { | |
fba6bd1d | 76 | ovs-vsctl --no-wait "$@" |
43bb5f82 BP |
77 | } |
78 | ||
43bb5f82 BP |
79 | set_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 | 127 | check_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 |
133 | del_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 |
139 | start_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 |
187 | add_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 |
200 | start_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 |
231 | stop_ovsdb () { |
232 | stop_daemon ovsdb-server | |
233 | } | |
234 | ||
235 | stop_forwarding () { | |
43bb5f82 | 236 | stop_daemon ovs-vswitchd |
43bb5f82 BP |
237 | } |
238 | ||
239 | ## ----------------- ## | |
240 | ## force-reload-kmod ## | |
241 | ## ----------------- ## | |
242 | ||
243 | internal_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 |
264 | ovs_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 | ||
274 | save_ofports_if_required () { | |
a7577088 BP |
275 | # Save OpenFlow port numbers if we are upgrading from a pre-1.10 branch. |
276 | # | |
277 | # (Versions 1.10 and later save OpenFlow port numbers without assistance, | |
278 | # so we don't have to do anything for them. | |
16774462 GS |
279 | case `ovs-appctl version | sed 1q` in |
280 | "ovs-vswitchd (Open vSwitch) 1."[0-9].*) | |
281 | action "Saving ofport values" ovs_save save-ofports \ | |
737af96d | 282 | "${script_ofports}" |
16774462 | 283 | ;; |
16774462 | 284 | esac |
a4175433 GS |
285 | } |
286 | ||
24605d4e SH |
287 | save_flows_if_required () { |
288 | if test X"$DELETE_BRIDGES" != Xyes; then | |
289 | action "Saving flows" ovs_save save-flows "${script_flows}" | |
290 | fi | |
291 | } | |
292 | ||
751d0ddb | 293 | save_interfaces () { |
a4175433 GS |
294 | "$datadir/scripts/ovs-save" save-interfaces ${ifaces} \ |
295 | > "${script_interfaces}" | |
296 | } | |
297 | ||
16774462 | 298 | restore_ofports () { |
737af96d | 299 | [ -x "${script_ofports}" ] && \ |
16774462 GS |
300 | action "Restoring ofport values" "${script_ofports}" |
301 | } | |
302 | ||
407b1473 GS |
303 | flow_restore_wait () { |
304 | ovs_vsctl set open_vswitch . other_config:flow-restore-wait="true" | |
305 | } | |
306 | ||
307 | flow_restore_complete () { | |
308 | ovs_vsctl --if-exists remove open_vswitch . other_config \ | |
309 | flow-restore-wait="true" | |
310 | } | |
311 | ||
a4175433 | 312 | restore_flows () { |
737af96d | 313 | [ -x "${script_flows}" ] && \ |
a4175433 | 314 | action "Restoring saved flows" "${script_flows}" |
751d0ddb BP |
315 | } |
316 | ||
737af96d GS |
317 | restore_interfaces () { |
318 | [ ! -x "${script_interfaces}" ] && return 0 | |
319 | action "Restoring interface configuration" "${script_interfaces}" | |
320 | rc=$? | |
321 | if test $rc = 0; then | |
322 | level=debug | |
323 | else | |
324 | level=err | |
325 | fi | |
326 | log="logger -p daemon.$level -t ovs-save" | |
a3a0a7a0 | 327 | $log "interface restore script exited with status $rc:" |
737af96d GS |
328 | $log -f "$script_interfaces" |
329 | } | |
43bb5f82 | 330 | |
737af96d | 331 | init_restore_scripts () { |
a4175433 | 332 | script_interfaces=`mktemp` |
a4175433 | 333 | script_flows=`mktemp` |
16774462 GS |
334 | script_ofports=`mktemp` |
335 | trap 'rm -f "${script_interfaces}" "${script_flows}" "${script_ofports}"' 0 | |
737af96d | 336 | } |
a4175433 | 337 | |
737af96d GS |
338 | force_reload_kmod () { |
339 | ifaces=`internal_interfaces` | |
340 | action "Detected internal interfaces: $ifaces" true | |
341 | ||
342 | init_restore_scripts | |
24605d4e | 343 | save_flows_if_required |
16774462 | 344 | save_ofports_if_required |
a4175433 | 345 | |
522839ab JP |
346 | # Restart the database first, since a large database may take a |
347 | # while to load, and we want to minimize forwarding disruption. | |
348 | stop_ovsdb | |
349 | start_ovsdb | |
350 | ||
16774462 GS |
351 | # Restore of ofports should happen before vswitchd is restarted. |
352 | restore_ofports | |
353 | ||
522839ab | 354 | stop_forwarding |
43bb5f82 | 355 | |
bb9f6963 | 356 | if action "Saving interface configuration" save_interfaces; then |
43bb5f82 BP |
357 | : |
358 | else | |
359 | log_warning_msg "Failed to save configuration, not replacing kernel module" | |
522839ab | 360 | start_forwarding |
1259a0c4 | 361 | add_managers |
43bb5f82 BP |
362 | exit 1 |
363 | fi | |
a4175433 GS |
364 | chmod +x "$script_interfaces" |
365 | ||
0311d4f4 | 366 | for dp in `ovs-dpctl dump-dps`; do |
de061b24 | 367 | action "Removing datapath: $dp" ovs-dpctl del-dp "$dp" |
43bb5f82 BP |
368 | done |
369 | ||
a6df8ea0 TG |
370 | for vport in `awk '/^vport_/ { print $1 }' /proc/modules`; do |
371 | action "Removing $vport module" rmmod $vport | |
372 | if ! grep -q $vport /proc/modules; then | |
373 | removed_vports="$removed_vports $vport" | |
374 | fi | |
375 | done | |
376 | ||
9b80f761 | 377 | # try both old and new names in case this is post upgrade |
43bb5f82 BP |
378 | if test -e /sys/module/openvswitch_mod; then |
379 | action "Removing openvswitch module" rmmod openvswitch_mod | |
9b80f761 CW |
380 | elif test -e /sys/module/openvswitch; then |
381 | action "Removing openvswitch module" rmmod openvswitch | |
43bb5f82 BP |
382 | fi |
383 | ||
407b1473 GS |
384 | # Start vswitchd by asking it to wait till flow restore is finished. |
385 | flow_restore_wait | |
522839ab | 386 | start_forwarding |
43bb5f82 | 387 | |
407b1473 | 388 | # Restore saved flows and inform vswitchd that we are done. |
a4175433 | 389 | restore_flows |
407b1473 | 390 | flow_restore_complete |
1259a0c4 | 391 | add_managers |
a4175433 | 392 | |
737af96d | 393 | restore_interfaces |
2dc7590d BP |
394 | |
395 | "$datadir/scripts/ovs-check-dead-ifs" | |
43bb5f82 BP |
396 | } |
397 | ||
a4175433 GS |
398 | ## ------- ## |
399 | ## restart ## | |
400 | ## ------- ## | |
401 | ||
a3a0a7a0 GS |
402 | save_interfaces_if_required () { |
403 | # Save interfaces if we are upgrading from a pre-1.10 branch. | |
404 | case `ovs-appctl version | sed 1q` in | |
405 | "ovs-vswitchd (Open vSwitch) 1."[0-9].*) | |
406 | ifaces=`internal_interfaces` | |
407 | action "Detected internal interfaces: $ifaces" true | |
408 | if action "Saving interface configuration" save_interfaces; then | |
409 | chmod +x "$script_interfaces" | |
410 | fi | |
411 | ;; | |
412 | esac | |
413 | } | |
414 | ||
a4175433 | 415 | restart () { |
03d589af | 416 | if daemon_is_running ovsdb-server && daemon_is_running ovs-vswitchd; then |
a3a0a7a0 GS |
417 | init_restore_scripts |
418 | save_interfaces_if_required | |
24605d4e | 419 | save_flows_if_required |
a3a0a7a0 | 420 | save_ofports_if_required |
03d589af | 421 | fi |
a4175433 GS |
422 | |
423 | # Restart the database first, since a large database may take a | |
424 | # while to load, and we want to minimize forwarding disruption. | |
425 | stop_ovsdb | |
426 | start_ovsdb | |
427 | ||
a3a0a7a0 GS |
428 | # Restore of ofports, if required, should happen before vswitchd is |
429 | # restarted. | |
430 | restore_ofports | |
431 | ||
a4175433 | 432 | stop_forwarding |
407b1473 GS |
433 | |
434 | # Start vswitchd by asking it to wait till flow restore is finished. | |
435 | flow_restore_wait | |
a4175433 GS |
436 | start_forwarding |
437 | ||
407b1473 | 438 | # Restore saved flows and inform vswitchd that we are done. |
a3a0a7a0 | 439 | restore_flows |
407b1473 | 440 | flow_restore_complete |
1259a0c4 | 441 | add_managers |
a3a0a7a0 GS |
442 | |
443 | # Restore the interfaces if required. Return true even if restore fails. | |
444 | restore_interfaces || true | |
a4175433 GS |
445 | } |
446 | ||
b3a375f2 BP |
447 | ## --------------- ## |
448 | ## enable-protocol ## | |
449 | ## --------------- ## | |
450 | ||
451 | enable_protocol () { | |
b053c7c1 BP |
452 | # Translate the protocol name to a number, because "iptables -n -L" prints |
453 | # some protocols by name (despite the -n) and therefore we need to look for | |
454 | # both forms. | |
455 | # | |
456 | # (iptables -S output is more uniform but old iptables doesn't have it.) | |
457 | protonum=`grep "^$PROTOCOL[ ]" /etc/protocols | awk '{print $2}'` | |
458 | if expr X"$protonum" : X'[0-9]\{1,\}$' > /dev/null; then :; else | |
459 | log_failure_msg "unknown protocol $PROTOCOL" | |
460 | return 1 | |
461 | fi | |
462 | ||
b3a375f2 | 463 | name=$PROTOCOL |
b053c7c1 BP |
464 | match="(\$2 == \"$PROTOCOL\" || \$2 == $protonum)" |
465 | insert="iptables -I INPUT -p $PROTOCOL" | |
b3a375f2 | 466 | if test X"$DPORT" != X; then |
b3a375f2 | 467 | name="$name to port $DPORT" |
b053c7c1 BP |
468 | match="$match && /dpt:$DPORT/" |
469 | insert="$insert --dport $DPORT" | |
b3a375f2 BP |
470 | fi |
471 | if test X"$SPORT" != X; then | |
b3a375f2 | 472 | name="$name from port $SPORT" |
b053c7c1 BP |
473 | match="$match && /spt:$SPORT/" |
474 | insert="$insert --sport $SPORT" | |
b3a375f2 | 475 | fi |
b3a375f2 BP |
476 | insert="$insert -j ACCEPT" |
477 | ||
b053c7c1 BP |
478 | if (iptables -n -L INPUT) >/dev/null 2>&1; then |
479 | if iptables -n -L INPUT | awk "$match { n++ } END { exit n == 0 }" | |
480 | then | |
481 | # There's already a rule for this protocol. Don't override it. | |
482 | log_success_msg "iptables already has a rule for $name, not explicitly enabling" | |
483 | else | |
484 | action "Enabling $name with iptables" $insert | |
485 | fi | |
b3a375f2 | 486 | elif (iptables --version) >/dev/null 2>&1; then |
b3a375f2 | 487 | action "cannot list iptables rules, not adding a rule for $name" |
2ae9d860 BP |
488 | else |
489 | action "iptables binary not installed, not adding a rule for $name" | |
b3a375f2 BP |
490 | fi |
491 | } | |
492 | ||
43bb5f82 BP |
493 | ## ---- ## |
494 | ## main ## | |
495 | ## ---- ## | |
496 | ||
497 | set_defaults () { | |
498 | SYSTEM_ID= | |
499 | ||
500 | DELETE_BRIDGES=no | |
54b21db7 | 501 | DELETE_TRANSIENT_PORTS=no |
43bb5f82 BP |
502 | |
503 | DAEMON_CWD=/ | |
504 | FORCE_COREFILES=yes | |
505 | MLOCKALL=yes | |
506 | OVSDB_SERVER_PRIORITY=-10 | |
507 | OVS_VSWITCHD_PRIORITY=-10 | |
d0c06099 BP |
508 | OVSDB_SERVER_WRAPPER= |
509 | OVS_VSWITCHD_WRAPPER= | |
43bb5f82 | 510 | |
f973f2af | 511 | DB_FILE=$dbdir/conf.db |
43bb5f82 BP |
512 | DB_SOCK=$rundir/db.sock |
513 | DB_SCHEMA=$datadir/vswitch.ovsschema | |
b4e8d170 | 514 | EXTRA_DBS= |
43bb5f82 | 515 | |
b3a375f2 BP |
516 | PROTOCOL=gre |
517 | DPORT= | |
518 | SPORT= | |
519 | ||
a685eb5a GS |
520 | type_file=$etcdir/system-type.conf |
521 | version_file=$etcdir/system-version.conf | |
522 | ||
523 | if test -e "$type_file" ; then | |
524 | SYSTEM_TYPE=`cat $type_file` | |
525 | SYSTEM_VERSION=`cat $version_file` | |
526 | elif (lsb_release --id) >/dev/null 2>&1; then | |
43bb5f82 BP |
527 | SYSTEM_TYPE=`lsb_release --id -s` |
528 | system_release=`lsb_release --release -s` | |
529 | system_codename=`lsb_release --codename -s` | |
530 | SYSTEM_VERSION="${system_release}-${system_codename}" | |
531 | else | |
532 | SYSTEM_TYPE=unknown | |
533 | SYSTEM_VERSION=unknown | |
534 | fi | |
535 | } | |
536 | ||
537 | usage () { | |
538 | set_defaults | |
539 | cat <<EOF | |
540 | $0: controls Open vSwitch daemons | |
541 | usage: $0 [OPTIONS] COMMAND | |
542 | ||
543 | This program is intended to be invoked internally by Open vSwitch startup | |
544 | scripts. System administrators should not normally invoke it directly. | |
545 | ||
546 | Commands: | |
547 | start start Open vSwitch daemons | |
548 | stop stop Open vSwitch daemons | |
a4175433 | 549 | restart stop and start Open vSwitch daemons |
43bb5f82 BP |
550 | status check whether Open vSwitch daemons are running |
551 | version print versions of Open vSwitch daemons | |
da3db88f | 552 | load-kmod insert modules if not already present |
43bb5f82 BP |
553 | force-reload-kmod save OVS network device state, stop OVS, unload kernel |
554 | module, reload kernel module, start OVS, restore state | |
b3a375f2 | 555 | enable-protocol enable protocol specified in options with iptables |
43bb5f82 BP |
556 | help display this help message |
557 | ||
a4175433 | 558 | One of the following options is required for "start", "restart" and "force-reload-kmod": |
43bb5f82 BP |
559 | --system-id=UUID set specific ID to uniquely identify this system |
560 | --system-id=random use a random but persistent UUID to identify this system | |
561 | ||
a4175433 | 562 | Other important options for "start", "restart" and "force-reload-kmod": |
43bb5f82 BP |
563 | --system-type=TYPE set system type (e.g. "XenServer") |
564 | --system-version=VERSION set system version (e.g. "5.6.100-39265p") | |
565 | --external-id="key=value" | |
566 | add given key-value pair to Open_vSwitch external-ids | |
567 | --delete-bridges delete all bridges just before starting ovs-vswitchd | |
568 | ||
a4175433 | 569 | Less important options for "start", "restart" and "force-reload-kmod": |
9fc47ed7 BP |
570 | --daemon-cwd=DIR set working dir for OVS daemons (default: $DAEMON_CWD) |
571 | --no-force-corefiles do not force on core dumps for OVS daemons | |
572 | --no-mlockall do not lock all of ovs-vswitchd into memory | |
573 | --ovsdb-server-priority=NICE set ovsdb-server's niceness (default: $OVSDB_SERVER_PRIORITY) | |
574 | --ovs-vswitchd-priority=NICE set ovs-vswitchd's niceness (default: $OVS_VSWITCHD_PRIORITY) | |
9fc47ed7 | 575 | |
a4175433 | 576 | Debugging options for "start", "restart" and "force-reload-kmod": |
d0c06099 BP |
577 | --ovsdb-server-wrapper=WRAPPER |
578 | --ovs-vswitchd-wrapper=WRAPPER | |
579 | --ovs-vswitchd-wrapper=WRAPPER | |
580 | run specified daemon under WRAPPER (either 'valgrind' or 'strace') | |
581 | ||
43bb5f82 BP |
582 | File location options: |
583 | --db-file=FILE database file name (default: $DB_FILE) | |
584 | --db-sock=SOCKET JSON-RPC socket name (default: $DB_SOCK) | |
585 | --db-schema=FILE database schema file name (default: $DB_SCHEMA) | |
586 | ||
9fc47ed7 | 587 | Options for "enable-protocol": |
b3a375f2 BP |
588 | --protocol=PROTOCOL protocol to enable with iptables (default: gre) |
589 | --sport=PORT source port to match (for tcp or udp protocol) | |
590 | --dport=PORT ddestination port to match (for tcp or udp protocol) | |
591 | ||
43bb5f82 BP |
592 | Other options: |
593 | -h, --help display this help message | |
594 | -V, --version display version information | |
595 | ||
596 | Default directories with "configure" option and environment variable override: | |
f973f2af BP |
597 | logs: @LOGDIR@ (--with-logdir, OVS_LOGDIR) |
598 | pidfiles and sockets: @RUNDIR@ (--with-rundir, OVS_RUNDIR) | |
599 | conf.db: @DBDIR@ (--with-dbdir, OVS_DBDIR) | |
43bb5f82 BP |
600 | system configuration: @sysconfdir@ (--sysconfdir, OVS_SYSCONFDIR) |
601 | data files: @pkgdatadir@ (--pkgdatadir, OVS_PKGDATADIR) | |
602 | user binaries: @bindir@ (--bindir, OVS_BINDIR) | |
603 | system binaries: @sbindir@ (--sbindir, OVS_SBINDIR) | |
604 | ||
605 | Please report bugs to bugs@openvswitch.org (see REPORTING-BUGS for details). | |
606 | EOF | |
607 | ||
608 | exit 0 | |
609 | } | |
610 | ||
611 | set_option () { | |
612 | var=`echo "$option" | tr abcdefghijklmnopqrstuvwxyz- ABCDEFGHIJKLMNOPQRSTUVWXYZ_` | |
613 | eval set=\${$var+yes} | |
614 | eval old_value=\$$var | |
615 | if test X$set = X || \ | |
616 | (test $type = bool && \ | |
617 | test X"$old_value" != Xno && test X"$old_value" != Xyes); then | |
618 | echo >&2 "$0: unknown option \"$arg\" (use --help for help)" | |
619 | return | |
620 | fi | |
621 | eval $var=\$value | |
622 | } | |
623 | ||
9fc47ed7 BP |
624 | daemons () { |
625 | echo ovsdb-server ovs-vswitchd | |
9fc47ed7 BP |
626 | } |
627 | ||
43bb5f82 BP |
628 | set_defaults |
629 | extra_ids= | |
630 | command= | |
631 | for arg | |
632 | do | |
633 | case $arg in | |
634 | -h | --help) | |
635 | usage | |
636 | ;; | |
637 | -V | --version) | |
8a07709c | 638 | echo "$0 (Open vSwitch) $VERSION" |
43bb5f82 BP |
639 | exit 0 |
640 | ;; | |
641 | --external-id=*) | |
642 | value=`expr X"$arg" : 'X[^=]*=\(.*\)'` | |
643 | case $value in | |
644 | *=*) | |
645 | extra_ids="$extra_ids external-ids:$value" | |
646 | ;; | |
647 | *) | |
648 | echo >&2 "$0: --external-id argument not in the form \"key=value\"" | |
649 | exit 1 | |
650 | ;; | |
651 | esac | |
652 | ;; | |
653 | --[a-z]*=*) | |
654 | option=`expr X"$arg" : 'X--\([^=]*\)'` | |
655 | value=`expr X"$arg" : 'X[^=]*=\(.*\)'` | |
656 | type=string | |
657 | set_option | |
658 | ;; | |
659 | --no-[a-z]*) | |
660 | option=`expr X"$arg" : 'X--no-\(.*\)'` | |
661 | value=no | |
662 | type=bool | |
663 | set_option | |
664 | ;; | |
665 | --[a-z]*) | |
666 | option=`expr X"$arg" : 'X--\(.*\)'` | |
667 | value=yes | |
668 | type=bool | |
669 | set_option | |
670 | ;; | |
671 | -*) | |
672 | echo >&2 "$0: unknown option \"$arg\" (use --help for help)" | |
673 | exit 1 | |
674 | ;; | |
675 | *) | |
676 | if test X"$command" = X; then | |
677 | command=$arg | |
678 | else | |
679 | echo >&2 "$0: exactly one non-option argument required (use --help for help)" | |
680 | exit 1 | |
681 | fi | |
682 | ;; | |
683 | esac | |
684 | done | |
685 | case $command in | |
686 | start) | |
9fc789b9 | 687 | start_ovsdb || exit 1 |
522839ab | 688 | start_forwarding |
1259a0c4 | 689 | add_managers |
43bb5f82 BP |
690 | ;; |
691 | stop) | |
522839ab JP |
692 | stop_forwarding |
693 | stop_ovsdb | |
43bb5f82 | 694 | ;; |
a4175433 GS |
695 | restart) |
696 | restart | |
697 | ;; | |
43bb5f82 | 698 | status) |
9fc47ed7 BP |
699 | rc=0 |
700 | for daemon in `daemons`; do | |
701 | daemon_status $daemon || rc=$? | |
702 | done | |
703 | exit $rc | |
43bb5f82 BP |
704 | ;; |
705 | version) | |
9fc47ed7 BP |
706 | for daemon in `daemons`; do |
707 | $daemon --version | |
708 | done | |
43bb5f82 BP |
709 | ;; |
710 | force-reload-kmod) | |
c707d418 | 711 | force_reload_kmod |
43bb5f82 | 712 | ;; |
da3db88f SH |
713 | load-kmod) |
714 | insert_mod_if_required | |
715 | ;; | |
b3a375f2 BP |
716 | enable-protocol) |
717 | enable_protocol | |
718 | ;; | |
43bb5f82 BP |
719 | help) |
720 | usage | |
721 | ;; | |
722 | '') | |
723 | echo >&2 "$0: missing command name (use --help for help)" | |
724 | exit 1 | |
725 | ;; | |
726 | *) | |
727 | echo >&2 "$0: unknown command \"$command\" (use --help for help)" | |
728 | exit 1 | |
729 | ;; | |
730 | esac |