rcvar revision 238438
1249259Sdim#!/bin/sh
2249259Sdim#-
3249259Sdim# Copyright (c) 2012 Devin Teske
4249259Sdim# All Rights Reserved.
5249259Sdim#
6249259Sdim# Redistribution and use in source and binary forms, with or without
7249259Sdim# modification, are permitted provided that the following conditions
8249259Sdim# are met:
9249259Sdim# 1. Redistributions of source code must retain the above copyright
10249259Sdim#    notice, this list of conditions and the following disclaimer.
11249259Sdim# 2. Redistributions in binary form must reproduce the above copyright
12249259Sdim#    notice, this list of conditions and the following disclaimer in the
13249259Sdim#    documentation and/or other materials provided with the distribution.
14249259Sdim#
15249259Sdim# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16249259Sdim# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, THE
17249259Sdim# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18249259Sdim# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19249259Sdim# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20249259Sdim# DAMAGES (INLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21249259Sdim# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22249259Sdim# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23249259Sdim# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24249259Sdim# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25266759Sdim# SUCH DAMAGE.
26266759Sdim#
27263509Sdim# $FreeBSD: head/usr.sbin/bsdconfig/startup/rcvar 238438 2012-07-14 03:16:57Z dteske $
28263509Sdim#
29249259Sdim############################################################ INCLUDES
30263509Sdim
31263509SdimBSDCFG_LIBE="/usr/libexec/bsdconfig"
32249259Sdim. $BSDCFG_LIBE/include/common.subr || exit 1
33249259Sdimf_include $BSDCFG_LIBE/include/dialog.subr
34249259Sdimf_include $BSDCFG_LIBE/include/mustberoot.subr
35249259Sdimf_include $BSDCFG_LIBE/include/sysrc.subr
36249259Sdim
37249259SdimAPP_DIR="140.startup"
38249259Sdimf_include $BSDCFG_LIBE/$APP_DIR/include/rcvar.subr
39249259Sdimf_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
40249259Sdim
41249259Sdimipgm=$( f_index_menu_selection $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" )
42249259Sdim[ $? -eq $SUCCESS -a "$ipgm" ] && pgm="$ipgm"
43249259Sdim
44249259Sdim############################################################ GLOBALS
45249259Sdim
46249259Sdim#
47249259Sdim# Global map/menu-list for the main menu
48249259Sdim#
49249259SdimRCVAR_MAP=
50249259Sdim_RCVAR_MAP=
51249259SdimRCVAR_MENU_LIST=
52249259Sdim
53249259Sdim#
54249259Sdim# Options
55249259Sdim#
56249259Sdim# Inherit SHOW_DESC value if set, otherwise default to 1
57249259Sdim( ${SHOW_DESC?} ) > /dev/null 2>&1 || SHOW_DESC=1
58249259Sdim
59249259Sdim############################################################ FUNCTIONS
60249259Sdim
61249259Sdim# dialog_menu_main
62249259Sdim#
63249259Sdim# Display the dialog(1)-based application main menu.
64249259Sdim#
65249259Sdimdialog_menu_main()
66249259Sdim{
67249259Sdim	local size
68249259Sdim	local hline="$hline_arrows_tab_enter"
69249259Sdim	local prompt=""
70249259Sdim
71249259Sdim	RCVAR_MENU_LIST="
72249259Sdim		'X $msg_exit' '$msg_exit_this_menu'
73249259Sdim		              ${SHOW_DESC:+'$msg_exit_this_menu'}
74249259Sdim	" # END-QUOTE
75249259Sdim
76249259Sdim	if [ ! "$_RCVAR_MAP" ]; then
77249259Sdim		# Genreate RCVAR_MAP of `rcvar dflt script desc ...' per-line
78249259Sdim		f_dialog_info "$msg_creating_rcvar_map"
79249259Sdim		RCVAR_MAP=$( f_startup_rcvar_map )
80249259Sdim		export RCVAR_MAP
81249259Sdim		export _RCVAR_MAP=1
82249259Sdim	fi
83249259Sdim
84249259Sdim	RCVAR_MENU_LIST="$RCVAR_MENU_LIST $(
85249259Sdim		. "$RC_DEFAULTS" > /dev/null
86249259Sdim		source_rc_confs > /dev/null
87249259Sdim		for rcvar in $( echo "$RCVAR_MAP" | awk '{print $1}' ); do
88249259Sdim			eval export $rcvar
89249259Sdim		done
90249259Sdim		export SHOW_DESC msg_default_value
91249259Sdim		echo "$RCVAR_MAP" | awk '
92249259Sdim		BEGIN {
93249259Sdim			prefix = ""
94249259Sdim			rword  = "^[[:space:]]*[^[:space:]]*[[:space:]]*"
95249259Sdim		}
96249259Sdim		{
97249259Sdim			cur_prefix = tolower(substr($1, 1, 1))
98249259Sdim			printf "'\''"
99249259Sdim			if ( prefix != cur_prefix )
100249259Sdim				prefix = cur_prefix
101249259Sdim			else
102249259Sdim				printf " "
103249259Sdim			rcvar   = $1
104249259Sdim			default = $2
105249259Sdim			script  = $3
106249259Sdim			printf "%s'\'' '\''", rcvar
107249259Sdim			if ( ENVIRON[rcvar] ~ /[Yy][Ee][Ss]/ )
108249259Sdim				printf "[X] "
109249259Sdim			else
110249259Sdim				printf "[ ] "
111249259Sdim			printf "%s; " ENVIRON["msg_default_value"],
112249259Sdim			       script, default
113249259Sdim			printf "'\''"
114249259Sdim			if ( ENVIRON["SHOW_DESC"] ) {
115252723Sdim				desc = $0
116249259Sdim				sub(rword, "", desc)
117249259Sdim				sub(rword, "", desc)
118249259Sdim				sub(rword, "", desc)
119249259Sdim				gsub(/'\''/, "'\''\\'\'\''", desc)
120249259Sdim				printf " '\''%s'\''", desc
121249259Sdim			}
122249259Sdim			printf "\n"
123249259Sdim		}'
124249259Sdim	)"
125249259Sdim
126249259Sdim	set -f # noglob
127249259Sdim
128249259Sdim	size=$( eval f_dialog_menu_${SHOW_DESC:+with_help_}size \
129249259Sdim	        	\"\$DIALOG_TITLE\"     \
130249259Sdim	        	\"\$DIALOG_BACKTITLE\" \
131249259Sdim	        	\"\$prompt\"           \
132249259Sdim	        	\"\$hline\"            \
133263509Sdim	        	$RCVAR_MENU_LIST       )
134263509Sdim
135263509Sdim	eval $DIALOG \
136263509Sdim		--clear --title \"\$DIALOG_TITLE\" \
137263509Sdim		--backtitle \"\$DIALOG_BACKTITLE\" \
138249259Sdim		--hline \"\$hline\"                \
139249259Sdim		--ok-label \"\$msg_ok\"            \
140249259Sdim		--cancel-label \"\$msg_cancel\"    \
141249259Sdim		${SHOW_DESC:+--item-help}          \
142249259Sdim		--menu \"\$prompt\" $size          \
143249259Sdim		$RCVAR_MENU_LIST                   \
144249259Sdim		2> "$DIALOG_TMPDIR/dialog.menu.$$"
145249259Sdim}
146249259Sdim
147249259Sdim############################################################ MAIN
148263509Sdim
149263509Sdim# Incorporate rc-file if it exists
150263509Sdim[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
151263509Sdim
152263509Sdim#
153263509Sdim# Process command-line arguments
154263509Sdim#
155263509Sdimwhile getopts hSX flag; do
156249259Sdim	case "$flag" in
157249259Sdim	h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm";;
158249259Sdim	esac
159249259Sdimdone
160263509Sdimshift $(( $OPTIND - 1 ))
161249259Sdim
162249259Sdim#
163249259Sdim# Initialize
164249259Sdim#
165249259Sdimf_dialog_init
166249259Sdimf_dialog_title "$msg_toggle_startup_services"
167249259Sdimf_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
168249259Sdimf_mustberoot_init
169249259Sdim
170249259Sdimwhile :; do
171249259Sdim	dialog_menu_main
172249259Sdim	retval=$?
173249259Sdim	mtag=$( f_dialog_menutag )
174249259Sdim
175249259Sdim	[ $retval -eq 0 ] || f_die
176249259Sdim
177249259Sdim	case "$mtag" in
178249259Sdim	"X $msg_exit") break ;;
179249259Sdim	*) # Anything else is an rcvar to toggle
180249259Sdim
181249259Sdim		rcvar="${mtag# }"
182249259Sdim		value=$( eval f_dialog_menutag2item${SHOW_DESC:+_with_help} \
183249259Sdim		         	\"\$mtag\" $RCVAR_MENU_LIST )
184249259Sdim
185249259Sdim		# Determine the new [toggled] value to use
186263509Sdim		case "$value" in
187263509Sdim		"[X]"*) value="NO";;
188263509Sdim		     *) value="YES";;
189263509Sdim		esac
190249259Sdim
191263509Sdim		err=$( f_sysrc_set "$rcvar" "$value" 2>&1 ) ||
192263509Sdim			f_show_msg "$err"
193263509Sdim	esac
194249259Sdimdone
195249259Sdim
196249259Sdimexit $SUCCESS
197249259Sdim
198263509Sdim################################################################################
199249259Sdim# END
200249259Sdim################################################################################
201249259Sdim