#!/bin/sh
### BEGIN INIT INFO
# Provides:          openvswitch
# Required-Start:    $syslog $network boot.loadmodules
# Should-Start:      
# Required-Stop:     $syslog $network
# Should-Stop:       
# Default-Start:     B 2 3 5
# Default-Stop:      0 1 6
# Short-Description: openvSwitch
# Description:       Start openvSwitch
### END INIT INFO

# Check for missing binaries (stale symlinks should not happen)
# Note: Special treatment of stop for LSB conformance

OVSDB_BIN=/usr/sbin/ovsdb-server
OVSSW_BIN=/usr/sbin/ovs-vswitchd
OVSBR_BIN=/usr/sbin/ovs-brcompatd
OVS_LOGDIR=/var/log/openvswitch
OVS_LOGARGS="-vANY:console:emer -vANY:syslog:emer -vANY:file:warn"

test -x $OVSDB_BIN || { echo "$OVSDB_BIN not installed"; 
	if [ "$1" = "stop" ]; then exit 0;
	else exit 5; fi; }
test -x $OVSSW_BIN || { echo "$OVSSW_BIN not installed";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 5; fi; }
test -x $OVSBR_BIN || { echo "$OVSBR_BIN not installed";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 5; fi; }


# Check for existence of needed config file and read it
OVS_CONFIG=/etc/sysconfig/openvswitch
test -r $OVS_CONFIG || { echo "$OVS_CONFIG does not exist.";
	if [ "$1" = "stop" ]; then exit 0;
	else exit 6; fi; }

# Read config	
. $OVS_CONFIG

test -r $OVSDB_DB || { echo "$OVSDB_DB does not exist...creating default from template.";
	ovsdb-tool create $OVSDB_DB /usr/share/openvswitch/vswitch.ovsschema || exit 7; }

. /etc/rc.status
rc_reset

case "$1" in
    start)
	echo -n "Starting OVSDB "
	/sbin/startproc $OVSDB_BIN --log-file=$OVS_LOGDIR/ovsdb.log --remote=punix:$OVSDB_SOCK --unixctl=/var/run/openvswitch/ovsdb.ctl --detach $OVSDB_DB
	rc_status -v
	echo -n "Starting OVSSW "
	modprobe openvswitch_mod
	/sbin/startproc $OVSSW_BIN --log-file=$OVS_LOGDIR/vswitchd.log $OVS_LOGARGS unix:$OVSDB_SOCK
	rc_status -v
	echo -n "Starting OVSBR "
	modprobe brcompat_mod
	/sbin/startproc $OVSBR_BIN --log-file=$OVS_LOGDIR/brcompatd.log $OVS_LOGARGS unix:$OVSDB_SOCK
	rc_status -v
	;;
    stop)
	echo -n "Shutting down OVS "
	/sbin/killproc $OVSDB_BIN
	rc_status -v
	;;
    restart)
	$0 reload
	rc_status
	;;
    reload)
	echo -n "Reload service OVSDB "
	/sbin/killproc -HUP $OVSDB_BIN
	rc_status -v
	echo -n "Reload service OVSSW "
	/sbin/killproc -HUP $OVSSW_BIN
	rc_status -v
	echo -n "Reload service OVSBR "
	/sbin/killproc -HUP $OVSBR_BIN
	rc_status -v
	;;
    status)
	echo -n "Checking for service OVSDB "
	/sbin/checkproc $OVSDB_BIN
	rc_status -v
	echo -n "Checking for service OVSSW "
	/sbin/checkproc $OVSSW_BIN
	rc_status -v
	echo -n "Checking for service OVSBR "
	/sbin/checkproc $OVSBR_BIN
	rc_status -v
	;;
    *)
	echo "Usage: $0 {start|stop|status|restart|reload}"
	exit 1
	;;
esac
rc_exit
