rcvar revision 240798
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/rcvar 240798 2012-09-22 04:04:02Z 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/rcvar.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#
49238438SdteskeRCVAR_MAP=
50238438Sdteske_RCVAR_MAP=
51238438SdteskeRCVAR_MENU_LIST=
52238438Sdteske
53238438Sdteske#
54238438Sdteske# Options
55238438Sdteske#
56238438Sdteske# Inherit SHOW_DESC value if set, otherwise default to 1
57240798Sdteske[ "${SHOW_DESC+set}" ] || SHOW_DESC=1
58238438Sdteske
59238438Sdteske############################################################ FUNCTIONS
60238438Sdteske
61238438Sdteske# dialog_menu_main
62238438Sdteske#
63238438Sdteske# Display the dialog(1)-based application main menu.
64238438Sdteske#
65238438Sdteskedialog_menu_main()
66238438Sdteske{
67238438Sdteske	local size
68238438Sdteske	local hline="$hline_arrows_tab_enter"
69238438Sdteske	local prompt=""
70238438Sdteske
71238438Sdteske	RCVAR_MENU_LIST="
72238438Sdteske		'X $msg_exit' '$msg_exit_this_menu'
73238438Sdteske		              ${SHOW_DESC:+'$msg_exit_this_menu'}
74238438Sdteske	" # END-QUOTE
75238438Sdteske
76238438Sdteske	if [ ! "$_RCVAR_MAP" ]; then
77238438Sdteske		# Genreate RCVAR_MAP of `rcvar dflt script desc ...' per-line
78238438Sdteske		f_dialog_info "$msg_creating_rcvar_map"
79238438Sdteske		RCVAR_MAP=$( f_startup_rcvar_map )
80238438Sdteske		export RCVAR_MAP
81238438Sdteske		export _RCVAR_MAP=1
82238438Sdteske	fi
83238438Sdteske
84238438Sdteske	RCVAR_MENU_LIST="$RCVAR_MENU_LIST $(
85240783Sdteske		. "$RC_DEFAULTS" > /dev/null
86240783Sdteske		source_rc_confs > /dev/null
87238438Sdteske		for rcvar in $( echo "$RCVAR_MAP" | awk '{print $1}' ); do
88238438Sdteske			eval export $rcvar
89238438Sdteske		done
90238438Sdteske		export SHOW_DESC msg_default_value
91238438Sdteske		echo "$RCVAR_MAP" | awk '
92238438Sdteske		BEGIN {
93238438Sdteske			prefix = ""
94238438Sdteske			rword  = "^[[:space:]]*[^[:space:]]*[[:space:]]*"
95238438Sdteske		}
96238438Sdteske		{
97238438Sdteske			cur_prefix = tolower(substr($1, 1, 1))
98238438Sdteske			printf "'\''"
99238438Sdteske			if ( prefix != cur_prefix )
100238438Sdteske				prefix = cur_prefix
101238438Sdteske			else
102238438Sdteske				printf " "
103238438Sdteske			rcvar   = $1
104238438Sdteske			default = $2
105238438Sdteske			script  = $3
106238438Sdteske			printf "%s'\'' '\''", rcvar
107238438Sdteske			if ( ENVIRON[rcvar] ~ /[Yy][Ee][Ss]/ )
108238438Sdteske				printf "[X] "
109238438Sdteske			else
110238438Sdteske				printf "[ ] "
111238438Sdteske			printf "%s; " ENVIRON["msg_default_value"],
112238438Sdteske			       script, default
113238438Sdteske			printf "'\''"
114238438Sdteske			if ( ENVIRON["SHOW_DESC"] ) {
115238438Sdteske				desc = $0
116238438Sdteske				sub(rword, "", desc)
117238438Sdteske				sub(rword, "", desc)
118238438Sdteske				sub(rword, "", desc)
119238438Sdteske				gsub(/'\''/, "'\''\\'\'\''", desc)
120238438Sdteske				printf " '\''%s'\''", desc
121238438Sdteske			}
122238438Sdteske			printf "\n"
123238438Sdteske		}'
124238438Sdteske	)"
125238438Sdteske
126238438Sdteske	set -f # noglob
127238438Sdteske
128238438Sdteske	size=$( eval f_dialog_menu_${SHOW_DESC:+with_help_}size \
129238438Sdteske	        	\"\$DIALOG_TITLE\"     \
130238438Sdteske	        	\"\$DIALOG_BACKTITLE\" \
131238438Sdteske	        	\"\$prompt\"           \
132238438Sdteske	        	\"\$hline\"            \
133238438Sdteske	        	$RCVAR_MENU_LIST       )
134238438Sdteske
135240768Sdteske	local dialog_menu
136240768Sdteske	dialog_menu=$( eval $DIALOG \
137238438Sdteske		--clear --title \"\$DIALOG_TITLE\" \
138238438Sdteske		--backtitle \"\$DIALOG_BACKTITLE\" \
139238438Sdteske		--hline \"\$hline\"                \
140238438Sdteske		--ok-label \"\$msg_ok\"            \
141238438Sdteske		--cancel-label \"\$msg_cancel\"    \
142238438Sdteske		${SHOW_DESC:+--item-help}          \
143238438Sdteske		--menu \"\$prompt\" $size          \
144238438Sdteske		$RCVAR_MENU_LIST                   \
145240768Sdteske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
146240768Sdteske	)
147240768Sdteske	local retval=$?
148240768Sdteske	setvar DIALOG_MENU_$$ "$dialog_menu"
149240768Sdteske	return $retval
150238438Sdteske}
151238438Sdteske
152238438Sdteske############################################################ MAIN
153238438Sdteske
154238438Sdteske# Incorporate rc-file if it exists
155238438Sdteske[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
156238438Sdteske
157238438Sdteske#
158238438Sdteske# Process command-line arguments
159238438Sdteske#
160238438Sdteskewhile getopts hSX flag; do
161238438Sdteske	case "$flag" in
162238438Sdteske	h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm";;
163238438Sdteske	esac
164238438Sdteskedone
165238438Sdteskeshift $(( $OPTIND - 1 ))
166238438Sdteske
167238438Sdteske#
168238438Sdteske# Initialize
169238438Sdteske#
170238438Sdteskef_dialog_init
171238438Sdteskef_dialog_title "$msg_toggle_startup_services"
172238438Sdteskef_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
173238438Sdteskef_mustberoot_init
174238438Sdteske
175238438Sdteskewhile :; do
176238438Sdteske	dialog_menu_main
177238438Sdteske	retval=$?
178238438Sdteske	mtag=$( f_dialog_menutag )
179238438Sdteske
180238438Sdteske	[ $retval -eq 0 ] || f_die
181238438Sdteske
182238438Sdteske	case "$mtag" in
183238438Sdteske	"X $msg_exit") break ;;
184238438Sdteske	*) # Anything else is an rcvar to toggle
185238438Sdteske
186238438Sdteske		rcvar="${mtag# }"
187238438Sdteske		value=$( eval f_dialog_menutag2item${SHOW_DESC:+_with_help} \
188238438Sdteske		         	\"\$mtag\" $RCVAR_MENU_LIST )
189238438Sdteske
190238438Sdteske		# Determine the new [toggled] value to use
191238438Sdteske		case "$value" in
192238438Sdteske		"[X]"*) value="NO";;
193238438Sdteske		     *) value="YES";;
194238438Sdteske		esac
195238438Sdteske
196238438Sdteske		err=$( f_sysrc_set "$rcvar" "$value" 2>&1 ) ||
197238438Sdteske			f_show_msg "$err"
198238438Sdteske	esac
199238438Sdteskedone
200238438Sdteske
201238438Sdteskeexit $SUCCESS
202238438Sdteske
203238438Sdteske################################################################################
204238438Sdteske# END
205238438Sdteske################################################################################
206