#!/usr/local/bin/cbsd
#v11.1.2
MYARG=""
MYOPTARG="display header active human"
MYDESC="Operate with vm_packages/flavor database"
CBSDMODULE="bhyve,jail,qemu,xen"
ADDHELP="
${H3_COLOR}Description${N0_COLOR}:

Usually, when creating virtual environments, you operate with three parameters to 
describe the physical characteristics: 'vm_cpus', 'vm_ram' and 'imgsize'.

In some cases it is more convenient to create named groups that describe these parameters, 
for example:

 - small1: 1 vCPU,  1GB RAM,  10GB of first dsk size;
 - medium1: 8 vCPU, 8GB RAM,  60GB of first dsk size;
 - large1: 16 vCPU, 32GB RAM, 200GB of first dsk size;
 - ...
 
And then use it when creating environments, for example, instead of:

 cbsd bcreate vm_cpus=8 vm_ram=8g imgsize=60g ..

use:

 cbsd bcreate flavor=medium1 ..

This script works with flavor base.

${H3_COLOR}General Options${N0_COLOR}:

 ${N2_COLOR}header=${N0_COLOR}  - when '0' don't print header (default = '1');
 ${N2_COLOR}display=${N0_COLOR} - list by comma for column, default values:
             'name,pkg_vm_cpus,pkg_vm_ram,pkg_vm_disk';
 ${N2_COLOR}human=${N0_COLOR}   - Humanize output. When '0' - convert 1g/20g values to bytes,
             default values: '1';

${H3_COLOR}Examples${N0_COLOR}:

 # cbsd vm-packages

${H3_COLOR}See also${N0_COLOR}:

 cbsd vm-packages-tui --help
 cbsd bcreate --help
 cbsd jcreate --help
 cbsd xcreate --help
 cbsd qcreate --help
 
"

. ${subrdir}/nc.subr

. ${cbsdinit}

. ${system}

[ -z "${display}" ] && display="name,pkg_vm_cpus,pkg_vm_ram,pkg_vm_disk"
[ -z "${human}" ] && human=1

#remove commas for loop action on header
mydisplay=$( echo ${display} | ${TR_CMD} ',' '  ' )

# upper for header
myheader=$( echo ${mydisplay} | ${TR_CMD} '[:lower:]' '[:upper:]' )

show_header()
{
	local _header="${BOLD}${myheader}${N0_COLOR}"
	[ ${header} -eq 1 ] && ${ECHO} ${_header}
}

# if $1 = "Unregister" then overwrite status to "Unregister"
populate_output_data()
{
	local _i _val

	_status=

	printf "${N0_COLOR}" # for column sort

	#populate values for in output string
	for _i in ${mydisplay}; do

		_val=""

		eval _val="\$$_i"

		if [ ${human} -eq 0 ]; then
			case "${_i}" in
				pkg_vm_ram|pkg_vm_disk)
					[ -z "${_val}" ] && continue
					if is_number ${_val}; then
						if conv2bytes ${_val}; then
							_val="${convval}"
						fi
					fi
					;;
			esac
		fi

		[ -z "${_val}" ] && _val="\-"
		printf "${_val} "
	done

	printf "\n"
}


# $1 - which file from. Eg: local
show_jaildata_from_sql()
{
	local _i

	#   set sqlfile for ". rcconf" including
	if [ -n "${1}" ]; then
		sqlfile="$1"
	else
		sqlfile="local"
	fi

	[ -n "${2}" ] && local jname="${2}"

	_sql="SELECT name,pkg_vm_cpus,pkg_vm_ram,pkg_vm_disk FROM vmpackages"
	cbsdsqlro ${sqlfile} ${_sql} | while read name pkg_vm_cpus pkg_vm_ram pkg_vm_disk; do
		populate_output_data
		${ECHO} ${_status}
	done
}


show_local()
{
	local _errcode _status

	show_header
	show_jaildata_from_sql local
}

show_vhid()
{
	show_local
}

#### MAIN
[ -z "${header}" ] && header=1
sqldelimer=" "
show_local | ${COLUMN_CMD} -t

exit 0
