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