#!/bin/bash

# Copyright (c) 2019, 2021 Oracle and/or its affiliates. All rights reserved.
# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl.


#
#  KVM networks service command script
#  script run by KVM network systemd unit created while creating a virtual network
#  This script handles the start, stop and status method
#

start() {
    echo "Adding default route to ${__VNIC_DEFAULT_GW__}"
    /usr/sbin/ip route add default via ${__VNIC_DEFAULT_GW__} dev ${__NET_DEV__} table ${__RT_TABLE_NAME__}
    if [ $? -ne 0 ]
    then
        echo "Cannot add route : default ${__VNIC_DEFAULT_GW__} via dev ${__NET_DEV__} table ${__RT_TABLE_NAME__}"
        return 1
    fi
    echo "Adding rule for ${__VNIC_PRIVATE_IP__}"
    /usr/sbin/ip rule add from ${__VNIC_PRIVATE_IP__} lookup ${__RT_TABLE_NAME__}
    if [ $? -ne 0 ]
    then
        echo "Cannot add rule : from ${__VNIC_PRIVATE_IP__} lookup ${__RT_TABLE_NAME__}"
        return 1
    fi
    # Start the KVM network
    echo "Starting the network"
    /bin/virsh net-start --network ${__KVM_NETWORK_NAME__}
    if [ $? -ne 0 ]
    then
        echo "Cannot start kvm network"
        return 1
    fi
    echo "network started"

    # Add routes for KVM
    echo "Adding routes for KVM network"
    /usr/sbin/ip route add ${__KVM_NET_ADDRESS_SPACE__} dev ${__KVM_NET_BRIDGE_NAME__} scope link proto kernel table ${__RT_TABLE_NAME__}
    if [ $? -ne 0 ]
    then
        echo "Cannot add route : ${__KVM_NET_ADDRESS_SPACE__} dev ${__KVM_NET_BRIDGE_NAME__} scope link proto kernel table ${__RT_TABLE_NAME__}"
        return 1
    fi
    /usr/sbin/ip rule add from ${__KVM_NET_ADDRESS_SPACE__} lookup ${__RT_TABLE_NAME__}
    # Add firewall rules
    echo "Adding iptables rules routes for KVM network"
    /usr/sbin/iptables -t nat -A POSTROUTING -s ${__KVM_NET_ADDRESS_SPACE__} -d 224.0.0.0/24 -j ACCEPT
    /usr/sbin/iptables -t nat -A POSTROUTING -s ${__KVM_NET_ADDRESS_SPACE__} -d 255.255.255.255/32 -j ACCEPT
    /usr/sbin/iptables -t nat -A POSTROUTING -s ${__KVM_NET_ADDRESS_SPACE__} ! -d ${__KVM_NET_ADDRESS_SPACE__} -j MASQUERADE
    return 0
}


stop() {
   /usr/bin/virsh net-destroy --network ${__KVM_NETWORK_NAME__}
   return $?
}

status() {
    /usr/bin/virsh net-info --network ${__KVM_NETWORK_NAME__}
    /usr/bin/virsh net-dhcp-leases --network ${__KVM_NETWORK_NAME__}
}


if [ -z "${__KVM_NETWORK_NAME__}" ] || \
   [ -z "${__KVM_NET_ADDRESS_SPACE__}" ] || \
   [ -z "${__KVM_NET_BRIDGE_NAME__}" ] || \
   [ -z "${__VNIC_DEFAULT_GW__}" ] || \
   [ -z "${__NET_DEV__}" ] || \
   [ -z "${__RT_TABLE_NAME__}" ] || \
   [ -z "${__VNIC_PRIVATE_IP__}" ]
then
    echo "ERROR: Environment not set correctly!" >&2
    exit 1
fi

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status
        ;;
    *)
        exit 1
        ;;
esac
exit $?



