#!/usr/local/bin/cbsd
#v10.1.6
MYARG="jconf"
MYOPTARG="inter ver arch customskel fstablocal delpkglist removejconf pkglist jprofile zfs_snapsrc"
MYDESC="Create VirtualBox from config file"
ADDHELP="inter=0 to prevent any questions and to accept answers by default\n\
customskel = additional skel directory applyed above jail structrure\n\
fstablocal = additional fstab file stored as fstab.local\n\
jprofile = specify jail profile for creating jail\n\
zfs_snapsrc = use ZFS snapshot as data source\n"
CBSDMODULE="virtualbox"
EXTHELP="wf_bcreate"

. ${subrdir}/nc.subr
. ${system}
. ${tools}
. ${mdtools}
. ${jfs}
readconf buildworld.conf
readconf virtualbox-default-default.conf
readconf zfs.conf
. ${subrdir}/universe.subr
. ${subrdir}/freebsd_world.subr
. ${subrdir}/virtualbox.subr

. ${cbsdinit}

### MAIN
[ ! -f "$jconf" ] && err 1 "${N1_COLOR}no such jconf file${N0_COLOR}";
over="${ver}"
oarch="${arch}"
jconf=$( realpath $jconf )

if [ -z "${delpkglist}" ]; then
	delpkglist=0
else
	delpkglist=1
fi

temprcconf="${ftmpdir}/jcreate_jconf.$$"

/bin/cp ${jconf} ${temprcconf}

if [ ${removejconf} = "1" ]; then
	trap "/bin/rm -f ${temprcconf} ${jconf}" HUP INT ABRT BUS TERM  EXIT
else
	trap "/bin/rm -f ${temprcconf}" HUP INT ABRT BUS TERM  EXIT
fi

. ${temprcconf}
. ${subrdir}/build.subr
. ${temprcconf}

[ -z "${jname}" ] && err 1 "${N1_COLOR}No such jname variable${N0_COLOR}"

# profile
readconf vm-${vm_os_type}-${vm_os_profile}.conf
[ -z "${vm_profile}" ] && err 1 "${N1_COLOR}No such profile: ${N2_COLOR}vm-${vm_os_type}-${vm_os_profile}.conf${N0_COLOR}"
# re-read jail params and apply personal after profile
. ${temprcconf}

jstatus jname=${jname} > /dev/null 2>&1
[ $? -eq 0 ] || err 1 "${N1_COLOR}Jail with $jname already exist${N0_COLOR}"

# ip validate
if [ -n "${interface}" -a "${inteface}" != "0" ]; then
	### CHECK FOR IP ( 1 - check for interfaces) ####
	checkip ip=${ips} check=1 > /dev/null 2>&1
	case $? in
		0)
			err 1 "${N1_COLOR}Ip not in pool range${N0_COLOR}"
			;;
		1)	;;
		2)
			${ECHO} "${N1_COLOR}Warning:${N2_COLOR} Ip already exists in LAN${N0_COLOR}"
			;;
		*)
			err 1 "Unknown code from checkip"
			;;
	esac
fi

${ECHO} "${N1_COLOR}Please wait: ${N2_COLOR}this will take a while...${N0_COLOR}"

[ -d "${data}" ] && remove_data_dir ${data}

create_fs ${data}

[ ! -d "${data}" ] && err 1 "Can't create datadir ${data}"
[ ! -d ${path} -a "${baserw}" -eq 0 ] && mkdir -p ${path}
[ ! -d ${jailfstabdir}  ] && mkdir -p ${jailfstabdir}
[ ! -d "${jailsysdir}/${jname}" ] && mkdir -p ${jailsysdir}/${jname}

if [ "${vm_os_type}" = "freebsd" -a "${from_jail}" = "1" ]; then
	case ${virtualbox_profile} in
		"FreeBSD-bsdinstall-jail")
			export UNAME_r="${ver}-RELEASE"
			export DISTRIBUTIONS="kernel.txz base.txz"
			bsdinstall jail ${data}
			unset UNAME_r
			nobase=1
			;;
		*)
			nobase=0
			init_target_arch
			init_basedir
			init_kerneldir
			get_base -v ${ver}
			${ECHO} "${N1_COLOR}Stage1: ${N2_COLOR}jail hier...${N0_COLOR}"
			populate_freebsd_world
			customskel
			;;
	esac
fi

/bin/cp $temprcconf $rcconf

[ -n "${fstablocal}" -a -f "${fstablocal}" ] && /bin/cp ${fstablocal} ${jailfstabdir}/${jailfstabpref}${jname}.local

# Finnaly export to SQLite
jregister jname=${jname} mode=new

_res=$?

if [ "${vm_os_type}" = "freebsd" -a "${from_jail}" = "1" ]; then
	if [ -n "${pkglist}" ]; then
		pkg mode=bootstrap jname=${jname} ||true
		if [ ! -f "${pkglist}" ]; then
			pkg mode=install jname=${jname} ${pkglist}
		else
			pkg mode=install pkglist="${pkglist}" jname=${jname}
			[ $delpkglist -eq 1 ] && /bin/rm -f ${pkglist}
		fi
	fi

	if [ -n "${user_pw_root}" ]; then
		passwd jname=${jname} login="root" pw="${user_pw_root}"
	fi

	if [ -n "${sysrc_enable}" ]; then
		for i in ${sysrc_enable}; do
			sysrc jname=${jname} ${i}_enable="YES"
		done
	fi

	[ -n "${user_add}" ] && adduser jname=${jname} mode=add fromfile="${jconf}"
