-}
-
-function start_daemon {
- local DAEMON=$1
- shift
- local BINARY=$1
-
- # cd to daemon's run_dir so core files get dumped into a sensible place.
- eval local run_dir=\$${DAEMON}_RUN_DIR
- if [ ! -d "$run_dir" ]; then
- install -d -m 755 -o root -g root "$run_dir"
- fi
- cd "$run_dir"
-
- # Configure log levels.
- eval local syslog_loglevel=\$${DAEMON}_SYSLOG_LOGLEVEL
- eval local file_loglevel=\$${DAEMON}_FILE_LOGLEVEL
- eval local logfile=\$${DAEMON}_LOGFILE
- set -- "$@" -vANY:CONSOLE:EMER -vANY:SYSLOG:"$syslog_loglevel"
- if test -n "$file_loglevel" && test -n "$logfile"; then
- install -d -m 755 -o root -g root `dirname "$logfile"`
- set -- "$@" --log-file="$logfile" -vANY:FILE:"$file_loglevel"
- fi
-
- # Configure leak checker.
- eval local memleak_logfile=\$${DAEMON}_MEMLEAK_LOGFILE
- if test -n "$memleak_logfile"; then
- set -- "$@" --check-leaks="$memleak_logfile"
- if test -e "$memleak_logfile"; then
- mv "$memleak_logfile" "$memleak_logfile.prev"
- fi
- fi
-
- # Configure debugging wrappers.
- eval local strace_log=\$${DAEMON}_STRACE_LOG
- eval local strace_opt=\$${DAEMON}_STRACE_OPT
- eval local valgrind_log=\$${DAEMON}_VALGRIND_LOG
- eval local valgrind_opt=\$${DAEMON}_VALGRIND_OPT
- if test -n "$strace_log" && test -n "$valgrind_log"; then
- printf "Can not start with both VALGRIND and STRACE\n"
- exit 1
- elif test -n "$strace_log"; then
- local mode=strace
- set -- strace -o "$strace_log" $strace_opt "$@"
- elif test -n "$valgrind_log"; then
- local mode=valgrind
- set -- valgrind --log-file="$valgrind_log" $valgrind_opt "$@"
- else
- local mode=production
- eval local pidfile=\$${DAEMON}_PIDFILE
- install -d -m 755 -o root -g root `dirname $pidfile`
- set -- "$@" --pidfile="$pidfile" --detach $monitor_opt --no-chdir
- fi
-
- # Configure niceness.
- eval local priority=\$${DAEMON}_PRIORITY
- if test -n "$priority"; then
- set -- nice -n $priority "$@"
- fi
-
- if test $mode = production; then
- action "Starting `basename $BINARY`" "$@"
- else
- # Start in background and force a "success" message
- action "Starting `basename $BINARY` with $mode debugging" true
- ("$@") &
- fi
-}
-
-function start_ovsdb_server {
- set -- "$ovsdb_server" "$OVSDB_SERVER_DB"
- for remote in $OVSDB_SERVER_REMOTES; do
- set -- "$@" --remote="$remote"
- done
- set -- "$@" --private-key=db:SSL,private_key --certificate=db:SSL,certificate --bootstrap-ca-cert=db:SSL,ca_cert
- start_daemon OVSDB_SERVER "$@"
-}
-
-function start_vswitchd {
- local fake_proc_net_opt=
- if [ "$ENABLE_FAKE_PROC_NET" = "y" ]; then
- fake_proc_net_opt="--fake-proc-net"
- fi
-
- local mlockall_opt=
- if [ "$VSWITCHD_MLOCKALL" != "no" ]; then
- mlockall_opt="--mlockall"
- fi
-
- start_daemon VSWITCHD "$vswitchd" $fake_proc_net_opt $mlockall_opt \
- "$VSWITCHD_OVSDB_SERVER"
- }
-
-function start_brcompatd {
- start_daemon BRCOMPATD "$brcompatd" \
- --appctl-command="$appctl --target=/var/run/openvswitch/ovs-vswitchd.\`cat $VSWITCHD_PIDFILE\`.ctl %s" \
- "$VSWITCHD_OVSDB_SERVER"
-}
-
-function stop_daemon {
- local DAEMON=$1
- local BINARY=$2
- eval local pidfile=\$${DAEMON}_PIDFILE
- if test -f "$pidfile"; then
- local pid=$(cat "$pidfile")
- action "Killing `basename $BINARY` ($pid)" kill $pid
- for delay in .1 .25 .65 1 1 1 1; do
- if kill -0 $pid >/dev/null 2>&1; then
- sleep $delay
- else
- break
- fi
- done
- rm -f "$pidfile"
- fi
-}
-
-function restart_approval {
- if test ! -t 0; then
- # Don't prompt if invoked non-interactively.
- return 0
- fi
- cat <<EOF
-
-WARNING!!!
-
-Restarting Open vSwitch on a live server is not guaranteed to work. It is
-provided as a convenience for those situations in which it does work.
-
-EOF
- read -s -r -n 1 -p "Continue with restart (y/N): " response
- printf "\n"
- case "$response" in
- y|Y)
- return 0
- ;;
- *)
- return 1
- ;;
- esac
-}
-
-function set_system_ids {
- if [ -f /etc/xensource-inventory ]; then
- OVS_VERSION=`ovs-vswitchd --version | sed 's/.*) //;1q'`
- action "Configuring Open vSwitch system IDs" true
- $vsctl --no-wait --timeout=5 set Open_vSwitch . \
- ovs-version="$OVS_VERSION" \
- system-type="$PRODUCT_BRAND" \
- system-version="$PRODUCT_VERSION-$BUILD_NUMBER" \
- external-ids:system-id="$INSTALLATION_UUID" \
- external-ids:xs-system-uuid="$INSTALLATION_UUID"
- else
- if test -f /etc/openvswitch/install_uuid.conf; then
- . /etc/openvswitch/install_uuid.conf
- elif INSTALLATION_UUID=`uuidgen`; then
- echo "INSTALLATION_UUID=$INSTALLATION_UUID" > /etc/openvswitch/install_uuid.conf
- else
- log_failure_msg "missing uuidgen, could not generate system UUID"
- return
- fi
- $vsctl --no-wait --timeout=5 set Open_vSwitch . \
- external-ids:system-id="$INSTALLATION_UUID"
- action "Configuring Open vSwitch system IDs" true
- fi
-}
-
-function start {
- if [ "$FORCE_COREFILES" = "y" ]; then
- turn_on_corefiles
- fi
-
- insert_modules_if_required
-
- # Increase the limit on the number of open file descriptors since
- # ovs-vswitchd needs a few per bridge
- ulimit -n 4096
-
- # Allow GRE traffic.
- iptables -I INPUT -p gre -j ACCEPT
-
- schemaver=`$ovsdb_tool schema-version "$VSWITCHD_OVSDB_SCHEMA"`
- if [ ! -e "$OVSDB_SERVER_DB" ]; then
- warning "$OVSDB_SERVER_DB does not exist"
- install -d -m 755 -o root -g root `dirname $OVSDB_SERVER_DB`
-
- action "Creating empty database $OVSDB_SERVER_DB" true
- $ovsdb_tool -vANY:console:emer create "$OVSDB_SERVER_DB" "$VSWITCHD_OVSDB_SCHEMA"
- else
- # If schema version changed, then back up the old version.
- oldver=`$ovsdb_tool db-version "$OVSDB_SERVER_DB"`
- if test "X$oldver" != "X$schemaver"; then
- backup=$OVSDB_SERVER_DB.backup$oldver
- action "Backing up $OVSDB_SERVER_DB in $backup before converting from schema version \"$oldver\" to \"$schemaver\"" true
- cp "$OVSDB_SERVER_DB" "$backup"
- fi
-
- # Upgrade or downgrade schema and compact database.
- $ovsdb_tool -vANY:console:emer convert "$OVSDB_SERVER_DB" "$VSWITCHD_OVSDB_SCHEMA"
- fi
-
- start_ovsdb_server
- $vsctl --no-wait --timeout=5 init -- set Open_vSwitch . db-version="$schemaver"
- if [ ! -e /var/run/openvswitch.booted ]; then