#!/bin/bash

### Hook for libvirt to handle VM power cycle
# v0.1.0 2012 Sergio Kviato <sergey.kviato@onapp.com>
#

TMP="/etc/libvirt/hooks/$1.tmp"

rm -f /etc/libvirt/hooks/*.tmp

while read xml
do
	echo "$xml" >> $TMP
done


### Setup ###
OVSVSCTL=$(whereis -b ovs-vsctl | awk '{print $2}')
OVSOFCTL=$(whereis -b ovs-ofctl | awk '{print $2}')
RUNPATH="/var/run/openvswitch"
OVSVSCTL="$OVSVSCTL --db=unix:$RUNPATH/db.sock"
COMMAND=""
INTERFACE=""
IP=""
SWITCH="onapp-ovs0"
PORT=""

### The Code ###
################

### Check if there any arguments ###
if [ -z $1 ]
then
# echo "there no arguments"
exit 0
fi

### Process command line arguments ###
case "$2" in
	"stopped")
        COMMAND="del-flows"
        ACTION=""
        ;;
        "start")
        COMMAND="add-flow"
        ACTION="action=normal"
        ;;
	*)
        exit 0
        ;;
esac

### Process Interfaces ###
for INTERFACE in `grep -A 10 "interface type" $TMP | grep "target dev" | awk -F\' '{print $2}'`
do

# disable interface
/sbin/ifconfig $INTERFACE down > /dev/null 2>&1

PORT=$($OVSVSCTL -- get Interface $INTERFACE ofport)

if [ "$COMMAND" == "del-flows" ]; then
        $OVSOFCTL $COMMAND $SWITCH "in_port=$PORT"
        continue
fi

MAC=$(grep -B 7 "$INTERFACE" $TMP | grep "mac address" | awk -F\' '{print $2}')
ALL_IP=$(grep -B 7 "$INTERFACE" $TMP | grep "ip address" | awk -F\' '{print $2}' | sed 's/\,/\ /g')
        for IP in $ALL_IP
        do
        # Add ability to answer only using correct MAC and IP address
        # Only Port which we defined can answer on this request
        # On interface that belongs to VM
        $OVSOFCTL $COMMAND $SWITCH "in_port=$PORT dl_type=0x0806 nw_proto=2 arp_sha=$MAC nw_src=$IP $ACTION" > /dev/null 2>&1
        $OVSOFCTL $COMMAND $SWITCH "$PORT dl_type=0x0800 dl_src=$MAC nw_src=$IP $ACTION" > /dev/null 2>&1
        done

        if [ -n "$ACTION" ]; then
        # enable interface 
        /sbin/ifconfig $INTERFACE up > /dev/null 2>&1
        fi

done

exit 0

