rcvar revision 244675
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 244675 2012-12-25 10:47:45Z 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 size
69238438Sdteske	local hline="$hline_arrows_tab_enter"
70238438Sdteske	local prompt=""
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
78238438Sdteske		# Genreate 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
129238438Sdteske	size=$( eval f_dialog_menu_${SHOW_DESC:+with_help_}size \
130238438Sdteske	        	\"\$DIALOG_TITLE\"     \
131238438Sdteske	        	\"\$DIALOG_BACKTITLE\" \
132238438Sdteske	        	\"\$prompt\"           \
133238438Sdteske	        	\"\$hline\"            \
134238438Sdteske	        	$RCVAR_MENU_LIST       )
135238438Sdteske
136240768Sdteske	local dialog_menu
137240768Sdteske	dialog_menu=$( eval $DIALOG \
138238438Sdteske		--clear --title \"\$DIALOG_TITLE\" \
139238438Sdteske		--backtitle \"\$DIALOG_BACKTITLE\" \
140238438Sdteske		--hline \"\$hline\"                \
141238438Sdteske		--ok-label \"\$msg_ok\"            \
142238438Sdteske		--cancel-label \"\$msg_cancel\"    \
143238438Sdteske		${SHOW_DESC:+--item-help}          \
144238438Sdteske		--menu \"\$prompt\" $size          \
145238438Sdteske		$RCVAR_MENU_LIST                   \
146240768Sdteske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
147240768Sdteske	)
148240768Sdteske	local retval=$?
149240768Sdteske	setvar DIALOG_MENU_$$ "$dialog_menu"
150240768Sdteske	return $retval
151238438Sdteske}
152238438Sdteske
153238438Sdteske############################################################ MAIN
154238438Sdteske
155238438Sdteske# Incorporate rc-file if it exists
156238438Sdteske[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
157238438Sdteske
158238438Sdteske#
159238438Sdteske# Process command-line arguments
160238438Sdteske#
161238438Sdteskewhile getopts hSX flag; do
162238438Sdteske	case "$flag" in
163238438Sdteske	h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm";;
164238438Sdteske	esac
165238438Sdteskedone
166238438Sdteskeshift $(( $OPTIND - 1 ))
167238438Sdteske
168238438Sdteske#
169238438Sdteske# Initialize
170238438Sdteske#
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