#!/usr/local/bin/cbsd
#v13.0.8
CBSDMODULE="jail,sys"
MYARG=""
MYOPTARG="baseonly controlmaster path"
MYDESC="TUI to build/select services in jail/basejail"
ADDHELP="\

${H3_COLOR}Description${N0_COLOR}:

Creates a list of available services for the jail or the FreeBSD base.
Can saves selected items as a \$sysrc_enable variable in the file. Mainly used in
jconfig/jconstruct-tui to build \$sysrc_enable variable for jcreate.

${H3_COLOR}Options${N0_COLOR}:

 ${N2_COLOR}baseonly=${N0_COLOR}         - when 1: show services only from specific FreeBSD
                     distribition (use basejail dir);
 ${N2_COLOR}controlmaster=${N0_COLOR}    - <path>, store/save result as \$sysrc_enable vars
                     in <path> file;
 ${N2_COLOR}path=${N0_COLOR}             - valid FreeBSD or jail path with FreeBSD hier;

${H3_COLOR}Examples${N0_COLOR}:

 # srvbrowser-tui controlmaster=/tmp/test.txt baseonly=1 path=/usr/jails/basejail/base_amd64_amd64_13.0

"

. ${subrdir}/nc.subr

path=
. ${cbsdinit}
. ${dialog}

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

readconf ${platform}-srvbrowser.conf

init_srv_list()
{
	local _cmd _res

	if [ "${baseonly}" = "1" ];then
		_cmd="service mode=list baseonly=1"
	else
		_cmd="service mode=list"
	fi

	_tmp=$( ${MKTEMP_CMD} )

	[ -n "${path}" ] && _cmd="${_cmd} jname=${path}"

	${_cmd} > ${_tmp}
	_res=$?
	if [ ${_res} -ne 0 ]; then
		${CAT_CMD} ${_tmp}
		${RM_CMD} -f ${_tmp}
		exit ${_res}
	fi
	srv_list=$( ${CAT_CMD} ${_tmp} | ${SORT_CMD} )
	${RM_CMD} -f ${_tmp}
}

# mark service as active when it enabled
init_srv_status()
{
	local _res _active

	for i in ${srv_list}; do
		_res=$( /usr/local/cbsd/misc/cbsdsysrc ${i}_enable 2>/dev/null )
		_active=${_res##*:}
		case "${_active}" in
			*YES)
				eval "selected_srv_${i}=\"1\""
				;;
		esac
	done
}

browse_service_list()
{
	local title=" services "
	local btitle="Select services"
	local prompt=""
	local defaultitem=
	local hline="Hit ENTER for SELECT"
	local prompt=" Choose services.\nSelected: ${srvnum} "
	local mark prefix name

	local f_dialog_title=" Service list "

	f_dialog_default_fetch defaultitem

	local menu_list=" \
		'EXIT'		'<<'			'Exit this menu' \
		'-'	'-'	'' \
	" # END-QUOTE

	local sqldelimer="|"
	local IFS="|"

	unset IFS
	unset sqldelimer

	local prefix=X
	local cur_prefix=Y

	for name in ${srv_list}; do

		prefix=$( substr --pos=0 --len=1 --str=${name} )

		if [ "${prefix}" != "${cur_prefix}" ]; then
			cur_prefix="${prefix}"
		else
			prefix=""
		fi

		eval mark=\$selected_srv_${name}

		if [ "${mark}" = "1" ]; then
			srv_mark="X"
		else
			srv_mark=" "
		fi

		menu_list="${menu_list} '${prefix} ${name}'	'[${srv_mark}]'	''"
	done

	IFS=" "

	cbsd_menubox
	retval=$?

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

	return ${retval}
}


### MAIN ###
init_srv_list
[ "${baseonly}" != "1" ] && init_srv_status

srvnum=0

while :; do

	# calculate num of selected pkg. pkglist variable from input_manual method is preferred.
	if [ -z "${srv_list}" ]; then
		srvnum=$( ${GREP_CMD} -E -v '(srv_mark_)*(_origin=)' ${controlmaster} | ${WC_CMD} -l | ${AWK_CMD} '{printf $1}' )
	else
		srvnum=0
		for i in ${srv_list}; do
			mark=0
			eval mark=\$selected_srv_${i}
			[ "${mark}" = "1" ] && srvnum=$(( srvnum + 1 ))
		done
	fi

	browse_service_list || break
	UPDATED=0

	[ -z "${mtag}" ] && exit $SUCCESS

	case "${mtag}" in
		"EXIT")
			sysrc_enable=""

			for i in ${srv_list}; do
				eval mark=\$selected_srv_${i}
				[ "${mark}" = "1" ] && sysrc_enable="${sysrc_enable} ${i}"
			done

			if [ -z "${controlmaster}" ]; then
				echo "${sysrc_enable}"
			else
				${TRUNCATE_CMD} -s0 ${controlmaster}
				/usr/local/cbsd/misc/cbsdsysrc -qf ${controlmaster} sysrc_enable="${sysrc_enable}" >/dev/null
			fi
			f_die
			;;
		"-")
			continue
			;;
		*)
			index=${mtag%% *}
			name=${mtag##* }

			eval mark=\$selected_srv_${name}

			if [ "${mark}" = "1" ];then
				eval "selected_srv_${name}=\"0\""
			else
				eval "selected_srv_${name}=\"1\""
			fi
			continue
			;;
	esac

	if [ "${command}" ]; then
		${BSDCFG_LIBE}/${APP_DIR}/$command ${USE_XDIALOG:+-X}
	fi
done

exit ${SUCCESS}