fi

if [ ${_res} -eq 0 ]; then
	echo
	${ECHO} "${N1_COLOR}To edit VM properties use: ${N2_COLOR}cbsd vconfig jname=${jname}${N0_COLOR}"
	${ECHO} "${N1_COLOR}To start VM use: ${N2_COLOR}cbsd vstart ${jname}${N0_COLOR}"
	${ECHO} "${N1_COLOR}To stop VM use: ${N2_COLOR}cbsd vstop ${jname}${N0_COLOR}"
	${ECHO} "${N1_COLOR}To remove VM use: ${N2_COLOR}cbsd vremove ${jname}${N0_COLOR}"
	${ECHO} "${N1_COLOR}For attach VM console use: ${N2_COLOR}cbsd vlogin ${jname}${N0_COLOR}"
	echo
	${ECHO} "${N1_COLOR}Creating ${jname} complete: ${N2_COLOR}Enjoy!${N0_COLOR}"
	/bin/rm -f $rcconf

	[ "${mdsize}" != "0" ] && unmountmd jroot=${data}
	#timezone

	defdsk="dsk1.vhd"
	defnic="nic1.vhd"

	if [ "${from_jail}" ]; then
		${ECHO} "${N1_COLOR}Stage2: ${N2_COLOR}jail2iso...${N0_COLOR}"
		[ -z "${swapsize}" ] && swapsize="0"
		jail2iso jname=${jname} nameserver=${jnameserver} ip4_addr=${ip4_addr} gw4=${gw4} dstname=${jname}.$$.img swapsize=${swapsize} freesize=${imgsize} dstdir=/tmp host_hostname="${host_hostname}" media=virtualbox quiet=1 prunelist=0 nobase=${nobase} vm_guestfs=${vm_guestfs}
		jremove ${jname}
		/usr/local/cbsd/misc/cbsdsysrc -qf ${jconf} ver="empty" > /dev/null
		/usr/local/cbsd/misc/cbsdsysrc -qf ${jconf} sysrc_enable="" > /dev/null
		jcreate jconf=${jconf}
		#test for zfs mounted & mount if not
		case $zfsfeat in
			1)
				. ${subrdir}/zfs.subr
				zfsmnt ${data}
				[ $? -eq 2 ] && /sbin/zfs mount "${ZPOOL}"
				;;
		esac
		/usr/local/cbsd/misc/cbsdsysrc -qf ${jconf} ver="${ver}" > /dev/null
		${MV_CMD} /tmp/${jname}.$$.img ${data}/${defdsk}
	else
		if ! virtualbox_create_dsk ${data}/${defdsk} ${imgsize} ${swapsize}; then
			err 1 "vcreate error: Couldn't create the image file. ${mdimage}"
		fi
	fi

	if [ -n "${virtio_type}" ]; then
		${miscdir}/sqlcli ${dbdir}/local.sqlite "INSERT INTO virtualboxdsk ( jname,dsk_controller,dsk_path,dsk_slot ) VALUES ( \"${jname}\",\"${virtio_type}\",\"${defdsk}\","0" )"
	else
		${miscdir}/sqlcli ${dbdir}/local.sqlite "INSERT INTO virtualboxdsk ( jname,dsk_path,dsk_slot ) VALUES ( \"${jname}\",\"${defdsk}\","0" )"
	fi

	${miscdir}/sqlcli ${dbdir}/local.sqlite "INSERT INTO virtualboxnic ( jname ) VALUES ( \"${jname}\" )"

	# store profile in jail system dir
	[ ! -d "${jailsysdir}/${jname}/etc" ] && /bin/mkdir ${jailsysdir}/${jname}/etc && /usr/sbin/chown cbsd:cbsd ${jailsysdir}/${jname}/etc
	storeconf virtualbox-${vm_os_type}-${vm_os_profile}.conf ${jailsysdir}/${jname}/etc/virtualbox-${vm_os_type}-${vm_os_profile}.conf

	${VBOX_MGMT_CMD} createvm --name ${jname} --ostype ${virtualbox_ostype} --register

	${VBOX_MGMT_CMD} storagectl ${jname} --name "IDE Controller" --add ide
	${VBOX_MGMT_CMD} storageattach ${jname} --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium ${data}/${defdsk}
	exit 0
else
	${ECHO}
	${ECHO} "${N1_COLOR}Creating ${jname} failed: ${N2_COLOR}cbsd jregister${N0_COLOR}"
	${ECHO} "${N1_COLOR}Please review bad config file: ${N2_COLOR}/tmp/rc.conf_${jname}${N0_COLOR}"
	mv $rcconf /tmp
	#cleanup
	[ -f "${mount_fstab}" ] && /bin/rm -f ${mount_fstab}
	remove_data_dir ${data}
	exit 1
fi
