#!/usr/local/bin/cbsd
#v11.0.5
MYARG="path size"
MYOPTARG="format type name jname"
MYDESC="Create virtual storage media for bhyve"
CBSDMODULE="bhyve"
EXTHELP="wf_bhyve.html"
ADDHELP="name=storage name\n\
path=storage path\n\
type=hdd,cd\n\
format=vdi,vmdk,vhd\n\
size=size of image\n"

. ${subr}
. ${system}
. ${strings}
. ${tools}

init $*

. ${workdir}/bhyve.subr

dsk_path="${path}"

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

	_sql="SELECT name,path,type,jname FROM media"

	cbsdsql storage_media ${_sql} | while read name path type jname; do
		populate_output_data
	done

	IFS=" "
}


# select into $vm_res variable path of media by name
# return 0 if data exist
#
select_by_name()
{
	vm_res=$( cbsdsql storage_media SELECT path FROM media WHERE name=\"${name}\" )

	[ -z "${vm_res}" ] && return 1

	return 0
}

# select into $vm_res variable name of media by $path or $1
# return 0 if data exist
select_by_path()
{
	local _p

	if [ -n "${1}" ]; then
		_path="${1}"
	else
		_path="${path}"
	fi

	vm_res=$( cbsdsql storage_media SELECT name FROM media WHERE path=\"${_path}\" )

	[ -z "${vm_res}" ] && return 1

	return 0
}

update_jname()
{
	cbsdsql storage_media "UPDATE media SET jname=\"${jname}\" WHERE name=\"${name}\" AND path=\"${path}\""
}

update_type()
{
	cbsdsql storage_media "UPDATE media SET type=\"${type}\" WHERE name=\"${name}\" AND path=\"${path}\""
}


#### MAIN
if is_number ${size}; then
	if conv2bytes ${size}; then
		size="${convval}"
	fi
fi

named_disk=1		# 1 - seq/named disk for existing jail
			# 0: /full/path
			# 1: dskX

prefix=$( substr --pos=0 --len=1 --str=${dsk_path} )
[ "${prefix}" = "/" ] && named_disk=0

if [ ${named_disk} -eq 1 ]; then
	prefix=$( substr --pos=0 --len=3 --str=${dsk_path} )
	[ "${prefix}" != "dsk" ] && err 1 "${MAGENTA}Non-FS-based path must be named as: ${GREEN}dskX${NORMAL}"
fi

[ ${named_disk} -eq 0 -a -r "${dsk_path}" ] && err 1 "${MAGENTA}File already exist in FS: ${GREEN}${dsk_path}${NORMAL}"

if [ ${named_disk} -eq 1 -a -z "${jname}" ]; then

	case "${zfsfeat}" in
		0)
			err 1 "${MAGENTA}For non-FS-based path (path not started from /), ${GREEN}jname=${MAGENTA} is mandatory${NORMAL}"
			;;
		1)
			jname="CBSDSYS"
			full_path="${jaildatadir}/CBSDSYS-data/${dsk_path}.vhd"
			;;
	esac
fi

[ -z "${name}" ] && name="hdd-${dsk_path}"
[ -z "${type}" ] && type="hdd"

if [ ${named_disk} -eq 1 -a "${jname}" != "CBSDSYS" ]; then
	. ${jrcconf}
	[ $? -eq 1 ] && err 1 "${MAGENTA}No such vm: ${GREEN}${jname}${NORMAL}"
	[ "${emulator}" != "bhyve" ] && err 1 "${MAGENTA}Not in bhyve mode${NORMAL}"
	full_path="${data}/${dsk_path}.vhd"
fi

case ${named_disk} in
	0)
		echo "/usr/bin/truncate -s${size} ${dsk_path}"
		/usr/bin/truncate -s${size} ${dsk_path}

		cbsdsql storage_media "INSERT INTO media ( name, path, type, jname, size ) VALUES ( \"${name}\", \"${dsk_path}\", \"${type}\", \"${jname}\", \"${size}\" )"
		;;
	1)
		[ -r "${full_path}" -a -h "${full_path}" ] && err 1 "${MAGENTA}Disk file already exist: ${GREEN}${full_path}${NORMAL}"

		select_by_path ${full_path}
		[ $? -eq 0 ] && err 1 "${MAGENTA}Path already registered: ${GREEN}${vm_res}${NORMAL}"

		if ! bhyve_create_dsk -p ${full_path} -s ${size} -f 1; then
			err 1 "${MAGENTA}bhyve_create_dsk from createhd failed for: ${GREEN}${full_path}${NORMAL}"
		fi

		;;
esac

if [ "${jname}" = "CBSDSYS" ]; then
	cbsdsql storage_media "UPDATE media SET jname=\"-\" WHERE jname=\"CBSDSYS\" AND path=\"${full_path}\""
fi
