postinstall.in revision 1.19.2.3 1 1.19.2.2 martin #!/bin/sh
2 1.19.2.2 martin #
3 1.19.2.2 martin # $NetBSD: postinstall.in,v 1.19.2.3 2020/04/21 18:42:48 martin Exp $
4 1.19.2.2 martin #
5 1.19.2.2 martin # Copyright (c) 2002-2015 The NetBSD Foundation, Inc.
6 1.19.2.2 martin # All rights reserved.
7 1.19.2.2 martin #
8 1.19.2.2 martin # This code is derived from software contributed to The NetBSD Foundation
9 1.19.2.2 martin # by Luke Mewburn.
10 1.19.2.2 martin #
11 1.19.2.2 martin # Redistribution and use in source and binary forms, with or without
12 1.19.2.2 martin # modification, are permitted provided that the following conditions
13 1.19.2.2 martin # are met:
14 1.19.2.2 martin # 1. Redistributions of source code must retain the above copyright
15 1.19.2.2 martin # notice, this list of conditions and the following disclaimer.
16 1.19.2.2 martin # 2. Redistributions in binary form must reproduce the above copyright
17 1.19.2.2 martin # notice, this list of conditions and the following disclaimer in the
18 1.19.2.2 martin # documentation and/or other materials provided with the distribution.
19 1.19.2.2 martin #
20 1.19.2.2 martin # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21 1.19.2.2 martin # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 1.19.2.2 martin # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 1.19.2.2 martin # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24 1.19.2.2 martin # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 1.19.2.2 martin # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 1.19.2.2 martin # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 1.19.2.2 martin # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 1.19.2.2 martin # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 1.19.2.2 martin # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 1.19.2.2 martin # POSSIBILITY OF SUCH DAMAGE.
31 1.19.2.2 martin #
32 1.19.2.2 martin # postinstall
33 1.19.2.2 martin # Check for or fix configuration changes that occur
34 1.19.2.2 martin # over time as NetBSD evolves.
35 1.19.2.2 martin #
36 1.19.2.2 martin
37 1.19.2.2 martin #
38 1.19.2.2 martin # XXX BE SURE TO USE ${DEST_DIR} PREFIX BEFORE ALL REAL FILE OPERATIONS XXX
39 1.19.2.2 martin #
40 1.19.2.2 martin
41 1.19.2.2 martin #
42 1.19.2.2 martin # checks to add:
43 1.19.2.2 martin # - sysctl(8) renames (net.inet6.ip6.bindv6only -> net.inet6.ip6.v6only)
44 1.19.2.2 martin # - de* -> tlp* migration (/etc/ifconfig.de*, $ifconfig_de*, ...) ?
45 1.19.2.2 martin # - support quiet/verbose mode ?
46 1.19.2.2 martin # - differentiate between failures caused by missing source
47 1.19.2.2 martin # and real failures
48 1.19.2.2 martin # - install moduli into usr/share/examples/ssh and use from there?
49 1.19.2.2 martin # - differentiate between "needs fix" versus "can't fix" issues
50 1.19.2.2 martin #
51 1.19.2.2 martin
52 1.19.2.2 martin # This script is executed as part of a cross build. Allow the build
53 1.19.2.2 martin # environment to override the locations of some tools.
54 1.19.2.2 martin : ${AWK:=awk}
55 1.19.2.2 martin : ${DB:=db}
56 1.19.2.2 martin : ${GREP:=grep}
57 1.19.2.2 martin : ${HOST_SH:=sh}
58 1.19.2.2 martin : ${MAKE:=make}
59 1.19.2.2 martin : ${PWD_MKDB:=/usr/sbin/pwd_mkdb}
60 1.19.2.2 martin : ${SED:=sed}
61 1.19.2.2 martin : ${SORT:=sort}
62 1.19.2.2 martin : ${STAT:=stat}
63 1.19.2.2 martin
64 1.19.2.2 martin #
65 1.19.2.2 martin # helper functions
66 1.19.2.2 martin #
67 1.19.2.2 martin
68 1.19.2.2 martin err()
69 1.19.2.2 martin {
70 1.19.2.2 martin exitval=$1
71 1.19.2.2 martin shift
72 1.19.2.2 martin echo 1>&2 "${PROGNAME}: $*"
73 1.19.2.2 martin if [ -n "${SCRATCHDIR}" ]; then
74 1.19.2.2 martin /bin/rm -rf "${SCRATCHDIR}"
75 1.19.2.2 martin fi
76 1.19.2.2 martin exit ${exitval}
77 1.19.2.2 martin }
78 1.19.2.2 martin
79 1.19.2.2 martin warn()
80 1.19.2.2 martin {
81 1.19.2.2 martin echo 1>&2 "${PROGNAME}: $*"
82 1.19.2.2 martin }
83 1.19.2.2 martin
84 1.19.2.2 martin msg()
85 1.19.2.2 martin {
86 1.19.2.2 martin echo " $*"
87 1.19.2.2 martin }
88 1.19.2.2 martin
89 1.19.2.2 martin mkdtemp()
90 1.19.2.2 martin {
91 1.19.2.2 martin # Make sure we don't loop forever if mkdir will always fail.
92 1.19.2.2 martin [ -d /tmp ] || err 2 /tmp is not a directory
93 1.19.2.2 martin [ -w /tmp ] || err 2 /tmp is not writable
94 1.19.2.2 martin
95 1.19.2.2 martin _base="/tmp/_postinstall.$$"
96 1.19.2.2 martin _serial=0
97 1.19.2.2 martin
98 1.19.2.2 martin while true; do
99 1.19.2.2 martin _dir="${_base}.${_serial}"
100 1.19.2.2 martin mkdir -m 0700 "${_dir}" && break
101 1.19.2.2 martin _serial=$((${_serial} + 1))
102 1.19.2.2 martin done
103 1.19.2.2 martin echo "${_dir}"
104 1.19.2.2 martin }
105 1.19.2.2 martin
106 1.19.2.2 martin # Quote args to make them safe in the shell.
107 1.19.2.2 martin # Usage: quotedlist="$(shell_quote args...)"
108 1.19.2.2 martin #
109 1.19.2.2 martin # After building up a quoted list, use it by evaling it inside
110 1.19.2.2 martin # double quotes, like this:
111 1.19.2.2 martin # eval "set -- $quotedlist"
112 1.19.2.2 martin # or like this:
113 1.19.2.2 martin # eval "\$command $quotedlist \$filename"
114 1.19.2.2 martin #
115 1.19.2.2 martin shell_quote()
116 1.19.2.2 martin {(
117 1.19.2.2 martin local result=''
118 1.19.2.2 martin local arg qarg
119 1.19.2.2 martin LC_COLLATE=C ; export LC_COLLATE # so [a-zA-Z0-9] works in ASCII
120 1.19.2.2 martin for arg in "$@" ; do
121 1.19.2.2 martin case "${arg}" in
122 1.19.2.2 martin '')
123 1.19.2.2 martin qarg="''"
124 1.19.2.2 martin ;;
125 1.19.2.2 martin *[!-./a-zA-Z0-9]*)
126 1.19.2.2 martin # Convert each embedded ' to '\'',
127 1.19.2.2 martin # then insert ' at the beginning of the first line,
128 1.19.2.2 martin # and append ' at the end of the last line.
129 1.19.2.2 martin # Finally, elide unnecessary '' pairs at the
130 1.19.2.2 martin # beginning and end of the result and as part of
131 1.19.2.2 martin # '\'''\'' sequences that result from multiple
132 1.19.2.2 martin # adjacent quotes in he input.
133 1.19.2.2 martin qarg="$(printf "%s\n" "$arg" | \
134 1.19.2.2 martin ${SED:-sed} -e "s/'/'\\\\''/g" \
135 1.19.2.2 martin -e "1s/^/'/" -e "\$s/\$/'/" \
136 1.19.2.2 martin -e "1s/^''//" -e "\$s/''\$//" \
137 1.19.2.2 martin -e "s/'''/'/g"
138 1.19.2.2 martin )"
139 1.19.2.2 martin ;;
140 1.19.2.2 martin *)
141 1.19.2.2 martin # Arg is not the empty string, and does not contain
142 1.19.2.2 martin # any unsafe characters. Leave it unchanged for
143 1.19.2.2 martin # readability.
144 1.19.2.2 martin qarg="${arg}"
145 1.19.2.2 martin ;;
146 1.19.2.2 martin esac
147 1.19.2.2 martin result="${result}${result:+ }${qarg}"
148 1.19.2.2 martin done
149 1.19.2.2 martin printf "%s\n" "$result"
150 1.19.2.2 martin )}
151 1.19.2.2 martin
152 1.19.2.2 martin # Convert arg $1 to a basic regular expression (as in sed)
153 1.19.2.2 martin # that will match the arg. This works by inserting backslashes
154 1.19.2.2 martin # before characters that are special in basic regular expressions.
155 1.19.2.2 martin # It also inserts backslashes before the extra characters specified
156 1.19.2.2 martin # in $2 (which defaults to "/,").
157 1.19.2.2 martin # XXX: Does not handle embedded newlines.
158 1.19.2.2 martin # Usage: regex="$(bre_quote "${string}")"
159 1.19.2.2 martin bre_quote()
160 1.19.2.2 martin {
161 1.19.2.2 martin local arg="$1"
162 1.19.2.2 martin local extra="${2-/,}"
163 1.19.2.2 martin printf "%s\n" "${arg}" | ${SED} -e 's/[][^$.*\\'"${extra}"']/\\&/g'
164 1.19.2.2 martin }
165 1.19.2.2 martin
166 1.19.2.2 martin # unprefix dir
167 1.19.2.2 martin # Remove any dir prefix from a list of paths on stdin,
168 1.19.2.2 martin # and write the result to stdout. Useful for converting
169 1.19.2.2 martin # from ${DEST_DIR}/path to /path.
170 1.19.2.2 martin #
171 1.19.2.2 martin unprefix()
172 1.19.2.2 martin {
173 1.19.2.2 martin [ $# -eq 1 ] || err 3 "USAGE: unprefix dir"
174 1.19.2.2 martin local prefix="${1%/}"
175 1.19.2.2 martin prefix="$(bre_quote "${prefix}")"
176 1.19.2.2 martin
177 1.19.2.2 martin ${SED} -e "s,^${prefix}/,/,"
178 1.19.2.2 martin }
179 1.19.2.2 martin
180 1.19.2.2 martin # additem item description
181 1.19.2.2 martin # Add item to list of supported items to check/fix,
182 1.19.2.2 martin # which are checked/fixed by default if no item is requested by user.
183 1.19.2.2 martin #
184 1.19.2.2 martin additem()
185 1.19.2.2 martin {
186 1.19.2.2 martin [ $# -eq 2 ] || err 3 "USAGE: additem item description"
187 1.19.2.2 martin defaultitems="${defaultitems}${defaultitems:+ }$1"
188 1.19.2.2 martin eval desc_$1=\"\$2\"
189 1.19.2.2 martin }
190 1.19.2.2 martin
191 1.19.2.2 martin # adddisableditem item description
192 1.19.2.2 martin # Add item to list of supported items to check/fix,
193 1.19.2.2 martin # but execute the item only if the user asks for it explicitly.
194 1.19.2.2 martin #
195 1.19.2.2 martin adddisableditem()
196 1.19.2.2 martin {
197 1.19.2.2 martin [ $# -eq 2 ] || err 3 "USAGE: adddisableditem item description"
198 1.19.2.2 martin otheritems="${otheritems}${otheritems:+ }$1"
199 1.19.2.2 martin eval desc_$1=\"\$2\"
200 1.19.2.2 martin }
201 1.19.2.2 martin
202 1.19.2.2 martin # checkdir op dir mode
203 1.19.2.2 martin # Ensure dir exists, and if not, create it with the appropriate mode.
204 1.19.2.2 martin # Returns 0 if ok, 1 otherwise.
205 1.19.2.2 martin #
206 1.19.2.2 martin check_dir()
207 1.19.2.2 martin {
208 1.19.2.2 martin [ $# -eq 3 ] || err 3 "USAGE: check_dir op dir mode"
209 1.19.2.2 martin _cdop="$1"
210 1.19.2.2 martin _cddir="$2"
211 1.19.2.2 martin _cdmode="$3"
212 1.19.2.2 martin [ -d "${_cddir}" ] && return 0
213 1.19.2.2 martin if [ "${_cdop}" = "check" ]; then
214 1.19.2.2 martin msg "${_cddir} is not a directory"
215 1.19.2.2 martin return 1
216 1.19.2.2 martin elif ! mkdir -m "${_cdmode}" "${_cddir}" ; then
217 1.19.2.2 martin msg "Can't create missing ${_cddir}"
218 1.19.2.2 martin return 1
219 1.19.2.2 martin else
220 1.19.2.2 martin msg "Missing ${_cddir} created"
221 1.19.2.2 martin fi
222 1.19.2.2 martin return 0
223 1.19.2.2 martin }
224 1.19.2.2 martin
225 1.19.2.2 martin # check_ids op type file srcfile start id [...]
226 1.19.2.2 martin # Check if file of type "users" or "groups" contains the relevant IDs.
227 1.19.2.2 martin # Use srcfile as a reference for the expected contents.
228 1.19.2.2 martin # The specified "id" names should be given in numerical order,
229 1.19.2.2 martin # with the first name corresponding to numerical value "start",
230 1.19.2.2 martin # and with the special name "SKIP" being used to mark gaps in the
231 1.19.2.2 martin # sequence.
232 1.19.2.2 martin # Returns 0 if ok, 1 otherwise.
233 1.19.2.2 martin #
234 1.19.2.2 martin check_ids()
235 1.19.2.2 martin {
236 1.19.2.2 martin [ $# -ge 6 ] || err 3 "USAGE: checks_ids op type file start srcfile id [...]"
237 1.19.2.2 martin _op="$1"
238 1.19.2.2 martin _type="$2"
239 1.19.2.2 martin _file="$3"
240 1.19.2.2 martin _srcfile="$4"
241 1.19.2.2 martin _start="$5"
242 1.19.2.2 martin shift 5
243 1.19.2.2 martin #_ids="$@"
244 1.19.2.2 martin
245 1.19.2.2 martin if [ ! -f "${_file}" ]; then
246 1.19.2.2 martin msg "${_file} doesn't exist; can't check for missing ${_type}"
247 1.19.2.2 martin return 1
248 1.19.2.2 martin fi
249 1.19.2.2 martin if [ ! -r "${_file}" ]; then
250 1.19.2.2 martin msg "${_file} is not readable; can't check for missing ${_type}"
251 1.19.2.2 martin return 1
252 1.19.2.2 martin fi
253 1.19.2.2 martin _notfixed=""
254 1.19.2.2 martin if [ "${_op}" = "fix" ]; then
255 1.19.2.2 martin _notfixed="${NOT_FIXED}"
256 1.19.2.2 martin fi
257 1.19.2.2 martin _missing="$(${AWK} -v start=$_start -F: '
258 1.19.2.2 martin BEGIN {
259 1.19.2.2 martin for (x = 1; x < ARGC; x++) {
260 1.19.2.2 martin if (ARGV[x] == "SKIP")
261 1.19.2.2 martin continue;
262 1.19.2.2 martin idlist[ARGV[x]]++;
263 1.19.2.2 martin value[ARGV[x]] = start + x - 1;
264 1.19.2.2 martin }
265 1.19.2.2 martin ARGC=1
266 1.19.2.2 martin }
267 1.19.2.2 martin {
268 1.19.2.2 martin found[$1]++
269 1.19.2.2 martin number[$1] = $3
270 1.19.2.2 martin }
271 1.19.2.2 martin END {
272 1.19.2.2 martin for (id in idlist) {
273 1.19.2.2 martin if (!(id in found))
274 1.19.2.2 martin printf("%s (missing)\n", id)
275 1.19.2.2 martin else if (number[id] != value[id])
276 1.19.2.2 martin printf("%s (%d != %d)\n", id,
277 1.19.2.2 martin number[id], value[id])
278 1.19.2.2 martin start++;
279 1.19.2.2 martin }
280 1.19.2.2 martin }
281 1.19.2.2 martin ' "$@" < "${_file}")" || return 1
282 1.19.2.2 martin if [ -n "${_missing}" ]; then
283 1.19.2.2 martin msg "Error ${_type}${_notfixed}:" $(echo ${_missing})
284 1.19.2.2 martin msg "Use the following as a template:"
285 1.19.2.2 martin set -- ${_missing}
286 1.19.2.2 martin while [ $# -gt 0 ]
287 1.19.2.2 martin do
288 1.19.2.2 martin ${GREP} -E "^${1}:" ${_srcfile}
289 1.19.2.2 martin shift 2
290 1.19.2.2 martin done
291 1.19.2.2 martin msg "and adjust if necessary."
292 1.19.2.2 martin return 1
293 1.19.2.2 martin fi
294 1.19.2.2 martin return 0
295 1.19.2.2 martin }
296 1.19.2.2 martin
297 1.19.2.2 martin # populate_dir op onlynew src dest mode file [file ...]
298 1.19.2.2 martin # Perform op ("check" or "fix") on files in src/ against dest/
299 1.19.2.2 martin # If op = "check" display missing or changed files, optionally with diffs.
300 1.19.2.2 martin # If op != "check" copies any missing or changed files.
301 1.19.2.2 martin # If onlynew evaluates to true, changed files are ignored.
302 1.19.2.2 martin # Returns 0 if ok, 1 otherwise.
303 1.19.2.2 martin #
304 1.19.2.2 martin populate_dir()
305 1.19.2.2 martin {
306 1.19.2.2 martin [ $# -ge 5 ] || err 3 "USAGE: populate_dir op onlynew src dest mode file [...]"
307 1.19.2.2 martin _op="$1"
308 1.19.2.2 martin _onlynew="$2"
309 1.19.2.2 martin _src="$3"
310 1.19.2.2 martin _dest="$4"
311 1.19.2.2 martin _mode="$5"
312 1.19.2.2 martin shift 5
313 1.19.2.2 martin #_files="$@"
314 1.19.2.2 martin
315 1.19.2.2 martin if [ ! -d "${_src}" ]; then
316 1.19.2.2 martin msg "${_src} is not a directory; skipping check"
317 1.19.2.2 martin return 1
318 1.19.2.2 martin fi
319 1.19.2.2 martin check_dir "${_op}" "${_dest}" 755 || return 1
320 1.19.2.2 martin
321 1.19.2.2 martin _cmpdir_rv=0
322 1.19.2.2 martin for f in "$@"; do
323 1.19.2.2 martin fs="${_src}/${f}"
324 1.19.2.2 martin fd="${_dest}/${f}"
325 1.19.2.2 martin _error=""
326 1.19.2.2 martin if [ ! -f "${fd}" ]; then
327 1.19.2.2 martin _error="${fd} does not exist"
328 1.19.2.2 martin elif ! cmp -s "${fs}" "${fd}" ; then
329 1.19.2.2 martin if $_onlynew; then # leave existing ${fd} alone
330 1.19.2.2 martin continue;
331 1.19.2.2 martin fi
332 1.19.2.2 martin _error="${fs} != ${fd}"
333 1.19.2.2 martin else
334 1.19.2.2 martin continue
335 1.19.2.2 martin fi
336 1.19.2.2 martin if [ "${_op}" = "check" ]; then
337 1.19.2.2 martin msg "${_error}"
338 1.19.2.2 martin if [ -n "${DIFF_STYLE}" -a -f "${fd}" ]; then
339 1.19.2.2 martin diff -${DIFF_STYLE} ${DIFF_OPT} "${fd}" "${fs}"
340 1.19.2.2 martin fi
341 1.19.2.2 martin _cmpdir_rv=1
342 1.19.2.2 martin elif ! rm -f "${fd}" ||
343 1.19.2.2 martin ! cp -f "${fs}" "${fd}"; then
344 1.19.2.2 martin msg "Can't copy ${fs} to ${fd}"
345 1.19.2.2 martin _cmpdir_rv=1
346 1.19.2.2 martin elif ! chmod "${_mode}" "${fd}"; then
347 1.19.2.2 martin msg "Can't change mode of ${fd} to ${_mode}"
348 1.19.2.2 martin _cmpdir_rv=1
349 1.19.2.2 martin else
350 1.19.2.2 martin msg "Copied ${fs} to ${fd}"
351 1.19.2.2 martin fi
352 1.19.2.2 martin done
353 1.19.2.2 martin return ${_cmpdir_rv}
354 1.19.2.2 martin }
355 1.19.2.2 martin
356 1.19.2.2 martin # compare_dir op src dest mode file [file ...]
357 1.19.2.2 martin # Perform op ("check" or "fix") on files in src/ against dest/
358 1.19.2.2 martin # If op = "check" display missing or changed files, optionally with diffs.
359 1.19.2.2 martin # If op != "check" copies any missing or changed files.
360 1.19.2.2 martin # Returns 0 if ok, 1 otherwise.
361 1.19.2.2 martin #
362 1.19.2.2 martin compare_dir()
363 1.19.2.2 martin {
364 1.19.2.2 martin [ $# -ge 4 ] || err 3 "USAGE: compare_dir op src dest mode file [...]"
365 1.19.2.2 martin _op="$1"
366 1.19.2.2 martin _src="$2"
367 1.19.2.2 martin _dest="$3"
368 1.19.2.2 martin _mode="$4"
369 1.19.2.2 martin shift 4
370 1.19.2.2 martin #_files="$@"
371 1.19.2.2 martin
372 1.19.2.2 martin populate_dir "$_op" false "$_src" "$_dest" "$_mode" "$@"
373 1.19.2.2 martin }
374 1.19.2.2 martin
375 1.19.2.2 martin # move_file op src dest --
376 1.19.2.2 martin # Check (op == "check") or move (op != "check") from src to dest.
377 1.19.2.2 martin # Returns 0 if ok, 1 otherwise.
378 1.19.2.2 martin #
379 1.19.2.2 martin move_file()
380 1.19.2.2 martin {
381 1.19.2.2 martin [ $# -eq 3 ] || err 3 "USAGE: move_file op src dest"
382 1.19.2.2 martin _fm_op="$1"
383 1.19.2.2 martin _fm_src="$2"
384 1.19.2.2 martin _fm_dest="$3"
385 1.19.2.2 martin
386 1.19.2.2 martin if [ -f "${_fm_src}" -a ! -f "${_fm_dest}" ]; then
387 1.19.2.2 martin if [ "${_fm_op}" = "check" ]; then
388 1.19.2.2 martin msg "Move ${_fm_src} to ${_fm_dest}"
389 1.19.2.2 martin return 1
390 1.19.2.2 martin fi
391 1.19.2.2 martin if ! mv "${_fm_src}" "${_fm_dest}"; then
392 1.19.2.2 martin msg "Can't move ${_fm_src} to ${_fm_dest}"
393 1.19.2.2 martin return 1
394 1.19.2.2 martin fi
395 1.19.2.2 martin msg "Moved ${_fm_src} to ${_fm_dest}"
396 1.19.2.2 martin fi
397 1.19.2.2 martin return 0
398 1.19.2.2 martin }
399 1.19.2.2 martin
400 1.19.2.2 martin # rcconf_is_set op name var [verbose] --
401 1.19.2.2 martin # Load the rcconf for name, and check if obsolete rc.conf(5) variable
402 1.19.2.2 martin # var is defined or not.
403 1.19.2.2 martin # Returns 0 if defined (even to ""), otherwise 1.
404 1.19.2.2 martin # If verbose != "", print an obsolete warning if the var is defined.
405 1.19.2.2 martin #
406 1.19.2.2 martin rcconf_is_set()
407 1.19.2.2 martin {
408 1.19.2.2 martin [ $# -ge 3 ] || err 3 "USAGE: rcconf_is_set op name var [verbose]"
409 1.19.2.2 martin _rcis_op="$1"
410 1.19.2.2 martin _rcis_name="$2"
411 1.19.2.2 martin _rcis_var="$3"
412 1.19.2.2 martin _rcis_verbose="$4"
413 1.19.2.2 martin _rcis_notfixed=""
414 1.19.2.2 martin if [ "${_rcis_op}" = "fix" ]; then
415 1.19.2.2 martin _rcis_notfixed="${NOT_FIXED}"
416 1.19.2.2 martin fi
417 1.19.2.2 martin (
418 1.19.2.2 martin for f in \
419 1.19.2.2 martin "${DEST_DIR}/etc/rc.conf" \
420 1.19.2.2 martin "${DEST_DIR}/etc/rc.conf.d/${_rcis_name}"; do
421 1.19.2.2 martin [ -f "${f}" ] && . "${f}"
422 1.19.2.2 martin done
423 1.19.2.2 martin eval echo -n \"\${${_rcis_var}}\" 1>&3
424 1.19.2.2 martin if eval "[ -n \"\${${_rcis_var}}\" \
425 1.19.2.2 martin -o \"\${${_rcis_var}-UNSET}\" != \"UNSET\" ]"; then
426 1.19.2.2 martin if [ -n "${_rcis_verbose}" ]; then
427 1.19.2.2 martin msg \
428 1.19.2.2 martin "Obsolete rc.conf(5) variable '\$${_rcis_var}' found.${_rcis_notfixed}"
429 1.19.2.2 martin fi
430 1.19.2.2 martin exit 0
431 1.19.2.2 martin else
432 1.19.2.2 martin exit 1
433 1.19.2.2 martin fi
434 1.19.2.2 martin )
435 1.19.2.2 martin }
436 1.19.2.2 martin
437 1.19.2.2 martin # rcvar_is_enabled var
438 1.19.2.2 martin # Check if rcvar is enabled
439 1.19.2.2 martin #
440 1.19.2.2 martin rcvar_is_enabled()
441 1.19.2.2 martin {
442 1.19.2.2 martin [ $# -eq 1 ] || err 3 "USAGE: rcvar_is_enabled var"
443 1.19.2.2 martin _rcie_var="$1"
444 1.19.2.2 martin (
445 1.19.2.2 martin [ -f "${DEST_DIR}/etc/rc.conf" ] && . "${DEST_DIR}/etc/rc.conf"
446 1.19.2.2 martin eval _rcie_val=\"\${${_rcie_var}}\"
447 1.19.2.2 martin case $_rcie_val in
448 1.19.2.2 martin # "yes", "true", "on", or "1"
449 1.19.2.2 martin [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
450 1.19.2.2 martin exit 0
451 1.19.2.2 martin ;;
452 1.19.2.2 martin
453 1.19.2.2 martin *)
454 1.19.2.2 martin exit 1
455 1.19.2.2 martin ;;
456 1.19.2.2 martin esac
457 1.19.2.2 martin )
458 1.19.2.2 martin }
459 1.19.2.2 martin
460 1.19.2.2 martin # find_file_in_dirlist() file message dir1 [...] --
461 1.19.2.2 martin # Find which directory file is in, and sets ${dir} to match.
462 1.19.2.2 martin # Returns 0 if matched, otherwise 1 (and sets ${dir} to "").
463 1.19.2.2 martin #
464 1.19.2.2 martin # Generally, check the directory for the "checking from source" case,
465 1.19.2.2 martin # and then the directory for the "checking from extracted etc.tgz" case.
466 1.19.2.2 martin #
467 1.19.2.2 martin find_file_in_dirlist()
468 1.19.2.2 martin {
469 1.19.2.2 martin [ $# -ge 3 ] || err 3 "USAGE: find_file_in_dirlist file msg dir1 [...]"
470 1.19.2.2 martin
471 1.19.2.2 martin _file="$1" ; shift
472 1.19.2.2 martin _msg="$1" ; shift
473 1.19.2.2 martin _dir1st= # first dir in list
474 1.19.2.2 martin for dir in "$@"; do
475 1.19.2.2 martin : ${_dir1st:="${dir}"}
476 1.19.2.2 martin if [ -f "${dir}/${_file}" ]; then
477 1.19.2.2 martin if [ "${_dir1st}" != "${dir}" ]; then
478 1.19.2.2 martin msg \
479 1.19.2.2 martin "(Checking for ${_msg} from ${dir} instead of ${_dir1st})"
480 1.19.2.2 martin fi
481 1.19.2.2 martin return 0
482 1.19.2.2 martin fi
483 1.19.2.2 martin done
484 1.19.2.2 martin msg "Can't find source directory for ${_msg}"
485 1.19.2.2 martin return 1
486 1.19.2.2 martin }
487 1.19.2.2 martin
488 1.19.2.2 martin # file_exists_exact path
489 1.19.2.2 martin # Returns true if a file exists in the ${DEST_DIR} whose name
490 1.19.2.2 martin # is exactly ${path}, interpreted in a case-sensitive way
491 1.19.2.2 martin # even if the underlying file system is case-insensitive.
492 1.19.2.2 martin #
493 1.19.2.2 martin # The path must begin with '/' or './', and is interpreted as
494 1.19.2.2 martin # being relative to ${DEST_DIR}.
495 1.19.2.2 martin #
496 1.19.2.2 martin file_exists_exact()
497 1.19.2.2 martin {
498 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: file_exists_exact path"
499 1.19.2.2 martin _path="${1#.}"
500 1.19.2.2 martin [ -h "${DEST_DIR}${_path}" ] || \
501 1.19.2.2 martin [ -e "${DEST_DIR}${_path}" ] || return 1
502 1.19.2.2 martin while [ "${_path}" != "/" -a "${_path}" != "." ] ; do
503 1.19.2.2 martin _dirname="$(dirname "${_path}" 2>/dev/null)"
504 1.19.2.2 martin _basename="$(basename "${_path}" 2>/dev/null)"
505 1.19.2.2 martin ls -fa "${DEST_DIR}${_dirname}" 2> /dev/null \
506 1.19.2.2 martin | ${GREP} -F -x "${_basename}" >/dev/null \
507 1.19.2.2 martin || return 1
508 1.19.2.2 martin _path="${_dirname}"
509 1.19.2.2 martin done
510 1.19.2.2 martin return 0
511 1.19.2.2 martin }
512 1.19.2.2 martin
513 1.19.2.2 martin # obsolete_paths op
514 1.19.2.2 martin # Obsolete the list of paths provided on stdin.
515 1.19.2.2 martin # Each path should start with '/' or './', and
516 1.19.2.2 martin # will be interpreted relative to ${DEST_DIR}.
517 1.19.2.2 martin #
518 1.19.2.2 martin obsolete_paths()
519 1.19.2.2 martin {
520 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: obsolete_paths fix|check"
521 1.19.2.2 martin op="$1"
522 1.19.2.2 martin
523 1.19.2.2 martin failed=0
524 1.19.2.2 martin while read ofile; do
525 1.19.2.2 martin if ! ${file_exists_exact} "${ofile}"; then
526 1.19.2.2 martin continue
527 1.19.2.2 martin fi
528 1.19.2.2 martin ofile="${DEST_DIR}${ofile#.}"
529 1.19.2.2 martin cmd="rm"
530 1.19.2.2 martin ftype="file"
531 1.19.2.2 martin if [ -h "${ofile}" ]; then
532 1.19.2.2 martin ftype="link"
533 1.19.2.2 martin elif [ -d "${ofile}" ]; then
534 1.19.2.2 martin ftype="directory"
535 1.19.2.2 martin cmd="rmdir"
536 1.19.2.2 martin elif [ ! -e "${ofile}" ]; then
537 1.19.2.2 martin continue
538 1.19.2.2 martin fi
539 1.19.2.2 martin if [ "${op}" = "check" ]; then
540 1.19.2.2 martin msg "Remove obsolete ${ftype} ${ofile}"
541 1.19.2.2 martin failed=1
542 1.19.2.2 martin elif ! eval "${cmd} \"\${ofile}\""; then
543 1.19.2.2 martin msg "Can't remove obsolete ${ftype} ${ofile}"
544 1.19.2.2 martin failed=1
545 1.19.2.2 martin else
546 1.19.2.2 martin msg "Removed obsolete ${ftype} ${ofile}"
547 1.19.2.2 martin fi
548 1.19.2.2 martin done
549 1.19.2.2 martin return ${failed}
550 1.19.2.2 martin }
551 1.19.2.2 martin
552 1.19.2.2 martin # obsolete_libs dir
553 1.19.2.2 martin # Display the minor/teeny shared libraries in dir that are considered
554 1.19.2.2 martin # to be obsolete.
555 1.19.2.2 martin #
556 1.19.2.2 martin # The implementation supports removing obsolete major libraries
557 1.19.2.2 martin # if the awk variable AllLibs is set, although there is no way to
558 1.19.2.2 martin # enable that in the enclosing shell function as this time.
559 1.19.2.2 martin #
560 1.19.2.2 martin obsolete_libs()
561 1.19.2.2 martin {
562 1.19.2.2 martin [ $# -eq 1 ] || err 3 "USAGE: obsolete_libs dir"
563 1.19.2.2 martin dir="$1"
564 1.19.2.2 martin
565 1.19.2.2 martin _obsolete_libs "${dir}"
566 1.19.2.2 martin _obsolete_libs "/usr/libdata/debug/${dir}"
567 1.19.2.2 martin }
568 1.19.2.2 martin
569 1.19.2.2 martin exclude()
570 1.19.2.2 martin {
571 1.19.2.2 martin local dollar
572 1.19.2.2 martin case "$1" in
573 1.19.2.2 martin -t)
574 1.19.2.2 martin dollar='$'
575 1.19.2.2 martin shift
576 1.19.2.2 martin ;;
577 1.19.2.2 martin *)
578 1.19.2.2 martin dollar=
579 1.19.2.2 martin ;;
580 1.19.2.2 martin esac
581 1.19.2.2 martin if [ -z "$*" ]; then
582 1.19.2.2 martin cat
583 1.19.2.2 martin else
584 1.19.2.2 martin eval ${GREP} -v -E "'(^$(echo $* | \
585 1.19.2.2 martin ${SED} -e s/\\./\\\\./g -e 's/ /'${dollar}'|^/'g)${dollar})'"
586 1.19.2.2 martin fi
587 1.19.2.2 martin }
588 1.19.2.2 martin
589 1.19.2.2 martin #
590 1.19.2.2 martin # find all the target symlinks of shared libaries and exclude them
591 1.19.2.2 martin # from consideration for removal
592 1.19.2.2 martin #
593 1.19.2.2 martin exclude_libs() {
594 1.19.2.2 martin local target="$(ls -l -d lib*.so.* 2> /dev/null \
595 1.19.2.2 martin | ${AWK} '{ print $11; }' \
596 1.19.2.2 martin | ${SED} -e 's@.*/@@' | ${SORT} -u)"
597 1.19.2.2 martin exclude -t ${target}
598 1.19.2.2 martin }
599 1.19.2.2 martin
600 1.19.2.2 martin _obsolete_libs()
601 1.19.2.2 martin {
602 1.19.2.2 martin dir="$1"
603 1.19.2.2 martin
604 1.19.2.2 martin (
605 1.19.2.2 martin
606 1.19.2.2 martin if [ ! -e "${DEST_DIR}/${dir}" ]
607 1.19.2.2 martin then
608 1.19.2.2 martin return 0
609 1.19.2.2 martin fi
610 1.19.2.2 martin
611 1.19.2.2 martin cd "${DEST_DIR}/${dir}" || err 2 "can't cd to ${DEST_DIR}/${dir}"
612 1.19.2.2 martin echo lib*.so.* \
613 1.19.2.2 martin | tr ' ' '\n' \
614 1.19.2.2 martin | ${AWK} -v LibDir="${dir}/" '
615 1.19.2.2 martin #{
616 1.19.2.2 martin
617 1.19.2.2 martin function digit(v, c, n) { return (n <= c) ? v[n] : 0 }
618 1.19.2.2 martin
619 1.19.2.2 martin function checklib(results, line, regex) {
620 1.19.2.2 martin if (! match(line, regex))
621 1.19.2.2 martin return
622 1.19.2.2 martin lib = substr(line, RSTART, RLENGTH)
623 1.19.2.2 martin rev = substr($0, RLENGTH+1)
624 1.19.2.2 martin if (! (lib in results)) {
625 1.19.2.2 martin results[lib] = rev
626 1.19.2.2 martin return
627 1.19.2.2 martin }
628 1.19.2.2 martin orevc = split(results[lib], orev, ".")
629 1.19.2.2 martin nrevc = split(rev, nrev, ".")
630 1.19.2.2 martin maxc = (orevc > nrevc) ? orevc : nrevc
631 1.19.2.2 martin for (i = 1; i <= maxc; i++) {
632 1.19.2.2 martin res = digit(orev, orevc, i) - digit(nrev, nrevc, i)
633 1.19.2.2 martin if (res < 0) {
634 1.19.2.2 martin print LibDir lib results[lib]
635 1.19.2.2 martin results[lib] = rev
636 1.19.2.2 martin return
637 1.19.2.2 martin } else if (res > 0) {
638 1.19.2.2 martin print LibDir lib rev
639 1.19.2.2 martin return
640 1.19.2.2 martin }
641 1.19.2.2 martin }
642 1.19.2.2 martin }
643 1.19.2.2 martin
644 1.19.2.2 martin /^lib.*\.so\.[0-9]+\.[0-9]+(\.[0-9]+)?(\.debug)?$/ {
645 1.19.2.2 martin if (AllLibs)
646 1.19.2.2 martin checklib(minor, $0, "^lib.*\\.so\\.")
647 1.19.2.2 martin else
648 1.19.2.2 martin checklib(found, $0, "^lib.*\\.so\\.[0-9]+\\.")
649 1.19.2.2 martin }
650 1.19.2.2 martin
651 1.19.2.2 martin /^lib.*\.so\.[0-9]+$/ {
652 1.19.2.2 martin if (AllLibs)
653 1.19.2.2 martin checklib(major, $0, "^lib.*\\.so\\.")
654 1.19.2.2 martin }
655 1.19.2.2 martin
656 1.19.2.2 martin #}' | exclude_libs
657 1.19.2.2 martin
658 1.19.2.2 martin )
659 1.19.2.2 martin }
660 1.19.2.2 martin
661 1.19.2.2 martin # obsolete_stand dir
662 1.19.2.2 martin # Prints the names of all obsolete files and subdirs below the
663 1.19.2.2 martin # provided dir. dir should be something like /stand/${MACHINE}.
664 1.19.2.2 martin # The input dir and all output paths are interpreted
665 1.19.2.2 martin # relative to ${DEST_DIR}.
666 1.19.2.2 martin #
667 1.19.2.2 martin # Assumes that the numerically largest subdir is current, and all
668 1.19.2.2 martin # others are obsolete.
669 1.19.2.2 martin #
670 1.19.2.2 martin obsolete_stand()
671 1.19.2.2 martin {
672 1.19.2.2 martin [ $# -eq 1 ] || err 3 "USAGE: obsolete_stand dir"
673 1.19.2.2 martin local dir="$1"
674 1.19.2.2 martin local subdir
675 1.19.2.2 martin
676 1.19.2.2 martin if ! [ -d "${DEST_DIR}${dir}" ]; then
677 1.19.2.2 martin msg "${DEST_DIR}${dir} doesn't exist; can't check for obsolete files"
678 1.19.2.2 martin return 1
679 1.19.2.2 martin fi
680 1.19.2.2 martin
681 1.19.2.2 martin ( cd "${DEST_DIR}${dir}" && ls -1d [0-9]*[0-9]/. ) \
682 1.19.2.2 martin | ${GREP} -v '[^0-9./]' \
683 1.19.2.2 martin | sort -t. -r -n -k1,1 -k2,2 -k3,3 \
684 1.19.2.2 martin | tail -n +2 \
685 1.19.2.2 martin | while read subdir ; do
686 1.19.2.2 martin subdir="${subdir%/.}"
687 1.19.2.2 martin find "${DEST_DIR}${dir}/${subdir}" -depth -print
688 1.19.2.2 martin done \
689 1.19.2.2 martin | unprefix "${DEST_DIR}"
690 1.19.2.2 martin }
691 1.19.2.2 martin
692 1.19.2.2 martin # modify_file op srcfile scratchfile awkprog
693 1.19.2.2 martin # Apply awkprog to srcfile sending output to scratchfile, and
694 1.19.2.2 martin # if appropriate replace srcfile with scratchfile.
695 1.19.2.2 martin #
696 1.19.2.2 martin modify_file()
697 1.19.2.2 martin {
698 1.19.2.2 martin [ $# -eq 4 ] || err 3 "USAGE: modify_file op file scratch awkprog"
699 1.19.2.2 martin
700 1.19.2.2 martin _mfop="$1"
701 1.19.2.2 martin _mffile="$2"
702 1.19.2.2 martin _mfscratch="$3"
703 1.19.2.2 martin _mfprog="$4"
704 1.19.2.2 martin _mffailed=0
705 1.19.2.2 martin
706 1.19.2.2 martin ${AWK} "${_mfprog}" < "${_mffile}" > "${_mfscratch}"
707 1.19.2.2 martin if ! cmp -s "${_mffile}" "${_mfscratch}"; then
708 1.19.2.2 martin diff "${_mffile}" "${_mfscratch}" > "${_mfscratch}.diffs"
709 1.19.2.2 martin if [ "${_mfop}" = "check" ]; then
710 1.19.2.2 martin msg "${_mffile} needs the following changes:"
711 1.19.2.2 martin _mffailed=1
712 1.19.2.2 martin elif ! rm -f "${_mffile}" ||
713 1.19.2.2 martin ! cp -f "${_mfscratch}" "${_mffile}"; then
714 1.19.2.2 martin msg "${_mffile} changes not applied:"
715 1.19.2.2 martin _mffailed=1
716 1.19.2.2 martin else
717 1.19.2.2 martin msg "${_mffile} changes applied:"
718 1.19.2.2 martin fi
719 1.19.2.2 martin while read _line; do
720 1.19.2.2 martin msg " ${_line}"
721 1.19.2.2 martin done < "${_mfscratch}.diffs"
722 1.19.2.2 martin fi
723 1.19.2.2 martin return ${_mffailed}
724 1.19.2.2 martin }
725 1.19.2.2 martin
726 1.19.2.2 martin
727 1.19.2.2 martin # contents_owner op directory user group
728 1.19.2.2 martin # Make sure directory and contents are owned (and group-owned)
729 1.19.2.2 martin # as specified.
730 1.19.2.2 martin #
731 1.19.2.2 martin contents_owner()
732 1.19.2.2 martin {
733 1.19.2.2 martin [ $# -eq 4 ] || err 3 "USAGE: contents_owner op dir user group"
734 1.19.2.2 martin
735 1.19.2.2 martin _op="$1"
736 1.19.2.2 martin _dir="$2"
737 1.19.2.2 martin _user="$3"
738 1.19.2.2 martin _grp="$4"
739 1.19.2.2 martin
740 1.19.2.2 martin if [ "${_op}" = "check" ]; then
741 1.19.2.2 martin _files=$(find "${_dir}" \( \( ! -user "${_user}" \) -o \
742 1.19.2.2 martin \( ! -group "${_grp}" \) \) )
743 1.19.2.2 martin _error=$?
744 1.19.2.2 martin if [ ! -z "$_files" ] || [ $_error != 0 ]; then
745 1.19.2.2 martin msg "${_dir} and contents not all owned by" \
746 1.19.2.2 martin "${_user}:${_grp}"
747 1.19.2.2 martin return 1
748 1.19.2.2 martin else
749 1.19.2.2 martin return 0
750 1.19.2.2 martin fi
751 1.19.2.2 martin elif [ "${_op}" = "fix" ]; then
752 1.19.2.2 martin find "${_dir}" \( \( ! -user "${_user}" \) -o \
753 1.19.2.3 martin \( ! -group "${_grp}" \) \) \
754 1.19.2.3 martin -exec chown "${_user}:${_grp}" -- {} \;
755 1.19.2.2 martin fi
756 1.19.2.2 martin }
757 1.19.2.2 martin
758 1.19.2.2 martin # get_makevar var [var ...]
759 1.19.2.2 martin # Retrieve the value of a user-settable system make variable
760 1.19.2.2 martin get_makevar()
761 1.19.2.2 martin {
762 1.19.2.2 martin $SOURCEMODE || err 3 "get_makevar must be used in source mode"
763 1.19.2.2 martin [ $# -eq 0 ] && err 3 "USAGE: get_makevar var [var ...]"
764 1.19.2.2 martin
765 1.19.2.2 martin for _var in "$@"; do
766 1.19.2.2 martin _value="$(echo '.include <bsd.own.mk>' | \
767 1.19.2.2 martin ${MAKE} -f - -V "\${${_var}}")"
768 1.19.2.2 martin
769 1.19.2.2 martin eval ${_var}=\"\${_value}\"
770 1.19.2.2 martin done
771 1.19.2.2 martin }
772 1.19.2.2 martin
773 1.19.2.2 martin # detect_x11
774 1.19.2.2 martin # Detect if X11 components should be analysed and set values of
775 1.19.2.2 martin # relevant variables.
776 1.19.2.2 martin detect_x11()
777 1.19.2.2 martin {
778 1.19.2.2 martin if $SOURCEMODE; then
779 1.19.2.2 martin get_makevar MKX11 X11ROOTDIR X11SRCDIR
780 1.19.2.2 martin else
781 1.19.2.2 martin if [ -f "${SRC_DIR}/etc/mtree/set.xetc" ]; then
782 1.19.2.2 martin MKX11=yes
783 1.19.2.2 martin X11ROOTDIR=/this/value/isnt/used/yet
784 1.19.2.2 martin else
785 1.19.2.2 martin MKX11=no
786 1.19.2.2 martin X11ROOTDIR=
787 1.19.2.2 martin fi
788 1.19.2.2 martin X11SRCDIR=/nonexistent/xsrc
789 1.19.2.2 martin fi
790 1.19.2.2 martin }
791 1.19.2.2 martin
792 1.19.2.2 martin #
793 1.19.2.2 martin # find out where MAKEDEV lives, set MAKEDEV_DIR appropriately
794 1.19.2.2 martin #
795 1.19.2.2 martin find_makedev()
796 1.19.2.2 martin {
797 1.19.2.2 martin if [ -e "${DEST_DIR}/dev/MAKEDEV" ]; then
798 1.19.2.2 martin MAKEDEV_DIR="${DEST_DIR}/dev"
799 1.19.2.2 martin elif [ -e "${DEST_DIR}/etc/MAKEDEV" ]; then
800 1.19.2.2 martin MAKEDEV_DIR="${DEST_DIR}/etc"
801 1.19.2.2 martin else
802 1.19.2.2 martin MAKEDEV_DIR="${DEST_DIR}/dev"
803 1.19.2.2 martin fi
804 1.19.2.2 martin }
805 1.19.2.2 martin
806 1.19.2.2 martin
807 1.19.2.2 martin #
808 1.19.2.2 martin # items
809 1.19.2.2 martin # -----
810 1.19.2.2 martin #
811 1.19.2.2 martin
812 1.19.2.2 martin #
813 1.19.2.2 martin # Bluetooth
814 1.19.2.2 martin #
815 1.19.2.2 martin
816 1.19.2.2 martin additem bluetooth "Bluetooth configuration is up to date"
817 1.19.2.2 martin do_bluetooth()
818 1.19.2.2 martin {
819 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_bluetooth fix|check"
820 1.19.2.2 martin op="$1"
821 1.19.2.2 martin failed=0
822 1.19.2.2 martin
823 1.19.2.2 martin populate_dir "${op}" true \
824 1.19.2.2 martin "${SRC_DIR}/etc/bluetooth" "${DEST_DIR}/etc/bluetooth" 644 \
825 1.19.2.2 martin hosts protocols btattach.conf btdevctl.conf
826 1.19.2.2 martin failed=$(( ${failed} + $? ))
827 1.19.2.2 martin
828 1.19.2.2 martin move_file "${op}" "${DEST_DIR}/var/db/btdev.xml" \
829 1.19.2.2 martin "${DEST_DIR}/var/db/btdevctl.plist"
830 1.19.2.2 martin failed=$(( ${failed} + $? ))
831 1.19.2.2 martin
832 1.19.2.2 martin notfixed=""
833 1.19.2.2 martin if [ "${op}" = "fix" ]; then
834 1.19.2.2 martin notfixed="${NOT_FIXED}"
835 1.19.2.2 martin fi
836 1.19.2.2 martin for _v in btattach btconfig btdevctl; do
837 1.19.2.2 martin if rcvar_is_enabled "${_v}"; then
838 1.19.2.2 martin msg \
839 1.19.2.2 martin "${_v} is obsolete in rc.conf(5)${notfixed}: use bluetooth=YES"
840 1.19.2.2 martin failed=$(( ${failed} + 1 ))
841 1.19.2.2 martin fi
842 1.19.2.2 martin done
843 1.19.2.2 martin
844 1.19.2.2 martin return ${failed}
845 1.19.2.2 martin }
846 1.19.2.2 martin
847 1.19.2.2 martin #
848 1.19.2.2 martin # ddbonpanic
849 1.19.2.2 martin #
850 1.19.2.2 martin additem ddbonpanic "verify ddb.onpanic is configured in sysctl.conf"
851 1.19.2.2 martin do_ddbonpanic()
852 1.19.2.2 martin {
853 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_ddbonpanic fix|check"
854 1.19.2.2 martin
855 1.19.2.2 martin if ${GREP} -E '^#*[[:space:]]*ddb\.onpanic[[:space:]]*\??=[[:space:]]*[[:digit:]]+' \
856 1.19.2.2 martin "${DEST_DIR}/etc/sysctl.conf" >/dev/null 2>&1
857 1.19.2.2 martin then
858 1.19.2.2 martin result=0
859 1.19.2.2 martin else
860 1.19.2.2 martin if [ "$1" = check ]; then
861 1.19.2.2 martin msg \
862 1.19.2.2 martin "The ddb.onpanic behaviour is not explicitly specified in /etc/sysctl.conf"
863 1.19.2.2 martin result=1
864 1.19.2.2 martin else
865 1.19.2.2 martin echo >> "${DEST_DIR}/etc/sysctl.conf"
866 1.19.2.2 martin ${SED} < "${SRC_DIR}/etc/sysctl.conf" \
867 1.19.2.2 martin -e '/^ddb\.onpanic/q' | \
868 1.19.2.2 martin ${SED} -e '1,/^$/d' >> \
869 1.19.2.2 martin "${DEST_DIR}/etc/sysctl.conf"
870 1.19.2.2 martin result=$?
871 1.19.2.2 martin fi
872 1.19.2.2 martin fi
873 1.19.2.2 martin return ${result}
874 1.19.2.2 martin }
875 1.19.2.2 martin
876 1.19.2.2 martin #
877 1.19.2.2 martin # defaults
878 1.19.2.2 martin #
879 1.19.2.2 martin additem defaults "/etc/defaults/ being up to date"
880 1.19.2.2 martin do_defaults()
881 1.19.2.2 martin {
882 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_defaults fix|check"
883 1.19.2.2 martin local op="$1"
884 1.19.2.2 martin local failed=0
885 1.19.2.2 martin local etcsets=$(getetcsets)
886 1.19.2.2 martin
887 1.19.2.2 martin local rc_exclude_scripts=""
888 1.19.2.2 martin if $SOURCEMODE; then
889 1.19.2.2 martin # For most architectures rc.conf(5) should be the same as the
890 1.19.2.2 martin # one obtained from a source directory, except for the ones
891 1.19.2.2 martin # that have an append file for it.
892 1.19.2.2 martin local rc_conf_app="${SRC_DIR}/etc/etc.${MACHINE}/rc.conf.append"
893 1.19.2.2 martin if [ -f "${rc_conf_app}" ]; then
894 1.19.2.2 martin rc_exclude_scripts="rc.conf"
895 1.19.2.2 martin
896 1.19.2.2 martin # Generate and compare the correct rc.conf(5) file
897 1.19.2.2 martin mkdir "${SCRATCHDIR}/defaults"
898 1.19.2.2 martin
899 1.19.2.2 martin cat "${SRC_DIR}/etc/defaults/rc.conf" "${rc_conf_app}" \
900 1.19.2.2 martin > "${SCRATCHDIR}/defaults/rc.conf"
901 1.19.2.2 martin
902 1.19.2.2 martin compare_dir "${op}" "${SCRATCHDIR}/defaults" \
903 1.19.2.2 martin "${DEST_DIR}/etc/defaults" \
904 1.19.2.2 martin 444 \
905 1.19.2.2 martin "rc.conf"
906 1.19.2.2 martin failed=$(( ${failed} + $? ))
907 1.19.2.2 martin fi
908 1.19.2.2 martin fi
909 1.19.2.2 martin
910 1.19.2.2 martin find_file_in_dirlist pf.boot.conf "pf.boot.conf" \
911 1.19.2.2 martin "${SRC_DIR}/usr.sbin/pf/etc/defaults" "${SRC_DIR}/etc/defaults" \
912 1.19.2.2 martin || return 1
913 1.19.2.2 martin # ${dir} is set by find_file_in_dirlist()
914 1.19.2.2 martin compare_dir "$op" "${dir}" "${DEST_DIR}/etc/defaults" 444 pf.boot.conf
915 1.19.2.2 martin failed=$(( ${failed} + $? ))
916 1.19.2.2 martin
917 1.19.2.2 martin rc_exclude_scripts="${rc_exclude_scripts} pf.boot.conf"
918 1.19.2.2 martin
919 1.19.2.2 martin local rc_default_conf_files="$(select_set_files /etc/defaults/ \
920 1.19.2.2 martin "/etc/defaults/\([^[:space:]]*\.conf\)" ${etcsets} | \
921 1.19.2.2 martin exclude ${rc_exclude_scripts})"
922 1.19.2.2 martin compare_dir "$op" "${SRC_DIR}/etc/defaults" "${DEST_DIR}/etc/defaults" \
923 1.19.2.2 martin 444 \
924 1.19.2.2 martin ${rc_default_conf_files}
925 1.19.2.2 martin failed=$(( ${failed} + $? ))
926 1.19.2.2 martin
927 1.19.2.2 martin
928 1.19.2.2 martin return ${failed}
929 1.19.2.2 martin }
930 1.19.2.2 martin
931 1.19.2.2 martin #
932 1.19.2.2 martin # dhcpcd
933 1.19.2.2 martin #
934 1.19.2.2 martin additem dhcpcd "dhcpcd configuration is up to date"
935 1.19.2.2 martin do_dhcpcd()
936 1.19.2.2 martin {
937 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_dhcpcd fix|check"
938 1.19.2.2 martin op="$1"
939 1.19.2.2 martin failed=0
940 1.19.2.2 martin
941 1.19.2.2 martin find_file_in_dirlist dhcpcd.conf "dhcpcd.conf" \
942 1.19.2.2 martin "${SRC_DIR}/external/bsd/dhcpcd/dist/src" \
943 1.19.2.2 martin "${SRC_DIR}/etc" || return 1
944 1.19.2.2 martin # ${dir} is set by find_file_in_dirlist()
945 1.19.2.2 martin populate_dir "$op" true "${dir}" "${DEST_DIR}/etc" 644 dhcpcd.conf
946 1.19.2.2 martin failed=$(( ${failed} + $? ))
947 1.19.2.2 martin
948 1.19.2.2 martin dstdir="${DEST_DIR}/var/chroot/dhcpcd"
949 1.19.2.2 martin
950 1.19.2.2 martin check_dir "${op}" "${dstdir}/var/db/dhcpcd" 755
951 1.19.2.2 martin failed=$(( ${failed} + $? ))
952 1.19.2.2 martin
953 1.19.2.2 martin move_file "${op}" \
954 1.19.2.2 martin "${DEST_DIR}/etc/dhcpcd.duid" \
955 1.19.2.2 martin "${dstdir}/var/db/dhcpcd/duid"
956 1.19.2.2 martin failed=$(( ${failed} + $? ))
957 1.19.2.2 martin
958 1.19.2.2 martin move_file "${op}" \
959 1.19.2.2 martin "${DEST_DIR}/etc/dhcpcd.secret" \
960 1.19.2.2 martin "${dstdir}/var/db/dhcpcd/secret"
961 1.19.2.2 martin failed=$(( ${failed} + $? ))
962 1.19.2.2 martin
963 1.19.2.2 martin move_file "${op}" \
964 1.19.2.2 martin "${DEST_DIR}/var/db/dhcpcd-rdm.monotonic" \
965 1.19.2.2 martin "${dstdir}/var/db/dhcpcd/rdm_monotonic"
966 1.19.2.2 martin failed=$(( ${failed} + $? ))
967 1.19.2.2 martin
968 1.19.2.2 martin for lease in "${DEST_DIR}/var/db/dhcpcd-"*.lease*; do
969 1.19.2.2 martin [ -f "${lease}" ] || continue
970 1.19.2.2 martin new_lease=$(basename "${lease}" | ${SED} -e 's/dhcpcd-//')
971 1.19.2.2 martin new_lease="${dstdir}/var/db/dhcpcd/${new_lease}"
972 1.19.2.2 martin move_file "${op}" "${lease}" "${new_lease}"
973 1.19.2.2 martin failed=$(( ${failed} + $? ))
974 1.19.2.2 martin done
975 1.19.2.2 martin
976 1.19.2.2 martin move_file "${op}" \
977 1.19.2.2 martin "${DEST_DIR}/var/db/dhcpcd/duid" \
978 1.19.2.2 martin "${dstdir}/var/db/dhcpcd/duid"
979 1.19.2.2 martin failed=$(( ${failed} + $? ))
980 1.19.2.2 martin
981 1.19.2.2 martin move_file "${op}" \
982 1.19.2.2 martin "${DEST_DIR}/var/db/dhcpcd/secret" \
983 1.19.2.2 martin "${dstdir}/var/db/dhcpcd/secret"
984 1.19.2.2 martin failed=$(( ${failed} + $? ))
985 1.19.2.2 martin
986 1.19.2.2 martin move_file "${op}" \
987 1.19.2.2 martin "${DEST_DIR}/var/db/dhcpcd/rdm_monotonic" \
988 1.19.2.2 martin "${dstdir}/var/db/dhcpcd/rdm_monotonic"
989 1.19.2.2 martin failed=$(( ${failed} + $? ))
990 1.19.2.2 martin
991 1.19.2.2 martin for lease in "${DEST_DIR}/var/db/dhcpcd/"*.lease*; do
992 1.19.2.2 martin [ -f "${lease}" ] || continue
993 1.19.2.2 martin new_lease="${dstdir}/var/db/dhcpcd/$(basename ${lease})"
994 1.19.2.2 martin move_file "${op}" "${lease}" "${new_lease}"
995 1.19.2.2 martin failed=$(( ${failed} + $? ))
996 1.19.2.2 martin done
997 1.19.2.2 martin
998 1.19.2.2 martin contents_owner "${op}" "${dstdir}/var/db/dhcpcd" _dhcpcd _dhcpcd
999 1.19.2.2 martin failed=$(( ${failed} + $? ))
1000 1.19.2.2 martin
1001 1.19.2.2 martin return ${failed}
1002 1.19.2.2 martin }
1003 1.19.2.2 martin
1004 1.19.2.2 martin #
1005 1.19.2.2 martin # dhcpcdrundir
1006 1.19.2.2 martin #
1007 1.19.2.2 martin additem dhcpcdrundir "accidentaly created /@RUNDIR@ does not exist"
1008 1.19.2.2 martin do_dhcpcdrundir()
1009 1.19.2.2 martin {
1010 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_dhcpcdrundir fix|check"
1011 1.19.2.2 martin op="$1"
1012 1.19.2.2 martin failed=0
1013 1.19.2.2 martin
1014 1.19.2.2 martin if [ -d "${DEST_DIR}/@RUNDIR@" ]; then
1015 1.19.2.2 martin if [ "${op}" = "check" ]; then
1016 1.19.2.2 martin msg "Remove eroneously created /@RUNDIR@"
1017 1.19.2.2 martin failed=1
1018 1.19.2.2 martin elif ! rm -r "${DEST_DIR}/@RUNDIR@"; then
1019 1.19.2.2 martin msg "Failed to remove ${DEST_DIR}/@RUNDIR@"
1020 1.19.2.2 martin failed=1
1021 1.19.2.2 martin else
1022 1.19.2.2 martin msg "Removed eroneously created ${DEST_DIR}/@RUNDIR@"
1023 1.19.2.2 martin fi
1024 1.19.2.2 martin fi
1025 1.19.2.2 martin return ${failed}
1026 1.19.2.2 martin }
1027 1.19.2.2 martin
1028 1.19.2.2 martin #
1029 1.19.2.2 martin # envsys
1030 1.19.2.2 martin #
1031 1.19.2.2 martin additem envsys "envsys configuration is up to date"
1032 1.19.2.2 martin do_envsys()
1033 1.19.2.2 martin {
1034 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_envsys fix|check"
1035 1.19.2.2 martin local op="$1"
1036 1.19.2.2 martin local failed=0
1037 1.19.2.2 martin local etcsets=$(getetcsets)
1038 1.19.2.2 martin
1039 1.19.2.2 martin populate_dir "$op" true "${SRC_DIR}/etc" "${DEST_DIR}/etc" 644 \
1040 1.19.2.2 martin envsys.conf
1041 1.19.2.2 martin failed=$(( ${failed} + $? ))
1042 1.19.2.2 martin
1043 1.19.2.2 martin local powerd_scripts="$(select_set_files /etc/powerd/scripts/ \
1044 1.19.2.2 martin "/etc/powerd/scripts/\([^[:space:]/]*\)" ${etcsets})"
1045 1.19.2.2 martin
1046 1.19.2.2 martin populate_dir "$op" true "${SRC_DIR}/etc/powerd/scripts" \
1047 1.19.2.2 martin "${DEST_DIR}/etc/powerd/scripts" \
1048 1.19.2.2 martin 555 \
1049 1.19.2.2 martin ${powerd_scripts}
1050 1.19.2.2 martin failed=$(( ${failed} + $? ))
1051 1.19.2.2 martin
1052 1.19.2.2 martin return ${failed}
1053 1.19.2.2 martin }
1054 1.19.2.2 martin
1055 1.19.2.2 martin #
1056 1.19.2.2 martin # autofs config files
1057 1.19.2.2 martin #
1058 1.19.2.2 martin additem autofsconfig "automounter configuration files"
1059 1.19.2.2 martin do_autofsconfig()
1060 1.19.2.2 martin {
1061 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_autofsconfig fix|check"
1062 1.19.2.2 martin local autofs_files="
1063 1.19.2.2 martin include_ldap
1064 1.19.2.2 martin include_nis
1065 1.19.2.2 martin special_hosts
1066 1.19.2.2 martin special_media
1067 1.19.2.2 martin special_noauto
1068 1.19.2.2 martin special_null
1069 1.19.2.2 martin "
1070 1.19.2.2 martin op="$1"
1071 1.19.2.2 martin failed=0
1072 1.19.2.2 martin if [ "$op" = "fix" ]; then
1073 1.19.2.2 martin mkdir -p "${DEST_DIR}/etc/autofs"
1074 1.19.2.2 martin fi
1075 1.19.2.2 martin failed=$(( ${failed} + $? ))
1076 1.19.2.2 martin populate_dir "$op" false "${SRC_DIR}/etc" \
1077 1.19.2.2 martin "${DEST_DIR}/etc" \
1078 1.19.2.2 martin 644 \
1079 1.19.2.2 martin auto_master
1080 1.19.2.2 martin failed=$(( ${failed} + $? ))
1081 1.19.2.2 martin populate_dir "$op" false "${SRC_DIR}/etc/autofs" \
1082 1.19.2.2 martin "${DEST_DIR}/etc/autofs" \
1083 1.19.2.2 martin 644 \
1084 1.19.2.2 martin ${autofs_files}
1085 1.19.2.2 martin return ${failed}
1086 1.19.2.2 martin }
1087 1.19.2.2 martin
1088 1.19.2.2 martin
1089 1.19.2.2 martin #
1090 1.19.2.2 martin # X11 fontconfig
1091 1.19.2.2 martin #
1092 1.19.2.2 martin additem fontconfig "X11 font configuration is up to date"
1093 1.19.2.2 martin do_fontconfig()
1094 1.19.2.2 martin {
1095 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_fontconfig fix|check"
1096 1.19.2.2 martin op="$1"
1097 1.19.2.2 martin failed=0
1098 1.19.2.2 martin
1099 1.19.2.2 martin # First, check for updates we can handle.
1100 1.19.2.2 martin if ! $SOURCEMODE; then
1101 1.19.2.2 martin FONTCONFIG_DIR="${SRC_DIR}/etc/fonts/conf.avail"
1102 1.19.2.2 martin else
1103 1.19.2.2 martin FONTCONFIG_DIR="${XSRC_DIR}/external/mit/fontconfig/dist/conf.d"
1104 1.19.2.2 martin fi
1105 1.19.2.2 martin
1106 1.19.2.2 martin if [ ! -d "${FONTCONFIG_DIR}" ]; then
1107 1.19.2.2 martin msg "${FONTCONFIG_DIR} is not a directory; skipping check"
1108 1.19.2.2 martin return 0
1109 1.19.2.2 martin fi
1110 1.19.2.2 martin local regular_fonts="
1111 1.19.2.2 martin 10-autohint.conf
1112 1.19.2.2 martin 10-no-sub-pixel.conf
1113 1.19.2.2 martin 10-scale-bitmap-fonts.conf
1114 1.19.2.2 martin 10-sub-pixel-bgr.conf
1115 1.19.2.2 martin 10-sub-pixel-rgb.conf
1116 1.19.2.2 martin 10-sub-pixel-vbgr.conf
1117 1.19.2.2 martin 10-sub-pixel-vrgb.conf
1118 1.19.2.2 martin 10-unhinted.conf
1119 1.19.2.2 martin 11-lcdfilter-default.conf
1120 1.19.2.2 martin 11-lcdfilter-legacy.conf
1121 1.19.2.2 martin 11-lcdfilter-light.conf
1122 1.19.2.2 martin 20-unhint-small-vera.conf
1123 1.19.2.2 martin 25-unhint-nonlatin.conf
1124 1.19.2.2 martin 30-metric-aliases.conf
1125 1.19.2.2 martin 40-nonlatin.conf
1126 1.19.2.2 martin 45-generic.conf
1127 1.19.2.2 martin 45-latin.conf
1128 1.19.2.2 martin 49-sansserif.conf
1129 1.19.2.2 martin 50-user.conf
1130 1.19.2.2 martin 51-local.conf
1131 1.19.2.2 martin 60-generic.conf
1132 1.19.2.2 martin 60-latin.conf
1133 1.19.2.2 martin 65-fonts-persian.conf
1134 1.19.2.2 martin 65-khmer.conf
1135 1.19.2.2 martin 65-nonlatin.conf
1136 1.19.2.2 martin 69-unifont.conf
1137 1.19.2.2 martin 70-no-bitmaps.conf
1138 1.19.2.2 martin 70-yes-bitmaps.conf
1139 1.19.2.2 martin 80-delicious.conf
1140 1.19.2.2 martin 90-synthetic.conf
1141 1.19.2.2 martin "
1142 1.19.2.2 martin populate_dir "$op" false "${FONTCONFIG_DIR}" \
1143 1.19.2.2 martin "${DEST_DIR}/etc/fonts/conf.avail" \
1144 1.19.2.2 martin 444 \
1145 1.19.2.2 martin ${regular_fonts}
1146 1.19.2.2 martin failed=$(( ${failed} + $? ))
1147 1.19.2.2 martin
1148 1.19.2.2 martin if ! $SOURCEMODE; then
1149 1.19.2.2 martin FONTS_DIR="${SRC_DIR}/etc/fonts"
1150 1.19.2.2 martin else
1151 1.19.2.2 martin FONTS_DIR="${SRC_DIR}/external/mit/xorg/lib/fontconfig/etc"
1152 1.19.2.2 martin fi
1153 1.19.2.2 martin
1154 1.19.2.2 martin populate_dir "$op" false "${FONTS_DIR}" "${DEST_DIR}/etc/fonts" 444 \
1155 1.19.2.2 martin fonts.conf
1156 1.19.2.2 martin failed=$(( ${failed} + $? ))
1157 1.19.2.2 martin
1158 1.19.2.2 martin # We can't modify conf.d easily; someone might have removed a file.
1159 1.19.2.2 martin
1160 1.19.2.2 martin # Look for old files that need to be deleted.
1161 1.19.2.2 martin obsolete_fonts="
1162 1.19.2.2 martin 10-autohint.conf
1163 1.19.2.2 martin 10-no-sub-pixel.conf
1164 1.19.2.2 martin 10-sub-pixel-bgr.conf
1165 1.19.2.2 martin 10-sub-pixel-rgb.conf
1166 1.19.2.2 martin 10-sub-pixel-vbgr.conf
1167 1.19.2.2 martin 10-sub-pixel-vrgb.conf
1168 1.19.2.2 martin 10-unhinted.conf
1169 1.19.2.2 martin 25-unhint-nonlatin.conf
1170 1.19.2.2 martin 65-khmer.conf
1171 1.19.2.2 martin 70-no-bitmaps.conf
1172 1.19.2.2 martin 70-yes-bitmaps.conf
1173 1.19.2.2 martin "
1174 1.19.2.2 martin failed_fonts=""
1175 1.19.2.2 martin for i in ${obsolete_fonts}; do
1176 1.19.2.2 martin if [ -f "${DEST_DIR}/etc/fonts/conf.d/$i" ]; then
1177 1.19.2.2 martin conf_d_failed=1
1178 1.19.2.2 martin failed_fonts="$failed_fonts $i"
1179 1.19.2.2 martin fi
1180 1.19.2.2 martin done
1181 1.19.2.2 martin
1182 1.19.2.2 martin if [ -n "$failed_fonts" ]; then
1183 1.19.2.2 martin msg \
1184 1.19.2.2 martin "Broken fontconfig configuration found; please delete these files:"
1185 1.19.2.2 martin msg "[$failed_fonts]"
1186 1.19.2.2 martin failed=$(( ${failed} + 1 ))
1187 1.19.2.2 martin fi
1188 1.19.2.2 martin
1189 1.19.2.2 martin return ${failed}
1190 1.19.2.2 martin }
1191 1.19.2.2 martin
1192 1.19.2.2 martin #
1193 1.19.2.2 martin # gid
1194 1.19.2.2 martin #
1195 1.19.2.2 martin additem gid "required groups in /etc/group"
1196 1.19.2.2 martin do_gid()
1197 1.19.2.2 martin {
1198 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_gid fix|check"
1199 1.19.2.2 martin
1200 1.19.2.2 martin check_ids "$1" groups "${DEST_DIR}/etc/group" \
1201 1.19.2.2 martin "${SRC_DIR}/etc/group" 14 \
1202 1.19.2.2 martin named ntpd sshd SKIP _pflogd _rwhod staff _proxy _timedc \
1203 1.19.2.2 martin _sdpd _httpd _mdnsd _tests _tcpdump _tss _gpio _rtadvd SKIP \
1204 1.19.2.2 martin _unbound _nsd nvmm _dhcpcd
1205 1.19.2.2 martin }
1206 1.19.2.2 martin
1207 1.19.2.2 martin #
1208 1.19.2.2 martin # gpio
1209 1.19.2.2 martin #
1210 1.19.2.2 martin additem gpio "gpio configuration is up to date"
1211 1.19.2.2 martin do_gpio()
1212 1.19.2.2 martin {
1213 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_gpio fix|check"
1214 1.19.2.2 martin op="$1"
1215 1.19.2.2 martin failed=0
1216 1.19.2.2 martin
1217 1.19.2.2 martin populate_dir "$op" true "${SRC_DIR}/etc" "${DEST_DIR}/etc" 644 \
1218 1.19.2.2 martin gpio.conf
1219 1.19.2.2 martin failed=$(( ${failed} + $? ))
1220 1.19.2.2 martin
1221 1.19.2.2 martin return ${failed}
1222 1.19.2.2 martin }
1223 1.19.2.2 martin
1224 1.19.2.2 martin #
1225 1.19.2.2 martin # hosts
1226 1.19.2.2 martin #
1227 1.19.2.2 martin additem hosts "/etc/hosts being up to date"
1228 1.19.2.2 martin do_hosts()
1229 1.19.2.2 martin {
1230 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_hosts fix|check"
1231 1.19.2.2 martin
1232 1.19.2.2 martin modify_file "$1" "${DEST_DIR}/etc/hosts" "${SCRATCHDIR}/hosts" '
1233 1.19.2.2 martin /^(127\.0\.0\.1|::1)[ ]+[^\.]*$/ {
1234 1.19.2.2 martin print $0, "localhost."
1235 1.19.2.2 martin next
1236 1.19.2.2 martin }
1237 1.19.2.2 martin { print }
1238 1.19.2.2 martin '
1239 1.19.2.2 martin return $?
1240 1.19.2.2 martin }
1241 1.19.2.2 martin
1242 1.19.2.2 martin #
1243 1.19.2.2 martin # iscsi
1244 1.19.2.2 martin #
1245 1.19.2.2 martin additem iscsi "/etc/iscsi is populated"
1246 1.19.2.2 martin do_iscsi()
1247 1.19.2.2 martin {
1248 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_iscsi fix|check"
1249 1.19.2.2 martin
1250 1.19.2.2 martin populate_dir "${op}" true \
1251 1.19.2.2 martin "${SRC_DIR}/etc/iscsi" "${DEST_DIR}/etc/iscsi" 600 auths
1252 1.19.2.2 martin populate_dir "${op}" true \
1253 1.19.2.2 martin "${SRC_DIR}/etc/iscsi" "${DEST_DIR}/etc/iscsi" 644 targets
1254 1.19.2.2 martin return $?
1255 1.19.2.2 martin }
1256 1.19.2.2 martin
1257 1.19.2.2 martin #
1258 1.19.2.2 martin # makedev
1259 1.19.2.2 martin #
1260 1.19.2.2 martin additem makedev "/dev/MAKEDEV being up to date"
1261 1.19.2.2 martin do_makedev()
1262 1.19.2.2 martin {
1263 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_makedev fix|check"
1264 1.19.2.2 martin failed=0
1265 1.19.2.2 martin
1266 1.19.2.2 martin if [ -f "${SRC_DIR}/etc/MAKEDEV.tmpl" ]; then
1267 1.19.2.2 martin # generate MAKEDEV from source if source is available
1268 1.19.2.2 martin env MACHINE="${MACHINE}" \
1269 1.19.2.2 martin MACHINE_ARCH="${MACHINE_ARCH}" \
1270 1.19.2.2 martin NETBSDSRCDIR="${SRC_DIR}" \
1271 1.19.2.2 martin ${AWK} -f "${SRC_DIR}/etc/MAKEDEV.awk" \
1272 1.19.2.2 martin "${SRC_DIR}/etc/MAKEDEV.tmpl" > "${SCRATCHDIR}/MAKEDEV"
1273 1.19.2.2 martin fi
1274 1.19.2.2 martin
1275 1.19.2.2 martin find_file_in_dirlist MAKEDEV "MAKEDEV" \
1276 1.19.2.2 martin "${SCRATCHDIR}" "${SRC_DIR}/dev" \
1277 1.19.2.2 martin || return 1
1278 1.19.2.2 martin # ${dir} is set by find_file_in_dirlist()
1279 1.19.2.2 martin find_makedev
1280 1.19.2.2 martin compare_dir "$1" "${dir}" "${MAKEDEV_DIR}" 555 MAKEDEV
1281 1.19.2.2 martin failed=$(( ${failed} + $? ))
1282 1.19.2.2 martin
1283 1.19.2.2 martin find_file_in_dirlist MAKEDEV.local "MAKEDEV.local" \
1284 1.19.2.2 martin "${SRC_DIR}/etc" "${SRC_DIR}/dev" \
1285 1.19.2.2 martin || return 1
1286 1.19.2.2 martin # ${dir} is set by find_file_in_dirlist()
1287 1.19.2.2 martin compare_dir "$1" "${dir}" "${DEST_DIR}/dev" 555 MAKEDEV.local
1288 1.19.2.2 martin failed=$(( ${failed} + $? ))
1289 1.19.2.2 martin
1290 1.19.2.2 martin return ${failed}
1291 1.19.2.2 martin }
1292 1.19.2.2 martin
1293 1.19.2.2 martin #
1294 1.19.2.2 martin # motd
1295 1.19.2.2 martin #
1296 1.19.2.2 martin additem motd "contents of motd"
1297 1.19.2.2 martin do_motd()
1298 1.19.2.2 martin {
1299 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_motd fix|check"
1300 1.19.2.2 martin
1301 1.19.2.2 martin if ${GREP} -i 'http://www.NetBSD.org/Misc/send-pr.html' \
1302 1.19.2.2 martin "${DEST_DIR}/etc/motd" >/dev/null 2>&1 \
1303 1.19.2.2 martin || ${GREP} -i 'https*://www.NetBSD.org/support/send-pr.html' \
1304 1.19.2.2 martin "${DEST_DIR}/etc/motd" >/dev/null 2>&1
1305 1.19.2.2 martin then
1306 1.19.2.2 martin tmp1="$(mktemp /tmp/postinstall.motd.XXXXXXXX)"
1307 1.19.2.2 martin tmp2="$(mktemp /tmp/postinstall.motd.XXXXXXXX)"
1308 1.19.2.2 martin ${SED} '1,2d' <"${SRC_DIR}/etc/motd" >"${tmp1}"
1309 1.19.2.2 martin ${SED} '1,2d' <"${DEST_DIR}/etc/motd" >"${tmp2}"
1310 1.19.2.2 martin
1311 1.19.2.2 martin if [ "$1" = check ]; then
1312 1.19.2.2 martin cmp -s "${tmp1}" "${tmp2}"
1313 1.19.2.2 martin result=$?
1314 1.19.2.2 martin if [ "${result}" -ne 0 ]; then
1315 1.19.2.2 martin msg \
1316 1.19.2.2 martin "Bug reporting messages do not seem to match the installed release"
1317 1.19.2.2 martin fi
1318 1.19.2.2 martin else
1319 1.19.2.2 martin head -n 2 "${DEST_DIR}/etc/motd" >"${tmp1}"
1320 1.19.2.2 martin ${SED} '1,2d' <"${SRC_DIR}/etc/motd" >>"${tmp1}"
1321 1.19.2.2 martin cp "${tmp1}" "${DEST_DIR}/etc/motd"
1322 1.19.2.2 martin result=0
1323 1.19.2.2 martin fi
1324 1.19.2.2 martin
1325 1.19.2.2 martin rm -f "${tmp1}" "${tmp2}"
1326 1.19.2.2 martin else
1327 1.19.2.2 martin result=0
1328 1.19.2.2 martin fi
1329 1.19.2.2 martin
1330 1.19.2.2 martin return ${result}
1331 1.19.2.2 martin }
1332 1.19.2.2 martin
1333 1.19.2.2 martin #
1334 1.19.2.2 martin # mtree
1335 1.19.2.2 martin #
1336 1.19.2.2 martin additem mtree "/etc/mtree/ being up to date"
1337 1.19.2.2 martin do_mtree()
1338 1.19.2.2 martin {
1339 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_mtree fix|check"
1340 1.19.2.2 martin failed=0
1341 1.19.2.2 martin
1342 1.19.2.2 martin compare_dir "$1" "${SRC_DIR}/etc/mtree" "${DEST_DIR}/etc/mtree" 444 special
1343 1.19.2.2 martin failed=$(( ${failed} + $? ))
1344 1.19.2.2 martin
1345 1.19.2.2 martin if ! $SOURCEMODE; then
1346 1.19.2.2 martin MTREE_DIR="${SRC_DIR}/etc/mtree"
1347 1.19.2.2 martin else
1348 1.19.2.2 martin /bin/rm -rf "${SCRATCHDIR}/obj"
1349 1.19.2.2 martin mkdir "${SCRATCHDIR}/obj"
1350 1.19.2.2 martin ${MAKE} -s -C "${SRC_DIR}/etc/mtree" TOOL_AWK="${AWK}" \
1351 1.19.2.2 martin MAKEOBJDIR="${SCRATCHDIR}/obj" emit_dist_file > \
1352 1.19.2.2 martin "${SCRATCHDIR}/NetBSD.dist"
1353 1.19.2.2 martin MTREE_DIR="${SCRATCHDIR}"
1354 1.19.2.2 martin /bin/rm -rf "${SCRATCHDIR}/obj"
1355 1.19.2.2 martin fi
1356 1.19.2.2 martin compare_dir "$1" "${MTREE_DIR}" "${DEST_DIR}/etc/mtree" 444 NetBSD.dist
1357 1.19.2.2 martin failed=$(( ${failed} + $? ))
1358 1.19.2.2 martin
1359 1.19.2.2 martin return ${failed}
1360 1.19.2.2 martin }
1361 1.19.2.2 martin
1362 1.19.2.2 martin #
1363 1.19.2.2 martin # named
1364 1.19.2.2 martin #
1365 1.19.2.2 martin additem named "named configuration update"
1366 1.19.2.2 martin do_named()
1367 1.19.2.2 martin {
1368 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_named fix|check"
1369 1.19.2.2 martin op="$1"
1370 1.19.2.2 martin
1371 1.19.2.2 martin move_file "${op}" \
1372 1.19.2.2 martin "${DEST_DIR}/etc/namedb/named.conf" \
1373 1.19.2.2 martin "${DEST_DIR}/etc/named.conf"
1374 1.19.2.2 martin
1375 1.19.2.2 martin compare_dir "${op}" "${SRC_DIR}/etc/namedb" "${DEST_DIR}/etc/namedb" \
1376 1.19.2.2 martin 644 \
1377 1.19.2.2 martin root.cache
1378 1.19.2.2 martin }
1379 1.19.2.2 martin
1380 1.19.2.2 martin #
1381 1.19.2.2 martin # pam
1382 1.19.2.2 martin #
1383 1.19.2.2 martin additem pam "/etc/pam.d is populated"
1384 1.19.2.2 martin do_pam()
1385 1.19.2.2 martin {
1386 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_pam fix|check"
1387 1.19.2.2 martin op="$1"
1388 1.19.2.2 martin failed=0
1389 1.19.2.2 martin
1390 1.19.2.2 martin populate_dir "${op}" true "${SRC_DIR}/etc/pam.d" \
1391 1.19.2.2 martin "${DEST_DIR}/etc/pam.d" 644 \
1392 1.19.2.2 martin README cron display_manager ftpd gdm imap kde login other \
1393 1.19.2.2 martin passwd pop3 ppp racoon rexecd rsh sshd su system telnetd \
1394 1.19.2.2 martin xdm xserver
1395 1.19.2.2 martin
1396 1.19.2.2 martin failed=$(( ${failed} + $? ))
1397 1.19.2.2 martin
1398 1.19.2.2 martin return ${failed}
1399 1.19.2.2 martin }
1400 1.19.2.2 martin
1401 1.19.2.2 martin #
1402 1.19.2.2 martin # periodic
1403 1.19.2.2 martin #
1404 1.19.2.2 martin additem periodic "/etc/{daily,weekly,monthly,security} being up to date"
1405 1.19.2.2 martin do_periodic()
1406 1.19.2.2 martin {
1407 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_periodic fix|check"
1408 1.19.2.2 martin
1409 1.19.2.2 martin compare_dir "$1" "${SRC_DIR}/etc" "${DEST_DIR}/etc" 644 \
1410 1.19.2.2 martin daily weekly monthly security
1411 1.19.2.2 martin }
1412 1.19.2.2 martin
1413 1.19.2.2 martin #
1414 1.19.2.2 martin # pf
1415 1.19.2.2 martin #
1416 1.19.2.2 martin additem pf "pf configuration being up to date"
1417 1.19.2.2 martin do_pf()
1418 1.19.2.2 martin {
1419 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_pf fix|check"
1420 1.19.2.2 martin op="$1"
1421 1.19.2.2 martin failed=0
1422 1.19.2.2 martin
1423 1.19.2.2 martin find_file_in_dirlist pf.os "pf.os" \
1424 1.19.2.2 martin "${SRC_DIR}/dist/pf/etc" "${SRC_DIR}/etc" \
1425 1.19.2.2 martin || return 1
1426 1.19.2.2 martin # ${dir} is set by find_file_in_dirlist()
1427 1.19.2.2 martin populate_dir "${op}" true \
1428 1.19.2.2 martin "${dir}" "${DEST_DIR}/etc" 644 \
1429 1.19.2.2 martin pf.conf
1430 1.19.2.2 martin failed=$(( ${failed} + $? ))
1431 1.19.2.2 martin
1432 1.19.2.2 martin compare_dir "${op}" "${dir}" "${DEST_DIR}/etc" 444 pf.os
1433 1.19.2.2 martin failed=$(( ${failed} + $? ))
1434 1.19.2.2 martin
1435 1.19.2.2 martin return ${failed}
1436 1.19.2.2 martin }
1437 1.19.2.2 martin
1438 1.19.2.2 martin #
1439 1.19.2.2 martin # pwd_mkdb
1440 1.19.2.2 martin #
1441 1.19.2.2 martin additem pwd_mkdb "passwd database version"
1442 1.19.2.2 martin do_pwd_mkdb()
1443 1.19.2.2 martin {
1444 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_pwd_mkdb fix|check"
1445 1.19.2.2 martin op="$1"
1446 1.19.2.2 martin failed=0
1447 1.19.2.2 martin
1448 1.19.2.2 martin # XXX Ideally, we should figure out the endianness of the
1449 1.19.2.2 martin # target machine, and add "-E B"/"-E L" to the db(1) flags,
1450 1.19.2.2 martin # and "-B"/"-L" to the pwd_mkdb(8) flags if the target is not
1451 1.19.2.2 martin # the same as the host machine. It probably doesn't matter,
1452 1.19.2.2 martin # because we don't expect "postinstall fix pwd_mkdb" to be
1453 1.19.2.2 martin # invoked during a cross build.
1454 1.19.2.2 martin
1455 1.19.2.2 martin set -- $(${DB} -q -Sb -Ub -To -N hash "${DEST_DIR}/etc/pwd.db" \
1456 1.19.2.2 martin 'VERSION\0')
1457 1.19.2.2 martin case "$2" in
1458 1.19.2.2 martin '\001\000\000\000') return 0 ;; # version 1, little-endian
1459 1.19.2.2 martin '\000\000\000\001') return 0 ;; # version 1, big-endian
1460 1.19.2.2 martin esac
1461 1.19.2.2 martin
1462 1.19.2.2 martin if [ "${op}" = "check" ]; then
1463 1.19.2.2 martin msg "Update format of passwd database"
1464 1.19.2.2 martin failed=1
1465 1.19.2.2 martin elif ! ${PWD_MKDB} -V 1 -d "${DEST_DIR:-/}" \
1466 1.19.2.2 martin "${DEST_DIR}/etc/master.passwd";
1467 1.19.2.2 martin then
1468 1.19.2.2 martin msg "Can't update format of passwd database"
1469 1.19.2.2 martin failed=1
1470 1.19.2.2 martin else
1471 1.19.2.2 martin msg "Updated format of passwd database"
1472 1.19.2.2 martin fi
1473 1.19.2.2 martin
1474 1.19.2.2 martin return ${failed}
1475 1.19.2.2 martin }
1476 1.19.2.2 martin
1477 1.19.2.2 martin #
1478 1.19.2.2 martin # rc
1479 1.19.2.2 martin #
1480 1.19.2.2 martin
1481 1.19.2.2 martin # There is no info in src/distrib or /etc/mtree which rc* files
1482 1.19.2.2 martin # can be overwritten unconditionally on upgrade. See PR/54741.
1483 1.19.2.2 martin rc_644_files="
1484 1.19.2.2 martin rc
1485 1.19.2.2 martin rc.subr
1486 1.19.2.2 martin rc.shutdown
1487 1.19.2.2 martin "
1488 1.19.2.2 martin
1489 1.19.2.2 martin rc_obsolete_vars="
1490 1.19.2.2 martin amd amd_master
1491 1.19.2.2 martin btcontrol btcontrol_devices
1492 1.19.2.2 martin critical_filesystems critical_filesystems_beforenet
1493 1.19.2.2 martin mountcritlocal mountcritremote
1494 1.19.2.2 martin network ip6forwarding
1495 1.19.2.2 martin network nfsiod_flags
1496 1.19.2.2 martin sdpd sdpd_control
1497 1.19.2.2 martin sdpd sdpd_groupname
1498 1.19.2.2 martin sdpd sdpd_username
1499 1.19.2.2 martin sysctl defcorename
1500 1.19.2.2 martin "
1501 1.19.2.2 martin
1502 1.19.2.2 martin update_rc()
1503 1.19.2.2 martin {
1504 1.19.2.2 martin local op=$1
1505 1.19.2.2 martin local dir=$2
1506 1.19.2.2 martin local name=$3
1507 1.19.2.2 martin local bindir=$4
1508 1.19.2.2 martin local rcdir=$5
1509 1.19.2.2 martin
1510 1.19.2.2 martin if [ ! -x "${DEST_DIR}/${bindir}/${name}" ]; then
1511 1.19.2.2 martin return 0
1512 1.19.2.2 martin fi
1513 1.19.2.2 martin
1514 1.19.2.2 martin if ! find_file_in_dirlist "${name}" "${name}" \
1515 1.19.2.2 martin "${rcdir}" "${SRC_DIR}/etc/rc.d"; then
1516 1.19.2.2 martin return 1
1517 1.19.2.2 martin fi
1518 1.19.2.2 martin populate_dir "${op}" false "${dir}" "${DEST_DIR}/etc/rc.d" 555 "${name}"
1519 1.19.2.2 martin return $?
1520 1.19.2.2 martin }
1521 1.19.2.2 martin
1522 1.19.2.2 martin # select non-obsolete files in a sets file
1523 1.19.2.2 martin # $1: directory pattern
1524 1.19.2.2 martin # $2: file pattern
1525 1.19.2.2 martin # $3: filename
1526 1.19.2.2 martin select_set_files()
1527 1.19.2.2 martin {
1528 1.19.2.2 martin local qdir="$(echo $1 | ${SED} -e s@/@\\\\/@g -e s/\\./\\\\./g)"
1529 1.19.2.2 martin ${SED} -n -e /obsolete/d \
1530 1.19.2.2 martin -e "/^\.${qdir}/s@^.$2[[:space:]].*@\1@p" $3
1531 1.19.2.2 martin }
1532 1.19.2.2 martin
1533 1.19.2.2 martin # select obsolete files in a sets file
1534 1.19.2.2 martin # $1: directory pattern
1535 1.19.2.2 martin # $2: file pattern
1536 1.19.2.2 martin # $3: setname
1537 1.19.2.2 martin select_obsolete_files()
1538 1.19.2.2 martin {
1539 1.19.2.2 martin if $SOURCEMODE; then
1540 1.19.2.2 martin ${SED} -n -e "/obsolete/s@\.$1$2[[:space:]].*@\1@p" \
1541 1.19.2.2 martin ${SRC_DIR}/distrib/sets/lists/$3/mi
1542 1.19.2.2 martin return
1543 1.19.2.2 martin fi
1544 1.19.2.2 martin
1545 1.19.2.2 martin # On upgrade builds we don't extract the "etc" set so we
1546 1.19.2.2 martin # try to use the source set instead. See PR/54730 for
1547 1.19.2.2 martin # ways to better handle this.
1548 1.19.2.2 martin
1549 1.19.2.2 martin local obsolete_dir
1550 1.19.2.2 martin
1551 1.19.2.2 martin if [ $3 = "etc" ] ;then
1552 1.19.2.2 martin obsolete_dir=${SRC_DIR}/var/db/obsolete
1553 1.19.2.2 martin else
1554 1.19.2.2 martin obsolete_dir=${DEST_DIR}/var/db/obsolete
1555 1.19.2.2 martin fi
1556 1.19.2.2 martin ${SED} -n -e "s@\.$1$2\$@\1@p" "${obsolete_dir}/$3"
1557 1.19.2.2 martin }
1558 1.19.2.2 martin
1559 1.19.2.2 martin getetcsets()
1560 1.19.2.2 martin {
1561 1.19.2.2 martin if $SOURCEMODE; then
1562 1.19.2.2 martin echo "${SRC_DIR}/distrib/sets/lists/etc/mi"
1563 1.19.2.2 martin else
1564 1.19.2.2 martin echo "${SRC_DIR}/etc/mtree/set.etc"
1565 1.19.2.2 martin fi
1566 1.19.2.2 martin }
1567 1.19.2.2 martin
1568 1.19.2.2 martin additem rc "/etc/rc* and /etc/rc.d/ being up to date"
1569 1.19.2.2 martin do_rc()
1570 1.19.2.2 martin {
1571 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_rc fix|check"
1572 1.19.2.2 martin local op="$1"
1573 1.19.2.2 martin local failed=0
1574 1.19.2.2 martin local generated_scripts=""
1575 1.19.2.2 martin local etcsets=$(getetcsets)
1576 1.19.2.2 martin if [ "${MKX11}" != "no" ]; then
1577 1.19.2.2 martin generated_scripts="${generated_scripts} xdm xfs"
1578 1.19.2.2 martin fi
1579 1.19.2.2 martin
1580 1.19.2.2 martin # Directories of external programs that have rc files (in bsd)
1581 1.19.2.2 martin local rc_external_files="blacklist nsd unbound"
1582 1.19.2.2 martin
1583 1.19.2.2 martin # rc* files in /etc/
1584 1.19.2.2 martin # XXX: at least rc.conf and rc.local shouldn't be updated. PR/54741
1585 1.19.2.2 martin #local rc_644_files="$(select_set_files /etc/rc \
1586 1.19.2.2 martin # "/etc/\(rc[^[:space:]/]*\)" ${etcsets})"
1587 1.19.2.2 martin
1588 1.19.2.2 martin # no-obsolete rc files in /etc/rc.d
1589 1.19.2.2 martin local rc_555_files="$(select_set_files /etc/rc.d/ \
1590 1.19.2.2 martin "/etc/rc\.d/\([^[:space:]]*\)" ${etcsets} | \
1591 1.19.2.2 martin exclude ${rc_external_files})"
1592 1.19.2.2 martin
1593 1.19.2.2 martin # obsolete rc file in /etc/rc.d
1594 1.19.2.2 martin local rc_obsolete_files="$(select_obsolete_files /etc/rc.d/ \
1595 1.19.2.2 martin "\([^[:space:]]*\)" etc)"
1596 1.19.2.2 martin
1597 1.19.2.2 martin compare_dir "${op}" "${SRC_DIR}/etc" "${DEST_DIR}/etc" 644 \
1598 1.19.2.2 martin ${rc_644_files}
1599 1.19.2.2 martin failed=$(( ${failed} + $? ))
1600 1.19.2.2 martin
1601 1.19.2.2 martin local extra_scripts
1602 1.19.2.2 martin if ! $SOURCEMODE; then
1603 1.19.2.2 martin extra_scripts="${generated_scripts}"
1604 1.19.2.2 martin else
1605 1.19.2.2 martin extra_scripts=""
1606 1.19.2.2 martin fi
1607 1.19.2.2 martin
1608 1.19.2.2 martin compare_dir "${op}" "${SRC_DIR}/etc/rc.d" "${DEST_DIR}/etc/rc.d" 555 \
1609 1.19.2.2 martin ${rc_555_files} \
1610 1.19.2.2 martin ${extra_scripts}
1611 1.19.2.2 martin failed=$(( ${failed} + $? ))
1612 1.19.2.2 martin
1613 1.19.2.2 martin for i in ${rc_external_files}; do
1614 1.19.2.2 martin local rc_file
1615 1.19.2.2 martin case $i in
1616 1.19.2.2 martin *d) rc_file=${i};;
1617 1.19.2.2 martin *) rc_file=${i}d;;
1618 1.19.2.2 martin esac
1619 1.19.2.2 martin
1620 1.19.2.2 martin update_rc "${op}" "${dir}" ${rc_file} /sbin \
1621 1.19.2.2 martin "${SRC_DIR}/external/bsd/$i/etc/rc.d"
1622 1.19.2.2 martin failed=$(( ${failed} + $? ))
1623 1.19.2.2 martin done
1624 1.19.2.2 martin
1625 1.19.2.2 martin if $SOURCEMODE && [ -n "${generated_scripts}" ]; then
1626 1.19.2.2 martin # generate scripts
1627 1.19.2.2 martin mkdir "${SCRATCHDIR}/rc"
1628 1.19.2.2 martin for f in ${generated_scripts}; do
1629 1.19.2.2 martin ${SED} -e "s,@X11ROOTDIR@,${X11ROOTDIR},g" \
1630 1.19.2.2 martin < "${SRC_DIR}/etc/rc.d/${f}.in" \
1631 1.19.2.2 martin > "${SCRATCHDIR}/rc/${f}"
1632 1.19.2.2 martin done
1633 1.19.2.2 martin compare_dir "${op}" "${SCRATCHDIR}/rc" \
1634 1.19.2.2 martin "${DEST_DIR}/etc/rc.d" 555 \
1635 1.19.2.2 martin ${generated_scripts}
1636 1.19.2.2 martin failed=$(( ${failed} + $? ))
1637 1.19.2.2 martin fi
1638 1.19.2.2 martin
1639 1.19.2.2 martin # check for obsolete rc.d files
1640 1.19.2.2 martin for f in ${rc_obsolete_files}; do
1641 1.19.2.2 martin local fd="/etc/rc.d/${f}"
1642 1.19.2.2 martin [ -e "${DEST_DIR}${fd}" ] && echo "${fd}"
1643 1.19.2.2 martin done | obsolete_paths "${op}"
1644 1.19.2.2 martin failed=$(( ${failed} + $? ))
1645 1.19.2.2 martin
1646 1.19.2.2 martin # check for obsolete rc.conf(5) variables
1647 1.19.2.2 martin set -- ${rc_obsolete_vars}
1648 1.19.2.2 martin while [ $# -gt 1 ]; do
1649 1.19.2.2 martin if rcconf_is_set "${op}" "$1" "$2" 1; then
1650 1.19.2.2 martin failed=1
1651 1.19.2.2 martin fi
1652 1.19.2.2 martin shift 2
1653 1.19.2.2 martin done
1654 1.19.2.2 martin
1655 1.19.2.2 martin return ${failed}
1656 1.19.2.2 martin }
1657 1.19.2.2 martin
1658 1.19.2.2 martin #
1659 1.19.2.2 martin # sendmail
1660 1.19.2.2 martin #
1661 1.19.2.2 martin adddisableditem sendmail "remove obsolete sendmail configuration files and scripts"
1662 1.19.2.2 martin do_sendmail()
1663 1.19.2.2 martin {
1664 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_sendmail fix|check"
1665 1.19.2.2 martin op="$1"
1666 1.19.2.2 martin failed=0
1667 1.19.2.2 martin
1668 1.19.2.2 martin # Don't complain if the "sendmail" package is installed because the
1669 1.19.2.2 martin # files might still be in use.
1670 1.19.2.2 martin if /usr/sbin/pkg_info -qe sendmail >/dev/null 2>&1; then
1671 1.19.2.2 martin return 0
1672 1.19.2.2 martin fi
1673 1.19.2.2 martin
1674 1.19.2.2 martin for f in /etc/mail/helpfile /etc/mail/local-host-names \
1675 1.19.2.2 martin /etc/mail/sendmail.cf /etc/mail/submit.cf /etc/rc.d/sendmail \
1676 1.19.2.2 martin /etc/rc.d/smmsp /usr/share/misc/sendmail.hf \
1677 1.19.2.2 martin $( ( find "${DEST_DIR}/usr/share/sendmail" -type f ; \
1678 1.19.2.2 martin find "${DEST_DIR}/usr/share/sendmail" -type d \
1679 1.19.2.2 martin ) | unprefix "${DEST_DIR}" ) \
1680 1.19.2.2 martin /var/log/sendmail.st \
1681 1.19.2.2 martin /var/spool/clientmqueue \
1682 1.19.2.2 martin /var/spool/mqueue
1683 1.19.2.2 martin do
1684 1.19.2.2 martin [ -e "${DEST_DIR}${f}" ] && echo "${f}"
1685 1.19.2.2 martin done | obsolete_paths "${op}"
1686 1.19.2.2 martin failed=$(( ${failed} + $? ))
1687 1.19.2.2 martin
1688 1.19.2.2 martin return ${failed}
1689 1.19.2.2 martin }
1690 1.19.2.2 martin
1691 1.19.2.2 martin #
1692 1.19.2.2 martin # mailerconf
1693 1.19.2.2 martin #
1694 1.19.2.2 martin adddisableditem mailerconf "update /etc/mailer.conf after sendmail removal"
1695 1.19.2.2 martin do_mailerconf()
1696 1.19.2.2 martin {
1697 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_mailterconf fix|check"
1698 1.19.2.2 martin op="$1"
1699 1.19.2.2 martin
1700 1.19.2.2 martin failed=0
1701 1.19.2.2 martin mta_path="$(${AWK} '/^sendmail[ \t]/{print$2}' \
1702 1.19.2.2 martin "${DEST_DIR}/etc/mailer.conf")"
1703 1.19.2.2 martin old_sendmail_path="/usr/libexec/sendmail/sendmail"
1704 1.19.2.2 martin if [ "${mta_path}" = "${old_sendmail_path}" ]; then
1705 1.19.2.2 martin if [ "$op" = check ]; then
1706 1.19.2.2 martin msg "mailer.conf points to obsolete ${old_sendmail_path}"
1707 1.19.2.2 martin failed=1;
1708 1.19.2.2 martin else
1709 1.19.2.2 martin populate_dir "${op}" false \
1710 1.19.2.2 martin "${SRC_DIR}/etc" "${DEST_DIR}/etc" 644 mailer.conf
1711 1.19.2.2 martin failed=$?
1712 1.19.2.2 martin fi
1713 1.19.2.2 martin fi
1714 1.19.2.2 martin
1715 1.19.2.2 martin return ${failed}
1716 1.19.2.2 martin }
1717 1.19.2.2 martin
1718 1.19.2.2 martin #
1719 1.19.2.2 martin # ssh
1720 1.19.2.2 martin #
1721 1.19.2.2 martin additem ssh "ssh configuration update"
1722 1.19.2.2 martin do_ssh()
1723 1.19.2.2 martin {
1724 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_ssh fix|check"
1725 1.19.2.2 martin op="$1"
1726 1.19.2.2 martin
1727 1.19.2.2 martin failed=0
1728 1.19.2.2 martin _etcssh="${DEST_DIR}/etc/ssh"
1729 1.19.2.2 martin if ! check_dir "${op}" "${_etcssh}" 755; then
1730 1.19.2.2 martin failed=1
1731 1.19.2.2 martin fi
1732 1.19.2.2 martin
1733 1.19.2.2 martin if [ ${failed} -eq 0 ]; then
1734 1.19.2.2 martin for f in \
1735 1.19.2.2 martin ssh_known_hosts ssh_known_hosts2 \
1736 1.19.2.2 martin ssh_host_dsa_key ssh_host_dsa_key.pub \
1737 1.19.2.2 martin ssh_host_rsa_key ssh_host_rsa_key.pub \
1738 1.19.2.2 martin ssh_host_key ssh_host_key.pub \
1739 1.19.2.2 martin ; do
1740 1.19.2.2 martin if ! move_file "${op}" \
1741 1.19.2.2 martin "${DEST_DIR}/etc/${f}" "${_etcssh}/${f}" ; then
1742 1.19.2.2 martin failed=1
1743 1.19.2.2 martin fi
1744 1.19.2.2 martin done
1745 1.19.2.2 martin for f in sshd.conf ssh.conf ; do
1746 1.19.2.2 martin # /etc/ssh/ssh{,d}.conf -> ssh{,d}_config
1747 1.19.2.2 martin #
1748 1.19.2.2 martin if ! move_file "${op}" \
1749 1.19.2.2 martin "${_etcssh}/${f}" "${_etcssh}/${f%.conf}_config" ;
1750 1.19.2.2 martin then
1751 1.19.2.2 martin failed=1
1752 1.19.2.2 martin fi
1753 1.19.2.2 martin # /etc/ssh{,d}.conf -> /etc/ssh/ssh{,d}_config
1754 1.19.2.2 martin #
1755 1.19.2.2 martin if ! move_file "${op}" \
1756 1.19.2.2 martin "${DEST_DIR}/etc/${f}" \
1757 1.19.2.2 martin "${_etcssh}/${f%.conf}_config" ;
1758 1.19.2.2 martin then
1759 1.19.2.2 martin failed=1
1760 1.19.2.2 martin fi
1761 1.19.2.2 martin done
1762 1.19.2.2 martin fi
1763 1.19.2.2 martin
1764 1.19.2.2 martin sshdconf=""
1765 1.19.2.2 martin for f in \
1766 1.19.2.2 martin "${_etcssh}/sshd_config" \
1767 1.19.2.2 martin "${_etcssh}/sshd.conf" \
1768 1.19.2.2 martin "${DEST_DIR}/etc/sshd.conf" ; do
1769 1.19.2.2 martin if [ -f "${f}" ]; then
1770 1.19.2.2 martin sshdconf="${f}"
1771 1.19.2.2 martin break
1772 1.19.2.2 martin fi
1773 1.19.2.2 martin done
1774 1.19.2.2 martin if [ -n "${sshdconf}" ]; then
1775 1.19.2.2 martin modify_file "${op}" "${sshdconf}" "${SCRATCHDIR}/sshdconf" '
1776 1.19.2.2 martin /^[^#$]/ {
1777 1.19.2.2 martin kw = tolower($1)
1778 1.19.2.2 martin if (kw == "hostkey" &&
1779 1.19.2.2 martin $2 ~ /^\/etc\/+ssh_host(_[dr]sa)?_key$/ ) {
1780 1.19.2.2 martin sub(/\/etc\/+/, "/etc/ssh/")
1781 1.19.2.2 martin }
1782 1.19.2.2 martin if (kw == "rhostsauthentication" ||
1783 1.19.2.2 martin kw == "verifyreversemapping" ||
1784 1.19.2.2 martin kw == "reversemappingcheck") {
1785 1.19.2.2 martin sub(/^/, "# DEPRECATED:\t")
1786 1.19.2.2 martin }
1787 1.19.2.2 martin }
1788 1.19.2.2 martin { print }
1789 1.19.2.2 martin '
1790 1.19.2.2 martin failed=$(( ${failed} + $? ))
1791 1.19.2.2 martin fi
1792 1.19.2.2 martin
1793 1.19.2.2 martin if ! find_file_in_dirlist moduli "moduli" \
1794 1.19.2.2 martin "${SRC_DIR}/crypto/external/bsd/openssh/dist" "${SRC_DIR}/etc" ; then
1795 1.19.2.2 martin failed=1
1796 1.19.2.2 martin # ${dir} is set by find_file_in_dirlist()
1797 1.19.2.2 martin elif ! compare_dir "${op}" "${dir}" "${DEST_DIR}/etc" 444 moduli; then
1798 1.19.2.2 martin failed=1
1799 1.19.2.2 martin fi
1800 1.19.2.2 martin
1801 1.19.2.2 martin if ! check_dir "${op}" "${DEST_DIR}/var/chroot/sshd" 755 ; then
1802 1.19.2.2 martin failed=1
1803 1.19.2.2 martin fi
1804 1.19.2.2 martin
1805 1.19.2.2 martin if rcconf_is_set "${op}" sshd sshd_conf_dir 1; then
1806 1.19.2.2 martin failed=1
1807 1.19.2.2 martin fi
1808 1.19.2.2 martin
1809 1.19.2.2 martin return ${failed}
1810 1.19.2.2 martin }
1811 1.19.2.2 martin
1812 1.19.2.2 martin #
1813 1.19.2.2 martin # wscons
1814 1.19.2.2 martin #
1815 1.19.2.2 martin additem wscons "wscons configuration file update"
1816 1.19.2.2 martin do_wscons()
1817 1.19.2.2 martin {
1818 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_wscons fix|check"
1819 1.19.2.2 martin op="$1"
1820 1.19.2.2 martin
1821 1.19.2.2 martin [ -f "${DEST_DIR}/etc/wscons.conf" ] || return 0
1822 1.19.2.2 martin
1823 1.19.2.2 martin failed=0
1824 1.19.2.2 martin notfixed=""
1825 1.19.2.2 martin if [ "${op}" = "fix" ]; then
1826 1.19.2.2 martin notfixed="${NOT_FIXED}"
1827 1.19.2.2 martin fi
1828 1.19.2.2 martin while read _type _arg1 _rest; do
1829 1.19.2.2 martin if [ "${_type}" = "mux" -a "${_arg1}" = "1" ]; then
1830 1.19.2.2 martin msg \
1831 1.19.2.2 martin "Obsolete wscons.conf(5) entry \""${_type} ${_arg1}"\" found.${notfixed}"
1832 1.19.2.2 martin failed=1
1833 1.19.2.2 martin fi
1834 1.19.2.2 martin done < "${DEST_DIR}/etc/wscons.conf"
1835 1.19.2.2 martin
1836 1.19.2.2 martin return ${failed}
1837 1.19.2.2 martin }
1838 1.19.2.2 martin
1839 1.19.2.2 martin #
1840 1.19.2.2 martin # X11
1841 1.19.2.2 martin #
1842 1.19.2.2 martin additem x11 "x11 configuration update"
1843 1.19.2.2 martin do_x11()
1844 1.19.2.2 martin {
1845 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_x11 fix|check"
1846 1.19.2.2 martin op="$1"
1847 1.19.2.2 martin
1848 1.19.2.2 martin failed=0
1849 1.19.2.2 martin _etcx11="${DEST_DIR}/etc/X11"
1850 1.19.2.2 martin if [ ! -d "${_etcx11}" ]; then
1851 1.19.2.2 martin msg "${_etcx11} is not a directory; skipping check"
1852 1.19.2.2 martin return 0
1853 1.19.2.2 martin fi
1854 1.19.2.2 martin if [ -d "${DEST_DIR}/usr/X11R6/." ]
1855 1.19.2.2 martin then
1856 1.19.2.2 martin _libx11="${DEST_DIR}/usr/X11R6/lib/X11"
1857 1.19.2.2 martin if [ ! -d "${_libx11}" ]; then
1858 1.19.2.2 martin msg "${_libx11} is not a directory; skipping check"
1859 1.19.2.2 martin return 0
1860 1.19.2.2 martin fi
1861 1.19.2.2 martin fi
1862 1.19.2.2 martin
1863 1.19.2.2 martin _notfixed=""
1864 1.19.2.2 martin if [ "${op}" = "fix" ]; then
1865 1.19.2.2 martin _notfixed="${NOT_FIXED}"
1866 1.19.2.2 martin fi
1867 1.19.2.2 martin
1868 1.19.2.2 martin for d in \
1869 1.19.2.2 martin fs lbxproxy proxymngr rstart twm xdm xinit xserver xsm \
1870 1.19.2.2 martin ; do
1871 1.19.2.2 martin sd="${_libx11}/${d}"
1872 1.19.2.2 martin ld="/etc/X11/${d}"
1873 1.19.2.2 martin td="${DEST_DIR}${ld}"
1874 1.19.2.2 martin if [ -h "${sd}" ]; then
1875 1.19.2.2 martin continue
1876 1.19.2.2 martin elif [ -d "${sd}" ]; then
1877 1.19.2.2 martin tdfiles="$(find "${td}" \! -type d)"
1878 1.19.2.2 martin if [ -n "${tdfiles}" ]; then
1879 1.19.2.2 martin msg "${sd} exists yet ${td} already" \
1880 1.19.2.2 martin "contains files${_notfixed}"
1881 1.19.2.2 martin else
1882 1.19.2.2 martin msg "Migrate ${sd} to ${td}${_notfixed}"
1883 1.19.2.2 martin fi
1884 1.19.2.2 martin failed=1
1885 1.19.2.2 martin elif [ -e "${sd}" ]; then
1886 1.19.2.2 martin msg "Unexpected file ${sd}${_notfixed}"
1887 1.19.2.2 martin continue
1888 1.19.2.2 martin else
1889 1.19.2.2 martin continue
1890 1.19.2.2 martin fi
1891 1.19.2.2 martin done
1892 1.19.2.2 martin
1893 1.19.2.2 martin # check if xdm resources have been updated
1894 1.19.2.2 martin if [ -r ${_etcx11}/xdm/Xresources ] && \
1895 1.19.2.2 martin ! ${GREP} 'inpColor:' ${_etcx11}/xdm/Xresources > /dev/null; then
1896 1.19.2.2 martin msg "Update ${_etcx11}/xdm/Xresources${_notfixed}"
1897 1.19.2.2 martin failed=1
1898 1.19.2.2 martin fi
1899 1.19.2.2 martin
1900 1.19.2.2 martin return ${failed}
1901 1.19.2.2 martin }
1902 1.19.2.2 martin
1903 1.19.2.2 martin #
1904 1.19.2.2 martin # xkb
1905 1.19.2.2 martin #
1906 1.19.2.2 martin # /usr/X11R7/lib/X11/xkb/symbols/pc used to be a directory, but changed
1907 1.19.2.2 martin # to a file on 2009-06-12. Fixing this requires removing the directory
1908 1.19.2.2 martin # (which we can do) and re-extracting the xbase set (which we can't do),
1909 1.19.2.2 martin # or at least adding that one file (which we may be able to do if X11SRCDIR
1910 1.19.2.2 martin # is available).
1911 1.19.2.2 martin #
1912 1.19.2.2 martin additem xkb "clean up for xkbdata to xkeyboard-config upgrade"
1913 1.19.2.2 martin do_xkb()
1914 1.19.2.2 martin {
1915 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_xkb fix|check"
1916 1.19.2.2 martin op="$1"
1917 1.19.2.2 martin failed=0
1918 1.19.2.2 martin
1919 1.19.2.2 martin pcpath="/usr/X11R7/lib/X11/xkb/symbols/pc"
1920 1.19.2.2 martin pcsrcdir="${X11SRCDIR}/external/mit/xkeyboard-config/dist/symbols"
1921 1.19.2.2 martin
1922 1.19.2.2 martin filemsg="\
1923 1.19.2.2 martin ${pcpath} was a directory, should be a file.
1924 1.19.2.2 martin To fix, extract the xbase set again."
1925 1.19.2.2 martin
1926 1.19.2.2 martin _notfixed=""
1927 1.19.2.2 martin if [ "${op}" = "fix" ]; then
1928 1.19.2.2 martin _notfixed="${NOT_FIXED}"
1929 1.19.2.2 martin fi
1930 1.19.2.2 martin
1931 1.19.2.2 martin if [ ! -d "${DEST_DIR}${pcpath}" ]; then
1932 1.19.2.2 martin return 0
1933 1.19.2.2 martin fi
1934 1.19.2.2 martin
1935 1.19.2.2 martin # Delete obsolete files in the directory, and the directory
1936 1.19.2.2 martin # itself. If the directory contains unexpected extra files
1937 1.19.2.2 martin # then it will not be deleted.
1938 1.19.2.2 martin ( [ -f "${DEST_DIR}"/var/db/obsolete/xbase ] \
1939 1.19.2.2 martin && ${SORT} -ru "${DEST_DIR}"/var/db/obsolete/xbase \
1940 1.19.2.2 martin | ${GREP} -E "^\\.?${pcpath}/" ;
1941 1.19.2.2 martin echo "${pcpath}" ) \
1942 1.19.2.2 martin | obsolete_paths "${op}"
1943 1.19.2.2 martin failed=$(( ${failed} + $? ))
1944 1.19.2.2 martin
1945 1.19.2.2 martin # If the directory was removed above, then try to replace it with
1946 1.19.2.2 martin # a file.
1947 1.19.2.2 martin if [ -d "${DEST_DIR}${pcpath}" ]; then
1948 1.19.2.2 martin msg "${filemsg}${_notfixed}"
1949 1.19.2.2 martin failed=$(( ${failed} + 1 ))
1950 1.19.2.2 martin else
1951 1.19.2.2 martin if ! find_file_in_dirlist pc "${pcpath}" \
1952 1.19.2.2 martin "${pcsrcdir}" "${SRC_DIR}${pcpath%/*}"
1953 1.19.2.2 martin then
1954 1.19.2.2 martin msg "${filemsg}${_notfixed}"
1955 1.19.2.2 martin failed=$(( ${failed} + 1 ))
1956 1.19.2.2 martin else
1957 1.19.2.2 martin # ${dir} is set by find_file_in_dirlist()
1958 1.19.2.2 martin populate_dir "${op}" true \
1959 1.19.2.2 martin "${dir}" "${DEST_DIR}${pcpath%/*}" 444 \
1960 1.19.2.2 martin pc
1961 1.19.2.2 martin failed=$(( ${failed} + $? ))
1962 1.19.2.2 martin fi
1963 1.19.2.2 martin fi
1964 1.19.2.2 martin
1965 1.19.2.2 martin return $failed
1966 1.19.2.2 martin }
1967 1.19.2.2 martin
1968 1.19.2.2 martin #
1969 1.19.2.2 martin # uid
1970 1.19.2.2 martin #
1971 1.19.2.2 martin additem uid "required users in /etc/master.passwd"
1972 1.19.2.2 martin do_uid()
1973 1.19.2.2 martin {
1974 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_uid fix|check"
1975 1.19.2.2 martin
1976 1.19.2.2 martin check_ids "$1" users "${DEST_DIR}/etc/master.passwd" \
1977 1.19.2.2 martin "${SRC_DIR}/etc/master.passwd" 12 \
1978 1.19.2.2 martin postfix SKIP named ntpd sshd SKIP _pflogd _rwhod SKIP _proxy \
1979 1.19.2.2 martin _timedc _sdpd _httpd _mdnsd _tests _tcpdump _tss SKIP _rtadvd \
1980 1.19.2.2 martin SKIP _unbound _nsd SKIP _dhcpcd
1981 1.19.2.2 martin }
1982 1.19.2.2 martin
1983 1.19.2.2 martin
1984 1.19.2.2 martin #
1985 1.19.2.2 martin # varrwho
1986 1.19.2.2 martin #
1987 1.19.2.2 martin additem varrwho "required ownership of files in /var/rwho"
1988 1.19.2.2 martin do_varrwho()
1989 1.19.2.2 martin {
1990 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_varrwho fix|check"
1991 1.19.2.2 martin
1992 1.19.2.2 martin contents_owner "$1" "${DEST_DIR}/var/rwho" _rwhod _rwhod
1993 1.19.2.2 martin }
1994 1.19.2.2 martin
1995 1.19.2.2 martin
1996 1.19.2.2 martin #
1997 1.19.2.2 martin # tcpdumpchroot
1998 1.19.2.2 martin #
1999 1.19.2.2 martin additem tcpdumpchroot "remove /var/chroot/tcpdump/etc/protocols"
2000 1.19.2.2 martin do_tcpdumpchroot()
2001 1.19.2.2 martin {
2002 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_tcpdumpchroot fix|check"
2003 1.19.2.2 martin
2004 1.19.2.2 martin failed=0;
2005 1.19.2.2 martin if [ -r "${DEST_DIR}/var/chroot/tcpdump/etc/protocols" ]; then
2006 1.19.2.2 martin if [ "$1" = "fix" ]; then
2007 1.19.2.2 martin rm "${DEST_DIR}/var/chroot/tcpdump/etc/protocols"
2008 1.19.2.2 martin failed=$(( ${failed} + $? ))
2009 1.19.2.2 martin rmdir "${DEST_DIR}/var/chroot/tcpdump/etc"
2010 1.19.2.2 martin failed=$(( ${failed} + $? ))
2011 1.19.2.2 martin else
2012 1.19.2.2 martin failed=1
2013 1.19.2.2 martin fi
2014 1.19.2.2 martin fi
2015 1.19.2.2 martin return ${failed}
2016 1.19.2.2 martin }
2017 1.19.2.2 martin
2018 1.19.2.2 martin
2019 1.19.2.2 martin #
2020 1.19.2.2 martin # atf
2021 1.19.2.2 martin #
2022 1.19.2.2 martin additem atf "install missing atf configuration files and validate them"
2023 1.19.2.2 martin do_atf()
2024 1.19.2.2 martin {
2025 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_atf fix|check"
2026 1.19.2.2 martin op="$1"
2027 1.19.2.2 martin failed=0
2028 1.19.2.2 martin
2029 1.19.2.2 martin # Ensure atf configuration files are in place.
2030 1.19.2.2 martin if find_file_in_dirlist NetBSD.conf "NetBSD.conf" \
2031 1.19.2.2 martin "${SRC_DIR}/external/bsd/atf/etc/atf" \
2032 1.19.2.2 martin "${SRC_DIR}/etc/atf"; then
2033 1.19.2.2 martin # ${dir} is set by find_file_in_dirlist()
2034 1.19.2.2 martin populate_dir "${op}" true "${dir}" "${DEST_DIR}/etc/atf" 644 \
2035 1.19.2.2 martin NetBSD.conf common.conf || failed=1
2036 1.19.2.2 martin else
2037 1.19.2.2 martin failed=1
2038 1.19.2.2 martin fi
2039 1.19.2.2 martin if find_file_in_dirlist atf-run.hooks "atf-run.hooks" \
2040 1.19.2.2 martin "${SRC_DIR}/external/bsd/atf/dist/tools/sample" \
2041 1.19.2.2 martin "${SRC_DIR}/etc/atf"; then
2042 1.19.2.2 martin # ${dir} is set by find_file_in_dirlist()
2043 1.19.2.2 martin populate_dir "${op}" true "${dir}" "${DEST_DIR}/etc/atf" 644 \
2044 1.19.2.2 martin atf-run.hooks || failed=1
2045 1.19.2.2 martin else
2046 1.19.2.2 martin failed=1
2047 1.19.2.2 martin fi
2048 1.19.2.2 martin
2049 1.19.2.2 martin # Validate the _atf to _tests user/group renaming.
2050 1.19.2.2 martin if [ -f "${DEST_DIR}/etc/atf/common.conf" ]; then
2051 1.19.2.2 martin handle_atf_user "${op}" || failed=1
2052 1.19.2.2 martin else
2053 1.19.2.2 martin failed=1
2054 1.19.2.2 martin fi
2055 1.19.2.2 martin
2056 1.19.2.2 martin return ${failed}
2057 1.19.2.2 martin }
2058 1.19.2.2 martin
2059 1.19.2.2 martin handle_atf_user()
2060 1.19.2.2 martin {
2061 1.19.2.2 martin local op="$1"
2062 1.19.2.2 martin local failed=0
2063 1.19.2.2 martin
2064 1.19.2.2 martin local conf="${DEST_DIR}/etc/atf/common.conf"
2065 1.19.2.2 martin if grep '[^#]*unprivileged-user[ \t]*=.*_atf' "${conf}" >/dev/null
2066 1.19.2.2 martin then
2067 1.19.2.2 martin if [ "$1" = "fix" ]; then
2068 1.19.2.2 martin ${SED} -e \
2069 1.19.2.2 martin "/[^#]*unprivileged-user[\ t]*=/s/_atf/_tests/" \
2070 1.19.2.2 martin "${conf}" >"${conf}.new"
2071 1.19.2.2 martin failed=$(( ${failed} + $? ))
2072 1.19.2.2 martin mv "${conf}.new" "${conf}"
2073 1.19.2.2 martin failed=$(( ${failed} + $? ))
2074 1.19.2.2 martin msg "Set unprivileged-user=_tests in ${conf}"
2075 1.19.2.2 martin else
2076 1.19.2.2 martin msg "unprivileged-user=_atf in ${conf} should be" \
2077 1.19.2.2 martin "unprivileged-user=_tests"
2078 1.19.2.2 martin failed=1
2079 1.19.2.2 martin fi
2080 1.19.2.2 martin fi
2081 1.19.2.2 martin
2082 1.19.2.2 martin return ${failed}
2083 1.19.2.2 martin }
2084 1.19.2.2 martin
2085 1.19.2.2 martin #
2086 1.19.2.2 martin # catpages
2087 1.19.2.2 martin #
2088 1.19.2.2 martin obsolete_catpages()
2089 1.19.2.2 martin {
2090 1.19.2.2 martin basedir="$2"
2091 1.19.2.2 martin section="$3"
2092 1.19.2.2 martin mandir="${basedir}/man${section}"
2093 1.19.2.2 martin catdir="${basedir}/cat${section}"
2094 1.19.2.2 martin test -d "$mandir" || return 0
2095 1.19.2.2 martin test -d "$catdir" || return 0
2096 1.19.2.2 martin (cd "$mandir" && find . -type f) | {
2097 1.19.2.2 martin failed=0
2098 1.19.2.2 martin while read manpage; do
2099 1.19.2.2 martin manpage="${manpage#./}"
2100 1.19.2.2 martin case "$manpage" in
2101 1.19.2.2 martin *.Z)
2102 1.19.2.2 martin catname="$catdir/${manpage%.*.Z}.0"
2103 1.19.2.2 martin ;;
2104 1.19.2.2 martin *.gz)
2105 1.19.2.2 martin catname="$catdir/${manpage%.*.gz}.0"
2106 1.19.2.2 martin ;;
2107 1.19.2.2 martin *)
2108 1.19.2.2 martin catname="$catdir/${manpage%.*}.0"
2109 1.19.2.2 martin ;;
2110 1.19.2.2 martin esac
2111 1.19.2.2 martin test -e "$catname" -a "$catname" -ot "$mandir/$manpage" || continue
2112 1.19.2.2 martin if [ "$1" = "fix" ]; then
2113 1.19.2.2 martin rm "$catname"
2114 1.19.2.2 martin failed=$(( ${failed} + $? ))
2115 1.19.2.2 martin msg "Removed obsolete cat page $catname"
2116 1.19.2.2 martin else
2117 1.19.2.2 martin msg "Obsolete cat page $catname"
2118 1.19.2.2 martin failed=1
2119 1.19.2.2 martin fi
2120 1.19.2.2 martin done
2121 1.19.2.2 martin exit $failed
2122 1.19.2.2 martin }
2123 1.19.2.2 martin }
2124 1.19.2.2 martin
2125 1.19.2.2 martin additem catpages "remove outdated cat pages"
2126 1.19.2.2 martin do_catpages()
2127 1.19.2.2 martin {
2128 1.19.2.2 martin failed=0
2129 1.19.2.2 martin for manbase in /usr/share/man /usr/X11R6/man /usr/X11R7/man; do
2130 1.19.2.2 martin for sec in 1 2 3 4 5 6 7 8 9; do
2131 1.19.2.2 martin obsolete_catpages "$1" "${DEST_DIR}${manbase}" "${sec}"
2132 1.19.2.2 martin failed=$(( ${failed} + $? ))
2133 1.19.2.2 martin if [ "$1" = "fix" ]; then
2134 1.19.2.2 martin rmdir "${DEST_DIR}${manbase}/cat${sec}"/* \
2135 1.19.2.2 martin 2>/dev/null
2136 1.19.2.2 martin rmdir "${DEST_DIR}${manbase}/cat${sec}" \
2137 1.19.2.2 martin 2>/dev/null
2138 1.19.2.2 martin fi
2139 1.19.2.2 martin done
2140 1.19.2.2 martin done
2141 1.19.2.2 martin return $failed
2142 1.19.2.2 martin }
2143 1.19.2.2 martin
2144 1.19.2.2 martin #
2145 1.19.2.2 martin # man.conf
2146 1.19.2.2 martin #
2147 1.19.2.2 martin additem manconf "check for a mandoc usage in /etc/man.conf"
2148 1.19.2.2 martin do_manconf()
2149 1.19.2.2 martin {
2150 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_manconf fix|check"
2151 1.19.2.2 martin op="$1"
2152 1.19.2.2 martin failed=0
2153 1.19.2.2 martin
2154 1.19.2.2 martin [ -f "${DEST_DIR}/etc/man.conf" ] || return 0
2155 1.19.2.2 martin if ${GREP} -w "mandoc" "${DEST_DIR}/etc/man.conf" >/dev/null 2>&1;
2156 1.19.2.2 martin then
2157 1.19.2.2 martin failed=0;
2158 1.19.2.2 martin else
2159 1.19.2.2 martin failed=1
2160 1.19.2.2 martin notfixed=""
2161 1.19.2.2 martin if [ "${op}" = "fix" ]; then
2162 1.19.2.2 martin notfixed="${NOT_FIXED}"
2163 1.19.2.2 martin fi
2164 1.19.2.2 martin msg "The file /etc/man.conf has not been adapted to mandoc usage; you"
2165 1.19.2.2 martin msg "probably want to copy a new version over. ${notfixed}"
2166 1.19.2.2 martin fi
2167 1.19.2.2 martin
2168 1.19.2.2 martin return ${failed}
2169 1.19.2.2 martin }
2170 1.19.2.2 martin
2171 1.19.2.2 martin
2172 1.19.2.2 martin #
2173 1.19.2.2 martin # ptyfsoldnodes
2174 1.19.2.2 martin #
2175 1.19.2.2 martin additem ptyfsoldnodes "remove legacy device nodes when using ptyfs"
2176 1.19.2.2 martin do_ptyfsoldnodes()
2177 1.19.2.2 martin {
2178 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_ptyfsoldnodes fix|check"
2179 1.19.2.2 martin _ptyfs_op="$1"
2180 1.19.2.2 martin
2181 1.19.2.2 martin # Check whether ptyfs is in use
2182 1.19.2.2 martin failed=0;
2183 1.19.2.2 martin if ! ${GREP} -E "^ptyfs" "${DEST_DIR}/etc/fstab" > /dev/null; then
2184 1.19.2.2 martin msg "ptyfs is not in use"
2185 1.19.2.2 martin return 0
2186 1.19.2.2 martin fi
2187 1.19.2.2 martin
2188 1.19.2.2 martin if [ ! -e "${DEST_DIR}/dev/pts" ]; then
2189 1.19.2.2 martin msg "ptyfs is not properly configured: missing /dev/pts"
2190 1.19.2.2 martin return 1
2191 1.19.2.2 martin fi
2192 1.19.2.2 martin
2193 1.19.2.2 martin # Find the device major numbers for the pty master and slave
2194 1.19.2.2 martin # devices, by parsing the output from "MAKEDEV -s pty0".
2195 1.19.2.2 martin #
2196 1.19.2.2 martin # Output from MAKEDEV looks like this:
2197 1.19.2.2 martin # ./ttyp0 type=char device=netbsd,5,0 mode=666 gid=0 uid=0
2198 1.19.2.2 martin # ./ptyp0 type=char device=netbsd,6,0 mode=666 gid=0 uid=0
2199 1.19.2.2 martin #
2200 1.19.2.2 martin # Output from awk, used in the eval statement, looks like this:
2201 1.19.2.2 martin # maj_ptym=6; maj_ptys=5;
2202 1.19.2.2 martin #
2203 1.19.2.2 martin find_makedev
2204 1.19.2.2 martin eval "$(
2205 1.19.2.2 martin ${HOST_SH} "${MAKEDEV_DIR}/MAKEDEV" -s pty0 2>/dev/null \
2206 1.19.2.2 martin | ${AWK} '\
2207 1.19.2.2 martin BEGIN { before_re = ".*device=[a-zA-Z]*,"; after_re = ",.*"; }
2208 1.19.2.2 martin /ptyp0/ { maj_ptym = gensub(before_re, "", 1, $0);
2209 1.19.2.2 martin maj_ptym = gensub(after_re, "", 1, maj_ptym); }
2210 1.19.2.2 martin /ttyp0/ { maj_ptys = gensub(before_re, "", 1, $0);
2211 1.19.2.2 martin maj_ptys = gensub(after_re, "", 1, maj_ptys); }
2212 1.19.2.2 martin END { print "maj_ptym=" maj_ptym "; maj_ptys=" maj_ptys ";"; }
2213 1.19.2.2 martin '
2214 1.19.2.2 martin )"
2215 1.19.2.2 martin #msg "Major numbers are maj_ptym=${maj_ptym} maj_ptys=${maj_ptys}"
2216 1.19.2.2 martin if [ -z "$maj_ptym" ] || [ -z "$maj_ptys" ]; then
2217 1.19.2.2 martin msg "Cannot find device major numbers for pty master and slave"
2218 1.19.2.2 martin return 1
2219 1.19.2.2 martin fi
2220 1.19.2.2 martin
2221 1.19.2.2 martin # look for /dev/[pt]ty[p-zP-T][0-9a-zA-Z], and check that they
2222 1.19.2.2 martin # have the expected device major numbers. ttyv* is typically not a
2223 1.19.2.2 martin # pty device, but we check it anyway.
2224 1.19.2.2 martin #
2225 1.19.2.2 martin # The "for d1" loop is intended to avoid overflowing ARG_MAX;
2226 1.19.2.2 martin # otherwise we could have used a single glob pattern.
2227 1.19.2.2 martin #
2228 1.19.2.2 martin # If there are no files that match a particular pattern,
2229 1.19.2.2 martin # then stat prints something like:
2230 1.19.2.2 martin # stat: /dev/[pt]tyx?: lstat: No such file or directory
2231 1.19.2.2 martin # and we ignore it. XXX: We also ignore other error messages.
2232 1.19.2.2 martin #
2233 1.19.2.2 martin _ptyfs_tmp="$(mktemp /tmp/postinstall.ptyfs.XXXXXXXX)"
2234 1.19.2.2 martin for d1 in p q r s t u v w x y z P Q R S T; do
2235 1.19.2.2 martin ${STAT} -f "%Hr %N" "${DEST_DIR}/dev/"[pt]ty${d1}? 2>&1
2236 1.19.2.2 martin done \
2237 1.19.2.2 martin | while read -r major node ; do
2238 1.19.2.2 martin case "$major" in
2239 1.19.2.2 martin ${maj_ptym}|${maj_ptys}) echo "$node" ;;
2240 1.19.2.2 martin esac
2241 1.19.2.2 martin done >"${_ptyfs_tmp}"
2242 1.19.2.2 martin
2243 1.19.2.2 martin _desc="legacy device node"
2244 1.19.2.2 martin while read node; do
2245 1.19.2.2 martin if [ "${_ptyfs_op}" = "check" ]; then
2246 1.19.2.2 martin msg "Remove ${_desc} ${node}"
2247 1.19.2.2 martin failed=1
2248 1.19.2.2 martin else # "fix"
2249 1.19.2.2 martin if rm "${node}"; then
2250 1.19.2.2 martin msg "Removed ${_desc} ${node}"
2251 1.19.2.2 martin else
2252 1.19.2.2 martin warn "Failed to remove ${_desc} ${node}"
2253 1.19.2.2 martin failed=1
2254 1.19.2.2 martin fi
2255 1.19.2.2 martin fi
2256 1.19.2.2 martin done < "${_ptyfs_tmp}"
2257 1.19.2.2 martin rm "${_ptyfs_tmp}"
2258 1.19.2.2 martin
2259 1.19.2.2 martin return ${failed}
2260 1.19.2.2 martin }
2261 1.19.2.2 martin
2262 1.19.2.2 martin
2263 1.19.2.2 martin #
2264 1.19.2.2 martin # varshm
2265 1.19.2.2 martin #
2266 1.19.2.2 martin additem varshm "check for a tmpfs mounted on /var/shm"
2267 1.19.2.2 martin do_varshm()
2268 1.19.2.2 martin {
2269 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_varshm fix|check"
2270 1.19.2.2 martin op="$1"
2271 1.19.2.2 martin failed=0
2272 1.19.2.2 martin
2273 1.19.2.2 martin [ -f "${DEST_DIR}/etc/fstab" ] || return 0
2274 1.19.2.2 martin if ${GREP} -E "^var_shm_symlink" "${DEST_DIR}/etc/rc.conf" >/dev/null 2>&1;
2275 1.19.2.2 martin then
2276 1.19.2.2 martin failed=0;
2277 1.19.2.2 martin elif ${GREP} -w "/var/shm" "${DEST_DIR}/etc/fstab" >/dev/null 2>&1;
2278 1.19.2.2 martin then
2279 1.19.2.2 martin failed=0;
2280 1.19.2.2 martin else
2281 1.19.2.2 martin if [ "${op}" = "check" ]; then
2282 1.19.2.2 martin failed=1
2283 1.19.2.2 martin msg "No /var/shm mount found in ${DEST_DIR}/etc/fstab"
2284 1.19.2.2 martin elif [ "${op}" = "fix" ]; then
2285 1.19.2.2 martin printf '\ntmpfs\t/var/shm\ttmpfs\trw,-m1777,-sram%%25\n' \
2286 1.19.2.2 martin >> "${DEST_DIR}/etc/fstab"
2287 1.19.2.2 martin msg "Added tmpfs with 25% ram limit as /var/shm"
2288 1.19.2.2 martin
2289 1.19.2.2 martin fi
2290 1.19.2.2 martin fi
2291 1.19.2.2 martin
2292 1.19.2.2 martin return ${failed}
2293 1.19.2.2 martin }
2294 1.19.2.2 martin
2295 1.19.2.2 martin #
2296 1.19.2.2 martin # obsolete_stand
2297 1.19.2.2 martin #
2298 1.19.2.2 martin adddisableditem obsolete_stand "remove obsolete files from /stand"
2299 1.19.2.2 martin do_obsolete_stand()
2300 1.19.2.2 martin {
2301 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_obsolete_stnd fix|check"
2302 1.19.2.2 martin op="$1"
2303 1.19.2.2 martin failed=0
2304 1.19.2.2 martin
2305 1.19.2.2 martin for dir in \
2306 1.19.2.2 martin /stand/${MACHINE} \
2307 1.19.2.2 martin /stand/${MACHINE}-4xx \
2308 1.19.2.2 martin /stand/${MACHINE}-booke \
2309 1.19.2.2 martin /stand/${MACHINE}-xen \
2310 1.19.2.2 martin /stand/${MACHINE}pae-xen
2311 1.19.2.2 martin do
2312 1.19.2.2 martin [ -d "${DESTDIR}${dir}" ] && obsolete_stand "${dir}"
2313 1.19.2.2 martin done | obsolete_paths "${op}"
2314 1.19.2.2 martin failed=$(( ${failed} + $? ))
2315 1.19.2.2 martin
2316 1.19.2.2 martin return ${failed}
2317 1.19.2.2 martin }
2318 1.19.2.2 martin
2319 1.19.2.2 martin listarchsubdirs() {
2320 1.19.2.2 martin if ! $SOURCEMODE; then
2321 1.19.2.2 martin echo "@ARCHSUBDIRS@"
2322 1.19.2.2 martin else
2323 1.19.2.2 martin ${SED} -n -e '/ARCHDIR_SUBDIR/s/[[:space:]]//gp' \
2324 1.19.2.2 martin ${SRC_DIR}/compat/archdirs.mk
2325 1.19.2.2 martin fi
2326 1.19.2.2 martin }
2327 1.19.2.2 martin
2328 1.19.2.2 martin
2329 1.19.2.2 martin getarchsubdirs() {
2330 1.19.2.2 martin local m
2331 1.19.2.2 martin case ${MACHINE_ARCH} in
2332 1.19.2.2 martin *arm*|*aarch64*) m=arm;;
2333 1.19.2.2 martin x86_64) m=amd64;;
2334 1.19.2.2 martin *) m=${MACHINE_ARCH};;
2335 1.19.2.2 martin esac
2336 1.19.2.2 martin
2337 1.19.2.2 martin for i in $(listarchsubdirs); do
2338 1.19.2.2 martin echo $i
2339 1.19.2.2 martin done | ${SORT} -u | ${SED} -n -e "/=${m}/s@.*=${m}/\(.*\)@\1@p"
2340 1.19.2.2 martin }
2341 1.19.2.2 martin
2342 1.19.2.2 martin getcompatlibdirs() {
2343 1.19.2.2 martin for i in $(getarchsubdirs); do
2344 1.19.2.2 martin if [ -d "${DEST_DIR}/usr/lib/$i" ]; then
2345 1.19.2.2 martin echo /usr/lib/$i
2346 1.19.2.2 martin fi
2347 1.19.2.2 martin done
2348 1.19.2.2 martin }
2349 1.19.2.2 martin
2350 1.19.2.2 martin #
2351 1.19.2.2 martin # obsolete
2352 1.19.2.2 martin # (this item is last to allow other items to move obsolete files)
2353 1.19.2.2 martin #
2354 1.19.2.2 martin additem obsolete "remove obsolete file sets and minor libraries"
2355 1.19.2.2 martin do_obsolete()
2356 1.19.2.2 martin {
2357 1.19.2.2 martin [ -n "$1" ] || err 3 "USAGE: do_obsolete fix|check"
2358 1.19.2.2 martin op="$1"
2359 1.19.2.2 martin failed=0
2360 1.19.2.2 martin
2361 1.19.2.2 martin ${SORT} -ru "${DEST_DIR}"/var/db/obsolete/* | obsolete_paths "${op}"
2362 1.19.2.2 martin failed=$(( ${failed} + $? ))
2363 1.19.2.2 martin
2364 1.19.2.2 martin (
2365 1.19.2.2 martin obsolete_libs /lib
2366 1.19.2.2 martin obsolete_libs /usr/lib
2367 1.19.2.2 martin obsolete_libs /usr/lib/i18n
2368 1.19.2.2 martin obsolete_libs /usr/X11R6/lib
2369 1.19.2.2 martin obsolete_libs /usr/X11R7/lib
2370 1.19.2.2 martin for i in $(getcompatlibdirs); do
2371 1.19.2.2 martin obsolete_libs $i
2372 1.19.2.2 martin done
2373 1.19.2.2 martin ) | obsolete_paths "${op}"
2374 1.19.2.2 martin failed=$(( ${failed} + $? ))
2375 1.19.2.2 martin
2376 1.19.2.2 martin return ${failed}
2377 1.19.2.2 martin }
2378 1.19.2.2 martin
2379 1.19.2.2 martin #
2380 1.19.2.2 martin # end of items
2381 1.19.2.2 martin # ------------
2382 1.19.2.2 martin #
2383 1.19.2.2 martin
2384 1.19.2.2 martin
2385 1.19.2.2 martin usage()
2386 1.19.2.2 martin {
2387 1.19.2.2 martin cat 1>&2 << _USAGE_
2388 1.19.2.2 martin Usage: ${PROGNAME} [-s srcdir] [-x xsrcdir] [-d destdir] [-m mach] [-a arch] op [item [...]]
2389 1.19.2.2 martin Perform post-installation checks and/or fixes on a system's
2390 1.19.2.2 martin configuration files.
2391 1.19.2.2 martin If no items are provided, a default set of checks or fixes is applied.
2392 1.19.2.2 martin
2393 1.19.2.2 martin Options:
2394 1.19.2.2 martin -s {srcdir|tgzfile|tempdir}
2395 1.19.2.2 martin Location of the source files. This may be any
2396 1.19.2.2 martin of the following:
2397 1.19.2.2 martin * A directory that contains a NetBSD source tree;
2398 1.19.2.2 martin * A distribution set file such as "etc.tgz" or
2399 1.19.2.2 martin "xetc.tgz". Pass multiple -s options to specify
2400 1.19.2.2 martin multiple such files;
2401 1.19.2.2 martin * A temporary directory in which one or both of
2402 1.19.2.2 martin "etc.tgz" and "xetc.tgz" have been extracted.
2403 1.19.2.2 martin [${SRC_DIR:-/usr/src}]
2404 1.19.2.2 martin -x xsrcdir Location of the X11 source files. This must be
2405 1.19.2.2 martin a directory that contains a NetBSD xsrc tree.
2406 1.19.2.2 martin [${XSRC_DIR:-/usr/src/../xsrc}]
2407 1.19.2.2 martin -d destdir Destination directory to check. [${DEST_DIR:-/}]
2408 1.19.2.2 martin -m mach MACHINE. [${MACHINE}]
2409 1.19.2.2 martin -a arch MACHINE_ARCH. [${MACHINE_ARCH}]
2410 1.19.2.2 martin
2411 1.19.2.2 martin Operation may be one of:
2412 1.19.2.2 martin help Display this help.
2413 1.19.2.2 martin list List available items.
2414 1.19.2.2 martin check Perform post-installation checks on items.
2415 1.19.2.2 martin diff [diff(1) options ...]
2416 1.19.2.2 martin Similar to 'check' but also output difference of files.
2417 1.19.2.2 martin fix Apply fixes that 'check' determines need to be applied.
2418 1.19.2.2 martin usage Display this usage.
2419 1.19.2.2 martin _USAGE_
2420 1.19.2.2 martin exit 2
2421 1.19.2.2 martin }
2422 1.19.2.2 martin
2423 1.19.2.2 martin
2424 1.19.2.2 martin list()
2425 1.19.2.2 martin {
2426 1.19.2.2 martin echo "Default set of items (to apply if no items are provided by user):"
2427 1.19.2.2 martin echo " Item Description"
2428 1.19.2.2 martin echo " ---- -----------"
2429 1.19.2.2 martin for i in ${defaultitems}; do
2430 1.19.2.2 martin eval desc=\"\${desc_${i}}\"
2431 1.19.2.2 martin printf " %-12s %s\n" "${i}" "${desc}"
2432 1.19.2.2 martin done
2433 1.19.2.2 martin echo "Items disabled by default (must be requested explicitly):"
2434 1.19.2.2 martin echo " Item Description"
2435 1.19.2.2 martin echo " ---- -----------"
2436 1.19.2.2 martin for i in ${otheritems}; do
2437 1.19.2.2 martin eval desc=\"\${desc_${i}}\"
2438 1.19.2.2 martin printf " %-12s %s\n" "${i}" "${desc}"
2439 1.19.2.2 martin done
2440 1.19.2.2 martin
2441 1.19.2.2 martin }
2442 1.19.2.2 martin
2443 1.19.2.2 martin
2444 1.19.2.2 martin main()
2445 1.19.2.2 martin {
2446 1.19.2.2 martin TGZLIST= # quoted list list of tgz files
2447 1.19.2.2 martin SRC_ARGLIST= # quoted list of one or more "-s" args
2448 1.19.2.2 martin SRC_DIR="${SRC_ARG}" # set default value for early usage()
2449 1.19.2.2 martin XSRC_DIR="${SRC_ARG}/../xsrc"
2450 1.19.2.2 martin N_SRC_ARGS=0 # number of "-s" args
2451 1.19.2.2 martin TGZMODE=false # true if "-s" specifies a tgz file
2452 1.19.2.2 martin DIRMODE=false # true if "-s" specified a directory
2453 1.19.2.2 martin SOURCEMODE=false # true if "-s" specified a source directory
2454 1.19.2.2 martin
2455 1.19.2.2 martin case "$(uname -s)" in
2456 1.19.2.2 martin Darwin)
2457 1.19.2.2 martin # case sensitive match for case insensitive fs
2458 1.19.2.2 martin file_exists_exact=file_exists_exact
2459 1.19.2.2 martin ;;
2460 1.19.2.2 martin *)
2461 1.19.2.2 martin file_exists_exact=:
2462 1.19.2.2 martin ;;
2463 1.19.2.2 martin esac
2464 1.19.2.2 martin
2465 1.19.2.2 martin while getopts s:x:d:m:a: ch; do
2466 1.19.2.2 martin case "${ch}" in
2467 1.19.2.2 martin s)
2468 1.19.2.2 martin qarg="$(shell_quote "${OPTARG}")"
2469 1.19.2.2 martin N_SRC_ARGS=$(( $N_SRC_ARGS + 1 ))
2470 1.19.2.2 martin SRC_ARGLIST="${SRC_ARGLIST}${SRC_ARGLIST:+ }-s ${qarg}"
2471 1.19.2.2 martin if [ -f "${OPTARG}" ]; then
2472 1.19.2.2 martin # arg refers to a *.tgz file.
2473 1.19.2.2 martin # This may happen twice, for both
2474 1.19.2.2 martin # etc.tgz and xetc.tgz, so we build up a
2475 1.19.2.2 martin # quoted list in TGZLIST.
2476 1.19.2.2 martin TGZMODE=true
2477 1.19.2.2 martin TGZLIST="${TGZLIST}${TGZLIST:+ }${qarg}"
2478 1.19.2.2 martin # Note that, when TGZMODE is true,
2479 1.19.2.2 martin # SRC_ARG is used only for printing
2480 1.19.2.2 martin # human-readable messages.
2481 1.19.2.2 martin SRC_ARG="${TGZLIST}"
2482 1.19.2.2 martin elif [ -d "${OPTARG}" ]; then
2483 1.19.2.2 martin # arg refers to a directory.
2484 1.19.2.2 martin # It might be a source directory, or a
2485 1.19.2.2 martin # directory where the sets have already
2486 1.19.2.2 martin # been extracted.
2487 1.19.2.2 martin DIRMODE=true
2488 1.19.2.2 martin SRC_ARG="${OPTARG}"
2489 1.19.2.2 martin if [ -f "${OPTARG}/etc/Makefile" ]; then
2490 1.19.2.2 martin SOURCEMODE=true
2491 1.19.2.2 martin fi
2492 1.19.2.2 martin else
2493 1.19.2.2 martin err 2 "Invalid argument for -s option"
2494 1.19.2.2 martin fi
2495 1.19.2.2 martin ;;
2496 1.19.2.2 martin x)
2497 1.19.2.2 martin if [ -d "${OPTARG}" ]; then
2498 1.19.2.2 martin # arg refers to a directory.
2499 1.19.2.2 martin XSRC_DIR="${OPTARG}"
2500 1.19.2.2 martin XSRC_DIR_FIX="-x ${OPTARG} "
2501 1.19.2.2 martin else
2502 1.19.2.2 martin err 2 "Not a directory for -x option"
2503 1.19.2.2 martin fi
2504 1.19.2.2 martin ;;
2505 1.19.2.2 martin d)
2506 1.19.2.2 martin DEST_DIR="${OPTARG}"
2507 1.19.2.2 martin ;;
2508 1.19.2.2 martin m)
2509 1.19.2.2 martin MACHINE="${OPTARG}"
2510 1.19.2.2 martin ;;
2511 1.19.2.2 martin a)
2512 1.19.2.2 martin MACHINE_ARCH="${OPTARG}"
2513 1.19.2.2 martin ;;
2514 1.19.2.2 martin *)
2515 1.19.2.2 martin usage
2516 1.19.2.2 martin ;;
2517 1.19.2.2 martin esac
2518 1.19.2.2 martin done
2519 1.19.2.2 martin shift $((${OPTIND} - 1))
2520 1.19.2.2 martin [ $# -gt 0 ] || usage
2521 1.19.2.2 martin
2522 1.19.2.2 martin if [ "$N_SRC_ARGS" -gt 1 ] && $DIRMODE; then
2523 1.19.2.2 martin err 2 "Multiple -s args are allowed only with tgz files"
2524 1.19.2.2 martin fi
2525 1.19.2.2 martin if [ "$N_SRC_ARGS" -eq 0 ]; then
2526 1.19.2.2 martin # The default SRC_ARG was set elsewhere
2527 1.19.2.2 martin DIRMODE=true
2528 1.19.2.2 martin SOURCEMODE=true
2529 1.19.2.2 martin SRC_ARGLIST="-s $(shell_quote "${SRC_ARG}")"
2530 1.19.2.2 martin fi
2531 1.19.2.2 martin
2532 1.19.2.2 martin #
2533 1.19.2.2 martin # If '-s' arg or args specified tgz files, extract them
2534 1.19.2.2 martin # to a scratch directory.
2535 1.19.2.2 martin #
2536 1.19.2.2 martin if $TGZMODE; then
2537 1.19.2.2 martin ETCTGZDIR="${SCRATCHDIR}/etc.tgz"
2538 1.19.2.2 martin echo "Note: Creating temporary directory ${ETCTGZDIR}"
2539 1.19.2.2 martin if ! mkdir "${ETCTGZDIR}"; then
2540 1.19.2.2 martin err 2 "Can't create ${ETCTGZDIR}"
2541 1.19.2.2 martin fi
2542 1.19.2.2 martin ( # subshell to localise changes to "$@"
2543 1.19.2.2 martin eval "set -- ${TGZLIST}"
2544 1.19.2.2 martin for tgz in "$@"; do
2545 1.19.2.2 martin echo "Note: Extracting files from ${tgz}"
2546 1.19.2.2 martin cat "${tgz}" | (
2547 1.19.2.2 martin cd "${ETCTGZDIR}" &&
2548 1.19.2.2 martin tar -zxf -
2549 1.19.2.2 martin ) || err 2 "Can't extract ${tgz}"
2550 1.19.2.2 martin done
2551 1.19.2.2 martin )
2552 1.19.2.2 martin SRC_DIR="${ETCTGZDIR}"
2553 1.19.2.2 martin else
2554 1.19.2.2 martin SRC_DIR="${SRC_ARG}"
2555 1.19.2.2 martin fi
2556 1.19.2.2 martin
2557 1.19.2.2 martin [ -d "${SRC_DIR}" ] || err 2 "${SRC_DIR} is not a directory"
2558 1.19.2.2 martin [ -d "${DEST_DIR}" ] || err 2 "${DEST_DIR} is not a directory"
2559 1.19.2.2 martin [ -n "${MACHINE}" ] || err 2 "\${MACHINE} is not defined"
2560 1.19.2.2 martin [ -n "${MACHINE_ARCH}" ] || err 2 "\${MACHINE_ARCH} is not defined"
2561 1.19.2.2 martin if ! $SOURCEMODE && ! [ -f "${SRC_DIR}/etc/mtree/set.etc" ]; then
2562 1.19.2.2 martin err 2 "Files from the etc.tgz set are missing"
2563 1.19.2.2 martin fi
2564 1.19.2.2 martin
2565 1.19.2.2 martin # If directories are /, clear them, so various messages
2566 1.19.2.2 martin # don't have leading "//". However, this requires
2567 1.19.2.2 martin # the use of ${foo:-/} to display the variables.
2568 1.19.2.2 martin #
2569 1.19.2.2 martin [ "${SRC_DIR}" = "/" ] && SRC_DIR=""
2570 1.19.2.2 martin [ "${DEST_DIR}" = "/" ] && DEST_DIR=""
2571 1.19.2.2 martin
2572 1.19.2.2 martin detect_x11
2573 1.19.2.2 martin
2574 1.19.2.2 martin op="$1"
2575 1.19.2.2 martin shift
2576 1.19.2.2 martin
2577 1.19.2.2 martin case "${op}" in
2578 1.19.2.2 martin diff)
2579 1.19.2.2 martin op=check
2580 1.19.2.2 martin DIFF_STYLE=n # default style is RCS
2581 1.19.2.2 martin OPTIND=1
2582 1.19.2.2 martin while getopts bcenpuw ch; do
2583 1.19.2.2 martin case "${ch}" in
2584 1.19.2.2 martin c|e|n|u)
2585 1.19.2.2 martin if [ "${DIFF_STYLE}" != "n" -a \
2586 1.19.2.2 martin "${DIFF_STYLE}" != "${ch}" ]; then
2587 1.19.2.2 martin err 2 "conflicting output style: ${ch}"
2588 1.19.2.2 martin fi
2589 1.19.2.2 martin DIFF_STYLE="${ch}"
2590 1.19.2.2 martin ;;
2591 1.19.2.2 martin b|p|w)
2592 1.19.2.2 martin DIFF_OPT="${DIFF_OPT} -${ch}"
2593 1.19.2.2 martin ;;
2594 1.19.2.2 martin *)
2595 1.19.2.2 martin err 2 "unknown diff option"
2596 1.19.2.2 martin ;;
2597 1.19.2.2 martin esac
2598 1.19.2.2 martin done
2599 1.19.2.2 martin shift $((${OPTIND} - 1))
2600 1.19.2.2 martin ;;
2601 1.19.2.2 martin esac
2602 1.19.2.2 martin
2603 1.19.2.2 martin case "${op}" in
2604 1.19.2.2 martin
2605 1.19.2.2 martin usage|help)
2606 1.19.2.2 martin usage
2607 1.19.2.2 martin ;;
2608 1.19.2.2 martin
2609 1.19.2.2 martin list)
2610 1.19.2.2 martin echo "Source directory: ${SRC_DIR:-/}"
2611 1.19.2.2 martin echo "Target directory: ${DEST_DIR:-/}"
2612 1.19.2.2 martin if $TGZMODE; then
2613 1.19.2.2 martin echo " (extracted from: ${SRC_ARG})"
2614 1.19.2.2 martin fi
2615 1.19.2.2 martin list
2616 1.19.2.2 martin ;;
2617 1.19.2.2 martin
2618 1.19.2.2 martin check|fix)
2619 1.19.2.2 martin todo="$*"
2620 1.19.2.2 martin : ${todo:="${defaultitems}"}
2621 1.19.2.2 martin
2622 1.19.2.2 martin # ensure that all supplied items are valid
2623 1.19.2.2 martin #
2624 1.19.2.2 martin for i in ${todo}; do
2625 1.19.2.2 martin eval desc=\"\${desc_${i}}\"
2626 1.19.2.2 martin [ -n "${desc}" ] || err 2 "Unsupported ${op} '"${i}"'"
2627 1.19.2.2 martin done
2628 1.19.2.2 martin
2629 1.19.2.2 martin # perform each check/fix
2630 1.19.2.2 martin #
2631 1.19.2.2 martin echo "Source directory: ${SRC_DIR:-/}"
2632 1.19.2.2 martin if $TGZMODE; then
2633 1.19.2.2 martin echo " (extracted from: ${SRC_ARG})"
2634 1.19.2.2 martin fi
2635 1.19.2.2 martin echo "Target directory: ${DEST_DIR:-/}"
2636 1.19.2.2 martin items_passed=
2637 1.19.2.2 martin items_failed=
2638 1.19.2.2 martin for i in ${todo}; do
2639 1.19.2.2 martin echo "${i} ${op}:"
2640 1.19.2.2 martin ( eval do_${i} ${op} )
2641 1.19.2.2 martin if [ $? -eq 0 ]; then
2642 1.19.2.2 martin items_passed="${items_passed} ${i}"
2643 1.19.2.2 martin else
2644 1.19.2.2 martin items_failed="${items_failed} ${i}"
2645 1.19.2.2 martin fi
2646 1.19.2.2 martin done
2647 1.19.2.2 martin
2648 1.19.2.2 martin if [ "${op}" = "check" ]; then
2649 1.19.2.2 martin plural="checks"
2650 1.19.2.2 martin else
2651 1.19.2.2 martin plural="fixes"
2652 1.19.2.2 martin fi
2653 1.19.2.2 martin
2654 1.19.2.2 martin echo "${PROGNAME} ${plural} passed:${items_passed}"
2655 1.19.2.2 martin echo "${PROGNAME} ${plural} failed:${items_failed}"
2656 1.19.2.2 martin if [ -n "${items_failed}" ]; then
2657 1.19.2.2 martin exitstatus=1;
2658 1.19.2.2 martin if [ "${op}" = "check" ]; then
2659 1.19.2.2 martin [ "$MACHINE" = "$(uname -m)" ] && m= || m=" -m $MACHINE"
2660 1.19.2.2 martin cat <<_Fix_me_
2661 1.19.2.2 martin To fix, run:
2662 1.19.2.2 martin ${HOST_SH} ${0} ${SRC_ARGLIST} ${XSRC_DIR_FIX}-d ${DEST_DIR:-/}$m fix${items_failed}
2663 1.19.2.2 martin Note that this may overwrite local changes.
2664 1.19.2.2 martin _Fix_me_
2665 1.19.2.2 martin fi
2666 1.19.2.2 martin fi
2667 1.19.2.2 martin
2668 1.19.2.2 martin ;;
2669 1.19.2.2 martin
2670 1.19.2.2 martin *)
2671 1.19.2.2 martin warn "Unknown operation '"${op}"'"
2672 1.19.2.2 martin usage
2673 1.19.2.2 martin ;;
2674 1.19.2.2 martin
2675 1.19.2.2 martin esac
2676 1.19.2.2 martin }
2677 1.19.2.2 martin
2678 1.19.2.2 martin if [ -n "$POSTINSTALL_FUNCTION" ]; then
2679 1.19.2.2 martin eval "$POSTINSTALL_FUNCTION"
2680 1.19.2.2 martin exit 0
2681 1.19.2.2 martin fi
2682 1.19.2.2 martin
2683 1.19.2.2 martin # defaults
2684 1.19.2.2 martin #
2685 1.19.2.2 martin PROGNAME="${0##*/}"
2686 1.19.2.2 martin SRC_ARG="/usr/src"
2687 1.19.2.2 martin DEST_DIR="/"
2688 1.19.2.2 martin : ${MACHINE:="$( uname -m )"} # assume native build if $MACHINE is not set
2689 1.19.2.2 martin : ${MACHINE_ARCH:="$( uname -p )"}# assume native build if not set
2690 1.19.2.2 martin
2691 1.19.2.2 martin DIFF_STYLE=
2692 1.19.2.2 martin NOT_FIXED=" (FIX MANUALLY)"
2693 1.19.2.2 martin SCRATCHDIR="$( mkdtemp )" || err 2 "Can't create scratch directory"
2694 1.19.2.2 martin trap "/bin/rm -rf \"\${SCRATCHDIR}\" ; exit 0" 1 2 3 15 # HUP INT QUIT TERM
2695 1.19.2.2 martin
2696 1.19.2.2 martin umask 022
2697 1.19.2.2 martin exec 3>/dev/null
2698 1.19.2.2 martin exec 4>/dev/null
2699 1.19.2.2 martin exitstatus=0
2700 1.19.2.2 martin
2701 1.19.2.2 martin main "$@"
2702 1.19.2.2 martin /bin/rm -rf "${SCRATCHDIR}"
2703 1.19.2.2 martin exit $exitstatus
2704