X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=xenserver%2Fetc_init.d_openvswitch;h=8ba8aeeb5679066ee67d6d22e7558c751508ca17;hb=d652410464e0a8e1a35389e7f0c0cd2c2430827a;hp=31aa3fbc1252f21ee506476db8fd1ce1c246551c;hpb=5badabf575544be30ac671c3961c65911c3f2490;p=sliver-openvswitch.git diff --git a/xenserver/etc_init.d_openvswitch b/xenserver/etc_init.d_openvswitch index 31aa3fbc1..8ba8aeeb5 100755 --- a/xenserver/etc_init.d_openvswitch +++ b/xenserver/etc_init.d_openvswitch @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # # openvswitch # @@ -20,48 +20,18 @@ # limitations under the License. ### BEGIN INIT INFO # Provides: openvswitch-switch -# Required-Start: $network $named $remote_fs $syslog -# Required-Stop: $remote_fs +# Required-Start: +# Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Open vSwitch switch ### END INIT INFO -# source function library -if [ -f /etc/init.d/functions ]; then - . /etc/init.d/functions -elif [ -f /etc/rc.d/init.d/functions ]; then - . /etc/rc.d/init.d/functions -elif [ -f /lib/lsb/init-functions ]; then - . /lib/lsb/init-functions -else - echo "$0: missing LSB shell function library" >&2 - exit 1 -fi - -if type action >/dev/null 2>&1; then - : -else - # SUSE lacks action - action() { - STRING=$1 - shift - "$@" - rc=$? - if [ $rc -eq 0 ] ; then - log_success_msg $"$STRING " - else - log_failure_msg $"$STRING " - fi - return $rc - } -fi - +. /usr/share/openvswitch/scripts/ovs-lib.sh || exit 1 . /etc/xensource-inventory test -e /etc/sysconfig/openvswitch && . /etc/sysconfig/openvswitch -NETWORK_MODE=$(cat /etc/xensource/network.conf) -case $NETWORK_MODE in +case `cat /etc/xensource/network.conf` in vswitch|openvswitch) ;; bridge) @@ -73,368 +43,64 @@ case $NETWORK_MODE in ;; esac -# General config variables in /etc/sysconfig/openvswitch -if test "$PRODUCT_VERSION" = "5.5.0"; then - # XenServer 5.5.0 needs ovs-brcompatd and /proc/net simulation. - : ${ENABLE_BRCOMPAT:=y} - : ${ENABLE_FAKE_PROC_NET:=y} -else - # Later versions don't need them. - : ${ENABLE_BRCOMPAT:=n} - : ${ENABLE_FAKE_PROC_NET:=n} -fi -: ${ENABLE_MONITOR:=y} -: ${FORCE_COREFILES:=y} - -# Config variables specific to ovsdb-server -: ${OVSDB_SERVER_REMOTES:=punix:/var/run/openvswitch/db.sock db:Open_vSwitch,managers} -: ${OVSDB_SERVER_DB:=/etc/openvswitch/conf.db} -: ${OVSDB_SERVER_PIDFILE:=/var/run/openvswitch/ovsdb-server.pid} -: ${OVSDB_SERVER_RUN_DIR:=/var/xen/openvswitch} -: ${OVSDB_SERVER_PRIORITY:=-10} -: ${OVSDB_SERVER_LOGFILE:=/var/log/openvswitch/ovsdb-server.log} -: ${OVSDB_SERVER_FILE_LOGLEVEL:=INFO} -: ${OVSDB_SERVER_SYSLOG_LOGLEVEL:=ERR} -: ${OVSDB_SERVER_MEMLEAK_LOGFILE:=} -: ${OVSDB_SERVER_STRACE_LOG:=} -: ${OVSDB_SERVER_STRACE_OPT:=} -: ${OVSDB_SERVER_VALGRIND_LOG:=} -: ${OVSDB_SERVER_VALGRIND_OPT:=} - -# Config variables specific to ovs-vswitchd -: ${VSWITCHD_OVSDB_SERVER:=unix:/var/run/openvswitch/db.sock} -: ${VSWITCHD_OVSDB_SCHEMA:=/usr/share/openvswitch/vswitch.ovsschema} -: ${VSWITCHD_PIDFILE:=/var/run/openvswitch/ovs-vswitchd.pid} -: ${VSWITCHD_RUN_DIR:=/var/xen/openvswitch} -: ${VSWITCHD_PRIORITY:=-10} -: ${VSWITCHD_MLOCKALL:=yes} -: ${VSWITCHD_LOGFILE:=/var/log/openvswitch/ovs-vswitchd.log} -: ${VSWITCHD_FILE_LOGLEVEL:=INFO} -: ${VSWITCHD_SYSLOG_LOGLEVEL:=ERR} -: ${VSWITCHD_MEMLEAK_LOGFILE:=} -: ${VSWITCHD_STRACE_LOG:=} -: ${VSWITCHD_STRACE_OPT:=} -: ${VSWITCHD_VALGRIND_LOG:=} -: ${VSWITCHD_VALGRIND_OPT:=} - -# Config variables specific to ovs-brcompatd -: ${BRCOMPATD_PIDFILE:=/var/run/openvswitch/ovs-brcompatd.pid} -: ${BRCOMPATD_RUN_DIR:=/var/xen/openvswitch} -: ${BRCOMPATD_PRIORITY:=-10} -: ${BRCOMPATD_LOGFILE:=/var/log/openvswitch/ovs-brcompatd.log} -: ${BRCOMPATD_FILE_LOGLEVEL:=INFO} -: ${BRCOMPATD_SYSLOG_LOGLEVEL:=ERR} -: ${BRCOMPATD_MEMLEAK_LOGFILE:=} -: ${BRCOMPATD_STRACE_LOG:=} -: ${BRCOMPATD_STRACE_OPT:=} -: ${BRCOMPATD_VALGRIND_LOG:=} -: ${BRCOMPATD_VALGRIND_OPT:=} - -# Full paths to executables & modules -ovsdb_server="/usr/sbin/ovsdb-server" -ovsdb_tool="/usr/bin/ovsdb-tool" -vswitchd="/usr/sbin/ovs-vswitchd" -brcompatd="/usr/sbin/ovs-brcompatd" -dpctl="/usr/bin/ovs-dpctl" -appctl="/usr/bin/ovs-appctl" -ofctl="/usr/bin/ovs-ofctl" -vsctl="/usr/bin/ovs-vsctl" - -if [ "$ENABLE_FAKE_PROC_NET" = "y" ]; then - if [ "$ENABLE_BRCOMPAT" != "y" ]; then - warning "FAKE_PROC_NET required BRCOMPAT which was disabled. Force enabling." - ENABLE_BRCOMPAT="y" - fi -fi - -if test "$ENABLE_MONITOR" = "y"; then - monitor_opt="--monitor" -else - monitor_opt= -fi - -function hup_monitor_external_ids { - if [ -e /var/run/openvswitch/ovs-external-ids.pid ]; then - action "Configuring Open vSwitch external IDs" kill -HUP `cat /var/run/openvswitch/ovs-external-ids.pid` - fi -} - -function dp_list { - "$dpctl" show | grep '^dp[0-9]\+:' | cut -d':' -f 1 -} - -function turn_on_corefiles { - ulimit -Sc 67108864 -} - -function remove_all_dp { - for dp in $(dp_list); do - action "Removing datapath: $dp" "$dpctl" del-dp "$dp" - done -} - -function insert_modules_if_required { - if ! lsmod | grep -q "openvswitch_mod"; then - action "Inserting llc module" modprobe llc - action "Inserting openvswitch module" modprobe openvswitch_mod +start () { + set $ovs_ctl ${1-start} + set "$@" --system-id="$INSTALLATION_UUID" + set "$@" --system-type="$PRODUCT_BRAND" + set "$@" --system-version="$PRODUCT_VERSION-$BUILD_NUMBER" + set "$@" --external-id=xs-system-uuid="$INSTALLATION_UUID" + set "$@" --daemon-cwd=/var/xen/openvswitch + if test X"$FORCE_COREFILES" != X; then + set "$@" --force-corefiles="$FORCE_COREFILES" fi - if [ "$ENABLE_BRCOMPAT" = "y" ] && [ -n "$BRCOMPATD_PIDFILE" ] && ! lsmod | grep -q "brcompat_mod"; then - action "Inserting brcompat module" modprobe brcompat_mod + if test X"$OVSDB_SERVER_PRIORITY" != X; then + set "$@" --ovsdb-server-priority="$OVSDB_SERVER_PRIORITY" fi -} - -function remove_modules { - if lsmod | grep -q "brcompat_mod"; then - action "Removing brcompat module" rmmod brcompat_mod.ko + if test X"$VSWITCHD_PRIORITY" != X; then + set "$@" --ovs-vswitchd-priority="$VSWITCHD_PRIORITY" fi - if lsmod | grep -q "openvswitch_mod"; then - action "Removing openvswitch module" rmmod openvswitch_mod.ko + if test X"$VSWITCHD_MLOCKALL" != X; then + set "$@" --mlockall="$VSWITCHD_MLOCKALL" fi -} - -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 "$@" + if test ! -e /var/run/openvswitch.booted; then + touch /var/run/openvswitch.booted + set "$@" --delete-bridges fi + "$@" - if test $mode = production; then - action "Starting `basename $BINARY`" "$@" + if daemon_is_running ovs-xapi-sync; then + log_success_msg "ovs-xapi-sync is already running" 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" + PYTHONPATH=/usr/share/openvswitch/python \ + /usr/share/openvswitch/scripts/ovs-xapi-sync \ + --log-file --pidfile --detach --monitor unix:/var/run/openvswitch/db.sock fi -} -function restart_approval { - if test ! -t 0; then - # Don't prompt if invoked non-interactively. - return 0 - fi - cat < /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 + touch /var/lock/subsys/openvswitch } -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 +force_reload_kmod () { + start force-reload-kmod - # Upgrade or downgrade schema and compact database. - $ovsdb_tool -vANY:console:emer convert "$OVSDB_SERVER_DB" "$VSWITCHD_OVSDB_SCHEMA" + # Restart the high-availability daemon if it is running. Otherwise + # it loses its heartbeat and reboots the system after a few minutes. + if pidof xhad >/dev/null && test -e /etc/xensource/xhad.conf; then + PATH=$PATH:/opt/xensource/xha + action "Stopping HA daemon" ha_stop_daemon + action "Starting HA daemon" ha_start_daemon fi - - start_ovsdb_server - $vsctl --no-wait --timeout=5 init -- set Open_vSwitch . db-version="$schemaver" - if [ ! -e /var/run/openvswitch.booted ]; then - touch /var/run/openvswitch.booted - for bridge in $($vsctl list-br); do - $vsctl --no-wait --timeout=5 del-br $bridge - done - fi - - set_system_ids - - start_vswitchd - if [ "${ENABLE_BRCOMPAT}" = "y" ] ; then - start_brcompatd - fi - - if [ -f /etc/xensource-inventory ]; then - # Start daemon to monitor external ids - PYTHONPATH=/usr/share/openvswitch/python \ - /usr/share/openvswitch/scripts/ovs-external-ids \ - --pidfile --detach $monitor_opt "$VSWITCHD_OVSDB_SERVER" - fi - - touch /var/lock/subsys/openvswitch } -function stop { - stop_daemon BRCOMPATD "$brcompatd" - stop_daemon VSWITCHD "$vswitchd" - stop_daemon OVSDB_SERVER "$ovsdb_server" - if [ -e /var/run/openvswitch/ovs-external-ids.pid ]; then - kill `cat /var/run/openvswitch/ovs-external-ids.pid` - fi +stop () { + $ovs_ctl stop + stop_daemon ovs-xapi-sync rm -f /var/lock/subsys/openvswitch } -function restart { - if restart_approval; then - stop - start - fi -} - -case "$1" in +ovs_ctl=/usr/share/openvswitch/scripts/ovs-ctl +case $1 in start) start ;; @@ -442,32 +108,25 @@ case "$1" in stop ;; restart) - restart + stop + start ;; reload|force-reload) - # Nothing to do to ovs-vswitchd and ovsdb-server as they keep their - # configuration up-to-date all the time. HUP ovs-external-ids so it - # re-runs. - hup_monitor_external_ids - ;; - strace-vswitchd) - shift - strace -p $(cat "$VSWITCHD_PIDFILE") "$@" - ;; - strace-brcompatd) - shift - strace -p $(cat "$BRCOMPATD_PIDFILE") "$@" + # The main OVS daemons keep up-to-date, but ovs-xapi-sync needs help. + pidfile=/var/run/openvswitch/ovs-xapi-sync.pid + if test -e "$pidfile"; then + pid=`cat "$pidfile"` + action "Configuring Open vSwitch external IDs" kill -HUP $pid + fi ;; status) - status -p "$OVSDB_SERVER_PIDFILE" ovsdb-server && - status -p "$VSWITCHD_PIDFILE" ovs-vswitchd && - (test "$ENABLE_BRCOMPAT" != "y" || - status -p "$BRCOMPATD_PIDFILE" ovs-brcompatd) + $ovs_ctl status && daemon_status ovs-xapi-sync ;; version) - /usr/sbin/ovsdb-server -V - /usr/sbin/ovs-vswitchd -V - /usr/sbin/ovs-brcompatd -V + $ovs_ctl version + ;; + force-reload-kmod) + force_reload_kmod ;; help) printf "openvswitch [start|stop|restart|reload|force-reload|status|version]\n"