rcdelete revision 240684
1238438Sdteske#!/bin/sh
2238438Sdteske#-
3238438Sdteske# Copyright (c) 2012 Devin Teske
4238438Sdteske# All Rights Reserved.
5238438Sdteske#
6238438Sdteske# Redistribution and use in source and binary forms, with or without
7238438Sdteske# modification, are permitted provided that the following conditions
8238438Sdteske# are met:
9238438Sdteske# 1. Redistributions of source code must retain the above copyright
10238438Sdteske#    notice, this list of conditions and the following disclaimer.
11238438Sdteske# 2. Redistributions in binary form must reproduce the above copyright
12238438Sdteske#    notice, this list of conditions and the following disclaimer in the
13238438Sdteske#    documentation and/or other materials provided with the distribution.
14238438Sdteske#
15238438Sdteske# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16238438Sdteske# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, THE
17238438Sdteske# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18238438Sdteske# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19238438Sdteske# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20238438Sdteske# DAMAGES (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21238438Sdteske# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22238438Sdteske# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23238438Sdteske# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24238438Sdteske# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25238438Sdteske# SUCH DAMAGE.
26238438Sdteske#
27238438Sdteske# $FreeBSD: head/usr.sbin/bsdconfig/startup/rcdelete 240684 2012-09-18 22:28:42Z dteske $
28238438Sdteske#
29238438Sdteske############################################################ INCLUDES
30238438Sdteske
31240684SdteskeBSDCFG_SHARE="/usr/share/bsdconfig"
32240684Sdteske. $BSDCFG_SHARE/common.subr || exit 1
33240684Sdteskef_include $BSDCFG_SHARE/dialog.subr
34240684Sdteskef_include $BSDCFG_SHARE/mustberoot.subr
35240684Sdteskef_include $BSDCFG_SHARE/sysrc.subr
36240684Sdteskef_include $BSDCFG_SHARE/startup/rcconf.subr
37238438Sdteske
38240684SdteskeBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="140.startup"
39238438Sdteskef_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
40238438Sdteske
41238438Sdteskeipgm=$( f_index_menu_selection $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" )
42238438Sdteske[ $? -eq $SUCCESS -a "$ipgm" ] && pgm="$ipgm"
43238438Sdteske
44238438Sdteske############################################################ GLOBALS
45238438Sdteske
46238438Sdteske#
47238438Sdteske# Global map/menu-list for the main menu
48238438Sdteske#
49238438SdteskeRCCONF_MAP=
50238438Sdteske_RCCONF_MAP=
51238438SdteskeRCCONF_MENU_LIST=
52238438Sdteske
53238438Sdteske#
54238438Sdteske# Options
55238438Sdteske#
56238438Sdteske# Inherit SHOW_DESC value if set, otherwise default to 1
57238438Sdteske( : ${SHOW_DESC?} ) > /dev/null 2>&1 || SHOW_DESC=1
58238438Sdteske# Selectively inherit SHOW_* value (in order of preference)
59238438Sdteskeif [ "$SHOW_DEFAULT_VALUE" ]; then
60238438Sdteske	SHOW_DEFAULT_VALUE=1
61238438Sdteske	SHOW_CONFIGURED=
62238438Sdteske	SHOW_VALUE=
63238438Sdteskeelif [ "$SHOW_CONFIGURED" ]; then
64238438Sdteske	SHOW_DEFAULT_VALUE=
65238438Sdteske	SHOW_CONFIGURED=1
66238438Sdteske	SHOW_VALUE=
67238438Sdteskeelse
68238438Sdteske	SHOW_DEFAULT_VALUE=
69238438Sdteske	SHOW_CONFIGURED=
70238438Sdteske	SHOW_VALUE=1
71238438Sdteskefi
72238438Sdteske
73238438Sdteske############################################################ FUNCTIONS
74238438Sdteske
75238438Sdteske# dialog_menu_main
76238438Sdteske#
77238438Sdteske# Display the dialog(1)-based application main menu.
78238438Sdteske#
79238438Sdteskedialog_menu_main()
80238438Sdteske{
81238438Sdteske	local size
82238438Sdteske	local hline="$hline_arrows_tab_enter"
83238438Sdteske	local prompt=""
84238438Sdteske
85238438Sdteske	RCCONF_MENU_LIST="
86238438Sdteske		'X $msg_exit_cancel'     '$msg_exit_cancel_desc'
87238438Sdteske		            ${SHOW_DESC:+'$msg_exit_cancel_help'}
88238438Sdteske		'> $msg_delete_selected' '$msg_delete_selected_desc'
89238438Sdteske		            ${SHOW_DESC:+'$msg_delete_selected_help'}
90238438Sdteske		'> $msg_all'             '$msg_all_desc'
91238438Sdteske		            ${SHOW_DESC:+'$msg_all_help'}
92238438Sdteske		'> $msg_none'            '$msg_none_desc'
93238438Sdteske		            ${SHOW_DESC:+'$msg_none_help'}
94238438Sdteske	${USE_XDIALOG:+
95238438Sdteske		'> $msg_view_details' '$msg_view_details_desc'
96238438Sdteske		                       ${SHOW_DESC:+'$msg_view_details_help'}
97238438Sdteske	}
98238438Sdteske	" # END-QUOTE
99238438Sdteske
100238438Sdteske	if [ ! "$_RCCONF_MAP" ]; then
101238438Sdteske		# Genreate RCCONF_MAP of `var desc ...' per-line
102238438Sdteske		f_dialog_info "$msg_creating_rcconf_map"
103238438Sdteske		RCCONF_MAP=$( f_startup_rcconf_map )
104238438Sdteske		export RCCONF_MAP
105238438Sdteske		# Generate _${var}_desc variables from $RCCONF_MAP
106238438Sdteske		f_startup_rcconf_map_expand
107238438Sdteske		export _RCCONF_MAP=1
108238438Sdteske	fi
109238438Sdteske
110238438Sdteske	# Show infobox for modes that take a while to calculate/display
111238438Sdteske	[ "$SHOW_DEFAULT_VALUE" -o "$SHOW_CONFIGURED" ] &&
112238438Sdteske		f_dialog_info "$msg_creating_menu_list"
113238438Sdteske
114238438Sdteske	RCCONF_MENU_LIST="$RCCONF_MENU_LIST $(
115238438Sdteske		. "$RC_DEFAULTS" > /dev/null
116238438Sdteske		source_rc_confs > /dev/null
117238438Sdteske		var_list=$( f_startup_rcconf_list )
118238438Sdteske		for var in $var_list; do
119238438Sdteske			eval export $var
120238438Sdteske			[ "$SHOW_DEFAULT_VALUE" ] && export \
121238438Sdteske				_${var}_default="$( f_sysrc_get_default $var )"
122238438Sdteske			[ "$SHOW_CONFIGURED" ] && export \
123238438Sdteske				_${var}_file="$( f_sysrc_find $var )"
124238438Sdteske		done
125238438Sdteske		export SHOW_VALUE SHOW_DESC SHOW_DEFAULT_VALUE SHOW_CONFIGURED
126238438Sdteske		export msg_default_value
127238438Sdteske		echo "$var_list" | awk '
128238438Sdteske		BEGIN {
129238438Sdteske			prefix = ""
130238438Sdteske		}
131238438Sdteske		{
132238438Sdteske			cur_prefix = tolower(substr($1, 1, 1))
133238438Sdteske			printf "'\''"
134238438Sdteske			if ( prefix != cur_prefix )
135238438Sdteske				prefix = cur_prefix
136238438Sdteske			else
137238438Sdteske				printf " "
138238438Sdteske			var = $1
139238438Sdteske			printf "%s'\'' '\''[", var
140238438Sdteske			if ( ENVIRON["_" var "_delete"] )
141238438Sdteske				printf "X"
142238438Sdteske			else
143238438Sdteske				printf " "
144238438Sdteske			printf "] "
145238438Sdteske			if ( ENVIRON["SHOW_DEFAULT_VALUE"] ) {
146238438Sdteske				default = ENVIRON["_" var "_default"]
147238438Sdteske				gsub(/'\''/, "'\''\\'\'\''", default)
148238438Sdteske				value = ENVIRON[var]
149238438Sdteske				gsub(/'\''/, "'\''\\'\'\''", value)
150238438Sdteske				printf ENVIRON["msg_default_value"] "; %s",
151238438Sdteske				       default, value
152238438Sdteske			} else if ( ENVIRON["SHOW_CONFIGURED"] ) {
153238438Sdteske				printf "%s", ENVIRON["_" var "_file"]
154238438Sdteske			} else { # SHOW_VALUE (default behavior)
155238438Sdteske				value = ENVIRON[var]
156238438Sdteske				gsub(/'\''/, "'\''\\'\'\''", value)
157238438Sdteske				printf "%s", value
158238438Sdteske			}
159238438Sdteske			printf "'\''"
160238438Sdteske			if ( ENVIRON["SHOW_DESC"] ) {
161238438Sdteske				desc = ENVIRON["_" var "_desc"]
162238438Sdteske				gsub(/'\''/, "'\''\\'\'\''", desc)
163238438Sdteske				printf " '\''%s'\''", desc
164238438Sdteske			}
165238438Sdteske			printf "\n"
166238438Sdteske		}'
167238438Sdteske	)"
168238438Sdteske
169238438Sdteske	set -f # noglob
170238438Sdteske
171238438Sdteske	size=$( eval f_dialog_menu_${SHOW_DESC:+with_help_}size \
172238438Sdteske	        	\"\$DIALOG_TITLE\"     \
173238438Sdteske	        	\"\$DIALOG_BACKTITLE\" \
174238438Sdteske	                \"\$prompt\"           \
175238438Sdteske	        	\"\$hline\"            \
176238438Sdteske	        	$RCCONF_MENU_LIST      )
177238438Sdteske
178238438Sdteske	eval $DIALOG \
179238438Sdteske		--clear --title \"\$DIALOG_TITLE\" \
180238438Sdteske		--backtitle \"\$DIALOG_BACKTITLE\" \
181238438Sdteske		--hline \"\$hline\"                \
182238438Sdteske		--ok-label \"\$msg_ok\"            \
183238438Sdteske		--cancel-label \"\$msg_cancel\"    \
184238438Sdteske		--help-button                      \
185238438Sdteske		--help-label \"\$msg_details\"     \
186238438Sdteske		${SHOW_DESC:+--item-help}          \
187238438Sdteske		--menu \"\$prompt\" $size          \
188238438Sdteske		$RCCONF_MENU_LIST                  \
189238438Sdteske		2> "$DIALOG_TMPDIR/dialog.menu.$$"
190238438Sdteske}
191238438Sdteske
192238438Sdteske# dialog_menu_delete $var1 [$var2 ...]
193238438Sdteske#
194238438Sdteske# Get the user's blessing to delete one or more variables.
195238438Sdteske# if (and only-if) the user confirms (does not press ESC or Cancel/NO).
196238438Sdteske#
197238438Sdteskedialog_menu_delete()
198238438Sdteske{
199238438Sdteske	local size
200238438Sdteske	local hline="$hline_arrows_tab_enter"
201238438Sdteske	local prompt="$msg_are_you_sure_you_want_delete_the_following"
202238438Sdteske	local var_list menu_list
203238438Sdteske
204238438Sdteske	[ $# -ge 1 ] || return $FAILURE
205238438Sdteske
206238438Sdteske	if [ $# -eq 1 ]; then
207238438Sdteske		msg=$( printf "$msg_are_you_sure_you_want_to_delete" \
208238438Sdteske		              "$delete_vars" )
209238438Sdteske		f_dialog_noyes "$msg"
210238438Sdteske		return $?
211238438Sdteske	fi
212238438Sdteske
213238438Sdteske	var_list=$( for var in $*; do echo "$var"; done | sort -u )
214238438Sdteske	menu_list=$(
215238438Sdteske		. "$RC_DEFAULTS"
216238438Sdteske		source_rc_confs
217238438Sdteske		echo "$var_list" | awk '
218238438Sdteske		BEGIN {
219238438Sdteske			prefix = ""
220238438Sdteske		}
221238438Sdteske		{
222238438Sdteske			cur_prefix = tolower(substr($1, 1, 1))
223238438Sdteske			printf "'\''"
224238438Sdteske			if ( prefix != cur_prefix )
225238438Sdteske				prefix = cur_prefix
226238438Sdteske			else
227238438Sdteske				printf " "
228238438Sdteske			var = $1
229238438Sdteske			printf "%s'\'' '\'\''\n", var
230238438Sdteske		}'
231238438Sdteske	)
232238438Sdteske
233238438Sdteske	size=$( eval f_dialog_menu_size \
234238438Sdteske	        	\"\$DIALOG_TITLE\"     \
235238438Sdteske	        	\"\$DIALOG_BACKTITLE\" \
236238438Sdteske	                \"\$prompt\"           \
237238438Sdteske	        	\"\$hline\"            \
238238438Sdteske	        	$menu_list             )
239238438Sdteske
240238438Sdteske	local defaultno="defaultno"
241238438Sdteske	[ "$USE_XDIALOG" ] && defaultno="default-no"
242238438Sdteske
243238438Sdteske	eval $DIALOG \
244238438Sdteske		--clear --title \"\$DIALOG_TITLE\" \
245238438Sdteske		--backtitle \"\$DIALOG_BACKTITLE\" \
246238438Sdteske		--hline \"\$hline\"                \
247238438Sdteske		--$defaultno                       \
248238438Sdteske		--ok-label \"\$msg_ok\"            \
249238438Sdteske		--cancel-label \"\$msg_cancel\"    \
250238438Sdteske		--menu \"\$prompt\" $size          \
251238438Sdteske		$menu_list                         \
252238438Sdteske		2> "$DIALOG_TMPDIR/dialog.menu.$$"
253238438Sdteske}
254238438Sdteske
255238438Sdteske############################################################ MAIN
256238438Sdteske
257238438Sdteske# Incorporate rc-file if it exists
258238438Sdteske[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
259238438Sdteske
260238438Sdteske#
261238438Sdteske# Process command-line arguments
262238438Sdteske#
263238438Sdteskewhile getopts hSX flag; do
264238438Sdteske	case "$flag" in
265238438Sdteske	h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm";;
266238438Sdteske	esac
267238438Sdteskedone
268238438Sdteskeshift $(( $OPTIND - 1 ))
269238438Sdteske
270238438Sdteske#
271238438Sdteske# Initialize
272238438Sdteske#
273238438Sdteskef_dialog_init
274238438Sdteskef_dialog_title "$msg_delete_startup_directives"
275238438Sdteskef_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
276238438Sdteskef_mustberoot_init
277238438Sdteske
278238438Sdteskewhile :; do
279238438Sdteske	dialog_menu_main
280238438Sdteske	retval=$?
281238438Sdteske	mtag=$( f_dialog_menutag )
282238438Sdteske
283238438Sdteske	if [ "$USE_XDIALOG" ]; then
284238438Sdteske		case "$mtag" in
285238438Sdteske		"> $msg_view_details")
286238438Sdteske			f_dialog_input_view_details
287238438Sdteske			continue
288238438Sdteske		esac
289238438Sdteske	elif [ $retval -eq 2 ]; then
290238438Sdteske		# The ``Help'' button (labeled "Details") was pressed
291238438Sdteske		f_dialog_input_view_details
292238438Sdteske		continue
293238438Sdteske	fi
294238438Sdteske
295238438Sdteske	[ $retval -eq 0 ] || f_die
296238438Sdteske
297238438Sdteske	case "$mtag" in
298238438Sdteske	"X $msg_exit_cancel") break ;;
299238438Sdteske	"> $msg_delete_selected")
300238438Sdteske		delete_vars=
301238438Sdteske		for var in $( f_startup_rcconf_list ); do
302238438Sdteske			[ "$( eval echo \$_${var}_delete )" ] || continue
303238438Sdteske			delete_vars="$delete_vars${delete_vars:+ }$var"
304238438Sdteske		done
305238438Sdteske		unset var # no longer needed
306238438Sdteske		if dialog_menu_delete $delete_vars; then
307238438Sdteske			f_dialog_title "$msg_info"
308238438Sdteske			f_dialog_info "$msg_deleting_selected_directives"
309238438Sdteske			f_dialog_title_restore
310238438Sdteske			for var in $delete_vars; do
311238438Sdteske				err=$( f_sysrc_delete $var 2>&1 )
312238438Sdteske				if [ $? -ne $SUCCESS ]; then
313238438Sdteske					f_show_msg "%s\n" "$err"
314238438Sdteske					break
315238438Sdteske				fi
316238438Sdteske			done
317238438Sdteske			unset var # no longer needed
318238438Sdteske		fi
319238438Sdteske		;;
320238438Sdteske	"> $msg_all")
321238438Sdteske		for var in $( f_startup_rcconf_list ); do
322238438Sdteske			setvar _${var}_delete 1
323238438Sdteske			export _${var}_delete
324238438Sdteske		done
325238438Sdteske		unset var # no longer needed
326238438Sdteske		;;
327238438Sdteske	"> $msg_none")
328238438Sdteske		var_list=$( set | awk -F= "
329238438Sdteske			/$STARTUP_RCCONF_REGEX/ {
330238438Sdteske				if (\$1 ~ /^_[[:alpha:]_][[:alnum:]_]*_delete/)
331238438Sdteske					print \$1
332238438Sdteske			}"
333238438Sdteske		)
334238438Sdteske		[ "$var_list" ] && unset $var_list
335238438Sdteske		unset var_list # no longer needed
336238438Sdteske		;;
337238438Sdteske	*) # Anything else is a variable to edit
338238438Sdteske		var="${mtag# }"
339238438Sdteske
340238438Sdteske		# Toggle the state-variable and loop back to menu
341238438Sdteske		if ( eval : \${_${var}_delete?} ) > /dev/null 2>&1; then
342238438Sdteske			unset _${var}_delete
343238438Sdteske		else
344238438Sdteske			setvar _${var}_delete 1
345238438Sdteske			export _${var}_delete
346238438Sdteske		fi
347238438Sdteske		unset var # no longer needed
348238438Sdteske	esac
349238438Sdteskedone
350238438Sdteske
351238438Sdteskeexit $SUCCESS
352238438Sdteske
353238438Sdteske################################################################################
354238438Sdteske# END
355238438Sdteske################################################################################
356