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