#!/bin/bash
#
# In the interest of keeping the KVP daemon code free of distro specific
# information; the kvp daemon code invokes this external script to configure
# the interface.
#
# The only argument to this script is the configuration file that is to
# be used to configure the interface.
#
# Here is the format of the ip configuration file:
#
# HWADDR=macaddr
# IF_NAME=interface name
# DHCP=yes (This is optional; if yes, DHCP is configured)
#
# IPADDR=ipaddr1
# IPADDR_1=ipaddr2
# IPADDR_x=ipaddry (where y = x + 1)
#
# NETMASK=netmask1
# NETMASK_x=netmasky (where y = x + 1)
#
# GATEWAY=ipaddr1
# GATEWAY_x=ipaddry (where y = x + 1)
#
# DNSx=ipaddrx (where first DNS address is tagged as DNS1 etc)
#
# IPV6 addresses will be tagged as IPV6ADDR, IPV6 gateway will be
# tagged as IPV6_DEFAULTGW and IPV6 NETMASK will be tagged as
# IPV6NETMASK.
#
# The host can specify multiple ipv4 and ipv6 addresses to be
# configured for the interface. Furthermore, the configuration
# needs to be persistent. A subsequent GET call on the interface
# is expected to return the configuration that is set via the SET
# call.
#
cfg=$1
if ! test -f "${cfg}"
then
	: expect configuration datafile as first argument
	exit 1
fi
# send subshell output to syslog
(
f=/etc/sysconfig/network/scripts/functions
if test -f ${f}
then
	. ${f}
else
	echo "MISSING ${f}"
	exit 1
fi
# remove known config variables from environment 
unset HWADDR
unset DHCP
unset IF_NAME
unset ${!IPADDR*}
unset ${!NETMASK*}
unset ${!GATEWAY*}
unset ${!IPV6ADDR*}
unset ${!IPV6NETMASK*}
unset ${!IPV6_DEFAULTGW*}
unset ${!DNS*}
. "$1"
#
if test -z "${IF_NAME}"
then
	echo "Missing IF_NAME= in ${cfg}"
	exit 1
fi
#
t_ifcfg=`mktemp`
t_ifroute=`mktemp`
_exit() {
	rm -f "${t_ifcfg}" "${t_ifroute}"
}
trap _exit EXIT
#
if test -z "${t_ifcfg}" || test -z "${t_ifroute}"
then
	exit 1
fi
#
# Create ifcfg-* file
(
	echo "STARTMODE=auto"
	#
	if test -n "${HWADDR}"
	then
		: # ignore HWADDR, it just repeats the existing MAC value
	fi
	#
	if test "${DHCP}" = "yes"
	then
		echo "BOOTPROTO=dhcp"
	fi
	# single index for all ipv4 and ipv6 adresses in final ifcfg file
	i=0
	idx=""
	# loop through all ipv4 adresses
	for var in ${!IPADDR*}
	do
		index=${var#IPADDR}
		pfx=
		# find corresponding NETMASK variable
		eval nm=\$NETMASK${index}
		# if specified, calculate prefix
		if test -n "${nm}"
		then
			pfx=`mask2pfxlen "${nm}" 2>/dev/null`
		fi
		# if not specified, force prefix
		if test -z "${pfx}"
		then
			pfx="32"
		fi
		# construct actual value
		eval val=\$IPADDR${index}
		# write config variable
		echo "IPADDR${idx}='${val}/${pfx}'"
		idx="_$((++i))"
	done
	# loop through all ipv6 adresses
	for var in ${!IPV6ADDR*}
	do
		index=${var#IPV6ADDR}
		# find corresponding IPV6NETMASK variable
		eval pfx=\$IPV6NETMASK${index}
		# if not specified, force prefix
		if test -z "${pfx}"
		then
			pfx=128
		fi
		# construct actual value
		eval val=\$IPV6ADDR${index}
		# write config variable
		echo "IPADDR${idx}='${val}/${pfx}'"
		idx="_$((++i))"
	done

) >> "${t_ifcfg}"

# Create ifroute-* file
(
	if test -n "${GATEWAY}"
	then
		echo "default $GATEWAY - $IF_NAME"
	fi
	if test -n "${IPV6_DEFAULTGW}"
	then
		echo "default $IPV6_DEFAULTGW - $IF_NAME"
	fi
) >> "${t_ifroute}"
# Only a single default gateway is supported
unset GATEWAY IPV6_DEFAULTGW
if test -n "${!GATEWAY*}${!IPV6_DEFAULTGW*}"
then
	echo "WARNING: multiple gateways not supported: ${!GATEWAY*} ${!IPV6_DEFAULTGW*}"
fi

# collect DNS info
_DNS_=
for var in ${!DNS*}
do
	eval val=\$${var}
	if test -n "${_DNS_}"
	then
		_DNS_="${_DNS_} ${val}"
	else
		_DNS_=${val}
	fi
done
#
echo "$0: working on network interface ifcfg-${IF_NAME}"
cp -fb ${t_ifcfg} "/etc/sysconfig/network/ifcfg-${IF_NAME}"
cp -fb ${t_ifroute} "/etc/sysconfig/network/ifroute-${IF_NAME}"
if test -w /etc/sysconfig/network/config
then
	sed -i "s@^NETCONFIG_DNS_STATIC_SERVERS=.*@NETCONFIG_DNS_STATIC_SERVERS='$_DNS_'@"  /etc/sysconfig/network/config
	netconfig update -m dns
fi
ifdown "${IF_NAME}"
ifup "${IF_NAME}"
) 2>&1 | logger -t "${0##*/}[$PPID / $$]"
