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