#!/bin/sh
# Copyright 2012 Citrix Systems, Inc. Licensed under the
# Apache License, Version 2.0 (the "License"); you may not use this
# file except in compliance with the License.  Citrix Systems, Inc.
# reserves all rights not expressly granted by 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.
# 
# Automatically generated by addcopyright.py at 04/03/2012

errExit() {
    echo $@
    exit 1
}

stopHeartbeat() {
    pidFile="/var/run/ovs-agent/heartbeat.pid"
    if [ -f $pidFile ]; then
        pid=`cat $pidFile`
        ps -p $pid &>/dev/null
        if [ $? -eq 0 ]; then
            kill $pid &>/dev/null
        fi
    fi
}

openPortOnIptables() {
	port="$1"
	protocol="$2"
    chkconfig --list iptables | grep "on"
	if [ $? -eq 0 ]; then
	    iptables-save | grep "A INPUT -p $protocol -m $protocol --dport $port -j ACCEPT" >/dev/null
	    if [ $? -ne 0 ]; then
	        iptables -I INPUT 1 -p $protocol --dport $port -j ACCEPT
	        if [ $? -ne 0 ]; then
	            exit_with_error "iptables -I INPUT 1 -p $protocol --dport $port -j ACCEPT failed"
	        fi
	        echo "iptables:Open $protocol port $port for DHCP"
	    fi
	fi
}

applyPatch() {
    patchFile="$1"
    level="$2"

    [ ! -f $patchFile ] && errExit "Can not find $patchFile"

    if [ $? -ne 0 ]; then
        pushd /opt/ovs-agent-latest &>/dev/null
        test=`patch -p$level --dry-run -N < $patchFile`
        if [ $? -ne 0 ]; then
            tmp=`mktemp`
            echo $test > $tmp
            grep "Reversed (or previously applied) patch detected" $tmp &>/dev/null
            if [ $? -eq 0 ]; then
                # The file has been patched
                rm $tmp -f
                popd &>/dev/null
                return
            else
                rm $tmp -f
                popd &>/dev/null
                errExit "Can not apply $patchFile beacuse $test"
            fi
        fi
        patch -p$level < $patchFile
        [ $? -ne 0 ] && errExit "Patch to $target failed"
        popd &>/dev/null
    fi
}

postSetup() {
    openPortOnIptables 7777 tcp # for OCFS2, maybe tcp only
    openPortOnIptables 7777 udp
    openPortOnIptables 3260 tcp # for ISCSI, maybe tcp only
    openPortOnIptables 3260 udp
    applyPatch "/opt/ovs-agent-latest/OvmPatch.patch" 2
    applyPatch "/opt/ovs-agent-latest/OvmDontTouchOCFS2ClusterWhenAgentStart.patch" 1
    applyPatch "/opt/ovs-agent-latest/Fixget_storage_reposExceptionDueToWrongReturnValueCheck.patch" 1

    stopHeartbeat

    /etc/init.d/ovs-agent restart --disable-nowayout
    [ $? -ne 0 ] && errExit "Restart ovs agent failed"
    exit 0
}

preSetup() {
    agentConfig="/etc/ovs-agent/agent.ini"
    agentInitScript="/etc/init.d/ovs-agent"

    [ ! -f $agentConfig ] && errExit "Can not find $agentConfig"
    [ ! -f $agentInitScript ] && errExit "Can not find $agentInitScript"

    version=`grep "version="  $agentInitScript | cut -d "=" -f 2`
    [ x"$version" != x"2.3" ] && errExit "The OVS agent version is $version, we only support 2.3 now"

    # disable SSL
    sed -i 's/ssl=enable/ssl=disable/g' $agentConfig
    [ $? -ne 0 ] && errExit "configure ovs agent to non ssl failed"

    if [ ! -L /opt/ovs-agent-latest ]; then
        eval $agentInitScript status | grep 'down' && $agentInitScript start
        [ $? -ne 0 ] && errExit "Start ovs agent failed"
        [ ! -L /opt/ovs-agent-latest ] && errExit "No link at /opt/ovs-agent-latest"
    fi
    exit 0
}

[ $# -ne 1 ] && errExit "Usage: configureOvm.sh command"

case "$1" in
    preSetup)
        preSetup
        ;;
    postSetup)
        postSetup
        ;;
    *)
        errExit "Valid commands: preSetup postSetup"
esac

