#! /bin/sh
#
# Copyright (C) 2011, 2012, 2016 Nicira, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
### BEGIN INIT INFO
# Provides:          openvswitch-switch
# Required-Start:    $network $named $remote_fs $syslog
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Open vSwitch switch
# Description:       openvswitch-switch provides the userspace components and utilities for
#                    the Open vSwitch kernel-based switch.
### END INIT INFO

(test -x /usr/sbin/ovs-vswitchd && test -x /usr/sbin/ovsdb-server) || exit 0

SYSTEMCTL_SKIP_REDIRECT=yes

. /lib/lsb/init-functions

. /usr/share/openvswitch/scripts/ovs-lib
test -e /etc/default/openvswitch-switch && . /etc/default/openvswitch-switch

network_interfaces () {
    INTERFACES="/etc/network/interfaces"
    [ -e "${INTERFACES}" ] || return
    bridges=`ifquery --allow ovs --list`
    [ -n "${bridges}" ] && $1 --allow=ovs ${bridges}
}

load_kmod () {
    ovs_ctl load-kmod || exit $?
}

start () {
    if ovs_ctl load-kmod; then
        :
    else
        echo "Module has probably not been built for this kernel."
        echo "Please install Linux 3.3 or later with openvswitch kernel support."

        if test X"$OVS_MISSING_KMOD_OK" = Xyes; then
            # We're being invoked by the package postinst.  Do not
            # fail package installation just because the kernel module
            # is not available.
            exit 0
        fi
    fi
    set ovs_ctl ${1-start} --system-id=random
    if test X"$FORCE_COREFILES" != X; then
        set "$@" --force-corefiles="$FORCE_COREFILES"
    fi
    set "$@" $OVS_CTL_OPTS
    "$@" || exit $?
    if [ "$2" = "start" ] && [ "$READ_INTERFACES" != "no" ]; then
        network_interfaces ifup
    fi
}

stop () {
    [ "$READ_INTERFACES" != "no" ] && network_interfaces ifdown
    ovs_ctl stop
}

restart () {
    # OVS_FORCE_RELOAD_KMOD can be set by package postinst script.
    if [ "$1" = "--save-flows=yes" ] || \
        [ "${OVS_FORCE_RELOAD_KMOD}" = "no" ]; then
        start restart
    elif [ "${OVS_FORCE_RELOAD_KMOD}" = "yes" ]; then
        depmod -a

        if [ -e /sys/module/openvswitch ]; then
            LOADED_SRCVERSION=`cat /sys/module/openvswitch/srcversion \
                               2>/dev/null`
            LOADED_VERSION=`cat /sys/module/openvswitch/version \
                            2>/dev/null`
        fi
        SRCVERSION=`modinfo -F srcversion openvswitch 2>/dev/null`
        VERSION=`modinfo -F version openvswitch 2>/dev/null`

        ovs_ctl_log "Package upgrading:\n"\
                    "Loaded version: ${LOADED_VERSION} ${LOADED_SRCVERSION}.\n"\
                    "Version on disk: ${VERSION} ${SRCVERSION}."

        # If the kernel module was previously loaded and it is different than
        # the kernel module on disk, then do a 'force-reload-kmod'.
        if [ -n "${LOADED_SRCVERSION}" ] && [ -n "${SRCVERSION}" ] && \
            [ "${SRCVERSION}" != "${LOADED_SRCVERSION}" ]; then
            start force-reload-kmod
        else
            start restart
        fi
    else
        READ_INTERFACES="no" stop
        READ_INTERFACES="no" start
    fi
}

case $1 in
    start)
        start
        ;;
    stop | force-stop)
        stop
        ;;
    reload | force-reload)
        # The OVS daemons keep up-to-date.
        ;;
    restart)
        shift
        restart "$@"
        ;;
    status)
        ovs_ctl status
        exit $?
        ;;
    force-reload-kmod)
        start force-reload-kmod
        ;;
    load-kmod)
        load_kmod
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|force-reload|status|force-stop|force-reload-kmod|load-kmod}" >&2
        exit 1
        ;;
esac

exit 0
