if [ ! "$_VARIABLE_SUBR" ]; then _VARIABLE_SUBR=1 # # Copyright (c) 2012-2014 Devin Teske # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # ############################################################ INCLUDES BSDCFG_SHARE="/usr/share/bsdconfig" . $BSDCFG_SHARE/common.subr || exit 1 f_dprintf "%s: loading includes..." variable.subr f_include $BSDCFG_SHARE/dialog.subr f_include $BSDCFG_SHARE/strings.subr ############################################################ GLOBALS VARIABLES= # # Default behavior is to call f_variable_set_defaults() when loaded. # : ${VARIABLE_SELF_INITIALIZE=1} # # File to write when f_dump_variables() is called. # : ${VARIABLE_DUMPFILE:=/etc/bsdconfig.vars} ############################################################ FUNCTIONS # f_variable_new $handle $variable # # Register a new variable named $variable with the given reference-handle # $handle. The environment variable $handle is set to $variable allowing you to # use the f_getvar() function (from common.subr) with $handle to get the value # of environment variable $variable. For example: # # f_variable_new VAR_ABC abc # # allows the later indirection: # # f_getvar $VAR_ABC # # to return the value of environment variable `abc'. Variables registered in # this manner are recorded in the $VARIABLES environment variable for later # allowing dynamic enumeration of so-called `registered/advertised' variables. # f_variable_new() { local handle="$1" variable="$2" [ "$handle" ] || return $FAILURE f_dprintf "variable.subr: New variable %s -> %s" "$handle" "$variable" setvar $handle $variable VARIABLES="$VARIABLES${VARIABLES:+ }$handle" } # f_variable_get_value $var [ $fmt [ $opts ... ] ] # # Unless nonInteractive is set, prompt the user with a given value (pre-filled # with the value of $var) and give them the chance to change the value. # # Unlike f_getvar() (from common.subr) which can return a variable to the # caller on standard output, this function has no [meaningful] output. # # Returns success unless $var is either NULL or missing. # f_variable_get_value() { local var="$1" cp [ "$var" ] || return $FAILURE if ! { f_getvar $var cp && ! f_interactive; }; then shift 1 # var f_dialog_input cp "$( printf "$@" )" "$cp" && setvar $var "$cp" fi return $SUCCESS } # f_variable_set_defaults # # Installs sensible defaults for registered/advertised variables. # f_variable_set_defaults() { f_dprintf "f_variable_set_defaults: Initializing defaults..." # # Initialize various user-edittable values to their defaults # setvar $VAR_EDITOR "${EDITOR:-/usr/bin/ee}" setvar $VAR_HOSTNAME "$( hostname )" setvar $VAR_MEDIA_TIMEOUT "300" setvar $VAR_NFS_SECURE "NO" setvar $VAR_NFS_TCP "NO" setvar $VAR_NFS_V3 "YES" setvar $VAR_PKG_TMPDIR "/var/tmp" setvar $VAR_RELNAME "$UNAME_R" # # Debugging # if f_debugging; then local var for var in \ $VAR_EDITOR \ $VAR_HOSTNAME \ $VAR_MEDIA_TIMEOUT \ $VAR_NFS_SECURE \ $VAR_NFS_TCP \ $VAR_NFS_V3 \ $VAR_PKG_TMPDIR \ $VAR_RELNAME \ ; do f_quietly f_getvar $var done fi f_dprintf "f_variable_set_defaults: Defaults initialized." } # f_dump_variables # # Dump a list of registered/advertised variables and their respective values to # $VARIABLE_DUMPFILE. Returns success unless the file couldn't be written. If # an error occurs, it is displayed using f_dialog_msgbox() (from dialog.subr). # f_dump_variables() { local err if ! err=$( ( for handle in $VARIABLES; do f_getvar $handle var || continue f_getvar $var value || continue f_shell_escape "$value" value printf "%s='%s'\n" "$var" "$value" done > "$VARIABLE_DUMPFILE" ) 2>&1 ); then f_dialog_msgbox "$err" return $FAILURE fi } # f_debugging # # Are we in debug mode? Returns success if extra DEBUG information has been # requested (by setting $debug to non-NULL), otherwise false. # f_debugging() { local value f_getvar $VAR_DEBUG value && [ "$value" ] } # f_interactive # # Are we running interactively? Return error if $nonInteractive is set and non- # NULL, otherwise return success. # f_interactive() { local value ! f_getvar $VAR_NONINTERACTIVE value || [ ! "$value" ] } # f_netinteractive # # Has the user specifically requested the network-portion of configuration and # setup to be performed interactively? Returns success if the user has asked # for the network configuration to be done interactively even if perhaps over- # all non-interactive mode has been requested (by setting nonInteractive). # # Returns success if $netInteractive is set and non-NULL. # f_netinteractive() { local value f_getvar $VAR_NETINTERACTIVE value && [ "$value" ] } # f_zfsinteractive # # Has the user specifically requested the ZFS-portion of configuration and # setup to be performed interactively? Returns success if the user has asked # for the ZFS configuration to be done interactively even if perhaps overall # non-interactive mode has been requested (by setting nonInteractive). # # Returns success if $zfsInteractive is set and non-NULL. # f_zfsinteractive() { local value f_getvar $VAR_ZFSINTERACTIVE value && [ "$value" ] } ############################################################ MAIN # # Variables that can be tweaked from config files # # Handle Variable Name f_variable_new VAR_CONFIG_FILE configFile f_variable_new VAR_DEBUG debug f_variable_new VAR_DEBUG_FILE debugFile f_variable_new VAR_DIRECTORY_PATH _directoryPath f_variable_new VAR_DOMAINNAME domainname f_variable_new VAR_EDITOR editor f_variable_new VAR_EXTRAS ifconfig_ f_variable_new VAR_GATEWAY defaultrouter f_variable_new VAR_GROUP group f_variable_new VAR_GROUP_GID groupGid f_variable_new VAR_GROUP_MEMBERS groupMembers f_variable_new VAR_GROUP_PASSWORD groupPassword f_variable_new VAR_HOSTNAME hostname f_variable_new VAR_HTTP_DIR httpDirectory f_variable_new VAR_HTTP_FTP_MODE httpFtpMode f_variable_new VAR_HTTP_HOST httpHost f_variable_new VAR_HTTP_PATH _httpPath f_variable_new VAR_HTTP_PORT httpPort f_variable_new VAR_HTTP_PROXY httpProxy f_variable_new VAR_HTTP_PROXY_HOST httpProxyHost f_variable_new VAR_HTTP_PROXY_PATH _httpProxyPath f_variable_new VAR_HTTP_PROXY_PORT httpProxyPort f_variable_new VAR_IFCONFIG ifconfig_ f_variable_new VAR_IPADDR ipaddr f_variable_new VAR_IPV6ADDR ipv6addr f_variable_new VAR_IPV6_ENABLE ipv6_activate_all_interfaces f_variable_new VAR_KEYMAP keymap f_variable_new VAR_MEDIA_TIMEOUT MEDIA_TIMEOUT f_variable_new VAR_MEDIA_TYPE mediaType f_variable_new VAR_NAMESERVER nameserver f_variable_new VAR_NETINTERACTIVE netInteractive f_variable_new VAR_NETMASK netmask f_variable_new VAR_NETWORK_DEVICE netDev f_variable_new VAR_NFS_HOST nfsHost f_variable_new VAR_NFS_PATH nfsPath f_variable_new VAR_NFS_SECURE nfs_reserved_port_only f_variable_new VAR_NFS_TCP nfs_use_tcp f_variable_new VAR_NFS_V3 nfs_use_v3 f_variable_new VAR_NONINTERACTIVE nonInteractive f_variable_new VAR_NO_CONFIRM noConfirm f_variable_new VAR_NO_ERROR noError f_variable_new VAR_NO_INET6 noInet6 f_variable_new VAR_PACKAGE package f_variable_new VAR_PKG_TMPDIR PKG_TMPDIR f_variable_new VAR_PORTS_PATH ports f_variable_new VAR_RELNAME releaseName f_variable_new VAR_SLOW_ETHER slowEthernetCard f_variable_new VAR_TRY_DHCP tryDHCP f_variable_new VAR_TRY_RTSOL tryRTSOL f_variable_new VAR_UFS_PATH ufs f_variable_new VAR_USER user f_variable_new VAR_USER_ACCOUNT_EXPIRE userAccountExpire f_variable_new VAR_USER_DOTFILES_CREATE userDotfilesCreate f_variable_new VAR_USER_GECOS userGecos f_variable_new VAR_USER_GID userGid f_variable_new VAR_USER_GROUPS userGroups f_variable_new VAR_USER_GROUP_DELETE userGroupDelete f_variable_new VAR_USER_HOME userHome f_variable_new VAR_USER_HOME_CREATE userHomeCreate f_variable_new VAR_USER_HOME_DELETE userHomeDelete f_variable_new VAR_USER_LOGIN_CLASS userLoginClass f_variable_new VAR_USER_PASSWORD userPassword f_variable_new VAR_USER_PASSWORD_EXPIRE userPasswordExpire f_variable_new VAR_USER_SHELL userShell f_variable_new VAR_USER_UID userUid f_variable_new VAR_ZFSINTERACTIVE zfsInteractive # # Self-initialize unless requested otherwise # f_dprintf "%s: VARIABLE_SELF_INITIALIZE=[%s]" \ variable.subr "$VARIABLE_SELF_INITIALIZE" case "$VARIABLE_SELF_INITIALIZE" in ""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;; *) f_variable_set_defaults esac f_dprintf "%s: Successfully loaded." variable.subr fi # ! $_VARIABLE_SUBR