#!/usr/local/bin/cbsd
#v12.0.11
MYARG=""
MYOPTARG="mode"
MYDESC="Collect and/or update system-related information in inventory tables"
ADDHELP="sysinv withount mode=update only collect information and stored in variables\n\
mode=update - collect and update in db\n"

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

# create SQL schema
#${miscdir}/sqlcli ${dbdir}/local.sqlite DROP TABLE IF EXISTS local
#/usr/local/bin/cbsd ${miscdir}/updatesql ${dbdir}/inv.${nodename}.sqlite ${distdir}/share/local-local.schema local
sysinv_get_info_hostname()
{
	hostname=$( ${SYSCTL_CMD} -n kern.hostname 2>/dev/null )
	[ -z "${hostname}" ] && hostname="unknown"
}

sysinv_get_info_hostarch()
{
	hostarch=$( ${SYSCTL_CMD} -n hw.machine 2>/dev/null )
	[ -z "${hostarch}" ] && hostarch="unknown"
}

sysinv_get_info_osrelease()
{
	osrelease=$( ${SYSCTL_CMD} -n kern.osrelease 2>/dev/null )
	[ -z "${osrelease}" ] && osrelease="unknown"
}

sysinv_get_info_cpumodel()
{
	cpumodel=$( ${SYSCTL_CMD} -n hw.model 2>/dev/null )
	[ -z "${cpumodel}" ] && cpumodel="unknown"
}

sysinv_get_info_ncpu()
{
	ncpu=$( ${SYSCTL_CMD} -n hw.ncpu 2>/dev/null )
	[ -z "${ncpu}" ] && ncpu="0"
}

sysinv_get_info_cpufreq()
{
	cpufreq=$( ${SYSCTL_CMD} -n dev.cpu.0.freq 2>/dev/null )
	[ -z "${cpufreq}" ] && cpufreq="0"
}

sysinv_get_info_kernhz()
{
	kernhz=$( ${SYSCTL_CMD} -n kern.hz 2>/dev/null )
	[ -z "${kernhz}" ] && kernhz="0"
}

sysinv_get_info_sched()
{
	sched=$( ${SYSCTL_CMD} -n kern.sched.name 2>/dev/null )
	[ -z "${sched}" ] && sched="unknown"
}

sysinv_get_info_eventtimer()
{
	eventtimer=$( ${SYSCTL_CMD} -n kern.eventtimer.choice 2>/dev/null )
	[ -z "${eventtimer}" ] && eventtimer="unknown"
}

sysinv_get_info_disks()
{
	disks=$( ${SYSCTL_CMD} -n kern.disks 2>/dev/null )
	[ -z "${disks}" ] && disks="unknown"
}

sysinv_get_info_nodenamefile()
{
	[ -r "${nodenamefile}" ] && nodename=$( ${CAT_CMD} ${nodenamefile} | ${AWK_CMD} '{printf $1}' )
	[ -z "${nodenamefile}" ] && nodenamefile="unknown"
}

sysinv_get_info_vimage_feature()
{
	_ret=$( ${SYSCTL_CMD} -n kern.features.vimage 2>/dev/null )
	if [ -z "${_ret}" ]; then
		vimage_feature=0
	else
		vimage_feature=1
	fi
}

sysinv_get_info_racct()
{
	_ret=$( ${SYSCTL_CMD} -n kern.features.racct 2>/dev/null )
	if [ -z "${_ret}" ]; then
		racct=0
	else
		racct=1
	fi
}

sysinv_get_info_physmem()
{
	local _realmem

	. ${subrdir}/xen.subr

	if is_xen_dom0; then
		_realmem=$( ${XL_CMD} info total_memory 2>/dev/null )			# in MB by default
		[ -n "${_realmem}" ] && _realmem=$(( _realmem * 1024 * 1024 ))		# ->KB -> Bytes
	else
		_realmem=$( ${SYSCTL_CMD} -n hw.physmem 2>/dev/null )
	fi

	if [ -z "${_realmem}" ]; then
		physmem=0
	else
		physmem="${_realmem}"
	fi
}

