rcconf revision 260678
1303231Sdim#!/bin/sh
2303231Sdim#-
3303231Sdim# Copyright (c) 2012-2013 Devin Teske
4303231Sdim# All rights reserved.
5303231Sdim#
6303231Sdim# Redistribution and use in source and binary forms, with or without
7303231Sdim# modification, are permitted provided that the following conditions
8303231Sdim# are met:
9303231Sdim# 1. Redistributions of source code must retain the above copyright
10303231Sdim#    notice, this list of conditions and the following disclaimer.
11303231Sdim# 2. Redistributions in binary form must reproduce the above copyright
12303231Sdim#    notice, this list of conditions and the following disclaimer in the
13303231Sdim#    documentation and/or other materials provided with the distribution.
14303231Sdim#
15303231Sdim# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16303231Sdim# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17303231Sdim# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18303231Sdim# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19314564Sdim# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20303231Sdim# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21314564Sdim# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22321369Sdim# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23314564Sdim# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24303231Sdim# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25314564Sdim# SUCH DAMAGE.
26314564Sdim#
27321369Sdim# $FreeBSD: stable/10/usr.sbin/bsdconfig/startup/rcconf 260678 2014-01-15 07:49:17Z dteske $
28321369Sdim#
29321369Sdim############################################################ INCLUDES
30314564Sdim
31314564SdimBSDCFG_SHARE="/usr/share/bsdconfig"
32314564Sdim. $BSDCFG_SHARE/common.subr || exit 1
33303231Sdimf_dprintf "%s: loading includes..." "$0"
34303231Sdimf_include $BSDCFG_SHARE/dialog.subr
35303231Sdimf_include $BSDCFG_SHARE/mustberoot.subr
36314564Sdimf_include $BSDCFG_SHARE/sysrc.subr
37314564Sdimf_include $BSDCFG_SHARE/startup/rcconf.subr
38303231Sdim
39303231SdimBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="140.startup"
40303231Sdimf_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
41314564Sdim
42314564Sdimf_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" ipgm &&
43303231Sdim	pgm="${ipgm:-$pgm}"
44303231Sdim
45303231Sdim############################################################ GLOBALS
46303231Sdim
47303231Sdim#
48303231Sdim# Global map/menu-list for the main menu
49303231Sdim#
50303231SdimRCCONF_MAP=
51303231Sdim_RCCONF_MAP=
52303231Sdim
53303231Sdim#
54303231Sdim# Options
55303231Sdim#
56303231Sdim# Inherit SHOW_DESC value if set, otherwise default to 1
57303231Sdim[ "${SHOW_DESC+set}" ] || SHOW_DESC=1
58303231Sdim# Selectively inherit SHOW_* value (in order of preference)
59303231Sdimif [ "$SHOW_DEFAULT_VALUE" ]; then
60303231Sdim	SHOW_DEFAULT_VALUE=1
61303231Sdim	SHOW_CONFIGURED=
62303231Sdim	SHOW_VALUE=
63303231Sdimelif [ "$SHOW_CONFIGURED" ]; then
64314564Sdim	SHOW_DEFAULT_VALUE=
65314564Sdim	SHOW_CONFIGURED=1
66314564Sdim	SHOW_VALUE=
67314564Sdimelse
68314564Sdim	SHOW_DEFAULT_VALUE=
69314564Sdim	SHOW_CONFIGURED=
70314564Sdim	SHOW_VALUE=1
71314564Sdimfi
72314564Sdim
73321369Sdim############################################################ FUNCTIONS
74321369Sdim
75321369Sdim# dialog_menu_main
76321369Sdim#
77321369Sdim# Display the dialog(1)-based application main menu.
78314564Sdim#
79314564Sdimdialog_menu_main()
80314564Sdim{
81314564Sdim	local prompt=
82321369Sdim	local menu_list="
83314564Sdim		'X $msg_exit'    '$msg_exit_desc'
84314564Sdim		                  ${SHOW_DESC:+'$msg_exit_this_menu'}
85321369Sdim		'> $msg_add_new' '$msg_add_new_desc'
86321369Sdim		                  ${SHOW_DESC:+'$msg_add_new_help'}
87321369Sdim		'> $msg_delete'  '$msg_delete_desc'
88321369Sdim		                  ${SHOW_DESC:+'$msg_delete_help'}
89314564Sdim	${USE_XDIALOG:+
90314564Sdim		'> $msg_view_details' '$msg_view_details_desc'
91314564Sdim		                       ${SHOW_DESC:+'$msg_view_details_help'}
92314564Sdim	}
93321369Sdim	" # END-QUOTE
94321369Sdim	local defaultitem= # Calculated below
95321369Sdim	local hline="$hline_arrows_tab_enter"
96314564Sdim
97321369Sdim	if [ ! "$_RCCONF_MAP" ]; then
98321369Sdim		# Genreate RCCONF_MAP of `var desc ...' per-line
99314564Sdim		f_dialog_info "$msg_creating_rcconf_map"
100321369Sdim		f_startup_rcconf_map RCCONF_MAP
101321369Sdim		export RCCONF_MAP
102321369Sdim		# Generate _${var}_desc variables from $RCCONF_MAP
103314564Sdim		f_startup_rcconf_map_expand RCCONF_MAP
104314564Sdim		export _RCCONF_MAP=1
105314564Sdim	fi
106314564Sdim
107314564Sdim	# Show infobox for modes that take a while to calculate/display
108314564Sdim	[ "$SHOW_DEFAULT_VALUE" -o "$SHOW_CONFIGURED" ] &&
109321369Sdim		f_dialog_info "$msg_creating_menu_list"
110321369Sdim
111321369Sdim	menu_list="$menu_list $(
112314564Sdim		. "$RC_DEFAULTS" > /dev/null
113314564Sdim		source_rc_confs > /dev/null
114314564Sdim		var_list=$( f_startup_rcconf_list )
115321369Sdim		for var in $var_list; do
116314564Sdim			eval export $var
117321369Sdim			[ "$SHOW_DEFAULT_VALUE" ] && export \
118321369Sdim				_${var}_default="$( f_sysrc_get_default $var )"
119321369Sdim			[ "$SHOW_CONFIGURED" ] && export \
120321369Sdim				_${var}_file="$( f_sysrc_find $var )"
121321369Sdim		done
122321369Sdim		export SHOW_VALUE SHOW_DESC SHOW_DEFAULT_VALUE SHOW_CONFIGURED
123321369Sdim		export msg_default_value
124321369Sdim		echo "$var_list" | awk '
125321369Sdim		BEGIN {
126321369Sdim			prefix = ""
127321369Sdim		}
128321369Sdim		{
129321369Sdim			cur_prefix = tolower(substr($1, 1, 1))
130314564Sdim			printf "'\''"
131314564Sdim			if ( prefix != cur_prefix )
132321369Sdim				prefix = cur_prefix
133321369Sdim			else
134314564Sdim				printf " "
135321369Sdim			var = $1
136321369Sdim			printf "%s'\'' '\''", var
137314564Sdim			if ( ENVIRON["SHOW_DEFAULT_VALUE"] ) {
138314564Sdim				default = ENVIRON["_" var "_default"]
139314564Sdim				gsub(/'\''/, "'\''\\'\'\''", default)
140314564Sdim				value = ENVIRON[var]
141321369Sdim				gsub(/'\''/, "'\''\\'\'\''", value)
142321369Sdim				printf ENVIRON["msg_default_value"] "; %s",
143321369Sdim				       default, value
144314564Sdim			} else if ( ENVIRON["SHOW_CONFIGURED"] ) {
145321369Sdim				printf "%s", ENVIRON["_" var "_file"]
146314564Sdim			} else { # SHOW_VALUE (default behavior)
147314564Sdim				value = ENVIRON[var]
148321369Sdim				gsub(/'\''/, "'\''\\'\'\''", value)
149314564Sdim				printf "%s", value
150314564Sdim			}
151321369Sdim			printf "'\''"
152321369Sdim			if ( ENVIRON["SHOW_DESC"] ) {
153321369Sdim				desc = ENVIRON["_" var "_desc"]
154321369Sdim				gsub(/'\''/, "'\''\\'\'\''", desc)
155314564Sdim				printf " '\''%s'\''", desc
156314564Sdim			}
157314564Sdim			printf "\n"
158314564Sdim		}'
159314564Sdim	)"
160314564Sdim
161314564Sdim	set -f # set noglob because descriptions in the $menu_list may contain
162314564Sdim	       # `*' and get expanded by dialog(1) (doesn't affect Xdialog(1)).
163314564Sdim	       # This prevents dialog(1) from expanding wildcards in help line.
164314564Sdim
165314564Sdim	local height width rows
166314564Sdim	eval f_dialog_menu${SHOW_DESC:+_with_help}_size \
167314564Sdim		height width rows      \
168314564Sdim		\"\$DIALOG_TITLE\"     \
169314564Sdim		\"\$DIALOG_BACKTITLE\" \
170314564Sdim		\"\$prompt\"           \
171314564Sdim		\"\$hline\"            \
172314564Sdim		$menu_list
173314564Sdim
174314564Sdim	# Obtain default-item from previously stored selection
175314564Sdim	f_dialog_default_fetch defaultitem
176314564Sdim
177314564Sdim	local menu_choice
178314564Sdim	menu_choice=$( eval $DIALOG \
179314564Sdim		--title \"\$DIALOG_TITLE\"         \
180314564Sdim		--backtitle \"\$DIALOG_BACKTITLE\" \
181314564Sdim		--hline \"\$hline\"                \
182314564Sdim		--ok-label \"\$msg_ok\"            \
183314564Sdim		--cancel-label \"\$msg_cancel\"    \
184314564Sdim		--help-button                      \
185314564Sdim		--help-label \"\$msg_details\"     \
186314564Sdim		${SHOW_DESC:+--item-help}          \
187314564Sdim		--default-item \"\$defaultitem\"   \
188314564Sdim		--menu \"\$prompt\"                \
189314564Sdim		$height $width $rows               \
190314564Sdim		$menu_list                         \
191314564Sdim		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
192314564Sdim	)
193314564Sdim	local retval=$?
194314564Sdim	f_dialog_data_sanitize menu_choice
195314564Sdim	f_dialog_menutag_store "$menu_choice"
196314564Sdim
197314564Sdim	# Only update default-item on success
198314564Sdim	[ $retval -eq $DIALOG_OK ] && f_dialog_default_store "$menu_choice"
199314564Sdim
200314564Sdim	return $retval
201314564Sdim}
202314564Sdim
203314564Sdim############################################################ MAIN
204314564Sdim
205314564Sdim# Incorporate rc-file if it exists
206314564Sdim[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
207314564Sdim
208314564Sdim#
209314564Sdim# Process command-line arguments
210314564Sdim#
211314564Sdimwhile getopts h$GETOPTS_STDARGS flag; do
212314564Sdim	case "$flag" in
213314564Sdim	h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm" ;;
214314564Sdim	esac
215314564Sdimdone
216314564Sdimshift $(( $OPTIND - 1 ))
217314564Sdim
218314564Sdim#
219314564Sdim# Initialize
220314564Sdim#
221314564Sdimf_dialog_title "$msg_view_edit_startup_configuration"
222314564Sdimf_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
223314564Sdimf_mustberoot_init
224314564Sdim
225314564Sdim#
226314564Sdim# Launch application main menu
227314564Sdim#
228314564Sdimwhile :; do
229314564Sdim	dialog_menu_main
230314564Sdim	retval=$?
231314564Sdim	f_dialog_menutag_fetch mtag
232314564Sdim
233314564Sdim	if [ "$USE_XDIALOG" ]; then
234314564Sdim		case "$mtag" in
235314564Sdim		"> $msg_view_details")
236314564Sdim			f_dialog_input_view_details
237314564Sdim			continue
238314564Sdim		esac
239314564Sdim	elif [ $retval -eq $DIALOG_HELP ]; then
240314564Sdim		# The ``Help'' button (labeled "Details") was pressed
241314564Sdim		f_dialog_input_view_details
242314564Sdim		continue
243314564Sdim	fi
244314564Sdim
245314564Sdim	[ $retval -eq $DIALOG_OK ] || f_die
246314564Sdim
247314564Sdim	case "$mtag" in
248314564Sdim	"X $msg_exit") break ;;
249314564Sdim	"> $msg_add_new") $BSDCFG_LIBE/$APP_DIR/rcadd ${USE_XDIALOG:+-X} ;;
250314564Sdim	"> $msg_delete")
251314564Sdim		# rcdelete has a similar interface that can inherit the below:
252314564Sdim		export SHOW_VALUE SHOW_DESC SHOW_DEFAULT_VALUE SHOW_CONFIGURED
253314564Sdim		$BSDCFG_LIBE/$APP_DIR/rcdelete ${USE_XDIALOG:+-X}
254314564Sdim		;;
255314564Sdim	*) # Anything else is a variable to edit
256314564Sdim		$BSDCFG_LIBE/$APP_DIR/rcedit ${USE_XDIALOG:+-X} "${mtag# }"
257314564Sdim	esac
258314564Sdimdone
259314564Sdim
260314564Sdimexit $SUCCESS
261314564Sdim
262314564Sdim################################################################################
263314564Sdim# END
264314564Sdim################################################################################
265314564Sdim