1if [ ! "$_VARIABLE_SUBR" ]; then _VARIABLE_SUBR=1
2#
3# Copyright (c) 2012-2014 Devin Teske
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25# SUCH DAMAGE.
26#
27#
28############################################################ INCLUDES
29
30BSDCFG_SHARE="/usr/share/bsdconfig"
31. $BSDCFG_SHARE/common.subr || exit 1
32f_dprintf "%s: loading includes..." variable.subr
33f_include $BSDCFG_SHARE/dialog.subr
34f_include $BSDCFG_SHARE/strings.subr
35
36############################################################ GLOBALS
37
38VARIABLES=
39
40#
41# Default behavior is to call f_variable_set_defaults() when loaded.
42#
43: ${VARIABLE_SELF_INITIALIZE=1}
44
45#
46# File to write when f_dump_variables() is called.
47#
48: ${VARIABLE_DUMPFILE:=/etc/bsdconfig.vars}
49
50############################################################ FUNCTIONS
51
52# f_variable_new $handle $variable
53#
54# Register a new variable named $variable with the given reference-handle
55# $handle. The environment variable $handle is set to $variable allowing you to
56# use the f_getvar() function (from common.subr) with $handle to get the value
57# of environment variable $variable. For example:
58#
59# 	f_variable_new VAR_ABC abc
60#
61# allows the later indirection:
62#
63# 	f_getvar $VAR_ABC
64#
65# to return the value of environment variable `abc'. Variables registered in
66# this manner are recorded in the $VARIABLES environment variable for later
67# allowing dynamic enumeration of so-called `registered/advertised' variables.
68#
69f_variable_new()
70{
71	local handle="$1" variable="$2"
72	[ "$handle" ] || return $FAILURE
73	f_dprintf "variable.subr: New variable %s -> %s" "$handle" "$variable"
74	setvar $handle $variable
75	VARIABLES="$VARIABLES${VARIABLES:+ }$handle"
76}
77
78# f_variable_get_value $var [ $fmt [ $opts ... ] ]
79#
80# Unless nonInteractive is set, prompt the user with a given value (pre-filled
81# with the value of $var) and give them the chance to change the value.
82#
83# Unlike f_getvar() (from common.subr) which can return a variable to the
84# caller on standard output, this function has no [meaningful] output.
85#
86# Returns success unless $var is either NULL or missing.
87#
88f_variable_get_value()
89{
90	local var="$1" cp
91
92	[ "$var" ] || return $FAILURE
93
94	if ! { f_getvar $var cp && ! f_interactive; }; then
95		shift 1 # var
96		f_dialog_input cp "$( printf "$@" )" "$cp" && setvar $var "$cp"
97	fi
98
99	return $SUCCESS
100}
101
102# f_variable_set_defaults
103#
104# Installs sensible defaults for registered/advertised variables.
105#
106f_variable_set_defaults()
107{
108	f_dprintf "f_variable_set_defaults: Initializing defaults..."
109
110	#
111	# Initialize various user-edittable values to their defaults
112	#
113	setvar $VAR_EDITOR		"${EDITOR:-/usr/bin/ee}"
114	setvar $VAR_HOSTNAME		"$( hostname )"
115	setvar $VAR_MEDIA_TIMEOUT	"300"
116	setvar $VAR_NFS_SECURE		"NO"
117	setvar $VAR_NFS_TCP		"NO"
118	setvar $VAR_NFS_V3		"YES"
119	setvar $VAR_PKG_TMPDIR		"/var/tmp"
120	setvar $VAR_RELNAME		"$UNAME_R"
121
122	#
123	# Debugging
124	#
125	if f_debugging; then
126		local var
127		for var in \
128			$VAR_EDITOR		\
129			$VAR_HOSTNAME		\
130			$VAR_MEDIA_TIMEOUT	\
131			$VAR_NFS_SECURE		\
132			$VAR_NFS_TCP		\
133			$VAR_NFS_V3		\
134			$VAR_PKG_TMPDIR		\
135			$VAR_RELNAME		\
136		; do
137			f_quietly f_getvar $var
138		done
139	fi
140
141	f_dprintf "f_variable_set_defaults: Defaults initialized."
142}
143
144# f_dump_variables
145#
146# Dump a list of registered/advertised variables and their respective values to
147# $VARIABLE_DUMPFILE. Returns success unless the file couldn't be written. If
148# an error occurs, it is displayed using f_dialog_msgbox() (from dialog.subr).
149#
150f_dump_variables()
151{
152	local err
153	if ! err=$(
154		( for handle in $VARIABLES; do
155			f_getvar $handle var || continue
156			f_getvar $var value || continue
157			f_shell_escape "$value" value
158			printf "%s='%s'\n" "$var" "$value"
159		  done > "$VARIABLE_DUMPFILE" ) 2>&1
160	); then
161		f_dialog_msgbox "$err"
162		return $FAILURE
163	fi
164}
165
166# f_debugging
167#
168# Are we in debug mode? Returns success if extra DEBUG information has been
169# requested (by setting $debug to non-NULL), otherwise false.
170#
171f_debugging()
172{
173	local value
174	f_getvar $VAR_DEBUG value && [ "$value" ]
175}
176
177# f_interactive
178#
179# Are we running interactively? Return error if $nonInteractive is set and non-
180# NULL, otherwise return success.
181#
182f_interactive()
183{
184	local value
185	! f_getvar $VAR_NONINTERACTIVE value || [ ! "$value" ]
186}
187
188# f_netinteractive
189#
190# Has the user specifically requested the network-portion of configuration and
191# setup to be performed interactively? Returns success if the user has asked
192# for the network configuration to be done interactively even if perhaps over-
193# all non-interactive mode has been requested (by setting nonInteractive).
194#
195# Returns success if $netInteractive is set and non-NULL.
196#
197f_netinteractive()
198{
199	local value
200	f_getvar $VAR_NETINTERACTIVE value && [ "$value" ]
201}
202
203# f_zfsinteractive
204#
205# Has the user specifically requested the ZFS-portion of configuration and
206# setup to be performed interactively? Returns success if the user has asked
207# for the ZFS configuration to be done interactively even if perhaps overall
208# non-interactive mode has been requested (by setting nonInteractive).
209#
210# Returns success if $zfsInteractive is set and non-NULL.
211#
212f_zfsinteractive()
213{
214	local value
215	f_getvar $VAR_ZFSINTERACTIVE value && [ "$value" ]
216}
217
218############################################################ MAIN
219
220#
221# Variables that can be tweaked from config files
222#
223#              Handle                   Variable Name
224f_variable_new VAR_CONFIG_FILE		configFile
225f_variable_new VAR_DEBUG		debug
226f_variable_new VAR_DEBUG_FILE		debugFile
227f_variable_new VAR_DIRECTORY_PATH	_directoryPath
228f_variable_new VAR_DOMAINNAME		domainname
229f_variable_new VAR_EDITOR		editor
230f_variable_new VAR_EXTRAS		ifconfig_
231f_variable_new VAR_GATEWAY		defaultrouter
232f_variable_new VAR_GROUP		group
233f_variable_new VAR_GROUP_GID		groupGid
234f_variable_new VAR_GROUP_MEMBERS	groupMembers
235f_variable_new VAR_GROUP_PASSWORD	groupPassword
236f_variable_new VAR_HOSTNAME		hostname
237f_variable_new VAR_HTTP_DIR		httpDirectory
238f_variable_new VAR_HTTP_FTP_MODE	httpFtpMode
239f_variable_new VAR_HTTP_HOST		httpHost
240f_variable_new VAR_HTTP_PATH		_httpPath
241f_variable_new VAR_HTTP_PORT		httpPort
242f_variable_new VAR_HTTP_PROXY		httpProxy
243f_variable_new VAR_HTTP_PROXY_HOST	httpProxyHost
244f_variable_new VAR_HTTP_PROXY_PATH	_httpProxyPath
245f_variable_new VAR_HTTP_PROXY_PORT	httpProxyPort
246f_variable_new VAR_IFCONFIG		ifconfig_
247f_variable_new VAR_IPADDR		ipaddr
248f_variable_new VAR_IPV6ADDR		ipv6addr
249f_variable_new VAR_IPV6_ENABLE		ipv6_activate_all_interfaces
250f_variable_new VAR_KEYMAP		keymap
251f_variable_new VAR_MEDIA_TIMEOUT	MEDIA_TIMEOUT
252f_variable_new VAR_MEDIA_TYPE		mediaType
253f_variable_new VAR_NAMESERVER		nameserver
254f_variable_new VAR_NETINTERACTIVE	netInteractive
255f_variable_new VAR_NETMASK		netmask
256f_variable_new VAR_NETWORK_DEVICE	netDev
257f_variable_new VAR_NFS_HOST		nfsHost
258f_variable_new VAR_NFS_PATH		nfsPath
259f_variable_new VAR_NFS_SECURE		nfs_reserved_port_only
260f_variable_new VAR_NFS_TCP		nfs_use_tcp
261f_variable_new VAR_NFS_V3		nfs_use_v3
262f_variable_new VAR_NONINTERACTIVE	nonInteractive
263f_variable_new VAR_NO_CONFIRM		noConfirm
264f_variable_new VAR_NO_ERROR		noError
265f_variable_new VAR_NO_INET6		noInet6
266f_variable_new VAR_PACKAGE		package
267f_variable_new VAR_PKG_TMPDIR		PKG_TMPDIR
268f_variable_new VAR_PORTS_PATH		ports
269f_variable_new VAR_RELNAME		releaseName
270f_variable_new VAR_SLOW_ETHER		slowEthernetCard
271f_variable_new VAR_TRY_DHCP		tryDHCP
272f_variable_new VAR_TRY_RTSOL		tryRTSOL
273f_variable_new VAR_UFS_PATH		ufs
274f_variable_new VAR_USER			user
275f_variable_new VAR_USER_ACCOUNT_EXPIRE	userAccountExpire
276f_variable_new VAR_USER_DOTFILES_CREATE	userDotfilesCreate
277f_variable_new VAR_USER_GECOS		userGecos
278f_variable_new VAR_USER_GID		userGid
279f_variable_new VAR_USER_GROUPS		userGroups
280f_variable_new VAR_USER_GROUP_DELETE	userGroupDelete
281f_variable_new VAR_USER_HOME		userHome
282f_variable_new VAR_USER_HOME_CREATE	userHomeCreate
283f_variable_new VAR_USER_HOME_DELETE	userHomeDelete
284f_variable_new VAR_USER_LOGIN_CLASS	userLoginClass
285f_variable_new VAR_USER_PASSWORD	userPassword
286f_variable_new VAR_USER_PASSWORD_EXPIRE	userPasswordExpire
287f_variable_new VAR_USER_SHELL		userShell
288f_variable_new VAR_USER_UID		userUid
289f_variable_new VAR_ZFSINTERACTIVE	zfsInteractive
290
291#
292# Self-initialize unless requested otherwise
293#
294f_dprintf "%s: VARIABLE_SELF_INITIALIZE=[%s]" \
295          variable.subr "$VARIABLE_SELF_INITIALIZE"
296case "$VARIABLE_SELF_INITIALIZE" in
297""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;;
298*) f_variable_set_defaults
299esac
300
301f_dprintf "%s: Successfully loaded." variable.subr
302
303fi # ! $_VARIABLE_SUBR
304