sysinv_get_info_freemem()
{
	local _realmem _page_size _active_count _wire_count _active_size _wire_size _freemem

	. ${subrdir}/xen.subr

	if is_xen_dom0; then
		_freemem=$( ${XL_CMD} info free_memory 2>/dev/null )			# in MB by default
		[ -n "${_freemem}" ] && _freemem=$(( _freemem * 1024 * 1024 ))		# ->KB -> Bytes
	else
		sysinv_get_info_physmem		# get physmem
		_realmem="${physmem}"
		_realmem=$( ${SYSCTL_CMD} -n hw.physmem 2>/dev/null )
		_page_size=$( ${SYSCTL_CMD} -n vm.stats.vm.v_page_size )
		_active_count=$( ${SYSCTL_CMD} -n vm.stats.vm.v_active_count )
		_wire_count=$( ${SYSCTL_CMD} -n vm.stats.vm.v_wire_count )
		_active_size=$(( _page_size * _active_count ))
		_wire_size=$(( _page_size * _wire_count ))
		_freemem=$(( _realmem - _active_size - _wire_size ))
	fi

	if [ -n "${_freemem}" ]; then
		freemem="${_freemem}"
	else
		freemem=0
	fi
}

sysinv_get_info_memtype()
{
	local _dmidecode

	_dmidecode=$( which dmidecode )

	if [ -n "${_dmidecode}" ]; then
		memtype=$( ${_dmidecode} -t memory | ${GREP_CMD} -A20 "Memory Device" | ${GREP_CMD} -B20 "^Handle" | ${EGREP_CMD} "Type:|Speed:" | ${CUT_CMD} -d : -f 2 | ${XARGS_CMD} )
	else
		memtype=""
	fi
}

sysinv_get_info_nics()
{
	nics=""
	for i in $(${IFCONFIG_CMD} -l); do
		case "${i%%[0-9]*}" in
			ipfw|ppp|sl|lp|faith|fwe|fwip|plip|pfsync|pflog|tun|vboxnet|lo)
				continue
				;;
		esac
		nics="${nics} ${i}"
	done
	[ -n "${nics}" ] && nics=$( echo ${nics} | ${TR_CMD} " " "," )
}

# NEW
sysinv_get_info_la()
{
	la=$( ${SYSCTL_CMD} -qn vm.loadavg | ${TR_CMD} -d "{}" | ${AWK_CMD} '{printf $1" "$2" "$3"\n"}' )
	[ -z "${la}" ] && la="0 0 0"
}

sysinv_get_info_is_virtual()
{
	case "$( ${KENV_CMD} smbios.system.product )" in
		VirtualBox*)
			is_virtual="virtualbox"
			;;
		VMware*)
			is_virtual="vmware"
			;;
		Parallels*)
			is_virtual="parallels"
			;;
		KVM*)
			is_virtual="kvm"
			;;
		"Virtual Machine")
			is_virtual="hyperv"
			;;
		"RHEV Hypervisor")
			is_virtual="redhat_ev"
			;;
		"oVirt Node")
			is_virtual="ovirt"
			;;
		"HVM domU")
			is_virtual="xen_hardware"
			;;
		Bochs*)
			is_virtual="bochs"
			;;
		BHYVE)
			is_virtual="bhyve"
			;;
		*)
			is_virtual="physical"
			;;
	esac
}

sysinv_get_info_cbsdver()
{
	cbsdver=$( /usr/local/bin/cbsd version )
}

collect_info()
{
	cbsdver=${myversion}
	platform=$( /usr/bin/uname -s )

	for i in hostname hostarch osrelease cpumodel ncpu cpufreq kernhz sched eventtimer disks nodenamefile vimage_feature racct physmem freemem memtype nics la is_virtual cbsdver; do
		sysinv_get_info_${i}
	done
}

## MAIN
collect_info

if [ "${mode}" = "update" ]; then
	[ ! -h "${dbdir}/local.sqlite" ] && err 1 "${N1_COLOR}No inventory symlink. Run ${N2_COLOR}cbsd initenv${N1_COLOR} first${N0_COLOR}"
	. ${initenv}
	update_hwinfo
	env sqlcolnames="1" ${miscdir}/sqlcli ${dbdir}/local.sqlite "SELECT * FROM local" | ${XARGS_CMD} ${SYSRC_CMD} -qf  ${inventory} > /dev/null
fi
