variable.subr revision 260675
150276Speterif [ ! "$_VARIABLE_SUBR" ]; then _VARIABLE_SUBR=1
297049Speter#
350276Speter# Copyright (c) 2012-2013 Devin Teske
450276Speter# All rights reserved.
550276Speter#
650276Speter# Redistribution and use in source and binary forms, with or without
750276Speter# modification, are permitted provided that the following conditions
850276Speter# are met:
950276Speter# 1. Redistributions of source code must retain the above copyright
1050276Speter#    notice, this list of conditions and the following disclaimer.
1150276Speter# 2. Redistributions in binary form must reproduce the above copyright
1250276Speter#    notice, this list of conditions and the following disclaimer in the
1350276Speter#    documentation and/or other materials provided with the distribution.
1450276Speter#
1550276Speter# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1650276Speter# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1750276Speter# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1850276Speter# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1950276Speter# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2050276Speter# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2150276Speter# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2250276Speter# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2350276Speter# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2450276Speter# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2550276Speter# SUCH DAMAGE.
2650276Speter#
2750276Speter# $FreeBSD: stable/10/usr.sbin/bsdconfig/share/variable.subr 260675 2014-01-15 07:36:34Z dteske $
2850276Speter#
2950276Speter############################################################ INCLUDES
3050276Speter
3150276SpeterBSDCFG_SHARE="/usr/share/bsdconfig"
3250276Speter. $BSDCFG_SHARE/common.subr || exit 1
3350276Speterf_dprintf "%s: loading includes..." variable.subr
3450276Speterf_include $BSDCFG_SHARE/dialog.subr
3598503Speterf_include $BSDCFG_SHARE/strings.subr
3650276Speter
3750276Speter############################################################ GLOBALS
3850276Speter
3950276SpeterVARIABLES=
4050276Speter
4150276Speter#
4250276Speter# Default behavior is to call f_variable_set_defaults() when loaded.
4350276Speter#
4450276Speter: ${VARIABLE_SELF_INITIALIZE=1}
4550276Speter
4650276Speter#
4750276Speter# File to write when f_dump_variables() is called.
4850276Speter#
4950276Speter: ${VARIABLE_DUMPFILE:=/etc/bsdconfig.vars}
5050276Speter
5150276Speter############################################################ FUNCTIONS
5250276Speter
5350276Speter# f_variable_new $handle $variable
5450276Speter#
5550276Speter# Register a new variable named $variable with the given reference-handle
5650276Speter# $handle. The environment variable $handle is set to $variable allowing you to
5750276Speter# use the f_getvar() function (from common.subr) with $handle to get the value
5850276Speter# of environment variable $variable. For example:
5950276Speter#
6050276Speter# 	f_variable_new VAR_ABC abc
6150276Speter#
6250276Speter# allows the later indirection:
6350276Speter#
6450276Speter# 	f_getvar $VAR_ABC
6550276Speter#
6650276Speter# to return the value of environment variable `abc'. Variables registered in
6750276Speter# this manner are recorded in the $VARIABLES environment variable for later
6850276Speter# allowing dynamic enumeration of so-called `registered/advertised' variables.
6950276Speter#
7050276Speterf_variable_new()
7150276Speter{
7250276Speter	local handle="$1" variable="$2"
7350276Speter	[ "$handle" ] || return $FAILURE
7450276Speter	f_dprintf "variable.subr: New variable %s -> %s" "$handle" "$variable"
7550276Speter	setvar $handle $variable
7650276Speter	VARIABLES="$VARIABLES${VARIABLES:+ }$handle"
7750276Speter}
7850276Speter
7950276Speter# f_variable_get_value $var [ $fmt [ $opts ... ] ]
8050276Speter#
8150276Speter# Unless nonInteractive is set, prompt the user with a given value (pre-filled
8250276Speter# with the value of $var) and give them the chance to change the value.
8350276Speter#
8450276Speter# Unlike f_getvar() (from common.subr) which can return a variable to the
8550276Speter# caller on standard output, this function has no [meaningful] output.
8650276Speter#
8750276Speter# Returns success unless $var is either NULL or missing.
8850276Speter#
8950276Speterf_variable_get_value()
9050276Speter{
9150276Speter	local var="$1" cp
9250276Speter
9350276Speter	[ "$var" ] || return $FAILURE
9450276Speter
9550276Speter	if ! { f_getvar $var cp && ! f_interactive; }; then
9650276Speter		shift 1 # var
9750276Speter		f_dialog_input cp "$( printf "$@" )" "$cp" && setvar $var "$cp"
9850276Speter	fi
9950276Speter
10062449Speter	return $SUCCESS
10162449Speter}
10262449Speter
10362449Speter# f_variable_set_defaults
10462449Speter#
10562449Speter# Installs sensible defaults for registered/advertised variables.
10662449Speter#
10762449Speterf_variable_set_defaults()
10862449Speter{
10962449Speter	f_dprintf "f_variable_set_defaults: Initializing defaults..."
11062449Speter
11162449Speter	#
11262449Speter	# Initialize various user-edittable values to their defaults
11350276Speter	#
11462449Speter	setvar $VAR_EDITOR		"${EDITOR:-/usr/bin/ee}"
11550276Speter	setvar $VAR_FTP_STATE		"auto"
11650276Speter	setvar $VAR_FTP_USER		"ftp"
11750276Speter	setvar $VAR_HOSTNAME		"$( hostname )"
11850276Speter	setvar $VAR_MEDIA_TIMEOUT	"300"
11976726Speter	setvar $VAR_NFS_SECURE		"NO"
12076726Speter	setvar $VAR_NFS_TCP		"NO"
12176726Speter	setvar $VAR_NFS_V3		"YES"
12298503Speter	setvar $VAR_PKG_TMPDIR		"/var/tmp"
12350276Speter	setvar $VAR_RELNAME		"$UNAME_R"
12450276Speter
12550276Speter	#
12650276Speter	# Debugging
12750276Speter	#
12850276Speter	if f_debugging; then
12950276Speter		local var
13050276Speter		for var in \
13150276Speter			$VAR_EDITOR		\
13250276Speter			$VAR_FTP_STATE		\
13350276Speter			$VAR_FTP_USER		\
13450276Speter			$VAR_HOSTNAME		\
13550276Speter			$VAR_MEDIA_TIMEOUT	\
13650276Speter			$VAR_NFS_SECURE		\
13750276Speter			$VAR_NFS_TCP		\
13850276Speter			$VAR_NFS_V3		\
13950276Speter			$VAR_PKG_TMPDIR		\
14050276Speter			$VAR_RELNAME		\
14150276Speter		; do
14250276Speter			f_quietly f_getvar $var
14350276Speter		done
14450276Speter	fi
14550276Speter
14650276Speter	f_dprintf "f_variable_set_defaults: Defaults initialized."
14750276Speter}
14850276Speter
14950276Speter# f_dump_variables
15050276Speter#
15150276Speter# Dump a list of registered/advertised variables and their respective values to
15250276Speter# $VARIABLE_DUMPFILE. Returns success unless the file couldn't be written. If
15376726Speter# an error occurs, it is displayed using f_dialog_msgbox() (from dialog.subr).
15450276Speter#
15550276Speterf_dump_variables()
15650276Speter{
15750276Speter	local err
15850276Speter	if ! err=$(
15950276Speter		( for handle in $VARIABLES; do
16050276Speter			f_getvar $handle var || continue
16150276Speter			f_getvar $var value || continue
16250276Speter			f_shell_escape "$value" value
16376726Speter			printf "%s='%s'\n" "$var" "$value"
16450276Speter		  done > "$VARIABLE_DUMPFILE" ) 2>&1
16550276Speter	); then
16650276Speter		f_dialog_msgbox "$err"
16750276Speter		return $FAILURE
16850276Speter	fi
16950276Speter}
17050276Speter
17150276Speter# f_debugging
17250276Speter#
17350276Speter# Are we in debug mode? Returns success if extra DEBUG information has been
17462449Speter# requested (by setting $debug to non-NULL), otherwise false.
17556639Speter#
17656639Speterf_debugging()
17776726Speter{
17856639Speter	local value
17956639Speter	f_getvar $VAR_DEBUG value && [ "$value" ]
18056639Speter}
18176726Speter
18250276Speter# f_interactive
18356639Speter#
18456639Speter# Are we running interactively? Return error if $nonInteractive is set and non-
18550276Speter# NULL, otherwise return success.
18650276Speter#
18750276Speterf_interactive()
18850276Speter{
18950276Speter	local value
19050276Speter	! f_getvar $VAR_NONINTERACTIVE value || [ ! "$value" ]
19150276Speter}
19250276Speter
19350276Speter# f_netinteractive
19450276Speter#
19550276Speter# Has the user specifically requested the network-portion of configuration and
19650276Speter# setup to be performed interactively? Returns success if the user has asked
19750276Speter# for the network configuration to be done interactively even if perhaps over-
19850276Speter# all non-interactive mode has been requested (by setting nonInteractive).
19950276Speter#
20050276Speter# Returns success if $netInteractive is set and non-NULL.
20150276Speter#
20250276Speterf_netinteractive()
20350276Speter{
20450276Speter	local value
20550276Speter	f_getvar $VAR_NETINTERACTIVE value && [ "$value" ]
20676726Speter}
20750276Speter
20876726Speter# f_zfsinteractive
20976726Speter#
21050276Speter# Has the user specifically requested the ZFS-portion of configuration and
21176726Speter# setup to be performed interactively? Returns success if the user has asked
21276726Speter# for the ZFS configuration to be done interactively even if perhaps overall
21350276Speter# non-interactive mode has been requested (by setting nonInteractive).
21476726Speter#
21576726Speter# Returns success if $zfsInteractive is set and non-NULL.
21676726Speter#
21750276Speterf_zfsinteractive()
21850276Speter{
21950276Speter	local value
22097049Speter	f_getvar $VAR_ZFSINTERACTIVE value && [ "$value" ]
22197049Speter}
22250276Speter
22350276Speter############################################################ MAIN
22450276Speter
22597049Speter#
22697049Speter# Variables that can be tweaked from config files
22797049Speter#
22850276Speter#              Handle                   Variable Name
22997049Speterf_variable_new VAR_CONFIG_FILE		configFile
23050276Speterf_variable_new VAR_DEBUG		debug
23150276Speterf_variable_new VAR_DEBUG_FILE		debugFile
23250276Speterf_variable_new VAR_DIRECTORY_PATH	_directoryPath
23350276Speterf_variable_new VAR_DOMAINNAME		domainname
23450276Speterf_variable_new VAR_EDITOR		editor
23550276Speterf_variable_new VAR_EXTRAS		ifconfig_
23650276Speterf_variable_new VAR_FTP_DIR		ftpDirectory
23750276Speterf_variable_new VAR_FTP_HOST		ftpHost
23850276Speterf_variable_new VAR_FTP_PASS		ftpPass
23950276Speterf_variable_new VAR_FTP_PATH		_ftpPath
24050276Speterf_variable_new VAR_FTP_PORT		ftpPort
24150276Speterf_variable_new VAR_FTP_STATE		ftpState
24250276Speterf_variable_new VAR_FTP_USER		ftpUser
24366963Speterf_variable_new VAR_GATEWAY		defaultrouter
24476726Speterf_variable_new VAR_HOSTNAME		hostname
24597049Speterf_variable_new VAR_HTTP_DIR		httpDirectory
24666963Speterf_variable_new VAR_HTTP_FTP_MODE	httpFtpMode
24750276Speterf_variable_new VAR_HTTP_HOST		httpHost
24876726Speterf_variable_new VAR_HTTP_PATH		_httpPath
24976726Speterf_variable_new VAR_HTTP_PORT		httpPort
25076726Speterf_variable_new VAR_HTTP_PROXY		httpProxy
25176726Speterf_variable_new VAR_HTTP_PROXY_HOST	httpProxyHost
25250276Speterf_variable_new VAR_HTTP_PROXY_PATH	_httpProxyPath
25350276Speterf_variable_new VAR_HTTP_PROXY_PORT	httpProxyPort
25476726Speterf_variable_new VAR_IFCONFIG		ifconfig_
25576726Speterf_variable_new VAR_IPADDR		ipaddr
25676726Speterf_variable_new VAR_IPV6ADDR		ipv6addr
25776726Speterf_variable_new VAR_IPV6_ENABLE		ipv6_activate_all_interfaces
25876726Speterf_variable_new VAR_KEYMAP		keymap
25976726Speterf_variable_new VAR_MEDIA_TIMEOUT	MEDIA_TIMEOUT
26076726Speterf_variable_new VAR_MEDIA_TYPE		mediaType
26176726Speterf_variable_new VAR_NAMESERVER		nameserver
26276726Speterf_variable_new VAR_NETINTERACTIVE	netInteractive
26376726Speterf_variable_new VAR_NETMASK		netmask
26476726Speterf_variable_new VAR_NETWORK_DEVICE	netDev
26550276Speterf_variable_new VAR_NFS_HOST		nfsHost
26650276Speterf_variable_new VAR_NFS_PATH		nfsPath
26750276Speterf_variable_new VAR_NFS_SECURE		nfs_reserved_port_only
26850276Speterf_variable_new VAR_NFS_TCP		nfs_use_tcp
26976726Speterf_variable_new VAR_NFS_V3		nfs_use_v3
27076726Speterf_variable_new VAR_NONINTERACTIVE	nonInteractive
27176726Speterf_variable_new VAR_NO_CONFIRM		noConfirm
27276726Speterf_variable_new VAR_NO_ERROR		noError
27376726Speterf_variable_new VAR_NO_INET6		noInet6
27476726Speterf_variable_new VAR_PACKAGE		package
27576726Speterf_variable_new VAR_PKG_TMPDIR		PKG_TMPDIR
27650276Speterf_variable_new VAR_PORTS_PATH		ports
27750276Speterf_variable_new VAR_RELNAME		releaseName
27876726Speterf_variable_new VAR_SLOW_ETHER		slowEthernetCard
27950276Speterf_variable_new VAR_TRY_DHCP		tryDHCP
28050276Speterf_variable_new VAR_TRY_RTSOL		tryRTSOL
28176726Speterf_variable_new VAR_UFS_PATH		ufs
28250276Speterf_variable_new VAR_ZFSINTERACTIVE	zfsInteractive
28350276Speter
28476726Speter#
28576726Speter# Self-initialize unless requested otherwise
28650276Speter#
28750276Speterf_dprintf "%s: VARIABLE_SELF_INITIALIZE=[%s]" \
28876726Speter          variable.subr "$VARIABLE_SELF_INITIALIZE"
28950276Spetercase "$VARIABLE_SELF_INITIALIZE" in
29050276Speter""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;;
29176726Speter*) f_variable_set_defaults
29250276Speteresac
29350276Speter
29476726Speterf_dprintf "%s: Successfully loaded." variable.subr
29550276Speter
29650276Speterfi # ! $_VARIABLE_SUBR
29776726Speter