#!/usr/local/bin/cbsd
#v12.1.10
. ${subrdir}/nc.subr
. ${strings}
. ${tools}

[ ! -f "${distsharedir}/jail-arg" ] && err 1 "No such jail-arg skel"
. ${distsharedir}/jail-arg
CBSDMODULE="jail"
MYDESC="dialog-based text user interface for jail configuration"
MYARG="jname"
MYOPTARG="${JARG} outfile"
ADDHELP="\

${H3_COLOR}Description${N0_COLOR}:

Text user interface for jail configuration. This script invoked by 'cbsd jconfig'.

${H3_COLOR}Options${N0_COLOR}:

 ${N2_COLOR}jname=${N0_COLOR}     - work with <jail>;

${H3_COLOR}Examples${N0_COLOR}:

 # cbsd jsetup-tui jname=jail1

${H3_COLOR}See also${N0_COLOR}:

  cbsd jconfig --help
  cbsd jget --help
  cbsd jset --help

"

. ${cbsdinit}

. ${subrdir}/settings-tui.subr
. ${subrdir}/settings-tui-jail.subr
. ${dialog}

commit()
{
	local _oldjname _newjname

	_oldjname="${jname}"

	for i in ${JARG}; do
		eval VAL=\$$i
		eval OVAL=\$OLDVAL_${i}

		if [ "${i}" = "jname" ]; then
			_oldjname="${OVAL}"
			_newjname="${VAL}"
			continue
		fi
		[ "${VAL}" = "${OVAL}" ] && continue
		echo "jset mode=quiet jname=${_oldjname} $i=\"${VAL}\""
		jset mode=quiet jname=${_oldjname} $i="${VAL}"
	done

	if [ "${_oldjname}" != "${_newjname}" -a -n "${_newjname}" ]; then
		${ECHO} "jname: ${N1_COLOR}${_newjname}${N0_COLOR}"
		jrename old=${_oldjname} new=${_newjname}
		jname="${_newjname}"
	fi

	[ ${repo} -eq 1 ] && jconfig mode=list jname=${jname}
	exit 0
}


store_defaults()
{
	local i VAL

	eval $( for i in "jname" ${JARG}; do
		[ "${i}" = "repo" ] && repo=1 && continue
		eval VAL=\$$i
		echo "OLDVAL_${i}=\"${VAL}\""
	done )
}


dialog_menu_main()
{
	repo=0 # flags for execution jsetup-tui from repo get image

	hline=
	local _descr
	local defaultitem=

	item_let="A"
	item_num=0

	local i _mytest skip

	local _checkbox_all _checkbox_main_menu _params_main_menu

	_checkbox_all="allow_devfs allow_dying allow_fusefs allow_linprocfs allow_linsysfs allow_kmem allow_mount \
	allow_nullfs allow_fdescfs allow_procfs allow_raw_sockets allow_read_msgbuf allow_reserved_ports allow_sysvipc \
	allow_tmpfs allow_unprivileged_proc_debug allow_vmm allow_zfs applytpl astart floatresolv hidden mkhostsfile \
	mount_devfs mount_fdescfs mount_procfs mount_linprocfs mount_linsysfs mount_fstab mount_kernel mount_obj \
	mount_ports mount_src persist protected vnet allow_mlock baserw"

	f_dialog_info "scan and build menu entry..."

	# leave current checkbox list in main menu, rest - goes to submenu
	_checkbox_main_menu="applytpl astart floatresolv hidden mkhostsfile protected vnet baserw"

	# build checkbox list for sub-menu (exlude from main list)
	# and export via ${get_construct_jail_options_menu_checkbox}
	get_construct_jail_options_menu_checkbox=
	for i in ${_checkbox_all}; do
		skip=0
		for x in ${_checkbox_main_menu}; do
			[ "${i}" = "${x}" ] && skip=1 && break
		done
		[ ${skip} -eq 1 ] && continue
		if [ -z "${get_construct_jail_options_menu_checkbox}" ]; then
			get_construct_jail_options_menu_checkbox="${i}"
		else
			get_construct_jail_options_menu_checkbox="${get_construct_jail_options_menu_checkbox} ${i}"
		fi
	done

	# sorted main checkbox list
	local _checkbox=$( for i in ${_checkbox_main_menu}; do
		echo ${i}
	done | ${SORT_CMD} -n )

	# leave current params list in main menu, rest - goes to submenu
	_params_main_menu="jname arch basename childrenmax cpuset devfs_ruleset enforce_statfs exec_consolelog exec_fib exec_timeout host_hostname \
	interface ip4_addr jdomain stop_timeout sysvmsg sysvsem sysvshm ver"

	# build params list for sub-menu (exlude from main list)
	# and export via ${get_construct_jail_options_menu_params}
	get_construct_jail_options_menu_params=
	for i in ${JARG}; do

		skip=0
		# skip for checkbox type and main params
		for x in ${_checkbox_all}; do
			[ "${i}" = "${x}" ] && skip=1 && break
		done
		for x in ${_params_main_menu}; do
			[ "${i}" = "${x}" ] && skip=1 && break
		done

		[ ${skip} -eq 1 ] && continue

		if [ -z "${get_construct_jail_options_menu_params}" ]; then
			get_construct_jail_options_menu_params="${i}"
		else
			get_construct_jail_options_menu_params="${get_construct_jail_options_menu_params} ${i}"
		fi
	done

	# sorted main params list
	local _params=$( for i in ${_params_main_menu}; do
		echo ${i}
	done | ${SORT_CMD} -n )

	f_dialog_default_fetch defaultitem

	local menu_list="
		'EXIT'	'EXIT'	'Exit jconstruct-tui'
	" # END-QUOTE

	# build main menu: params first
	for i in ${_params}; do
		eval VAL=\$$i
		_mydesc=
		eval _mydesc=\$${i}_msg

		[ -z "${_mydesc}" ] && _mydesc="no description"

		if [ -z "${VAL}" ]; then
			menu_list="${menu_list} '${item_let} ${i}'	' '		'${_mydesc}'"
		else
			menu_list="${menu_list} '${item_let} ${i}'	'${VAL}'	'${_mydesc}'"
		fi
		inc_menu_index item_let
	done

	# build main menu: append checkbox list
	for i in ${_checkbox}; do
		eval _mytest=\$$i
		if [ "${_mytest}" = "1" ]; then
			export ${i}_mark="X"
			_mark="X"
		else
			export ${i}_mark=" "
			_mark=" "
		fi

		eval _desc="\${${i}_msg}"
		menu_list="${menu_list}	'${item_let} ${i}'	'[${_mark}]'	'${_desc}'"
		inc_menu_index item_let
	done

	menu_list="${menu_list} '-'		'-'	''"
	# submenu list area
	inc_menu_index item_num
	menu_list="${menu_list} '${item_num} jail_options'	'Jail options >>'	'Customize allow_XXX options'"
	if [ "${vnet}" = "1" -a "${vimage_feature}" = "1" ]; then
		inc_menu_index item_let
		menu_list="${menu_list} '${item_let} ci_gw4'            '$(curval ci_gw4)'              'Manage defaultrouter= via jail rc.conf, 0 - disabled'"
		inc_menu_index item_num
		[ ${jid} -eq 0 ] && menu_list="${menu_list} '${item_num} jailnic'	'Network config >>'	'cbsd jailnic-tui'"
	fi
	if [ "${racct}" = "1" ]; then
		inc_menu_index item_num
		menu_list="${menu_list} '${item_num} jrctl'		'RCTL config >>'	'cbsd jrctl-tui'"
	fi
	inc_menu_index item_num

	menu_list="${menu_list} '${item_num} order'		'boot order >>'		'cbsd jorder-tui'"
	menu_list="${menu_list} '-'		'-'	''"

	menu_list="${menu_list}	'0 COMMIT'	'save changes and quit'	'save!'"

	cbsd_menubox
	retval=$?

	f_dialog_data_sanitize menu_choice
	f_dialog_menutag_store "${menu_choice}"
	f_dialog_default_store "${menu_choice}"

	return $retval
}

