Deleted Added
full compact
variable.subr (251613) variable.subr (252112)
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#
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: head/usr.sbin/bsdconfig/share/variable.subr 251613 2013-06-11 03:37:29Z dteske $
27# $FreeBSD: head/usr.sbin/bsdconfig/share/variable.subr 252112 2013-06-23 10:48:26Z dteske $
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 #
110 # Initialize various user-edittable values to their defaults
111 #
112 setvar $VAR_EDITOR "${EDITOR:-/usr/bin/ee}"
113 setvar $VAR_FTP_STATE "auto"
114 setvar $VAR_FTP_USER "ftp"
115 setvar $VAR_HOSTNAME "$( hostname )"
116 setvar $VAR_MEDIA_TIMEOUT "300"
117 setvar $VAR_NFS_SECURE "NO"
118 setvar $VAR_NFS_TCP "NO"
119 setvar $VAR_NFS_V3 "YES"
120 setvar $VAR_PKG_TMPDIR "/var/tmp"
121 setvar $VAR_RELNAME "$UNAME_R"
122
123 f_dprintf "f_variable_set_defaults: Defaults initialized."
124}
125
126# f_dump_variables
127#
128# Dump a list of registered/advertised variables and their respective values to
129# $VARIABLE_DUMPFILE. Returns success unless the file couldn't be written. If
130# an error occurs, it is displayed using f_dialog_msgbox() (from dialog.subr).
131#
132f_dump_variables()
133{
134 local err
135 if ! err=$(
136 ( for handle in $VARIABLES; do
137 f_getvar $handle var || continue
138 f_getvar $var value || continue
139 f_shell_escape "$value" value
140 printf "%s='%s'\n" "$var" "$value"
141 done > "$VARIABLE_DUMPFILE" ) 2>&1
142 ); then
143 f_dialog_msgbox "$err"
144 return $FAILURE
145 fi
146}
147
148# f_debugging
149#
150# Are we in debug mode? Returns success if extra DEBUG information has been
151# requested (by setting $debug to non-NULL), otherwise false.
152#
153f_debugging()
154{
155 local value
156 f_getvar $VAR_DEBUG value && [ "$value" ]
157}
158
159# f_interactive()
160#
161# Are we running interactively? Return error if $nonInteractive is set and non-
162# NULL, otherwise return success.
163#
164f_interactive()
165{
166 local value
167 ! f_getvar $VAR_NONINTERACTIVE value || [ ! "$value" ]
168}
169
170# f_netinteractive()
171#
172# Has the user specifically requested the network-portion of configuration and
173# setup to be performed interactively? Returns success if the user has asked
174# for the network configuration to be done interactively even if perhaps over-
175# all non-interactive mode has been requested (by setting nonInteractive).
176#
177# Returns success if $netInteractive is set and non-NULL.
178#
179f_netinteractive()
180{
181 local value
182 f_getvar $VAR_NETINTERACTIVE value && [ "$value" ]
183}
184
185############################################################ MAIN
186
187#
188# Variables that can be tweaked from config files
189#
190# Handle Variable Name
191f_variable_new VAR_CONFIG_FILE configFile
192f_variable_new VAR_DEBUG debug
193f_variable_new VAR_DEBUG_FILE debugFile
194f_variable_new VAR_DIRECTORY_PATH _directoryPath
195f_variable_new VAR_DOMAINNAME domainname
196f_variable_new VAR_EDITOR editor
197f_variable_new VAR_EXTRAS ifconfig_
198f_variable_new VAR_FTP_DIR ftpDirectory
199f_variable_new VAR_FTP_HOST ftpHost
200f_variable_new VAR_FTP_PASS ftpPass
201f_variable_new VAR_FTP_PATH _ftpPath
202f_variable_new VAR_FTP_PORT ftpPort
203f_variable_new VAR_FTP_STATE ftpState
204f_variable_new VAR_FTP_USER ftpUser
205f_variable_new VAR_GATEWAY defaultrouter
206f_variable_new VAR_HOSTNAME hostname
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 #
110 # Initialize various user-edittable values to their defaults
111 #
112 setvar $VAR_EDITOR "${EDITOR:-/usr/bin/ee}"
113 setvar $VAR_FTP_STATE "auto"
114 setvar $VAR_FTP_USER "ftp"
115 setvar $VAR_HOSTNAME "$( hostname )"
116 setvar $VAR_MEDIA_TIMEOUT "300"
117 setvar $VAR_NFS_SECURE "NO"
118 setvar $VAR_NFS_TCP "NO"
119 setvar $VAR_NFS_V3 "YES"
120 setvar $VAR_PKG_TMPDIR "/var/tmp"
121 setvar $VAR_RELNAME "$UNAME_R"
122
123 f_dprintf "f_variable_set_defaults: Defaults initialized."
124}
125
126# f_dump_variables
127#
128# Dump a list of registered/advertised variables and their respective values to
129# $VARIABLE_DUMPFILE. Returns success unless the file couldn't be written. If
130# an error occurs, it is displayed using f_dialog_msgbox() (from dialog.subr).
131#
132f_dump_variables()
133{
134 local err
135 if ! err=$(
136 ( for handle in $VARIABLES; do
137 f_getvar $handle var || continue
138 f_getvar $var value || continue
139 f_shell_escape "$value" value
140 printf "%s='%s'\n" "$var" "$value"
141 done > "$VARIABLE_DUMPFILE" ) 2>&1
142 ); then
143 f_dialog_msgbox "$err"
144 return $FAILURE
145 fi
146}
147
148# f_debugging
149#
150# Are we in debug mode? Returns success if extra DEBUG information has been
151# requested (by setting $debug to non-NULL), otherwise false.
152#
153f_debugging()
154{
155 local value
156 f_getvar $VAR_DEBUG value && [ "$value" ]
157}
158
159# f_interactive()
160#
161# Are we running interactively? Return error if $nonInteractive is set and non-
162# NULL, otherwise return success.
163#
164f_interactive()
165{
166 local value
167 ! f_getvar $VAR_NONINTERACTIVE value || [ ! "$value" ]
168}
169
170# f_netinteractive()
171#
172# Has the user specifically requested the network-portion of configuration and
173# setup to be performed interactively? Returns success if the user has asked
174# for the network configuration to be done interactively even if perhaps over-
175# all non-interactive mode has been requested (by setting nonInteractive).
176#
177# Returns success if $netInteractive is set and non-NULL.
178#
179f_netinteractive()
180{
181 local value
182 f_getvar $VAR_NETINTERACTIVE value && [ "$value" ]
183}
184
185############################################################ MAIN
186
187#
188# Variables that can be tweaked from config files
189#
190# Handle Variable Name
191f_variable_new VAR_CONFIG_FILE configFile
192f_variable_new VAR_DEBUG debug
193f_variable_new VAR_DEBUG_FILE debugFile
194f_variable_new VAR_DIRECTORY_PATH _directoryPath
195f_variable_new VAR_DOMAINNAME domainname
196f_variable_new VAR_EDITOR editor
197f_variable_new VAR_EXTRAS ifconfig_
198f_variable_new VAR_FTP_DIR ftpDirectory
199f_variable_new VAR_FTP_HOST ftpHost
200f_variable_new VAR_FTP_PASS ftpPass
201f_variable_new VAR_FTP_PATH _ftpPath
202f_variable_new VAR_FTP_PORT ftpPort
203f_variable_new VAR_FTP_STATE ftpState
204f_variable_new VAR_FTP_USER ftpUser
205f_variable_new VAR_GATEWAY defaultrouter
206f_variable_new VAR_HOSTNAME hostname
207f_variable_new VAR_HTTP_DIR httpDirectory
207f_variable_new VAR_HTTP_FTP_MODE httpFtpMode
208f_variable_new VAR_HTTP_FTP_MODE httpFtpMode
209f_variable_new VAR_HTTP_HOST httpHost
210f_variable_new VAR_HTTP_PATH _httpPath
211f_variable_new VAR_HTTP_PORT httpPort
208f_variable_new VAR_HTTP_PROXY httpProxy
209f_variable_new VAR_HTTP_PROXY_HOST httpProxyHost
210f_variable_new VAR_HTTP_PROXY_PATH _httpProxyPath
211f_variable_new VAR_HTTP_PROXY_PORT httpProxyPort
212f_variable_new VAR_IFCONFIG ifconfig_
213f_variable_new VAR_IPADDR ipaddr
214f_variable_new VAR_IPV6ADDR ipv6addr
215f_variable_new VAR_IPV6_ENABLE ipv6_activate_all_interfaces
216f_variable_new VAR_MEDIA_TIMEOUT MEDIA_TIMEOUT
217f_variable_new VAR_MEDIA_TYPE mediaType
218f_variable_new VAR_NAMESERVER nameserver
219f_variable_new VAR_NETINTERACTIVE netInteractive
220f_variable_new VAR_NETMASK netmask
221f_variable_new VAR_NETWORK_DEVICE netDev
222f_variable_new VAR_NFS_HOST nfsHost
223f_variable_new VAR_NFS_PATH nfsPath
224f_variable_new VAR_NFS_SECURE nfs_reserved_port_only
225f_variable_new VAR_NFS_TCP nfs_use_tcp
226f_variable_new VAR_NFS_V3 nfs_use_v3
227f_variable_new VAR_NONINTERACTIVE nonInteractive
228f_variable_new VAR_NO_CONFIRM noConfirm
229f_variable_new VAR_NO_ERROR noError
230f_variable_new VAR_NO_INET6 noInet6
231f_variable_new VAR_PACKAGE package
232f_variable_new VAR_PKG_TMPDIR PKG_TMPDIR
233f_variable_new VAR_PORTS_PATH ports
234f_variable_new VAR_RELNAME releaseName
235f_variable_new VAR_SLOW_ETHER slowEthernetCard
236f_variable_new VAR_TRY_DHCP tryDHCP
237f_variable_new VAR_TRY_RTSOL tryRTSOL
238f_variable_new VAR_UFS_PATH ufs
239
240#
241# Self-initialize unless requested otherwise
242#
243f_dprintf "%s: VARIABLE_SELF_INITIALIZE=[%s]" \
244 variable.subr "$VARIABLE_SELF_INITIALIZE"
245case "$VARIABLE_SELF_INITIALIZE" in
246""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;;
247*) f_variable_set_defaults
248esac
249
250f_dprintf "%s: Successfully loaded." variable.subr
251
252fi # ! $_VARIABLE_SUBR
212f_variable_new VAR_HTTP_PROXY httpProxy
213f_variable_new VAR_HTTP_PROXY_HOST httpProxyHost
214f_variable_new VAR_HTTP_PROXY_PATH _httpProxyPath
215f_variable_new VAR_HTTP_PROXY_PORT httpProxyPort
216f_variable_new VAR_IFCONFIG ifconfig_
217f_variable_new VAR_IPADDR ipaddr
218f_variable_new VAR_IPV6ADDR ipv6addr
219f_variable_new VAR_IPV6_ENABLE ipv6_activate_all_interfaces
220f_variable_new VAR_MEDIA_TIMEOUT MEDIA_TIMEOUT
221f_variable_new VAR_MEDIA_TYPE mediaType
222f_variable_new VAR_NAMESERVER nameserver
223f_variable_new VAR_NETINTERACTIVE netInteractive
224f_variable_new VAR_NETMASK netmask
225f_variable_new VAR_NETWORK_DEVICE netDev
226f_variable_new VAR_NFS_HOST nfsHost
227f_variable_new VAR_NFS_PATH nfsPath
228f_variable_new VAR_NFS_SECURE nfs_reserved_port_only
229f_variable_new VAR_NFS_TCP nfs_use_tcp
230f_variable_new VAR_NFS_V3 nfs_use_v3
231f_variable_new VAR_NONINTERACTIVE nonInteractive
232f_variable_new VAR_NO_CONFIRM noConfirm
233f_variable_new VAR_NO_ERROR noError
234f_variable_new VAR_NO_INET6 noInet6
235f_variable_new VAR_PACKAGE package
236f_variable_new VAR_PKG_TMPDIR PKG_TMPDIR
237f_variable_new VAR_PORTS_PATH ports
238f_variable_new VAR_RELNAME releaseName
239f_variable_new VAR_SLOW_ETHER slowEthernetCard
240f_variable_new VAR_TRY_DHCP tryDHCP
241f_variable_new VAR_TRY_RTSOL tryRTSOL
242f_variable_new VAR_UFS_PATH ufs
243
244#
245# Self-initialize unless requested otherwise
246#
247f_dprintf "%s: VARIABLE_SELF_INITIALIZE=[%s]" \
248 variable.subr "$VARIABLE_SELF_INITIALIZE"
249case "$VARIABLE_SELF_INITIALIZE" in
250""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;;
251*) f_variable_set_defaults
252esac
253
254f_dprintf "%s: Successfully loaded." variable.subr
255
256fi # ! $_VARIABLE_SUBR