#!/usr/local/bin/cbsd
#v11.2.1
globalconf="${distdir}/cbsd.conf";
MYARG=""
MYOPTARG="fs_feat gold jname list new_host_hostname new_ip4_addr new_jname"
MYDESC="Import jail from image"
ADDHELP="\

${H3_COLOR}Description${N0_COLOR}:

Import jail from CBSD image.

${H3_COLOR}Options${N0_COLOR}:

 ${N2_COLOR}fs_feat=${N0_COLOR}           - 0 to disable fs (zfs/hammer) features, create in
                      normal/local dir (1 - auto by default).
 ${N2_COLOR}gold=${N0_COLOR}              - set '1' to convert image file to ZFS snapshot to use it
                      as 'gold' image, e.g. via 'cbsd jcreate from='.
                      Image will be converted to ZFS dataset with <name>@start snapshot.
 ${N2_COLOR}jname=${N0_COLOR}             - import <jname>.img ( image from ~cbsd/import/ directory.
 ${N2_COLOR}list=${N0_COLOR}              - set '1' to show content for ~cbsd/jimport/ directory
                      for list images.
 ${N2_COLOR}new_host_hostname=${N0_COLOR} - change hostname while importing. By default,
                      domain is inherits from original with change of hostname.
 ${N2_COLOR}new_ip4_addr=${N0_COLOR}      - change ip. Use 'DHCP' for detect ip automatically.
 ${N2_COLOR}new_jname=${N0_COLOR}         - import image and register as newname jail.

${H3_COLOR}Examples${N0_COLOR}:

 # cbsd jimport myjail
 # cbsd jimport jname=/usr/jails/export/oldjail.img new_jname=newjail

${H3_COLOR}See also${N0_COLOR}:

 cbsd jexport --help

"

CBSDMODULE="jail"

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

fs_feat=1
gold=0
. ${cbsdinit}

[ -n "${gold}" ] && ogold="${gold}"
. ${system}

if [ "${mod_cbsd_queue_enabled}" = "YES" -a -z "${MOD_CBSD_QUEUE_DISABLED}" ]; then
	readconf cbsd_queue.conf
	[ -z "${cbsd_queue_backend}" ] && MOD_CBSD_QUEUE_DISABLED="1"
fi

readconf zfs.conf

# return $list_img
get_list_img()
{
	list_img=$( ${LS_CMD} -1 ${importdir} | ${GREP_CMD} \.img$ | ${SED_CMD} 's/\.img//g' | ${XARGS_CMD} )
}

if [ -n "${list}" ]; then
	get_list_img
	for i in ${list_img}; do
		echo "${i}"
	done
	exit 0
fi

if [ -n "${jname}" ]; then

	# We accept jname with wildcard '*' e.g.: jail*, *vnet*
	# Also we need personal jname_is_multiple()
	# since jname_is_multiple from tools operate only with SQLite3
	# while jregister works only with ascii-based rc.conf files

	# jail as mask?
	is_mask=0

	jail_pref=$( substr --pos=0 --len=1 --str=${jname} )

	if [ "${jail_pref}" = "*" ]; then
		is_mask=1
	else
		strpos --str="${jname}" --search="*"
		is_mask=$?
	fi

	if [ ${is_mask} -ne 0 ]; then
		get_list_img
		if [ -n "${list_img}" ]; then
			for i in ${list_img}; do
				jimport jname=${i}
			done
		else
			err 1 "${N1_COLOR}No such jails by mask: ${N2_COLOR}${jname}${N0_COLOR}"
		fi
		exit 0
	fi
else
	# support for multiple image by full path: /path /path2
	jname=
	for i in $*; do
		# skip for arg=val args
		strpos --str="${i}" --search="="
		_pos=$?
		if [ ${_pos} -eq 0 ]; then
			if [ -r ${i} -o -r "${importdir}/${i}.img" ]; then
				jname="${jname} ${i}"
			elif [ -r ${CBSD_PWD}/${i} ]; then
				# lookup in curdir
				jname="${jname} ${CBSD_PWD}/${i}"
			else
				${ECHO} "${N1_COLOR}jimport: no such file here, skipp: ${N2_COLOR}${i}${N0_COLOR}"
				continue
			fi
		fi
	done
fi

if [ -z "${jname}" ]; then
	${ECHO} "${N1_COLOR}Give me jname or full path${N0_COLOR}"
	${ECHO} "${N1_COLOR}Content of ${N2_COLOR}${importdir}${N1_COLOR}:${N0_COLOR}"
	get_list_img
	for i in ${list_img}; do
		echo "${i}"
	done
	exit 0
fi

# $1 for jname/path
import_jail()
{
	local _size
	local jname="${1}"
	local from_nodename img_flat_size date ebytes=0 _ret compress=
	local st_time diff_time end_time

	if [ -z "${jname}" ]; then
		${ECHO} "${N1_COLOR}Empty jname or path${N0_COLOR}"
		return 1
	fi

	DATA="${importdir}"
	SRC="${DATA}/${jname}.img"

	if [ ! -f "${SRC}" ]; then
		SRC=${jname}
		if [ ! -f "${SRC}" ]; then
			${ECHO} "${N1_COLOR}No such jail or image here: ${N2_COLOR}${SRC}${N0_COLOR}"
			return 1
		fi
	fi

	. ${subrdir}/time.subr
	st_time=$( ${DATE_CMD} +%s )

	ebytes=$( get_file_bytes ${SRC} 2>/dev/null )
	img_flat_size=

	TMPDIR="${ftmpdir}/header.$$"
	imgpart mode=extract jname=${SRC} part=header out=${TMPDIR} >/dev/null 2>&1 || imgpart2 mode=extract jname=${SRC} part=header out=${TMPDIR}
	if [ $? -ne 0 ]; then
		echo 1 "header"
		return 1
	fi

	if [ ! -f "${TMPDIR}" ]; then
		${ECHO} "${N1_COLOR}No header info extracted${N0_COLOR}"
		return 1
	fi

	# extra header when jexport has extra data via header_extra="helpers=1"
	# extra hooks wip
	helpers=
	. "${TMPDIR}"
	[ -z "${hdrver}" ] && hdrver=0

	if [ -n "${helpers}" ]; then
		${ECHO} "${N1_COLOR}${CBSD_APP} pre-import hook via helpers: ${N2_COLOR}${helpers}${N0_COLOR}"
	fi
	${ECHO} "${N1_COLOR}Importing image, please stand by: ${N2_COLOR}${jname}${N0_COLOR}"

	if [ ${hdrver} -lt 3 ]; then
		${ECHO} "${N1_COLOR}Legacy image version detected. Using imgpart2 for extract${N0_COLOR}"
		${RM_CMD} -f ${TMPDIR}
		imgpart2 mode=extract jname=${SRC} part=header out=${TMPDIR}
		if [ ! -f ${TMPDIR} ]; then
			${ECHO} "Error retreive header v2"
			return 1
		fi
		. ${TMPDIR}
		imgpart_tool="imgpart2"
	else
		${ECHO} "${N1_COLOR}CBSD Image, version: ${N2_COLOR}${hdrver}${N0_COLOR}"
		imgpart_tool="imgpart"
	fi

	[ -n "${from_nodename}" ] && ${ECHO} "${N1_COLOR}Image was created on node: ${N2_COLOR}${from_nodename}${N1_COLOR}"
	[ -n "${date}" ] && ${ECHO} "${N1_COLOR}Image was created at: ${H5_COLOR}${date}${N0_COLOR}"

	if conv2human "${ebytes}"; then
		${ECHO} "${N1_COLOR}Image size: ${N2_COLOR}${convval}${N0_COLOR}"
	fi

	if [ -n "${img_flat_size}" ]; then
		if conv2human "${img_flat_size}"; then
			${ECHO} "${N1_COLOR}Environment flat size after extracting: ${N2_COLOR}${convval}${N0_COLOR}"
		fi
	fi

	[ -n "${compress}" ] && ${ECHO} "${N1_COLOR}Compress level: ${N2_COLOR}${compress}${N0_COLOR}"

	origjname="${jname}"
	${RM_CMD} -f "${TMPDIR}"
	[ -n "${new_jname}" ] && jname=${new_jname}
	jstatus jname=${jname} > /dev/null 2>&1
	if [ $? -eq 1 ]; then
		${ECHO} "${N1_COLOR}Jail already exist: ${N2_COLOR}${jname}${N1_COLOR}. May be ${N2_COLOR}new_jname=${N1_COLOR} args can help?${N0_COLOR}"
		return 1
	fi

	JAILDIR="${jaildatadir}/${jname}-${jaildatapref}"
	JAILFSTAB="${jailfstabdir}/${jname}/fstab"
	JAILLOCALFSTAB="${jailfstabdir}/${jname}/fstab.local"
	JAILRCCONF="${ftmpdir}/rc.conf_${jname}.$$"

	# check for already existance and offline
	if [ -d "${JAILDIR}" ]; then
		${ECHO} "${N1_COLOR}Jail datadir for ${jname} already exist. Please check and remove first: ${N2_COLOR}${JAILDIR}${N0_COLOR}"
		return 1
	fi

	${imgpart_tool} mode=extract jname=${SRC} part=rcconf out=${JAILRCCONF} hdrver=${hdrver}
	if [ $? -ne 0 ]; then
		${ECHO} "error extract rcconf"
		return 1
	fi

	trap "${RM_CMD} -f ${JAILRCCONF}" HUP INT ABRT BUS TERM EXIT

	[ "${origjname}" != "${jname}" ] && ${SED_CMD} -i${SED_DELIMER}'' s:${origjname}:${jname}:g ${JAILRCCONF}

	/usr/local/cbsd/misc/cbsdsysrc -qf ${JAILRCCONF} path=${jaildir}/${jname} > /dev/null
	/usr/local/cbsd/misc/cbsdsysrc -qf ${JAILRCCONF} mount_fstab=${jailfstabdir}/${jname}/fstab >/dev/null
	/usr/local/cbsd/misc/cbsdsysrc -qf ${JAILRCCONF} data=${jaildatadir}/${jname}-${jaildatapref} >/dev/null
	/usr/local/cbsd/misc/cbsdsysrc -qf ${JAILRCCONF} rcconf=${jailrcconfdir}/${jname}-rcconf >/dev/null

	. ${JAILRCCONF}

	# CBSD QUEUE
	if [ "${mod_cbsd_queue_enabled}" = "YES" -a -z "${MOD_CBSD_QUEUE_DISABLED}" ]; then

		case "${emulator}" in
			jail)
				[ -n "${cbsd_jail_queue_name}" ] && ${cbsd_queue_backend} cbsd_queue_name=${cbsd_jail_queue_name} id=${jname} cmd=jcreate ip4_addr=unknown protected=${protected} vnc_port=0 status=1
				;;
			bhyve)
				[ -n "${cbsd_bhyve_queue_name}" ] && ${cbsd_queue_backend} cbsd_queue_name=${cbsd_bhyve_queue_name} id=${jname} cmd=jcreate ip4_addr=unknown protected=${protected} vnc_port=0 status=1
				;;
		esac

		[ -n "${cbsd_import_queue_name}" ] && ${cbsd_queue_backend} cbsd_queue_name=${cbsd_import_queue_name} id=${jname} cmd=jimport status=1
		[ -n "${cbsd_import_queue_name}" ] && ${cbsd_queue_backend} cbsd_queue_name=${cbsd_import_queue_name} cmd=message msg="{\"cmd\":\"tooltip\",\"type\":\"information\",\"timeout\":10000,\"author\":\"Import\",\"msg\":\"${jname}#import#started...\"}"
	fi

	init_jail_path

	${imgpart_tool} mode=extract jname=${SRC} part=fstab out=${JAILFSTAB} hdrver=${hdrver}
	if [ $? -ne 0 ]; then
		${ECHO} "fstab"
		return 1
	fi
	[ "${origjname}" != "${jname}" ] && ${SED_CMD} -i${SED_DELIMER}'' s:${origjname}:${jname}:g ${JAILFSTAB}
	replacewdir file0="${JAILFSTAB}" file1="${JAILRCCONF}" old="CBSDROOT"

	${MKDIR_CMD} -p ${jailsysdir}/tmp.$$

	if [ "${origjname}" != "${jname}" ]; then
		_ret=$( ${imgpart_tool} mode=extract jname=${SRC} part=sysdata out=${jailsysdir}/tmp.$$ hdrver=${hdrver} 2>&1 )
		if [ $? -ne 0 ]; then
			err 1 "sysdata1: ${_ret}"
			return 1
		fi
		# migrate new version of rc.conf and delete old
		#if [ -f "${JAILRCCONF}" ]; then
		#	${MV_CMD} ${JAILRCCONF} ${jailsysdir}/tmp.$$/${origjname}/rc.conf
		#	JAILRCCONF="${jailsysdir}/tmp.$$/${origjname}/rc.conf"
		#fi
		[ -f "${jailsysdir}/tmp.$$/${origjname}/rc.conf_${origjname}" ] && ${RM_CMD} -f "${jailsysdir}/tmp.$$/${origjname}/rc.conf_${origjname}"
		[ -d "${jailsysdir}/${jname}" ] && ${RM_CMD} -rf ${jailsysdir}/${jname}
		[ -d "${jailsysdir}/tmp.$$/${origjname}" ] && ${MV_CMD} ${jailsysdir}/tmp.$$/${origjname} ${jailsysdir}/${jname}
		${RMDIR_CMD} ${jailsysdir}/tmp.$$
	else
		_ret=$( ${imgpart_tool} mode=extract jname=${SRC} part=sysdata out=${jailsysdir}/tmp.$$ hdrver=${hdrver} 2>&1 )
		if [ $? -ne 0 ]; then
			${ECHO} "sysdata2: ${_ret}"
			return 1
		fi
		[ -d ${jailsysdir}/${jname} -o -h ${jailsysdir}/${jname} ] && ${RM_CMD} -rf ${jailsysdir}/${jname}	# ZFS dir
		${FIND_CMD} ${jailsysdir}/tmp.$$/ -maxdepth 1 -mindepth 1 -type d -exec ${MV_CMD} {} ${jailsysdir}/${jname} \;
		${RMDIR_CMD} ${jailsysdir}/tmp.$$
	fi

	${imgpart_tool} mode=extract jname=${SRC} part=localfstab out=${JAILLOCALFSTAB} hdrver=${hdrver}
	if [ $? -ne 0 ]; then
		${ECHO} 1 "localfstab"
		return 1
	fi
	[ -r "${JAILLOCALFSTAB}" ] && replacewdir file0="${JAILLOCALFSTAB}" old="CBSDROOT"

	[ ${fs_feat} -eq 0 ] && zfsfeat=0

	if [ "${origjname}" = "${jname}" ]; then
		case ${zfsfeat} in
			0)
				${MKDIR_CMD} ${JAILDIR}
				;;
			1)
				. ${subrdir}/zfs.subr
				ZPOOL=$( ${ZFS_CMD} get -Ho value name ${jaildatadir} )
				if [ -n "${ZPOOL}" ]; then
					if zfsroot ${jname}; then
						${ECHO} "ZFS with ${jname} in pool already exist"
						return 1
					fi
					${ZFS_CMD} create ${zfs_create_flags} -o mountpoint=${JAILDIR} ${ZPOOL}/${jname}
				fi
				;;
		esac

		printf "${H3_COLOR}"
		case "${emulator}" in
			jail)
				${imgpart_tool} mode=extract jname=${SRC} part=data out=${jaildatadir} hdrver=${hdrver} ebytes=${ebytes} > /dev/null
				_ret=$?
				;;
			bhyve|xen|qemu)
				${MKDIR_CMD} -p ${jaildatadir}/tmp.$$
				${imgpart_tool} mode=extract jname=${SRC} part=data out=${jaildatadir}/tmp.$$ hdrver=${hdrver} ebytes=${ebytes} > /dev/null
				_ret=$?
				${FIND_CMD} ${jaildatadir}/tmp.$$/ -maxdepth 3 -mindepth 1 -type f -exec ${MV_CMD} {} ${JAILDIR}/ \;
				${RM_CMD} -rf ${jaildatadir}/tmp.$$
				;;
		esac
		printf "${N0_COLOR}"
		if [ ${_ret} -ne 0 ]; then
			${ECHO} "data"
			return 1
		fi
		# remove old symlink if exist for VM
		# due to create-bhyve|xen|qemu will create new structure ( which may not coincide with the original FS )
		case "${emulator}" in
			bhyve|xen|qemu)
				[ -n "${jaildatadir}" -a -d "${jaildatadir}" ] && ${FIND_CMD} ${jaildatadir}/ -mindepth 1 -maxdepth 1 -type l -delete > /dev/null 2>&1
				;;
			*)
				;;
		esac
	else
		# create temporary zfs file system for extract $origname data then rename it to ${jname}
		case ${zfsfeat} in
			0)
				${MKDIR_CMD} -p ${jaildatadir}/tmp.$$
				printf "${H3_COLOR}"
				${imgpart_tool} mode=extract jname=${SRC} part=data out=${jaildatadir}/tmp.$$ hdrver=${hdrver} ebytes=${ebytes} > /dev/null
				_ret=$?
				printf "${N0_COLOR}"
				if [ ${_ret} -ne 0 ]; then
					${ECHO} "data"
					return 1
				fi
				[ -d "${jaildatadir}/tmp.$$/${origjname}-${jaildatapref}" ] && ${MV_CMD} ${jaildatadir}/tmp.$$/${origjname}-${jaildatapref} ${jaildatadir}/${jname}-${jaildatapref}
				${RMDIR_CMD} ${jaildatadir}/tmp.$$
				;;
			1)
				. ${subrdir}/zfs.subr
				ZPOOL=$( ${ZFS_CMD} get -Ho value name ${jaildatadir} )
				if [ -z "${ZPOOL}" ]; then
					${ECHO} "Can't determine ZPOOL for ${jaildatadir}. Working on non-zfs scenario"
					${MKDIR_CMD} -p ${jaildatadir}/tmp.$$
					printf "${H3_COLOR}"
					${imgpart_tool} mode=extract jname=${SRC} part=data out=${jaildatadir}/tmp.$$ hdrver=${hdrver} ebytes=${ebytes} > /dev/null
					_ret=$?
					printf "${N0_COLOR}"
					if [ ${_ret} -ne 0 ]; then
						${ECHO} "data"
						return 1
					fi
					[ -d "${jaildatadir}/tmp.$$/${origjname}-${jaildatapref}" ] && ${MV_CMD} ${jaildatadir}/tmp.$$/${origjname}-${jaildatapref} ${jaildatadir}/${jname}-${jaildatapref}
					${RMDIR_CMD} ${jaildatadir}/tmp.$$
				else
					#create temp zfs
					TMPDATADIR="${jaildatadir}/tmp.$$"
					TMPJAILDATADIR="${TMPDATADIR}/${origjname}-${jaildatapref}"
					${MKDIR_CMD} -p ${TMPJAILDATADIR}
					${ZFS_CMD} create ${zfs_create_flags} -o mountpoint=${TMPJAILDATADIR} ${ZPOOL}/${jname}
					printf "${H3_COLOR}"
					${imgpart_tool} mode=extract jname=${SRC} part=data out=${TMPDATADIR} hdrver=${hdrver} ebytes=${ebytes} > /dev/null
					_ret=$?
					printf "${N0_COLOR}"
					if [ ${_ret} -ne 0 ]; then
						${ECHO} "data"
						return 1
					fi
					${ZFS_CMD} unmount ${ZPOOL}/${jname}
					${ZFS_CMD} set mountpoint=${JAILDIR} ${ZPOOL}/${jname}
					if ! is_mounted ${JAILDIR}; then
						${ZFS_CMD} mount ${ZPOOL}/${jname}
					fi
					${RMDIR_CMD} ${TMPJAILDATADIR} ${TMPDATADIR}
				fi
				;;
		esac
	fi

	# zvol area
	if [ -n "${vm_zvol_list}" ]; then
		. ${subrdir}/bhyve.subr
		${ECHO} "${N1_COLOR}ZVOLs list: ${N2_COLOR}${vm_zvol_list}${N0_COLOR}"
		for i in ${vm_zvol_list}; do
			vol_size=0
			dsk=
			eval vol_size="\$vm_zvol_size_${i}"

			if [ -z "${vol_size}" ]; then
				${ECHO} "${N1_COLOR}jimport empty vm_zvol_size_${i}, skipp${N0_COLOR}"
				continue
			fi

			dsk=${jaildatadir}/${jname}-${jaildatapref}/${i}.vhd

			_res=
			_msg=

			_msg=$( virtual_create_dsk -p ${dsk} -s ${vol_size} -f 1 2>&1 )
			_res=$?
			if [ ${_res} -ne 0 ]; then
				bremove ${jname}
				${ECHO} "Error: jimport: couldn't create the image file. ${_msg}"
				return 1
			fi

			if conv2human "${vol_size}"; then
				_size="${convval}"
			else
				_size="${vol_size}"
			fi

			#imghelper --start ${FROM} --end ${TO} --infile ${SRC} | ${miscdir}/cbsdtee -e ${ebytes} | ${TAR_CMD} xpf - -C "${out}" --numeric-owner
			printf " ${N2_COLOR}* ${i} (${_size}): ${H3_COLOR}"
			imghelper --start ___NCSTART_ZVOL_${i}=1 --end ___NCSTOP_ZVOL_${i}=1 --infile ${SRC} | ${miscdir}/cbsdtee -e ${vol_size} | ${GUNZIP_CMD} -c > ${dsk}
			printf "${N0_COLOR}"
		done
	fi

	# post action: modify ip if necessary
	if [ -n "${new_ip4_addr}" ]; then
		case "${new_ip4_addr}" in
			[Dd][Hh][Cc][Pp])
				new_ip4_addr=$( dhcpd )
				if [ $? -eq 2 ]; then
					${ECHO} "${N1_COLOR}No free IP address for DHCP in nodeippool${N0_COLOR}"
					return 1
				fi
				;;
			*)
		esac
		${ECHO} "${N1_COLOR}IP sets to: ${N2_COLOR}${new_ip4_addr}${N0_COLOR}"
		/usr/local/cbsd/misc/cbsdsysrc -qf ${JAILRCCONF} ip4_addr="${new_ip4_addr}" >/dev/null
	fi

	if [ -z "${new_host_hostname}" ]; then
		mydomain=${host_hostname#*.}
		if [ -n "${mydomain}" ]; then
			if [ -n "${new_jname}" ]; then
				new_host_hostname="${new_jname}.${mydomain}"
			else
				new_host_hostname="${jname}.${mydomain}"
			fi
		else
			new_host_hostname="${host_hostname}"
		fi
	fi

	${ECHO} "${N1_COLOR}Hostname sets to: ${N2_COLOR}${new_host_hostname}${N0_COLOR}"
	/usr/local/cbsd/misc/cbsdsysrc -qf ${JAILRCCONF} host_hostname="${new_host_hostname}" >/dev/null

	jregister jname=${jname} mode=new rcfile=${JAILRCCONF}
	[ -r ${JAILRCCONF} ] && ${RM_CMD} -f ${JAILRCCONF}

	# workaround for #603: https://github.com/cbsd/cbsd/issues/603
	[ -r ${jailsysdir}/${jname}/rc.conf_${jname}.orig ] && ${MV_CMD} ${jailsysdir}/${jname}/rc.conf_${jname}.orig ${jailsysdir}/${jname}/rc.conf_${jname}

	if [ -f "${jailsysdir}/${jname}/jail-message" ]; then
		echo "---- jail messages ----"
		${CAT_CMD} "${jailsysdir}/${jname}/jail-message"
		echo "---- jail messages ----"
	fi

	# CBSD QUEUE
	if [ "${mod_cbsd_queue_enabled}" = "YES" -a -z "${MOD_CBSD_QUEUE_DISABLED}" ]; then
		# refresh jail info
		. ${subrdir}/rcconf.subr

		case "${emulator}" in
			jail)
				[ -n "${cbsd_jail_queue_name}" ] && ${cbsd_queue_backend} cbsd_queue_name=${cbsd_jail_queue_name} id=${jname} cmd=jcreate ip4_addr=${ip4_addr} host_hostname=${host_hostname} protected=${protected} vnc_port=0 status=2
				[ -n "${cbsd_jail_queue_name}" ] && ${cbsd_queue_backend} cbsd_queue_name=${cbsd_jail_queue_name} id="${jname}" cmd=update ip4_addr="${ip4_addr}" host_hostname="${host_hostname}" status=1
				;;
			bhyve)
				[ -n "${cbsd_bhyve_queue_name}" ] && ${cbsd_queue_backend} cbsd_queue_name=${cbsd_bhyve_queue_name} id=${jname} cmd=jcreate ip4_addr=${ip4_addr} host_hostname=${host_hostname} protected=${protected} vnc_port=0 status=2
				[ -n "${cbsd_bhyve_queue_name}" ] && ${cbsd_queue_backend} cbsd_queue_name=${cbsd_bhyve_queue_name} id="${jname}" cmd=update ip4_addr="${ip4_addr}" host_hostname="${host_hostname}" status=1
				;;
		esac

		[ -n "${cbsd_import_queue_name}" ] && ${cbsd_queue_backend} cbsd_queue_name=${cbsd_import_queue_name} id=${jname} cmd=jimport status=2
		[ -n "${cbsd_import_queue_name}" ] && ${cbsd_queue_backend} cbsd_queue_name=${cbsd_import_queue_name} cmd=message msg="{\"cmd\":\"tooltip\",\"type\":\"success\",\"timeout\":10000,\"author\":\"Import\",\"msg\":\"${jname}#import#completed\"}"
	fi

	end_time=$( ${DATE_CMD} +%s )
	diff_time=$(( end_time - st_time ))
	diff_time=$( displaytime ${diff_time} )
	${ECHO} "${N1_COLOR}${CBSD_APP} done ${N2_COLOR}in ${diff_time}${N0_COLOR}"
}

for i in ${jname}; do
	import_jail ${i}
done

exit 0
