#!/bin/bash
#
# Copyright 2017 Red Hat, Inc.
#
# NAME
#     rht-setup-privbridges - create appropriate private bridges
#
# SYNOPSIS
#     rht-setup-privbridges
#
# DESCRIPTION
#     This tool will shift the type of private bridging based on /etc/rht
#     variable RHT_PRIVUSEOVS.
#
# CHANGELOG
#   * Fri Mar 24 2017 Robert Locke <rlocke@redhat.com>
#   - eliminate reliance on RHT_VMTREE
#   * Tue Jul 26 2016 Robert Locke <rlocke@redhat.com>
#   - notify NetworkManager of ifcfg file changes
#   * Wed May 11 2016 Robert Locke <rlocke@redhat.com>
#   - add support for RHT_ENROLLMENT -ge 512
#   * Wed Mar  9 2016 Robert Locke <rlocke@redhat.com>
#   - original code

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin

# Source some variables that we need - should provide:
# RHT_ENROLLMENT=X
# RHT_COURSE=rh124
source /etc/rht
# Validate
if [[ -z "${RHT_ENROLLMENT}" || -z "${RHT_COURSE}" ]]; then
  echo "Error: missing a needed variable from /etc/rht"
  echo "RHT_ENROLLMENT = '${RHT_ENROLLMENT}'"
  echo "RHT_COURSE = '${RHT_COURSE}'"
  exit 2
fi

# Additional functions for this shell script
function print_usage {
  local retcode=$1
  cat << EOF

This utility configures correct private networking for course.

Usage: rht-setup-privbridges
       rht-setup-privbridges -h|--help

EOF
  exit ${retccode}
}

# Main area
# If I need root privileges to run, then use sudo to call myself
if [[ "${EUID}" -gt "0" ]] ; then
  echo 'Using sudo to become root.'
  sudo $0 "$@"
  exit
fi
# Parse/confirm argument passed
ARGS=$(getopt -o h -l "help" -n "rht-setup-privbridges" -- "$@")
if [[ $? -ne 0 ]]; then
  print_usage 1
fi
eval set -- "${ARGS}"
while true ; do
  case $1 in
    -h|--help)
      print_usage 0 ;;
    --)
      shift ; break ;;
    *)
      echo "Error: bad option, $1" ; print_usage 1 ;;
  esac
done

# Determine current state
if ovs-vsctl show | grep privbr0 &>/dev/null ; then
  currentovs=1
else
  currentovs=0
fi
if [[ -f /etc/libvirt/qemu/networks/privbr0.xml ]]; then
  currentlib=1
else
  currentlib=0
fi

# If ovs is desired
if [[ "${RHT_PRIVUSEOVS}" == "yes" ]]; then
  # If we need to update
  if [[ ${currentovs} -eq 0 ]]; then
    # If we need to remove the other
    if [[ ${currentlib} -eq 1 ]]; then
      for bridge in privbr0 privnet ; do
        virsh net-destroy ${bridge}
        virsh net-undefine ${bridge}
      done
    fi
    # Add ovs
    if [[ ${RHT_ENROLLMENT} -ne 0 && ${RHT_ENROLLMENT} -lt 512 ]]; then
      peer=${RHT_ENROLLMENT}
    elif [[ "${RHT_ROLE}" == "foundation" ]]; then
      peer=251
    else
      peer=250
    fi
    if [[ "${RHT_ROLE}" == "foundation" ]]; then
      bridge4=250
      peer3=253.${peer}
    elif [[ ${RHT_ENROLLMENT} -eq 0 || $((RHT_ENROLLMENT/512)) -eq 1 ]]; then
      bridge4=251
      peer3=253.${peer}
    else
      bridge4=251
      peer3=254.${peer}
    fi
    # Create OpenvSwitch bridges
    ovs-vsctl add-br privbr0
    echo "OpenvSwitch network privbr0 created"
    echo
    ovs-vsctl add-br virbr1
    echo "OpenvSwitch network virbr1 created"
    echo
    # Configure IP address for privbr0
    cat > /etc/sysconfig/network-scripts/ifcfg-privbr0 <<-EOF
	DEVICE=privbr0
	ONBOOT=yes
	BOOTPROTO=none
	USERCTL=yes
	IPV6INIT=no
	PEERNTP=no
	PEERDNS=no
	TYPE=OVSBridge
	DEVICETYPE=ovs
	NAME="OVS Private Bridge 0"
	IPADDR=172.25.250.${bridge4}
	NETMASK=255.255.255.0
	NM_CONTROLLED=no
	MTU="1450"
	EOF
    nmcli con reload
    ifup privbr0
    # Configure tunnel between foundation and galaxy
    ovs-vsctl add-port privbr0 vxlan2 -- set Interface vxlan2 type=vxlan \
      options:key=2 options:remote_ip=172.25.${peer3}
    ovs-vsctl add-port virbr1 vxlan5 -- set Interface vxlan5 type=vxlan \
      options:key=5 options:remote_ip=172.25.${peer3}
  fi
else
  # If we need to update
  if [[ ${currentlib} -eq 0 ]]; then
    # If we need to remove the other
    if [[ ${currentovs} -eq 1 ]]; then
      ovs-vsctl del-br virbr1
      echo "OpenvSwitch network virbr1 destroyed"
      echo
      ovs-vsctl del-br privbr0
      echo "OpenvSwitch network privbr0 destroyed"
      echo
      rm /etc/sysconfig/network-scripts/ifcfg-privbr0
      nmcli con reload
    fi
    # Add libvirt
    for bridge in privbr0 privnet ; do
      virsh net-define /usr/share/foundation-config/${bridge}.xml
      virsh net-autostart ${bridge} &>/dev/null
      virsh net-start ${bridge}
    done
  fi

fi

