xref: /freebsd/usr.sbin/bsdconfig/share/variable.subr (revision f687c95d86df6433eb46f6aa6aac545bceaacf44)
1if [ ! "$_VARIABLE_SUBR" ]; then _VARIABLE_SUBR=1
2#
3# Copyright (c) 2012-2013 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 (INLUDING, 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# $FreeBSD$
28#
29############################################################ INCLUDES
30
31BSDCFG_SHARE="/usr/share/bsdconfig"
32. $BSDCFG_SHARE/common.subr || exit 1
33f_dprintf "%s: loading includes..." variable.subr
34f_include $BSDCFG_SHARE/dialog.subr
35f_include $BSDCFG_SHARE/strings.subr
36
37############################################################ GLOBALS
38
39VARIABLES=
40
41#
42# Default behavior is to call f_variable_set_defaults() when loaded.
43#
44: ${VARIABLE_SELF_INITIALIZE=1}
45
46#
47# File to write when f_dump_variables() is called.
48#
49: ${VARIABLE_DUMPFILE:=/etc/bsdconfig.vars}
50
51############################################################ FUNCTIONS
52
53# f_variable_new $handle $variable
54#
55# Register a new variable named $variable with the given reference-handle
56# $handle. The environment variable $handle is set to $variable allowing you to
57# use the f_getvar() function (from common.subr) with $handle to get the value
58# of environment variable $variable. For example:
59#
60# 	f_variable_new VAR_ABC abc
61#
62# allows the later indirection:
63#
64# 	f_getvar $VAR_ABC
65#
66# to return the value of environment variable `abc'. Variables registered in
67# this manner are recorded in the $VARIABLES environment variable for later
68# allowing dynamic enumeration of so-called `registered/advertised' variables.
69#
70f_variable_new()
71{
72	local handle="$1" variable="$2"
73	[ "$handle" ] || return $FAILURE
74	f_dprintf "variable.subr: New variable %s -> %s" "$handle" "$variable"
75	setvar $handle $variable
76	VARIABLES="$VARIABLES${VARIABLES:+ }$handle"
77}
78
79# f_variable_get_value $var [ $fmt [ $opts ... ] ]
80#
81# Unless nonInteractive is set, prompt the user with a given value (pre-filled
82# with the value of $var) and give them the chance to change the value.
83#
84# Unlike f_getvar() (from common.subr) which can return a variable to the
85# caller on standard output, this function has no [meaningful] output.
86#
87# Returns success unless $var is either NULL or missing.
88#
89f_variable_get_value()
90{
91	local var="$1" cp
92
93	[ "$var" ] || return $FAILURE
94
95	if ! { f_getvar $var cp && ! f_interactive; }; then
96		shift 1 # var
97		f_dialog_input cp "$( printf "$@" )" "$cp" && setvar $var "$cp"
98	fi
99
100	return $SUCCESS
101}
102
103# f_variable_set_defaults
104#
105# Installs sensible defaults for registered/advertised variables.
106#
107f_variable_set_defaults()
108{
109	f_dprintf "f_variable_set_defaults: Initializing defaults..."
110
111	#
112	# Initialize various user-edittable values to their defaults
113	#
114	setvar $VAR_EDITOR		"${EDITOR:-/usr/bin/ee}"
115	setvar $VAR_FTP_STATE		"auto"
116	setvar $VAR_FTP_USER		"ftp"
117	setvar $VAR_HOSTNAME		"$( hostname )"
118	setvar $VAR_MEDIA_TIMEOUT	"300"
119	setvar $VAR_NFS_SECURE		"NO"
120	setvar $VAR_NFS_TCP		"NO"
121	setvar $VAR_NFS_V3		"YES"
122	setvar $VAR_PKG_TMPDIR		"/var/tmp"
123	setvar $VAR_RELNAME		"$UNAME_R"
124
125	#
126	# Debugging
127	#
128	if f_debugging; then
129		local var
130		for var in \
131			$VAR_EDITOR		\
132			$VAR_FTP_STATE		\
133			$VAR_FTP_USER		\
134			$VAR_HOSTNAME		\
135			$VAR_MEDIA_TIMEOUT	\
136			$VAR_NFS_SECURE		\
137			$VAR_NFS_TCP		\
138			$VAR_NFS_V3		\
139			$VAR_PKG_TMPDIR		\
140			$VAR_RELNAME		\
141		; do
142			f_quietly f_getvar $var
143		done
144	fi
145
146	f_dprintf "f_variable_set_defaults: Defaults initialized."
147}
148
149# f_dump_variables
150#
151# Dump a list of registered/advertised variables and their respective values to
152# $VARIABLE_DUMPFILE. Returns success unless the file couldn't be written. If
153# an error occurs, it is displayed using f_dialog_msgbox() (from dialog.subr).
154#
155f_dump_variables()
156{
157	local err
158	if ! err=$(
159		( for handle in $VARIABLES; do
160			f_getvar $handle var || continue
161			f_getvar $var value || continue
162			f_shell_escape "$value" value
163			printf "%s='%s'\n" "$var" "$value"
164		  done > "$VARIABLE_DUMPFILE" ) 2>&1
165	); then
166		f_dialog_msgbox "$err"
167		return $FAILURE
168	fi
169}
170
171# f_debugging
172#
173# Are we in debug mode? Returns success if extra DEBUG information has been
174# requested (by setting $debug to non-NULL), otherwise false.
175#
176f_debugging()
177{
178	local value
179	f_getvar $VAR_DEBUG value && [ "$value" ]
180}
181
182# f_interactive()
183#
184# Are we running interactively? Return error if $nonInteractive is set and non-
185# NULL, otherwise return success.
186#
187f_interactive()
188{
189	local value
190	! f_getvar $VAR_NONINTERACTIVE value || [ ! "$value" ]
191}
192
193# f_netinteractive()
194#
195# Has the user specifically requested the network-portion of configuration and
196# setup to be performed interactively? Returns success if the user has asked
197# for the network configuration to be done interactively even if perhaps over-
198# all non-interactive mode has been requested (by setting nonInteractive).
199#
200# Returns success if $netInteractive is set and non-NULL.
201#
202f_netinteractive()
203{
204	local value
205	f_getvar $VAR_NETINTERACTIVE value && [ "$value" ]
206}
207
208############################################################ MAIN
209
210#
211# Variables that can be tweaked from config files
212#
213#              Handle                   Variable Name
214f_variable_new VAR_CONFIG_FILE		configFile
215f_variable_new VAR_DEBUG		debug
216f_variable_new VAR_DEBUG_FILE		debugFile
217f_variable_new VAR_DIRECTORY_PATH	_directoryPath
218f_variable_new VAR_DOMAINNAME		domainname
219f_variable_new VAR_EDITOR		editor
220f_variable_new VAR_EXTRAS		ifconfig_
221f_variable_new VAR_FTP_DIR		ftpDirectory
222f_variable_new VAR_FTP_HOST		ftpHost
223f_variable_new VAR_FTP_PASS		ftpPass
224f_variable_new VAR_FTP_PATH		_ftpPath
225f_variable_new VAR_FTP_PORT		ftpPort
226f_variable_new VAR_FTP_STATE		ftpState
227f_variable_new VAR_FTP_USER		ftpUser
228f_variable_new VAR_GATEWAY		defaultrouter
229f_variable_new VAR_HOSTNAME		hostname
230f_variable_new VAR_HTTP_DIR		httpDirectory
231f_variable_new VAR_HTTP_FTP_MODE	httpFtpMode
232f_variable_new VAR_HTTP_HOST		httpHost
233f_variable_new VAR_HTTP_PATH		_httpPath
234f_variable_new VAR_HTTP_PORT		httpPort
235f_variable_new VAR_HTTP_PROXY		httpProxy
236f_variable_new VAR_HTTP_PROXY_HOST	httpProxyHost
237f_variable_new VAR_HTTP_PROXY_PATH	_httpProxyPath
238f_variable_new VAR_HTTP_PROXY_PORT	httpProxyPort
239f_variable_new VAR_IFCONFIG		ifconfig_
240f_variable_new VAR_IPADDR		ipaddr
241f_variable_new VAR_IPV6ADDR		ipv6addr
242f_variable_new VAR_IPV6_ENABLE		ipv6_activate_all_interfaces
243f_variable_new VAR_MEDIA_TIMEOUT	MEDIA_TIMEOUT
244f_variable_new VAR_MEDIA_TYPE		mediaType
245f_variable_new VAR_NAMESERVER		nameserver
246f_variable_new VAR_NETINTERACTIVE	netInteractive
247f_variable_new VAR_NETMASK		netmask
248f_variable_new VAR_NETWORK_DEVICE	netDev
249f_variable_new VAR_NFS_HOST		nfsHost
250f_variable_new VAR_NFS_PATH		nfsPath
251f_variable_new VAR_NFS_SECURE		nfs_reserved_port_only
252f_variable_new VAR_NFS_TCP		nfs_use_tcp
253f_variable_new VAR_NFS_V3		nfs_use_v3
254f_variable_new VAR_NONINTERACTIVE	nonInteractive
255f_variable_new VAR_NO_CONFIRM		noConfirm
256f_variable_new VAR_NO_ERROR		noError
257f_variable_new VAR_NO_INET6		noInet6
258f_variable_new VAR_PACKAGE		package
259f_variable_new VAR_PKG_TMPDIR		PKG_TMPDIR
260f_variable_new VAR_PORTS_PATH		ports
261f_variable_new VAR_RELNAME		releaseName
262f_variable_new VAR_SLOW_ETHER		slowEthernetCard
263f_variable_new VAR_TRY_DHCP		tryDHCP
264f_variable_new VAR_TRY_RTSOL		tryRTSOL
265f_variable_new VAR_UFS_PATH		ufs
266
267#
268# Self-initialize unless requested otherwise
269#
270f_dprintf "%s: VARIABLE_SELF_INITIALIZE=[%s]" \
271          variable.subr "$VARIABLE_SELF_INITIALIZE"
272case "$VARIABLE_SELF_INITIALIZE" in
273""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;;
274*) f_variable_set_defaults
275esac
276
277f_dprintf "%s: Successfully loaded." variable.subr
278
279fi # ! $_VARIABLE_SUBR
280