rcvar revision 251244
1238438Sdteske#!/bin/sh
2238438Sdteske#-
3247278Sdteske# Copyright (c) 2012-2013 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/rcvar 251244 2013-06-02 09:02:12Z dteske $
28238438Sdteske#
29238438Sdteske############################################################ INCLUDES
30238438Sdteske
31240684SdteskeBSDCFG_SHARE="/usr/share/bsdconfig"
32240684Sdteske. $BSDCFG_SHARE/common.subr || exit 1
33244675Sdteskef_dprintf "%s: loading includes..." "$0"
34240684Sdteskef_include $BSDCFG_SHARE/dialog.subr
35240684Sdteskef_include $BSDCFG_SHARE/mustberoot.subr
36240684Sdteskef_include $BSDCFG_SHARE/sysrc.subr
37240684Sdteskef_include $BSDCFG_SHARE/startup/rcvar.subr
38238438Sdteske
39240684SdteskeBSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="140.startup"
40238438Sdteskef_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
41238438Sdteske
42243112Sdteskeipgm=$( f_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" )
43238438Sdteske[ $? -eq $SUCCESS -a "$ipgm" ] && pgm="$ipgm"
44238438Sdteske
45238438Sdteske############################################################ GLOBALS
46238438Sdteske
47238438Sdteske#
48238438Sdteske# Global map/menu-list for the main menu
49238438Sdteske#
50238438SdteskeRCVAR_MAP=
51238438Sdteske_RCVAR_MAP=
52238438SdteskeRCVAR_MENU_LIST=
53238438Sdteske
54238438Sdteske#
55238438Sdteske# Options
56238438Sdteske#
57238438Sdteske# Inherit SHOW_DESC value if set, otherwise default to 1
58240798Sdteske[ "${SHOW_DESC+set}" ] || SHOW_DESC=1
59238438Sdteske
60238438Sdteske############################################################ FUNCTIONS
61238438Sdteske
62238438Sdteske# dialog_menu_main
63238438Sdteske#
64238438Sdteske# Display the dialog(1)-based application main menu.
65238438Sdteske#
66238438Sdteskedialog_menu_main()
67238438Sdteske{
68238438Sdteske	local hline="$hline_arrows_tab_enter"
69238438Sdteske	local prompt=""
70251244Sdteske	local defaultitem= # Calculated below
71238438Sdteske
72238438Sdteske	RCVAR_MENU_LIST="
73238438Sdteske		'X $msg_exit' '$msg_exit_this_menu'
74238438Sdteske		              ${SHOW_DESC:+'$msg_exit_this_menu'}
75238438Sdteske	" # END-QUOTE
76238438Sdteske
77238438Sdteske	if [ ! "$_RCVAR_MAP" ]; then
78247278Sdteske		# Generate RCVAR_MAP of `rcvar dflt script desc ...' per-line
79238438Sdteske		f_dialog_info "$msg_creating_rcvar_map"
80238438Sdteske		RCVAR_MAP=$( f_startup_rcvar_map )
81238438Sdteske		export RCVAR_MAP
82238438Sdteske		export _RCVAR_MAP=1
83238438Sdteske	fi
84238438Sdteske
85238438Sdteske	RCVAR_MENU_LIST="$RCVAR_MENU_LIST $(
86240783Sdteske		. "$RC_DEFAULTS" > /dev/null
87240783Sdteske		source_rc_confs > /dev/null
88238438Sdteske		for rcvar in $( echo "$RCVAR_MAP" | awk '{print $1}' ); do
89238438Sdteske			eval export $rcvar
90238438Sdteske		done
91238438Sdteske		export SHOW_DESC msg_default_value
92238438Sdteske		echo "$RCVAR_MAP" | awk '
93238438Sdteske		BEGIN {
94238438Sdteske			prefix = ""
95238438Sdteske			rword  = "^[[:space:]]*[^[:space:]]*[[:space:]]*"
96238438Sdteske		}
97238438Sdteske		{
98238438Sdteske			cur_prefix = tolower(substr($1, 1, 1))
99238438Sdteske			printf "'\''"
100238438Sdteske			if ( prefix != cur_prefix )
101238438Sdteske				prefix = cur_prefix
102238438Sdteske			else
103238438Sdteske				printf " "
104238438Sdteske			rcvar   = $1
105238438Sdteske			default = $2
106238438Sdteske			script  = $3
107238438Sdteske			printf "%s'\'' '\''", rcvar
108238438Sdteske			if ( ENVIRON[rcvar] ~ /[Yy][Ee][Ss]/ )
109238438Sdteske				printf "[X] "
110238438Sdteske			else
111238438Sdteske				printf "[ ] "
112238438Sdteske			printf "%s; " ENVIRON["msg_default_value"],
113238438Sdteske			       script, default
114238438Sdteske			printf "'\''"
115238438Sdteske			if ( ENVIRON["SHOW_DESC"] ) {
116238438Sdteske				desc = $0
117238438Sdteske				sub(rword, "", desc)
118238438Sdteske				sub(rword, "", desc)
119238438Sdteske				sub(rword, "", desc)
120238438Sdteske				gsub(/'\''/, "'\''\\'\'\''", desc)
121238438Sdteske				printf " '\''%s'\''", desc
122238438Sdteske			}
123238438Sdteske			printf "\n"
124238438Sdteske		}'
125238438Sdteske	)"
126238438Sdteske
127238438Sdteske	set -f # noglob
128238438Sdteske
129251190Sdteske	local height width rows
130251190Sdteske	eval f_dialog_menu${SHOW_DESC:+_with_help}_size \
131251190Sdteske		height width rows      \
132251190Sdteske		\"\$DIALOG_TITLE\"     \
133251190Sdteske		\"\$DIALOG_BACKTITLE\" \
134251190Sdteske		\"\$prompt\"           \
135251190Sdteske		\"\$hline\"            \
136251190Sdteske		$RCVAR_MENU_LIST
137238438Sdteske
138251244Sdteske	# Obtain default-item from previously stored selection
139251244Sdteske	f_dialog_default_fetch defaultitem
140251244Sdteske
141251236Sdteske	local menu_choice
142251236Sdteske	menu_choice=$( eval $DIALOG \
143251244Sdteske		--title \"\$DIALOG_TITLE\"         \
144251244Sdteske		--backtitle \"\$DIALOG_BACKTITLE\" \
145251244Sdteske		--hline \"\$hline\"                \
146251244Sdteske		--keep-tite                        \
147251244Sdteske		--ok-label \"\$msg_ok\"            \
148251244Sdteske		--cancel-label \"\$msg_cancel\"    \
149251244Sdteske		${SHOW_DESC:+--item-help}          \
150251244Sdteske		--default-item \"\$defaultitem\"   \
151251244Sdteske		--menu \"\$prompt\"                \
152251244Sdteske		$height $width $rows               \
153251244Sdteske		$RCVAR_MENU_LIST                   \
154240768Sdteske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
155240768Sdteske	)
156240768Sdteske	local retval=$?
157251236Sdteske	f_dialog_data_sanitize menu_choice
158251236Sdteske	f_dialog_menutag_store "$menu_choice"
159251244Sdteske	f_dialog_default_store "$menu_choice"
160240768Sdteske	return $retval
161238438Sdteske}
162238438Sdteske
163238438Sdteske############################################################ MAIN
164238438Sdteske
165238438Sdteske# Incorporate rc-file if it exists
166238438Sdteske[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
167238438Sdteske
168238438Sdteske#
169238438Sdteske# Process command-line arguments
170238438Sdteske#
171250633Sdteskewhile getopts h$GETOPTS_STDARGS flag; do
172238438Sdteske	case "$flag" in
173238438Sdteske	h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm";;
174238438Sdteske	esac
175238438Sdteskedone
176238438Sdteskeshift $(( $OPTIND - 1 ))
177238438Sdteske
178238438Sdteske#
179238438Sdteske# Initialize
180238438Sdteske#
181238438Sdteskef_dialog_title "$msg_toggle_startup_services"
182238438Sdteskef_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
183238438Sdteskef_mustberoot_init
184238438Sdteske
185238438Sdteskewhile :; do
186251236Sdteske	dialog_menu_main || f_die
187251236Sdteske	f_dialog_menutag_fetch mtag
188238438Sdteske
189238438Sdteske	case "$mtag" in
190238438Sdteske	"X $msg_exit") break ;;
191238438Sdteske	*) # Anything else is an rcvar to toggle
192238438Sdteske
193238438Sdteske		rcvar="${mtag# }"
194238438Sdteske		value=$( eval f_dialog_menutag2item${SHOW_DESC:+_with_help} \
195238438Sdteske		         	\"\$mtag\" $RCVAR_MENU_LIST )
196238438Sdteske
197238438Sdteske		# Determine the new [toggled] value to use
198238438Sdteske		case "$value" in
199238438Sdteske		"[X]"*) value="NO";;
200238438Sdteske		     *) value="YES";;
201238438Sdteske		esac
202238438Sdteske
203238438Sdteske		err=$( f_sysrc_set "$rcvar" "$value" 2>&1 ) ||
204245437Sdteske			f_dialog_msgbox "$err"
205238438Sdteske	esac
206238438Sdteskedone
207238438Sdteske
208238438Sdteskeexit $SUCCESS
209238438Sdteske
210238438Sdteske################################################################################
211238438Sdteske# END
212238438Sdteske################################################################################
213