rcconf revision 252987
1185377Ssam#!/bin/sh
2187831Ssam#-
3185377Ssam# Copyright (c) 2012-2013 Devin Teske
4185377Ssam# All rights reserved.
5185377Ssam#
6185377Ssam# Redistribution and use in source and binary forms, with or without
7185377Ssam# modification, are permitted provided that the following conditions
8185377Ssam# are met:
9185377Ssam# 1. Redistributions of source code must retain the above copyright
10185377Ssam#    notice, this list of conditions and the following disclaimer.
11185377Ssam# 2. Redistributions in binary form must reproduce the above copyright
12185377Ssam#    notice, this list of conditions and the following disclaimer in the
13185377Ssam#    documentation and/or other materials provided with the distribution.
14185377Ssam#
15185377Ssam# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16185377Ssam# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17187831Ssam# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18185377Ssam# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19185377Ssam# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20185377Ssam# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21185377Ssam# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22185377Ssam# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23185377Ssam# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24185377Ssam# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25185377Ssam# SUCH DAMAGE.
26185377Ssam#
27185377Ssam# $FreeBSD: head/usr.sbin/bsdconfig/startup/rcconf 252987 2013-07-07 18:51:44Z dteske $
28185377Ssam#
29185377Ssam############################################################ INCLUDES
30185377Ssam
31185377SsamBSDCFG_SHARE="/usr/share/bsdconfig"
32185377Ssam. $BSDCFG_SHARE/common.subr || exit 1
33185377Ssamf_dprintf "%s: loading includes..." "$0"
34185377Ssamf_include $BSDCFG_SHARE/dialog.subr
35185377Ssamf_include $BSDCFG_SHARE/mustberoot.subr
36185377Ssamf_include $BSDCFG_SHARE/sysrc.subr
37185377Ssamf_include $BSDCFG_SHARE/startup/rcconf.subr
38185377Ssam
39185377SsamBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="140.startup"
40185377Ssamf_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
41185377Ssam
42185377Ssamipgm=$( f_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" )
43185377Ssam[ $? -eq $SUCCESS -a "$ipgm" ] && pgm="$ipgm"
44185377Ssam
45185377Ssam############################################################ GLOBALS
46185377Ssam
47185377Ssam#
48185377Ssam# Global map/menu-list for the main menu
49185377Ssam#
50185377SsamRCCONF_MAP=
51185377Ssam_RCCONF_MAP=
52185377Ssam
53185377Ssam#
54185377Ssam# Options
55185377Ssam#
56185377Ssam# Inherit SHOW_DESC value if set, otherwise default to 1
57185377Ssam[ "${SHOW_DESC+set}" ] || SHOW_DESC=1
58185377Ssam# Selectively inherit SHOW_* value (in order of preference)
59185377Ssamif [ "$SHOW_DEFAULT_VALUE" ]; then
60185377Ssam	SHOW_DEFAULT_VALUE=1
61185377Ssam	SHOW_CONFIGURED=
62185377Ssam	SHOW_VALUE=
63185377Ssamelif [ "$SHOW_CONFIGURED" ]; then
64185377Ssam	SHOW_DEFAULT_VALUE=
65185377Ssam	SHOW_CONFIGURED=1
66185377Ssam	SHOW_VALUE=
67185377Ssamelse
68185377Ssam	SHOW_DEFAULT_VALUE=
69185377Ssam	SHOW_CONFIGURED=
70185377Ssam	SHOW_VALUE=1
71185377Ssamfi
72185377Ssam
73185377Ssam############################################################ FUNCTIONS
74185377Ssam
75185377Ssam# dialog_menu_main
76185377Ssam#
77185377Ssam# Display the dialog(1)-based application main menu.
78185377Ssam#
79185377Ssamdialog_menu_main()
80185377Ssam{
81185377Ssam	local prompt=
82185377Ssam	local menu_list="
83185377Ssam		'X $msg_exit'    '$msg_exit_desc'
84185377Ssam		                  ${SHOW_DESC:+'$msg_exit_this_menu'}
85185377Ssam		'> $msg_add_new' '$msg_add_new_desc'
86185377Ssam		                  ${SHOW_DESC:+'$msg_add_new_help'}
87185377Ssam		'> $msg_delete'  '$msg_delete_desc'
88185377Ssam		                  ${SHOW_DESC:+'$msg_delete_help'}
89185377Ssam	${USE_XDIALOG:+
90185377Ssam		'> $msg_view_details' '$msg_view_details_desc'
91185377Ssam		                       ${SHOW_DESC:+'$msg_view_details_help'}
92185377Ssam	}
93185377Ssam	" # END-QUOTE
94185377Ssam	local defaultitem= # Calculated below
95185377Ssam	local hline="$hline_arrows_tab_enter"
96185377Ssam
97185377Ssam	if [ ! "$_RCCONF_MAP" ]; then
98185377Ssam		# Genreate RCCONF_MAP of `var desc ...' per-line
99185377Ssam		f_dialog_info "$msg_creating_rcconf_map"
100185377Ssam		f_startup_rcconf_map RCCONF_MAP
101185377Ssam		export RCCONF_MAP
102185377Ssam		# Generate _${var}_desc variables from $RCCONF_MAP
103185377Ssam		f_startup_rcconf_map_expand RCCONF_MAP
104185377Ssam		export _RCCONF_MAP=1
105185377Ssam	fi
106185377Ssam
107185377Ssam	# Show infobox for modes that take a while to calculate/display
108185377Ssam	[ "$SHOW_DEFAULT_VALUE" -o "$SHOW_CONFIGURED" ] &&
109185377Ssam		f_dialog_info "$msg_creating_menu_list"
110185377Ssam
111185377Ssam	menu_list="$menu_list $(
112185377Ssam		. "$RC_DEFAULTS" > /dev/null
113185377Ssam		source_rc_confs > /dev/null
114185377Ssam		var_list=$( f_startup_rcconf_list )
115185377Ssam		for var in $var_list; do
116185377Ssam			eval export $var
117185377Ssam			[ "$SHOW_DEFAULT_VALUE" ] && export \
118185377Ssam				_${var}_default="$( f_sysrc_get_default $var )"
119185377Ssam			[ "$SHOW_CONFIGURED" ] && export \
120185377Ssam				_${var}_file="$( f_sysrc_find $var )"
121185377Ssam		done
122185377Ssam		export SHOW_VALUE SHOW_DESC SHOW_DEFAULT_VALUE SHOW_CONFIGURED
123185377Ssam		export msg_default_value
124185377Ssam		echo "$var_list" | awk '
125185377Ssam		BEGIN {
126185377Ssam			prefix = ""
127185377Ssam		}
128185377Ssam		{
129185377Ssam			cur_prefix = tolower(substr($1, 1, 1))
130185377Ssam			printf "'\''"
131185377Ssam			if ( prefix != cur_prefix )
132185377Ssam				prefix = cur_prefix
133185377Ssam			else
134185377Ssam				printf " "
135185377Ssam			var = $1
136185377Ssam			printf "%s'\'' '\''", var
137185377Ssam			if ( ENVIRON["SHOW_DEFAULT_VALUE"] ) {
138185377Ssam				default = ENVIRON["_" var "_default"]
139185377Ssam				gsub(/'\''/, "'\''\\'\'\''", default)
140185377Ssam				value = ENVIRON[var]
141185377Ssam				gsub(/'\''/, "'\''\\'\'\''", value)
142185377Ssam				printf ENVIRON["msg_default_value"] "; %s",
143185377Ssam				       default, value
144185377Ssam			} else if ( ENVIRON["SHOW_CONFIGURED"] ) {
145185377Ssam				printf "%s", ENVIRON["_" var "_file"]
146185377Ssam			} else { # SHOW_VALUE (default behavior)
147185377Ssam				value = ENVIRON[var]
148185377Ssam				gsub(/'\''/, "'\''\\'\'\''", value)
149185377Ssam				printf "%s", value
150185377Ssam			}
151185377Ssam			printf "'\''"
152185377Ssam			if ( ENVIRON["SHOW_DESC"] ) {
153185377Ssam				desc = ENVIRON["_" var "_desc"]
154185377Ssam				gsub(/'\''/, "'\''\\'\'\''", desc)
155185377Ssam				printf " '\''%s'\''", desc
156185377Ssam			}
157185377Ssam			printf "\n"
158185377Ssam		}'
159185377Ssam	)"
160185377Ssam
161185377Ssam	set -f # set noglob because descriptions in the $menu_list may contain
162185377Ssam	       # `*' and get expanded by dialog(1) (doesn't affect Xdialog(1)).
163185377Ssam	       # This prevents dialog(1) from expanding wildcards in help line.
164185377Ssam
165185377Ssam	local height width rows
166185377Ssam	eval f_dialog_menu${SHOW_DESC:+_with_help}_size \
167185377Ssam		height width rows      \
168185377Ssam		\"\$DIALOG_TITLE\"     \
169185377Ssam		\"\$DIALOG_BACKTITLE\" \
170185377Ssam		\"\$prompt\"           \
171185377Ssam		\"\$hline\"            \
172185377Ssam		$menu_list
173185377Ssam
174185377Ssam	# Obtain default-item from previously stored selection
175185377Ssam	f_dialog_default_fetch defaultitem
176185377Ssam
177185377Ssam	local menu_choice
178185377Ssam	menu_choice=$( eval $DIALOG \
179185377Ssam		--title \"\$DIALOG_TITLE\"         \
180185377Ssam		--backtitle \"\$DIALOG_BACKTITLE\" \
181185377Ssam		--hline \"\$hline\"                \
182185377Ssam		--ok-label \"\$msg_ok\"            \
183185377Ssam		--cancel-label \"\$msg_cancel\"    \
184185377Ssam		--help-button                      \
185185377Ssam		--help-label \"\$msg_details\"     \
186185377Ssam		${SHOW_DESC:+--item-help}          \
187185377Ssam		--default-item \"\$defaultitem\"   \
188185377Ssam		--menu \"\$prompt\"                \
189185377Ssam		$height $width $rows               \
190185377Ssam		$menu_list                         \
191185377Ssam		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
192185377Ssam	)
193185377Ssam	local retval=$?
194185377Ssam	f_dialog_data_sanitize menu_choice
195185377Ssam	f_dialog_menutag_store "$menu_choice"
196185377Ssam
197185377Ssam	# Only update default-item on success
198185377Ssam	[ $retval -eq 0 ] && f_dialog_default_store "$menu_choice"
199185377Ssam
200185377Ssam	return $retval
201185377Ssam}
202185377Ssam
203185377Ssam############################################################ MAIN
204185377Ssam
205185377Ssam# Incorporate rc-file if it exists
206185377Ssam[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
207185377Ssam
208185377Ssam#
209185377Ssam# Process command-line arguments
210185377Ssam#
211185377Ssamwhile getopts h$GETOPTS_STDARGS flag; do
212185377Ssam	case "$flag" in
213185377Ssam	h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm" ;;
214185377Ssam	esac
215185377Ssamdone
216185377Ssamshift $(( $OPTIND - 1 ))
217185377Ssam
218185377Ssam#
219185377Ssam# Initialize
220185377Ssam#
221185377Ssamf_dialog_title "$msg_view_edit_startup_configuration"
222185377Ssamf_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
223185377Ssamf_mustberoot_init
224185377Ssam
225185377Ssam#
226185377Ssam# Launch application main menu
227185377Ssam#
228185377Ssamwhile :; do
229185377Ssam	dialog_menu_main
230185377Ssam	retval=$?
231185377Ssam	f_dialog_menutag_fetch mtag
232185377Ssam
233185377Ssam	if [ "$USE_XDIALOG" ]; then
234185377Ssam		case "$mtag" in
235185377Ssam		"> $msg_view_details")
236187831Ssam			f_dialog_input_view_details
237185377Ssam			continue
238185377Ssam		esac
239185377Ssam	elif [ $retval -eq 2 ]; then
240185377Ssam		# The ``Help'' button (labeled "Details") was pressed
241185377Ssam		f_dialog_input_view_details
242185377Ssam		continue
243185377Ssam	fi
244185377Ssam
245185377Ssam	[ $retval -eq 0 ] || f_die
246185377Ssam
247185377Ssam	case "$mtag" in
248185377Ssam	"X $msg_exit") break ;;
249185377Ssam	"> $msg_add_new") $BSDCFG_LIBE/$APP_DIR/rcadd ${USE_XDIALOG:+-X} ;;
250185377Ssam	"> $msg_delete")
251185377Ssam		# rcdelete has a similar interface that can inherit the below:
252185377Ssam		export SHOW_VALUE SHOW_DESC SHOW_DEFAULT_VALUE SHOW_CONFIGURED
253185377Ssam		$BSDCFG_LIBE/$APP_DIR/rcdelete ${USE_XDIALOG:+-X}
254185377Ssam		;;
255185377Ssam	*) # Anything else is a variable to edit
256185377Ssam		$BSDCFG_LIBE/$APP_DIR/rcedit ${USE_XDIALOG:+-X} "${mtag# }"
257187831Ssam	esac
258185377Ssamdone
259185377Ssam
260185377Ssamexit $SUCCESS
261185377Ssam
262185377Ssam################################################################################
263185377Ssam# END
264185377Ssam################################################################################
265185377Ssam