#!/usr/local/bin/cbsd
#v11.0.0
CIXARG=""
CIXOPTARG=""
MYDESC="Update Network-related information in inventory tables"

. ${subrdir}/nc.subr
. ${tools}
cixinit

# create SQL schema
${miscdir}/sqlcli ${dbdir}/local.sqlite "DROP TABLE IF EXISTS net"
/usr/local/bin/cbsd ${miscdir}/updatesql ${dbdir}/inv.${nodename}.sqlite ${CIX_DISTDIR}/share/local-net.schema net

update_sql()
{
	[ -z "${1}" ] && return 0

	local _nic= _mac= _type= _media= _ip4= _ip6= _mask4= _mask6= _status= 
	local _usr1= _usr2= _usr3= _val= _main4= _main5= _hwaddr= _num=
	local _NICSTABLE="mac type media ip4 ip6 mask4 mask6 status usr1 usr2 usr3 hwaddr"

	_nic="${1}"
	case "${platform}" in
		Linux)
			_mac=$( ${CAT_CMD} /sys/class/net/${1}/address )
			_hwaddr="${_mac}"
			_main4=$( ${IP_CMD} -4 address show dev ${_nic} | ${AWK_CMD} '/inet *.*+/{print $2}' | ${HEAD_CMD} -n1 )
			_main5=$( ${IP_CMD} -6 address show dev ${_nic} | ${AWK_CMD} '/inet *:*+/{print $2}' | ${HEAD_CMD} -n1 )
			;;
		*)
			_mac=$( ${IFCONFIG_CMD} ${_nic} | ${AWK_CMD} '/ether / {print $2}' )
			_hwaddr=$( ${IFCONFIG_CMD} ${_nic} | ${AWK_CMD} '/hwaddr / {print $2}' )
			_main4=$( ${IFCONFIG_CMD} ${_nic} | ${AWK_CMD} '/inet [0-9]+/ { print $2, $4}' | ${HEAD_CMD} -n 1 )
			_main5=$( ${IFCONFIG_CMD} ${_nic} | ${AWK_CMD} '/inet6 *:*+/ { print $2, $4}' | ${HEAD_CMD} -n 1 )
			;;
	esac

	[ -z "${_mac}" ] && _mac="unknown"
	[ -z "${_hwaddr}" ] && _hwaddr="${_mac}"

	if [ -n "${_main4}" ]; then
		_ip4=${_main4%% *}
		_mask4=${_main4##* }
	fi

	if [ -n "${_main6}" ]; then
		_ip6=${_main6%% *}
		_mask6=${_main6##* }
	fi

	#begin for collect SQL string
	STR="UPDATE net SET "
	_num=0

	for i in ${_NICSTABLE}; do
		eval _val=\$_${i}
		if [ -n "${_val}" ]; then
			[ ${_num} -ne 0 ] && STR="${STR},"
			STR="${STR} ${i} = '${_val}'"
			_num=$(( _num + 1 ))
		fi
	done

	STR="${STR} WHERE nic='${_nic}'"
	#${miscdir}/sqlcli ${dbdir}/local.sqlite ${STR}
	cbsdsqlrw local "${STR}"
}

#MAIN
capture NICS ${miscdir}/nics-list -s "lo tap bridge"

#first of all: populate all available interfaces
for i in ${NICS}; do
	INSERTSQL="INSERT INTO net ( nic ) VALUES ( '${i}' )"
	cbsdsqlrw local ${INSERTSQL}
done

# second: collect data for interesting iface
for i in ${NICS}; do
	update_sql ${i}
done

case "${platform}" in
	Linux)
		GW4=$( ${IP_CMD} -4 route ls | ${AWK_CMD} '/^default/{print $3}' | ${HEAD_CMD} -n1 )
		GW6=$( ${IP_CMD} -4 route ls | ${AWK_CMD} '/^default/{print $3}' | ${HEAD_CMD} -n1 )
		FIBS=0
		;;
	*)
		GW4=$( ${ROUTE_CMD} -n get 0.0.0.0 2>/dev/null| ${AWK_CMD} '/gateway:/{print $2}' )
		GW6=$( ${ROUTE_CMD} -n get -inet6 :: 2>/dev/null | ${AWK_CMD} '/gateway:/{print $2}' )
		capture FIBS ${SYSCTL_CMD} -n net.fibs 2>/dev/null
		_ret=$?
		if [ ${_ret} -ne 0 ]; then
			FIBS="0"
		fi
		;;
esac

[ -z "${FIBS}" ] && FIBS=0

${miscdir}/sqlcli ${dbdir}/local.sqlite DROP TABLE IF EXISTS gw
/usr/local/bin/cbsd ${miscdir}/updatesql ${dbdir}/inv.${nodename}.sqlite ${CIX_DISTDIR}/share/local-gw.schema gw

[ -n "${GW4}" ] && cbsdsqlrw local "INSERT INTO gw ( gw,val ) VALUES ( 'gw4','${GW4}' )"
[ -n "${GW6}" ] && cbsdsqlrw local "INSERT INTO gw ( gw,val ) VALUES ( 'gw6','${GW6}' )"

if [ ${FIBS} -gt 1 ]; then
	for ((i=1; i<=${FIBS}; i++)); do
		eval FIB4=$( /usr/sbin/setfib ${i} ${ROUTE_CMD} -n get 0.0.0.0 2>/dev/null| ${AWK_CMD} '/gateway:/{print $2}' )
		eval FIB6=$( /usr/sbin/setfib ${i} ${ROUTE_CMD} -n get -inet6 :: 2>/dev/null | ${AWK_CMD} '/gateway:/{print $2}' )
		[ -n "${FIB4}" ] && cbsdsqlrw local "INSERT INTO gw ( gw,val ) VALUES ( 'fib4_${i}','${FIB4}' )"
		[ -n "${FIB6}" ] && cbsdsqlrw local "INSERT INTO gw ( gw,val ) VALUES ( 'fib6_${i}','${FIB6}' )"
	done
fi

. ${subrdir}/initenv.subr

update_netinfo
cbsdsqlrw local "UPDATE local SET node_ip4_active='${node_ip4_active}'"
cbsdsqlrw local "UPDATE local SET node_ip6_active='${node_ip6_active}'"

exit 0
