#!/usr/local/bin/cbsd
#v14.1.02
MYARG=""
MYOPTARG="json"
MYDESC="Show CBSD capabilities for current platform"
CBSDMODULE="sys"
ADDHELP="
${H3_COLOR}Description${N0_COLOR}:

Shows CBSD capabilities (available engine/backend) for the current platform

${H3_COLOR}Options${N0_COLOR}:

 ${N2_COLOR}json=${N0_COLOR}  - JSON output;

${H3_COLOR}Examples${N0_COLOR}:

 # cbsd capabilities json=1

${H3_COLOR}See also${N0_COLOR}:

 cbsd summary --help

"

. ${subrdir}/nc.subr
json=0
. ${cbsdinit}

. ${system}

## MAIN
bhyve_status="0"
bhyve_description="Native FreeBSD hypervisor"
bhyve_prefix="b"
bhyve_info="https://github.com/cbsd/cbsd/blob/develop/share/docs/bhyve/cbsd_bhyve_quickstart.md"

jail_status="0"
jail_description="Native FreeBSD lightweight containers"
jail_prefix="j"
jail_info="https://github.com/cbsd/cbsd/blob/develop/share/docs/jail/cbsd_jail_quickstart.md"

qemu_status="0"
qemu_description="QEMU hypervisor"
qemu_prefix="q"
qemu_info="https://github.com/cbsd/cbsd/blob/develop/share/docs/qemu/cbsd_qemu_quickstart.md"

virtualbox_status="0"
virtualbox_description="VirtualBox hypervisor"
virtualbox_prefix="v"
virtualbox_info="https://github.com/cbsd/cbsd/blob/develop/share/docs/qemu/cbsd_virtualbox_quickstart.md"

vmm_status="0"
vmm_description="Native OpenBSD hypervisor"
vmm_prefix="o"
vmm_info="https://github.com/cbsd/cbsd/blob/develop/share/docs/jail/cbsd_vmm_quickstart.md"

xen_status="0"
xen_description="XEN hypervisor"
xen_prefix="x"
xen_info="https://github.com/cbsd/cbsd/blob/develop/share/docs/qemu/cbsd_xen_quickstart.md"

# ACCEL
nvmm_status="0"
kvm_status="0"

bhyve_ext_help_url="https://github.com/cbsd/cbsd/blob/develop/share/docs/bhyve/cbsd_bhyve_quickstart.md"
[ -n "${BHYVE_CMD}" ] && bhyve_status="1"

jail_ext_help_url="https://github.com/cbsd/cbsd/blob/develop/share/docs/jail/cbsd_jail_quickstart.md"
[ -n "${JAIL_CMD}" ] && jail_status="1"

nvmm_ext_help_url="https://github.com/cbsd/cbsd/blob/develop/share/docs/qemu/cbsd_qemu_quickstart.md#cbsd--qemu--dragonflybsd"
[ -n "${NVMMCTL_CMD}" ] && nvmm_status="1"

vmm_ext_help_url="https://github.com/cbsd/cbsd/blob/develop/share/docs/jail/cbsd_vmm_quickstart.md"
[ -n "${VMM_CMD}" ] && vmm_status="1"

qemu_ext_help_url="https://github.com/cbsd/cbsd/blob/develop/share/docs/qemu/cbsd_qemu_quickstart.md"
[ -n "${QEMU_SYSTEM_X86_64_CMD}" ] && qemu_status="1"

xen_ext_help_url="https://github.com/cbsd/cbsd/blob/develop/share/docs/qemu/cbsd_xen_quickstart.md"
[ -n "${XL_CMD}" ] && xen_status="1"

virtualbox_ext_help_url="https://github.com/cbsd/cbsd/blob/develop/share/docs/qemu/cbsd_virtualbox_quickstart.md"
[ -n "${VIRTUALBOX_CMD}" ] && virtualbox_status="1"

_cap_count_total=0
_cap_count_available=0
_cap_count_unavailable=0

for i in bhyve jail qemu virtualbox vmm xen; do
	_cap_count_total=$(( _cap_count_total + 1 ))
done

[ "${json}" = "1" ] && echo "["

_cap_count_current=0
for i in bhyve jail qemu virtualbox vmm xen; do
	_cap_count_current=$(( _cap_count_current + 1 ))

	_status=1
	_description=
	_prefix=
	_info=
	eval _status=\${${i}_status}
	eval _description=\${${i}_description}
	eval _prefix=\${${i}_prefix}
	eval _info=\${${i}_info}
	[ -z "${_status}" ] && _status="0"

	case "${_status}" in
		0)
			_cap_count_unavailable=$(( _cap_count_unavailable + _cap_count_unavailable ))
			;;
		1)
			_cap_count_available=$(( _cap_count_available + _cap_count_available ))
			;;
	esac

	if [ "${json}" = "1" ]; then
		if [ ${_cap_count_current} -eq ${_cap_count_total} ]; then
			JSON_DELIM=
		else
			JSON_DELIM=","
		fi

		${CAT_CMD} <<EOF
  {
    "name": "${i}",
    "description": "${_description}",
    "prefix": "${_prefix}",
    "available": ${_status},
    "info": "${_info}"
  }${JSON_DELIM}
EOF
	else
		${CAT_CMD} <<EOF
emulator_${i}_available="${_status}"
emulator_${i}_prefix="${_prefix}"
emulator_${i}_description="${_description}"
emulator_${i}_info="${_info}"
EOF
	fi
done

[ "${json}" = "1" ] && echo "]"

exit 0
