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

. ${subrdir}/nc.subr
. ${cbsdinit}

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

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

	local _nic _mac _type _media _ip4 _ip6 _mask4 _mask6 _status _usr1 _usr2 _usr3 _val _main4 _main5 _hwaddr
	local _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 ${1} | ${AWK_CMD} '/inet *.*+/{print $2}' | ${HEAD_CMD} -n1 )
			_main5=$( ${IP_CMD} -6 address show dev ${1} | ${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} ${1} | ${AWK_CMD} '/inet [0-9]+/ { print $2, $4}' | ${HEAD_CMD} -n 1 )
			_main5=$( ${IFCONFIG_CMD} ${1} | ${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}
}

#MAIN
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}\" )"
	${miscdir}/sqlcli ${dbdir}/local.sqlite ${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}' )
		FIBS=$( ${SYSCTL_CMD} -n net.fibs 2>/dev/null )
		;;
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 ${distdir}/share/local-gw.schema gw

[ -n "${GW4}" ] && ${miscdir}/sqlcli ${dbdir}/local.sqlite "INSERT INTO gw ( gw,val ) VALUES ( \"gw4\",\"$GW4\" )"
[ -n "${GW6}" ] && ${miscdir}/sqlcli ${dbdir}/local.sqlite "INSERT INTO gw ( gw,val ) VALUES ( \"gw6\",\"$GW6\" )"

if [ ${FIBS} -gt 1 ]; then
	for i in $( /usr/bin/jot ${FIBS} ); 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}" ] && ${miscdir}/sqlcli ${dbdir}/local.sqlite "INSERT INTO gw ( gw,val ) VALUES ( \"fib4_${i}\",\"$FIB4\" )"
		[ -n "${FIB6}" ] && ${miscdir}/sqlcli ${dbdir}/local.sqlite "INSERT INTO gw ( gw,val ) VALUES ( \"fib6_${i}\",\"$FIB6\" )"
	done
fi

. ${subrdir}/initenv.subr

update_netinfo
${miscdir}/sqlcli ${dbdir}/local.sqlite UPDATE local SET node_ip4_active=\"${node_ip4_active}\"
${miscdir}/sqlcli ${dbdir}/local.sqlite UPDATE local SET node_ip6_active=\"${node_ip6_active}\"

exit 0