### MAIN
zero_profile="jail-freebsd-default.conf"
#defaults

title=" config for ${jname} "
f_dialog_info "scan and build menu entry."

. ${subrdir}/build.subr

readconf ${zero_profile}

# re-read profile for init global_profile_file variable
get_construct_profile ${default_profile}

[ -z "${profile}" -a -n "${jail_profile}" ] && profile="${jail_profile}"

. ${subrdir}/rcconf.subr
[ $? -eq 1 ] && err 1 "${N1_COLOR}No such jail: ${N2_COLOR}${jname}${N0_COLOR}"

shift #skip for jname

if [ ${jid} -ne 0 ]; then
	# Command for modifying on-the fly here:
	JARG="ip4_addr cpuset astart exec_consolelog mount_src mount_ports mount_kernel allow_mount allow_nullfs allow_fusefs allow_linsysfs allow_linprocfs allow_tmpfs allow_mlock allow_procfs devfs_ruleset jdomain b_order applytpl protected hidden allow_raw_sockets allow_read_msgbuf allow_vmm sysvsem sysvshm sysvmsg boot_delay"
else
	JARG="$@"
fi

f_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
f_mustberoot_init

store_defaults

# fill promt variable used in dialog_menu_main about active jail status
# otherwise - append the argument that we can change also and jname.
if [ ${jid} -ne 0 ]; then
	prompt="Jail is ONLINE. Only on-the-fly options printed."
else
	JARG="jname ${JARG}"
fi

while [ 1 ]; do
	f_dialog_info "scan and build menu entry.."

	dialog_menu_main || f_die

	index=${mtag%% *}
	mychoice=${mtag##* }

	case "${mychoice}" in
		"EXIT")
			exit 0
			;;
		"-")
			continue
			;;
		"COMMIT")
			commit
			;;
		"jrctl")
			/usr/local/bin/cbsd jrctl-tui jname="${jname}"
			;;
		b_order|order)
			jorder-tui jname="${jname}"
			b_order=$( cbsdsqlro local "SELECT b_order FROM jails WHERE jname=\"${jname}\"" 2>/dev/null )
			;;
		baserw|astart|applytpl|floatresolv|mount_ports|mount_src|vnet|mkhostsfile|persist)
			invert_checkbox ${mychoice}
			continue
			;;
		mount_devfs|allow_mount|allow_devfs|allow_nullfs|allow_fusefs|allow_linprocfs|allow_linsysfs|mount_fdescfs|allow_fdescfs|allow_dying|allow_procfs|protected|hidden|allow_reserved_ports|allow_raw_sockets|allow_unprivileged_proc_debug)
			invert_checkbox ${mychoice}
			continue
			;;
		allow_tmpfs|allow_zfs|allow_kmem|mount_kernel|mount_obj|allow_read_msgbuf|allow_vmm|allow_mlock)
			invert_checkbox ${mychoice}
			continue
			;;
		interface)
			get_construct_interface -d 1 -s "tap bridge vboxnet"
			continue
			;;
		"jailnic")
			jailnic-tui jname=${jname}
			;;
		*)
			get_construct_${mychoice}
			continue
			;;
	esac
done

exit 0
