]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - usr.sbin/bsdconfig/share/variable.subr
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / usr.sbin / bsdconfig / share / variable.subr
1 if [ ! "$_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 (INCLUDING, 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
31 BSDCFG_SHARE="/usr/share/bsdconfig"
32 . $BSDCFG_SHARE/common.subr || exit 1
33 f_dprintf "%s: loading includes..." variable.subr
34 f_include $BSDCFG_SHARE/dialog.subr
35 f_include $BSDCFG_SHARE/strings.subr
36
37 ############################################################ GLOBALS
38
39 VARIABLES=
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 #
70 f_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 #
89 f_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 #
107 f_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 #
155 f_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 #
176 f_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 #
187 f_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 #
202 f_netinteractive()
203 {
204         local value
205         f_getvar $VAR_NETINTERACTIVE value && [ "$value" ]
206 }
207
208 # f_zfsinteractive()
209 #
210 # Has the user specifically requested the ZFS-portion of configuration and
211 # setup to be performed interactively? Returns success if the user has asked
212 # for the ZFS configuration to be done interactively even if perhaps overall
213 # non-interactive mode has been requested (by setting nonInteractive).
214 #
215 # Returns success if $zfsInteractive is set and non-NULL.
216 #
217 f_zfsinteractive()
218 {
219         local value
220         f_getvar $VAR_ZFSINTERACTIVE value && [ "$value" ]
221 }
222
223 ############################################################ MAIN
224
225 #
226 # Variables that can be tweaked from config files
227 #
228 #              Handle                   Variable Name
229 f_variable_new VAR_CONFIG_FILE          configFile
230 f_variable_new VAR_DEBUG                debug
231 f_variable_new VAR_DEBUG_FILE           debugFile
232 f_variable_new VAR_DIRECTORY_PATH       _directoryPath
233 f_variable_new VAR_DOMAINNAME           domainname
234 f_variable_new VAR_EDITOR               editor
235 f_variable_new VAR_EXTRAS               ifconfig_
236 f_variable_new VAR_FTP_DIR              ftpDirectory
237 f_variable_new VAR_FTP_HOST             ftpHost
238 f_variable_new VAR_FTP_PASS             ftpPass
239 f_variable_new VAR_FTP_PATH             _ftpPath
240 f_variable_new VAR_FTP_PORT             ftpPort
241 f_variable_new VAR_FTP_STATE            ftpState
242 f_variable_new VAR_FTP_USER             ftpUser
243 f_variable_new VAR_GATEWAY              defaultrouter
244 f_variable_new VAR_HOSTNAME             hostname
245 f_variable_new VAR_HTTP_DIR             httpDirectory
246 f_variable_new VAR_HTTP_FTP_MODE        httpFtpMode
247 f_variable_new VAR_HTTP_HOST            httpHost
248 f_variable_new VAR_HTTP_PATH            _httpPath
249 f_variable_new VAR_HTTP_PORT            httpPort
250 f_variable_new VAR_HTTP_PROXY           httpProxy
251 f_variable_new VAR_HTTP_PROXY_HOST      httpProxyHost
252 f_variable_new VAR_HTTP_PROXY_PATH      _httpProxyPath
253 f_variable_new VAR_HTTP_PROXY_PORT      httpProxyPort
254 f_variable_new VAR_IFCONFIG             ifconfig_
255 f_variable_new VAR_IPADDR               ipaddr
256 f_variable_new VAR_IPV6ADDR             ipv6addr
257 f_variable_new VAR_IPV6_ENABLE          ipv6_activate_all_interfaces
258 f_variable_new VAR_KEYMAP               keymap
259 f_variable_new VAR_MEDIA_TIMEOUT        MEDIA_TIMEOUT
260 f_variable_new VAR_MEDIA_TYPE           mediaType
261 f_variable_new VAR_NAMESERVER           nameserver
262 f_variable_new VAR_NETINTERACTIVE       netInteractive
263 f_variable_new VAR_NETMASK              netmask
264 f_variable_new VAR_NETWORK_DEVICE       netDev
265 f_variable_new VAR_NFS_HOST             nfsHost
266 f_variable_new VAR_NFS_PATH             nfsPath
267 f_variable_new VAR_NFS_SECURE           nfs_reserved_port_only
268 f_variable_new VAR_NFS_TCP              nfs_use_tcp
269 f_variable_new VAR_NFS_V3               nfs_use_v3
270 f_variable_new VAR_NONINTERACTIVE       nonInteractive
271 f_variable_new VAR_NO_CONFIRM           noConfirm
272 f_variable_new VAR_NO_ERROR             noError
273 f_variable_new VAR_NO_INET6             noInet6
274 f_variable_new VAR_PACKAGE              package
275 f_variable_new VAR_PKG_TMPDIR           PKG_TMPDIR
276 f_variable_new VAR_PORTS_PATH           ports
277 f_variable_new VAR_RELNAME              releaseName
278 f_variable_new VAR_SLOW_ETHER           slowEthernetCard
279 f_variable_new VAR_TRY_DHCP             tryDHCP
280 f_variable_new VAR_TRY_RTSOL            tryRTSOL
281 f_variable_new VAR_UFS_PATH             ufs
282 f_variable_new VAR_ZFSINTERACTIVE       zfsInteractive
283
284 #
285 # Self-initialize unless requested otherwise
286 #
287 f_dprintf "%s: VARIABLE_SELF_INITIALIZE=[%s]" \
288           variable.subr "$VARIABLE_SELF_INITIALIZE"
289 case "$VARIABLE_SELF_INITIALIZE" in
290 ""|0|[Nn][Oo]|[Oo][Ff][Ff]|[Ff][Aa][Ll][Ss][Ee]) : do nothing ;;
291 *) f_variable_set_defaults
292 esac
293
294 f_dprintf "%s: Successfully loaded." variable.subr
295
296 fi # ! $_VARIABLE_SUBR