rcvar revision 250633
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 250633 2013-05-14 03:21:13Z 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
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
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 \
138249751Sdteske		--title \"\$DIALOG_TITLE\"          \
139249751Sdteske		--backtitle \"\$DIALOG_BACKTITLE\"  \
140249751Sdteske		--hline \"\$hline\"                 \
141249751Sdteske		--keep-tite                         \
142249751Sdteske		--ok-label \"\$msg_ok\"             \
143249751Sdteske		--cancel-label \"\$msg_cancel\"     \
144249751Sdteske		${SHOW_DESC:+--item-help}           \
145249751Sdteske		--default-item \"\$DEFAULTITEM_$$\" \
146249751Sdteske		--menu \"\$prompt\" $size           \
147249751Sdteske		$RCVAR_MENU_LIST                    \
148240768Sdteske		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
149240768Sdteske	)
150240768Sdteske	local retval=$?
151249751Sdteske	setvar DEFAULTITEM_$$ "$dialog_menu"
152240768Sdteske	setvar DIALOG_MENU_$$ "$dialog_menu"
153240768Sdteske	return $retval
154238438Sdteske}
155238438Sdteske
156238438Sdteske############################################################ MAIN
157238438Sdteske
158238438Sdteske# Incorporate rc-file if it exists
159238438Sdteske[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
160238438Sdteske
161238438Sdteske#
162238438Sdteske# Process command-line arguments
163238438Sdteske#
164250633Sdteskewhile getopts h$GETOPTS_STDARGS flag; do
165238438Sdteske	case "$flag" in
166238438Sdteske	h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm";;
167238438Sdteske	esac
168238438Sdteskedone
169238438Sdteskeshift $(( $OPTIND - 1 ))
170238438Sdteske
171238438Sdteske#
172238438Sdteske# Initialize
173238438Sdteske#
174238438Sdteskef_dialog_title "$msg_toggle_startup_services"
175238438Sdteskef_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
176238438Sdteskef_mustberoot_init
177238438Sdteske
178238438Sdteskewhile :; do
179238438Sdteske	dialog_menu_main
180238438Sdteske	retval=$?
181238438Sdteske	mtag=$( f_dialog_menutag )
182238438Sdteske
183238438Sdteske	[ $retval -eq 0 ] || f_die
184238438Sdteske
185238438Sdteske	case "$mtag" in
186238438Sdteske	"X $msg_exit") break ;;
187238438Sdteske	*) # Anything else is an rcvar to toggle
188238438Sdteske
189238438Sdteske		rcvar="${mtag# }"
190238438Sdteske		value=$( eval f_dialog_menutag2item${SHOW_DESC:+_with_help} \
191238438Sdteske		         	\"\$mtag\" $RCVAR_MENU_LIST )
192238438Sdteske
193238438Sdteske		# Determine the new [toggled] value to use
194238438Sdteske		case "$value" in
195238438Sdteske		"[X]"*) value="NO";;
196238438Sdteske		     *) value="YES";;
197238438Sdteske		esac
198238438Sdteske
199238438Sdteske		err=$( f_sysrc_set "$rcvar" "$value" 2>&1 ) ||
200245437Sdteske			f_dialog_msgbox "$err"
201238438Sdteske	esac
202238438Sdteskedone
203238438Sdteske
204238438Sdteskeexit $SUCCESS
205238438Sdteske
206238438Sdteske################################################################################
207238438Sdteske# END
208238438Sdteske################################################################################
209