#!/usr/local/bin/cbsd
#v11.1.11
MYARG=""
MYOPTARG=""
ADDHELP=""
MYLOCK="/tmp/initenv-tui.lock"
MYDESC="Node re-initialization"
EXTHELP="wf_initenv"

. ${subrdir}/nc.subr

. ${cbsdinit}

. ${initenv}
. ${jfs}
. ${subrdir}/settings-tui.subr
. ${dialog}

# form for $ips
get_newvalue()
{
	local _par _val _desc _retval

	_par=$1

	[ -z "${_par}" ] && return 0

	eval _val="\$${_par}"
	eval _desc="\$${_par}_desc"

	 f_dialog_input _input "${_par}: ${_desc}" "${_val}" ""
	 _retval=$?

	 case ${_retval} in
		0)
			[ -n "${_input}" ] && export ${_par}="${_input}"
			;;
	 esac
}

commit()
{
	local _i VAL

	for _i in ${USERINI}; do
		eval VAL=\$$_i
		eval OVAL=\$OLDVAL_${_i}

		[ "${VAL}" = "${OVAL}" ] && continue

		case "${_i}" in
			"nodename")
				nodename=${VAL}
				old_nodename=${OVAL}
				change_nodename
				;;
			"nat_enable")
				natcfg fw_new=${VAL}
				;;
			"natip")
				natcfg natip_new=${VAL}
				;;
			*)
				${miscdir}/sqlcli ${dbdir}/local.sqlite UPDATE local SET ${_i}=\"${VAL}\"
				/usr/local/cbsd/misc/cbsdsysrc -qf ${inventory} ${_i}="${VAL}"
				;;
		esac
	done

	/usr/local/bin/cbsd initenv inter=0
	err 0 "${N1_COLOR}Commited${N0_COLOR}"
}


dialog_menu_main()
{
	local _par VAL
	local btitle="$DIALOG_BACKTITLE"
	local prompt=" Use menu to select and edit limit "
	local hline=
	local defaultitem=

	local title=" CBSD Settings "
	local _mydesc

	local enable=$( /usr/local/cbsd/misc/cbsdsysrc -n cbsdd_enable )
	local status=NO

	f_dialog_default_fetch defaultitem

	case "$enable" in
		[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) status=YES
	esac

	local menu_list="
		'EXIT'		'EXIT'		'Exit initenv-tui'
		'rcconf'	'CBSD Enabled: ${status}'	'Enable or Disable cbsdd in /etc/rc.conf'
	" # END-QUOTE

	for _par in ${USERINI}; do
		case "${_par}" in
			hostname|mdtmp|workdir|nat_enable|natip|nodedescr|jail_interface)
				continue
				;;
			zfsfeat)
				[ "${real_zfsfeat}" = "0" ] && continue
				;;
			hammerfeat)
				[ "${real_hammerfeat}" = "0" ] && continue
				;;
		esac

		eval VAL=\$${_par}
		eval _mydesc=\$${_par}_desc
		[ "${VAL}" = "(null)" ] && VAL="0"
		if [ -z "${VAL}" ]; then
			menu_list="${menu_list} '${_par}'	' '	'${_mydesc}'"
		else
			menu_list="${menu_list} '${_par}'	'${VAL}'	'${_mydesc}'"
		fi
	done

	menu_list="${menu_list}	'-'		'-'		''"
	menu_list="${menu_list}	'natcfg'	'Nat config >>'	'cbsd natcfg-tui'"
	menu_list="${menu_list}	'-'		'-'		''"

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

	cbsd_menubox_with_help
	retval=$?

	f_dialog_data_sanitize menu_choice
	f_dialog_menutag_store "$menu_choice"
	f_dialog_default_store "$menu_choice"

	return $retval
}


init_items_value()
{
	#first of all - push old values to OLDVAL for comparing final result in commit() func
	local _i VAL

	for _i in ${USERINI}; do
		eval VAL=\$$_i
		if [ -z "${VAL}" ]; then
			export OLDVAL_${_i}=""
		else
			export OLDVAL_${_i}="${VAL}"
		fi
	done
}

### MAIN ###
[ -f "${MYLOCK}" ] && err 1 "Locked: ${MYLOCK}"

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

init_items_default
init_items_desc

[ -f "${inventory}" ] && . ${inventory}

init_items_value

# data on ZFS ?
is_zfs=0

if ${KLDSTAT_CMD} -qm zfs >/dev/null 2>&1; then
	${ZFS_CMD} list ${jaildatadir} > /dev/null 2>&1
	if [ $? -eq 0 ]; then
		is_zfs=1
	else
		is_zfs=0
	fi
else
	is_zfs=0
fi

# HammerFS?
is_hammer=0

if [ -x /sbin/hammer2 ]; then
	/sbin/hammer2 info ${workdir} > /dev/null 2>&1
	[ $? -eq 0 ] && is_hammer=1
fi

real_zfsfeat="${is_zfs}"
real_hammerfeat="${is_hammer}"

while [ 1 ]; do
	dialog_menu_main
	ret=$?
	case $ret in
		${DIALOG_OK})
			[ "${mtag}" = "EXIT" ] && exit 0
			[ "${mtag}" = "COMMIT" ] && commit
			get_initenv_${mtag}
			;;
		${DIALOG_HELP})
			get_help
			continue
			;;
		*)
			${RM_CMD} -f "${MYLOCK}"
			trap "" HUP INT ABRT BUS TERM EXIT
			f_die
		;;
	esac
done

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