Home | History | Annotate | Line # | Download | only in postinstall
postinstall.in revision 1.53
      1   1.1  christos #!/bin/sh
      2   1.1  christos #
      3  1.53  riastrad # $NetBSD: postinstall.in,v 1.53 2023/08/26 05:59:00 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.53  riastrad #	opensslcerts
   1666  1.53  riastrad #
   1667  1.53  riastrad 
   1668  1.53  riastrad additem opensslcerts "build /etc/openssl/certs cache of HTTPS CA certificates"
   1669  1.53  riastrad do_opensslcerts()
   1670  1.53  riastrad {
   1671  1.53  riastrad 	[ -n "$1" ] || err 3 "USAGE: do_opensslcerts fix|check"
   1672  1.53  riastrad 
   1673  1.53  riastrad 	case $1 in
   1674  1.53  riastrad 	check)	# XXX Anything to check?
   1675  1.53  riastrad 		return 0
   1676  1.53  riastrad 		;;
   1677  1.53  riastrad 	fix)	# This runs openssl(1), which is not available as a
   1678  1.53  riastrad 		# build-time tool.  So for now, restrict it to running
   1679  1.53  riastrad 		# on the installed system.
   1680  1.53  riastrad 		case $DEST_DIR in
   1681  1.53  riastrad 		''|/)	;;
   1682  1.53  riastrad 		*)	msg "opensslcerts limited to DEST_DIR=/"
   1683  1.53  riastrad 			return 1
   1684  1.53  riastrad 			;;
   1685  1.53  riastrad 		esac
   1686  1.53  riastrad 		certctl rehash
   1687  1.53  riastrad 		return 0
   1688  1.53  riastrad 		;;
   1689  1.53  riastrad 	*)	err 3 "USAGE: do_opensslcerts fix|check"
   1690  1.53  riastrad 		;;
   1691  1.53  riastrad 	esac
   1692  1.53  riastrad }
   1693  1.53  riastrad 
   1694  1.53  riastrad 
   1695  1.53  riastrad #
   1696   1.1  christos #	pam
   1697   1.1  christos #
   1698  1.37     lukem 
   1699   1.1  christos additem pam "/etc/pam.d is populated"
   1700   1.1  christos do_pam()
   1701   1.1  christos {
   1702  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_pam fix|check"
   1703   1.1  christos 	op="$1"
   1704   1.1  christos 	failed=0
   1705   1.1  christos 
   1706   1.1  christos 	populate_dir "${op}" true "${SRC_DIR}/etc/pam.d" \
   1707   1.1  christos 		"${DEST_DIR}/etc/pam.d" 644 \
   1708   1.1  christos 		README cron display_manager ftpd gdm imap kde login other \
   1709   1.1  christos 		passwd pop3 ppp racoon rexecd rsh sshd su system telnetd \
   1710   1.1  christos 		xdm xserver
   1711   1.1  christos 
   1712   1.1  christos 	failed=$(( ${failed} + $? ))
   1713   1.1  christos 
   1714   1.1  christos 	return ${failed}
   1715   1.1  christos }
   1716   1.1  christos 
   1717  1.37     lukem 
   1718   1.1  christos #
   1719   1.1  christos #	periodic
   1720   1.1  christos #
   1721  1.37     lukem 
   1722   1.1  christos additem periodic "/etc/{daily,weekly,monthly,security} being up to date"
   1723   1.1  christos do_periodic()
   1724   1.1  christos {
   1725  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_periodic fix|check"
   1726   1.1  christos 
   1727   1.1  christos 	compare_dir "$1" "${SRC_DIR}/etc" "${DEST_DIR}/etc" 644 \
   1728   1.1  christos 		daily weekly monthly security
   1729   1.1  christos }
   1730   1.1  christos 
   1731  1.37     lukem 
   1732   1.1  christos #
   1733   1.1  christos #	pf
   1734   1.1  christos #
   1735  1.37     lukem 
   1736   1.1  christos additem pf "pf configuration being up to date"
   1737   1.1  christos do_pf()
   1738   1.1  christos {
   1739  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_pf fix|check"
   1740   1.1  christos 	op="$1"
   1741   1.1  christos 	failed=0
   1742   1.1  christos 
   1743   1.1  christos 	find_file_in_dirlist pf.os "pf.os" \
   1744   1.1  christos 	    "${SRC_DIR}/dist/pf/etc" "${SRC_DIR}/etc" \
   1745   1.1  christos 	    || return 1
   1746   1.1  christos 			# ${dir} is set by find_file_in_dirlist()
   1747   1.1  christos 	populate_dir "${op}" true \
   1748   1.1  christos 	    "${dir}" "${DEST_DIR}/etc" 644 \
   1749   1.1  christos 	    pf.conf
   1750   1.1  christos 	failed=$(( ${failed} + $? ))
   1751   1.1  christos 
   1752   1.1  christos 	compare_dir "${op}" "${dir}" "${DEST_DIR}/etc" 444 pf.os
   1753   1.1  christos 	failed=$(( ${failed} + $? ))
   1754   1.1  christos 
   1755   1.1  christos 	return ${failed}
   1756   1.1  christos }
   1757   1.1  christos 
   1758  1.37     lukem 
   1759  1.37     lukem #
   1760  1.37     lukem #	ptyfsoldnodes
   1761  1.37     lukem #
   1762  1.37     lukem 
   1763  1.37     lukem additem ptyfsoldnodes "remove legacy device nodes when using ptyfs"
   1764  1.37     lukem do_ptyfsoldnodes()
   1765  1.37     lukem {
   1766  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_ptyfsoldnodes fix|check"
   1767  1.37     lukem 	_ptyfs_op="$1"
   1768  1.37     lukem 
   1769  1.37     lukem 	# Check whether ptyfs is in use
   1770  1.37     lukem 	failed=0;
   1771  1.37     lukem 	if ! ${GREP} -E "^ptyfs" "${DEST_DIR}/etc/fstab" > /dev/null; then
   1772  1.37     lukem 		msg "ptyfs is not in use"
   1773  1.37     lukem 		return 0
   1774  1.37     lukem 	fi
   1775  1.37     lukem 
   1776  1.37     lukem 	if [ ! -e "${DEST_DIR}/dev/pts" ]; then
   1777  1.37     lukem 		msg "ptyfs is not properly configured: missing /dev/pts"
   1778  1.37     lukem 		return 1
   1779  1.37     lukem 	fi
   1780  1.37     lukem 
   1781  1.37     lukem 	# Find the device major numbers for the pty master and slave
   1782  1.37     lukem 	# devices, by parsing the output from "MAKEDEV -s pty0".
   1783  1.37     lukem 	#
   1784  1.37     lukem 	# Output from MAKEDEV looks like this:
   1785  1.37     lukem 	# ./ttyp0 type=char device=netbsd,5,0 mode=666 gid=0 uid=0
   1786  1.37     lukem 	# ./ptyp0 type=char device=netbsd,6,0 mode=666 gid=0 uid=0
   1787  1.37     lukem 	#
   1788  1.37     lukem 	# Output from awk, used in the eval statement, looks like this:
   1789  1.37     lukem 	# maj_ptym=6; maj_ptys=5;
   1790  1.37     lukem 	#
   1791  1.37     lukem 	find_makedev
   1792  1.37     lukem 	eval "$(
   1793  1.37     lukem 	    ${HOST_SH} "${MAKEDEV_DIR}/MAKEDEV" -s pty0 2>/dev/null \
   1794  1.37     lukem 	    | ${AWK} '\
   1795  1.37     lukem 	    BEGIN { before_re = ".*device=[a-zA-Z]*,"; after_re = ",.*"; }
   1796  1.37     lukem 	    /ptyp0/ { maj_ptym = gensub(before_re, "", 1, $0);
   1797  1.37     lukem 		      maj_ptym = gensub(after_re, "", 1, maj_ptym); }
   1798  1.37     lukem 	    /ttyp0/ { maj_ptys = gensub(before_re, "", 1, $0);
   1799  1.37     lukem 		      maj_ptys = gensub(after_re, "", 1, maj_ptys); }
   1800  1.37     lukem 	    END { print "maj_ptym=" maj_ptym "; maj_ptys=" maj_ptys ";"; }
   1801  1.37     lukem 	    '
   1802  1.37     lukem 	    )"
   1803  1.37     lukem 	#msg "Major numbers are maj_ptym=${maj_ptym} maj_ptys=${maj_ptys}"
   1804  1.37     lukem 	if [ -z "$maj_ptym" ] || [ -z "$maj_ptys" ]; then
   1805  1.37     lukem 		msg "Cannot find device major numbers for pty master and slave"
   1806  1.37     lukem 		return 1
   1807  1.37     lukem 	fi
   1808  1.37     lukem 
   1809  1.37     lukem 	# look for /dev/[pt]ty[p-zP-T][0-9a-zA-Z], and check that they
   1810  1.37     lukem 	# have the expected device major numbers.  ttyv* is typically not a
   1811  1.37     lukem 	# pty device, but we check it anyway.
   1812  1.37     lukem 	#
   1813  1.37     lukem 	# The "for d1" loop is intended to avoid overflowing ARG_MAX;
   1814  1.37     lukem 	# otherwise we could have used a single glob pattern.
   1815  1.37     lukem 	#
   1816  1.37     lukem 	# If there are no files that match a particular pattern,
   1817  1.37     lukem 	# then stat prints something like:
   1818  1.37     lukem 	#    stat: /dev/[pt]tyx?: lstat: No such file or directory
   1819  1.37     lukem 	# and we ignore it.  XXX: We also ignore other error messages.
   1820  1.37     lukem 	#
   1821  1.37     lukem 	_ptyfs_tmp="$(mktemp /tmp/postinstall.ptyfs.XXXXXXXX)"
   1822  1.37     lukem 	for d1 in p q r s t u v w x y z P Q R S T; do
   1823  1.37     lukem 		${STAT} -f "%Hr %N" "${DEST_DIR}/dev/"[pt]ty${d1}? 2>&1
   1824  1.37     lukem 	done \
   1825  1.37     lukem 	| while read -r major node ; do
   1826  1.37     lukem 		case "$major" in
   1827  1.37     lukem 		${maj_ptym}|${maj_ptys}) echo "$node" ;;
   1828  1.37     lukem 		esac
   1829  1.37     lukem 	done >"${_ptyfs_tmp}"
   1830  1.37     lukem 
   1831  1.37     lukem 	_desc="legacy device node"
   1832  1.37     lukem 	while read node; do
   1833  1.37     lukem 		if [ "${_ptyfs_op}" = "check" ]; then
   1834  1.37     lukem 			msg "Remove ${_desc} ${node}"
   1835  1.37     lukem 			failed=1
   1836  1.37     lukem 		else # "fix"
   1837  1.37     lukem 			if rm "${node}"; then
   1838  1.37     lukem 				msg "Removed ${_desc} ${node}"
   1839  1.37     lukem 			else
   1840  1.37     lukem 				warn "Failed to remove ${_desc} ${node}"
   1841  1.37     lukem 				failed=1
   1842  1.37     lukem 			fi
   1843  1.37     lukem 		fi
   1844  1.37     lukem 	done < "${_ptyfs_tmp}"
   1845  1.37     lukem 	rm "${_ptyfs_tmp}"
   1846  1.37     lukem 
   1847  1.37     lukem 	return ${failed}
   1848  1.37     lukem }
   1849  1.37     lukem 
   1850  1.37     lukem 
   1851   1.1  christos #
   1852   1.1  christos #	pwd_mkdb
   1853   1.1  christos #
   1854  1.37     lukem 
   1855   1.1  christos additem pwd_mkdb "passwd database version"
   1856   1.1  christos do_pwd_mkdb()
   1857   1.1  christos {
   1858  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_pwd_mkdb fix|check"
   1859   1.1  christos 	op="$1"
   1860   1.1  christos 	failed=0
   1861   1.1  christos 
   1862   1.1  christos 	# XXX Ideally, we should figure out the endianness of the
   1863   1.1  christos 	# target machine, and add "-E B"/"-E L" to the db(1) flags,
   1864   1.1  christos 	# and "-B"/"-L" to the pwd_mkdb(8) flags if the target is not
   1865   1.1  christos 	# the same as the host machine.  It probably doesn't matter,
   1866   1.1  christos 	# because we don't expect "postinstall fix pwd_mkdb" to be
   1867   1.1  christos 	# invoked during a cross build.
   1868   1.1  christos 
   1869   1.1  christos 	set -- $(${DB} -q -Sb -Ub -To -N hash "${DEST_DIR}/etc/pwd.db" \
   1870   1.1  christos 		'VERSION\0')
   1871   1.1  christos 	case "$2" in
   1872   1.1  christos 	'\001\000\000\000') return 0 ;; # version 1, little-endian
   1873   1.1  christos 	'\000\000\000\001') return 0 ;; # version 1, big-endian
   1874   1.1  christos 	esac
   1875   1.1  christos 
   1876   1.1  christos 	if [ "${op}" = "check" ]; then
   1877   1.1  christos 		msg "Update format of passwd database"
   1878   1.1  christos 		failed=1
   1879   1.1  christos 	elif ! ${PWD_MKDB} -V 1 -d "${DEST_DIR:-/}" \
   1880   1.1  christos 			"${DEST_DIR}/etc/master.passwd";
   1881   1.1  christos 	then
   1882   1.1  christos 		msg "Can't update format of passwd database"
   1883   1.1  christos 		failed=1
   1884   1.1  christos 	else
   1885   1.1  christos 		msg "Updated format of passwd database"
   1886   1.1  christos 	fi
   1887   1.1  christos 
   1888   1.1  christos 	return ${failed}
   1889   1.1  christos }
   1890   1.1  christos 
   1891  1.37     lukem 
   1892   1.1  christos #
   1893   1.1  christos #	rc
   1894   1.1  christos #
   1895   1.1  christos 
   1896  1.12   tsutsui # There is no info in src/distrib or /etc/mtree which rc* files
   1897  1.12   tsutsui # can be overwritten unconditionally on upgrade. See PR/54741.
   1898  1.12   tsutsui rc_644_files="
   1899  1.12   tsutsui rc
   1900  1.12   tsutsui rc.subr
   1901  1.12   tsutsui rc.shutdown
   1902  1.12   tsutsui "
   1903  1.12   tsutsui 
   1904   1.1  christos rc_obsolete_vars="
   1905   1.1  christos amd amd_master
   1906   1.1  christos btcontrol btcontrol_devices
   1907   1.1  christos critical_filesystems critical_filesystems_beforenet
   1908   1.1  christos mountcritlocal mountcritremote
   1909   1.1  christos network ip6forwarding
   1910   1.1  christos network nfsiod_flags
   1911   1.1  christos sdpd sdpd_control
   1912   1.1  christos sdpd sdpd_groupname
   1913   1.1  christos sdpd sdpd_username
   1914   1.1  christos sysctl defcorename
   1915   1.1  christos "
   1916   1.1  christos 
   1917   1.1  christos update_rc()
   1918   1.1  christos {
   1919   1.1  christos 	local op=$1
   1920   1.1  christos 	local dir=$2
   1921   1.1  christos 	local name=$3
   1922   1.1  christos 	local bindir=$4
   1923   1.1  christos 	local rcdir=$5
   1924   1.1  christos 
   1925   1.1  christos 	if [ ! -x "${DEST_DIR}/${bindir}/${name}" ]; then
   1926   1.1  christos 		return 0
   1927   1.1  christos 	fi
   1928   1.1  christos 
   1929   1.1  christos 	if ! find_file_in_dirlist "${name}" "${name}" \
   1930   1.1  christos 	    "${rcdir}" "${SRC_DIR}/etc/rc.d"; then
   1931   1.1  christos 		return 1
   1932   1.1  christos 	fi
   1933   1.1  christos 	populate_dir "${op}" false "${dir}" "${DEST_DIR}/etc/rc.d" 555 "${name}"
   1934   1.1  christos 	return $?
   1935   1.1  christos }
   1936   1.1  christos 
   1937   1.1  christos # select non-obsolete files in a sets file
   1938   1.1  christos # $1: directory pattern
   1939   1.1  christos # $2: file pattern
   1940   1.1  christos # $3: filename
   1941   1.1  christos select_set_files()
   1942   1.1  christos {
   1943   1.1  christos 	local qdir="$(echo $1 | ${SED} -e s@/@\\\\/@g -e s/\\./\\\\./g)"
   1944   1.1  christos 	${SED} -n -e /obsolete/d \
   1945   1.1  christos 	    -e "/^\.${qdir}/s@^.$2[[:space:]].*@\1@p" $3
   1946   1.1  christos }
   1947   1.1  christos 
   1948   1.4  christos # select obsolete files in a sets file
   1949   1.4  christos # $1: directory pattern
   1950   1.4  christos # $2: file pattern
   1951  1.10  christos # $3: setname
   1952   1.4  christos select_obsolete_files()
   1953   1.4  christos {
   1954  1.10  christos 	if $SOURCEMODE; then
   1955  1.10  christos 		${SED} -n -e "/obsolete/s@\.$1$2[[:space:]].*@\1@p" \
   1956  1.35     lukem 		    "${SRC_DIR}/distrib/sets/lists/$3/mi"
   1957  1.11  christos 		return
   1958  1.11  christos 	fi
   1959  1.11  christos 
   1960  1.11  christos 	# On upgrade builds we don't extract the "etc" set so we
   1961  1.11  christos 	# try to use the source set instead. See PR/54730 for
   1962  1.11  christos 	# ways to better handle this.
   1963  1.11  christos 
   1964  1.11  christos 	local obsolete_dir
   1965  1.11  christos 
   1966  1.11  christos 	if [ $3 = "etc" ] ;then
   1967  1.35     lukem 		obsolete_dir="${SRC_DIR}/var/db/obsolete"
   1968  1.10  christos 	else
   1969  1.35     lukem 		obsolete_dir="${DEST_DIR}/var/db/obsolete"
   1970  1.10  christos 	fi
   1971  1.11  christos 	${SED} -n -e "s@\.$1$2\$@\1@p" "${obsolete_dir}/$3"
   1972   1.4  christos }
   1973   1.4  christos 
   1974   1.1  christos getetcsets()
   1975   1.1  christos {
   1976   1.1  christos 	if $SOURCEMODE; then
   1977   1.1  christos 		echo "${SRC_DIR}/distrib/sets/lists/etc/mi"
   1978   1.1  christos 	else
   1979   1.1  christos 		echo "${SRC_DIR}/etc/mtree/set.etc"
   1980   1.1  christos 	fi
   1981   1.1  christos }
   1982   1.1  christos 
   1983   1.1  christos additem rc "/etc/rc* and /etc/rc.d/ being up to date"
   1984   1.1  christos do_rc()
   1985   1.1  christos {
   1986  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_rc fix|check"
   1987   1.1  christos 	local op="$1"
   1988   1.1  christos 	local failed=0
   1989   1.1  christos 	local generated_scripts=""
   1990   1.1  christos 	local etcsets=$(getetcsets)
   1991   1.1  christos 	if [ "${MKX11}" != "no" ]; then
   1992   1.1  christos 		generated_scripts="${generated_scripts} xdm xfs"
   1993   1.1  christos 	fi
   1994   1.1  christos 
   1995   1.1  christos 	# Directories of external programs that have rc files (in bsd)
   1996  1.26  christos 	local rc_external_files="blocklist nsd unbound"
   1997   1.1  christos 
   1998   1.1  christos 	# rc* files in /etc/
   1999  1.12   tsutsui 	# XXX: at least rc.conf and rc.local shouldn't be updated. PR/54741
   2000  1.12   tsutsui 	#local rc_644_files="$(select_set_files /etc/rc \
   2001  1.12   tsutsui 	#    "/etc/\(rc[^[:space:]/]*\)" ${etcsets})"
   2002   1.1  christos 
   2003   1.1  christos 	# no-obsolete rc files in /etc/rc.d
   2004   1.1  christos 	local rc_555_files="$(select_set_files /etc/rc.d/ \
   2005   1.1  christos 	    "/etc/rc\.d/\([^[:space:]]*\)" ${etcsets} | \
   2006   1.1  christos 	    exclude ${rc_external_files})"
   2007   1.1  christos 
   2008   1.1  christos 	# obsolete rc file in /etc/rc.d
   2009   1.4  christos 	local rc_obsolete_files="$(select_obsolete_files /etc/rc.d/ \
   2010  1.10  christos 	    "\([^[:space:]]*\)" etc)"
   2011   1.1  christos 
   2012   1.1  christos 	compare_dir "${op}" "${SRC_DIR}/etc" "${DEST_DIR}/etc" 644 \
   2013   1.1  christos 		${rc_644_files}
   2014   1.1  christos 	failed=$(( ${failed} + $? ))
   2015   1.1  christos 
   2016   1.1  christos 	local extra_scripts
   2017   1.1  christos 	if ! $SOURCEMODE; then
   2018   1.1  christos 		extra_scripts="${generated_scripts}"
   2019   1.1  christos 	else
   2020   1.1  christos 		extra_scripts=""
   2021   1.1  christos 	fi
   2022   1.1  christos 
   2023   1.1  christos 	compare_dir "${op}" "${SRC_DIR}/etc/rc.d" "${DEST_DIR}/etc/rc.d" 555 \
   2024   1.1  christos 		${rc_555_files} \
   2025   1.1  christos 		${extra_scripts}
   2026   1.1  christos 	failed=$(( ${failed} + $? ))
   2027   1.1  christos 
   2028   1.1  christos 	for i in ${rc_external_files}; do
   2029  1.28  riastrad 	    local rc_file
   2030   1.1  christos 	    case $i in
   2031   1.1  christos 	    *d) rc_file=${i};;
   2032   1.1  christos 	    *)	rc_file=${i}d;;
   2033   1.1  christos 	    esac
   2034  1.28  riastrad 
   2035   1.1  christos 	    update_rc "${op}" "${dir}" ${rc_file} /sbin \
   2036   1.1  christos 		"${SRC_DIR}/external/bsd/$i/etc/rc.d"
   2037   1.1  christos 	    failed=$(( ${failed} + $? ))
   2038   1.1  christos 	done
   2039   1.1  christos 
   2040   1.1  christos 	if $SOURCEMODE && [ -n "${generated_scripts}" ]; then
   2041   1.1  christos 		# generate scripts
   2042   1.1  christos 		mkdir "${SCRATCHDIR}/rc"
   2043   1.1  christos 		for f in ${generated_scripts}; do
   2044   1.1  christos 			${SED} -e "s,@X11ROOTDIR@,${X11ROOTDIR},g" \
   2045   1.1  christos 			    < "${SRC_DIR}/etc/rc.d/${f}.in" \
   2046   1.1  christos 			    > "${SCRATCHDIR}/rc/${f}"
   2047   1.1  christos 		done
   2048   1.1  christos 		compare_dir "${op}" "${SCRATCHDIR}/rc" \
   2049   1.1  christos 		    "${DEST_DIR}/etc/rc.d" 555 \
   2050   1.1  christos 		    ${generated_scripts}
   2051   1.1  christos 		failed=$(( ${failed} + $? ))
   2052   1.1  christos 	fi
   2053   1.1  christos 
   2054   1.1  christos 		# check for obsolete rc.d files
   2055   1.1  christos 	for f in ${rc_obsolete_files}; do
   2056   1.1  christos 		local fd="/etc/rc.d/${f}"
   2057   1.1  christos 		[ -e "${DEST_DIR}${fd}" ] && echo "${fd}"
   2058   1.1  christos 	done | obsolete_paths "${op}"
   2059   1.1  christos 	failed=$(( ${failed} + $? ))
   2060   1.1  christos 
   2061   1.1  christos 		# check for obsolete rc.conf(5) variables
   2062   1.1  christos 	set -- ${rc_obsolete_vars}
   2063   1.1  christos 	while [ $# -gt 1 ]; do
   2064   1.1  christos 		if rcconf_is_set "${op}" "$1" "$2" 1; then
   2065   1.1  christos 			failed=1
   2066   1.1  christos 		fi
   2067   1.1  christos 		shift 2
   2068   1.1  christos 	done
   2069   1.1  christos 
   2070   1.1  christos 	return ${failed}
   2071   1.1  christos }
   2072   1.1  christos 
   2073  1.37     lukem 
   2074   1.1  christos #
   2075   1.1  christos #	sendmail
   2076   1.1  christos #
   2077  1.37     lukem 
   2078   1.1  christos adddisableditem sendmail "remove obsolete sendmail configuration files and scripts"
   2079   1.1  christos do_sendmail()
   2080   1.1  christos {
   2081  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_sendmail fix|check"
   2082   1.1  christos 	op="$1"
   2083   1.1  christos 	failed=0
   2084   1.1  christos 
   2085   1.1  christos 	# Don't complain if the "sendmail" package is installed because the
   2086   1.1  christos 	# files might still be in use.
   2087   1.1  christos 	if /usr/sbin/pkg_info -qe sendmail >/dev/null 2>&1; then
   2088   1.1  christos 		return 0
   2089   1.1  christos 	fi
   2090   1.1  christos 
   2091   1.1  christos 	for f in /etc/mail/helpfile /etc/mail/local-host-names \
   2092   1.1  christos 	    /etc/mail/sendmail.cf /etc/mail/submit.cf /etc/rc.d/sendmail \
   2093   1.1  christos 	    /etc/rc.d/smmsp /usr/share/misc/sendmail.hf \
   2094   1.1  christos 	    $( ( find "${DEST_DIR}/usr/share/sendmail" -type f ; \
   2095   1.1  christos 	         find "${DEST_DIR}/usr/share/sendmail" -type d \
   2096   1.1  christos 	       ) | unprefix "${DEST_DIR}" ) \
   2097   1.1  christos 	    /var/log/sendmail.st \
   2098   1.1  christos 	    /var/spool/clientmqueue \
   2099   1.1  christos 	    /var/spool/mqueue
   2100   1.1  christos 	do
   2101   1.1  christos 		[ -e "${DEST_DIR}${f}" ] && echo "${f}"
   2102   1.1  christos 	done | obsolete_paths "${op}"
   2103   1.1  christos 	failed=$(( ${failed} + $? ))
   2104   1.1  christos 
   2105   1.1  christos 	return ${failed}
   2106   1.1  christos }
   2107   1.1  christos 
   2108   1.1  christos 
   2109   1.1  christos #
   2110   1.1  christos #	ssh
   2111   1.1  christos #
   2112  1.37     lukem 
   2113   1.1  christos additem ssh "ssh configuration update"
   2114   1.1  christos do_ssh()
   2115   1.1  christos {
   2116  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_ssh fix|check"
   2117   1.1  christos 	op="$1"
   2118   1.1  christos 
   2119   1.1  christos 	failed=0
   2120   1.1  christos 	_etcssh="${DEST_DIR}/etc/ssh"
   2121   1.1  christos 	if ! check_dir "${op}" "${_etcssh}" 755; then
   2122   1.1  christos 		failed=1
   2123   1.1  christos 	fi
   2124   1.1  christos 
   2125   1.1  christos 	if [ ${failed} -eq 0 ]; then
   2126   1.1  christos 		for f in \
   2127   1.1  christos 			    ssh_known_hosts ssh_known_hosts2 \
   2128   1.1  christos 			    ssh_host_dsa_key ssh_host_dsa_key.pub \
   2129   1.1  christos 			    ssh_host_rsa_key ssh_host_rsa_key.pub \
   2130   1.1  christos 			    ssh_host_key ssh_host_key.pub \
   2131   1.1  christos 		    ; do
   2132   1.1  christos 			if ! move_file "${op}" \
   2133   1.1  christos 			    "${DEST_DIR}/etc/${f}" "${_etcssh}/${f}" ; then
   2134   1.1  christos 				failed=1
   2135   1.1  christos 			fi
   2136   1.1  christos 		done
   2137   1.1  christos 		for f in sshd.conf ssh.conf ; do
   2138   1.1  christos 				# /etc/ssh/ssh{,d}.conf -> ssh{,d}_config
   2139   1.1  christos 				#
   2140   1.1  christos 			if ! move_file "${op}" \
   2141   1.1  christos 			    "${_etcssh}/${f}" "${_etcssh}/${f%.conf}_config" ;
   2142   1.1  christos 			then
   2143   1.1  christos 				failed=1
   2144   1.1  christos 			fi
   2145   1.1  christos 				# /etc/ssh{,d}.conf -> /etc/ssh/ssh{,d}_config
   2146   1.1  christos 				#
   2147   1.1  christos 			if ! move_file "${op}" \
   2148   1.1  christos 			    "${DEST_DIR}/etc/${f}" \
   2149   1.1  christos 			    "${_etcssh}/${f%.conf}_config" ;
   2150   1.1  christos 			then
   2151   1.1  christos 				failed=1
   2152   1.1  christos 			fi
   2153   1.1  christos 		done
   2154   1.1  christos 	fi
   2155   1.1  christos 
   2156   1.1  christos 	sshdconf=""
   2157   1.1  christos 	for f in \
   2158   1.1  christos 	    "${_etcssh}/sshd_config" \
   2159   1.1  christos 	    "${_etcssh}/sshd.conf" \
   2160   1.1  christos 	    "${DEST_DIR}/etc/sshd.conf" ; do
   2161   1.1  christos 		if [ -f "${f}" ]; then
   2162   1.1  christos 			sshdconf="${f}"
   2163   1.1  christos 			break
   2164   1.1  christos 		fi
   2165   1.1  christos 	done
   2166   1.1  christos 	if [ -n "${sshdconf}" ]; then
   2167   1.1  christos 		modify_file "${op}" "${sshdconf}" "${SCRATCHDIR}/sshdconf" '
   2168   1.1  christos 			/^[^#$]/ {
   2169   1.1  christos 				kw = tolower($1)
   2170   1.1  christos 				if (kw == "hostkey" &&
   2171   1.1  christos 				    $2 ~ /^\/etc\/+ssh_host(_[dr]sa)?_key$/ ) {
   2172   1.1  christos 					sub(/\/etc\/+/, "/etc/ssh/")
   2173   1.1  christos 				}
   2174   1.1  christos 				if (kw == "rhostsauthentication" ||
   2175   1.1  christos 				    kw == "verifyreversemapping" ||
   2176   1.1  christos 				    kw == "reversemappingcheck") {
   2177   1.1  christos 					sub(/^/, "# DEPRECATED:\t")
   2178   1.1  christos 				}
   2179   1.1  christos 			}
   2180   1.1  christos 			{ print }
   2181   1.1  christos 		'
   2182   1.1  christos 		failed=$(( ${failed} + $? ))
   2183   1.1  christos 	fi
   2184   1.1  christos 
   2185   1.1  christos 	if ! find_file_in_dirlist moduli "moduli" \
   2186   1.1  christos 	    "${SRC_DIR}/crypto/external/bsd/openssh/dist" "${SRC_DIR}/etc" ; then
   2187   1.1  christos 		failed=1
   2188   1.1  christos 			# ${dir} is set by find_file_in_dirlist()
   2189   1.1  christos 	elif ! compare_dir "${op}" "${dir}" "${DEST_DIR}/etc" 444 moduli; then
   2190   1.1  christos 		failed=1
   2191   1.1  christos 	fi
   2192   1.1  christos 
   2193   1.1  christos 	if ! check_dir "${op}" "${DEST_DIR}/var/chroot/sshd" 755 ; then
   2194   1.1  christos 		failed=1
   2195   1.1  christos 	fi
   2196   1.1  christos 
   2197   1.1  christos 	if rcconf_is_set "${op}" sshd sshd_conf_dir 1; then
   2198   1.1  christos 		failed=1
   2199   1.1  christos 	fi
   2200   1.1  christos 
   2201   1.1  christos 	return ${failed}
   2202   1.1  christos }
   2203   1.1  christos 
   2204  1.37     lukem 
   2205   1.1  christos #
   2206  1.37     lukem #	tcpdumpchroot
   2207   1.1  christos #
   2208  1.37     lukem 
   2209  1.37     lukem additem tcpdumpchroot "remove /var/chroot/tcpdump/etc/protocols"
   2210  1.37     lukem do_tcpdumpchroot()
   2211   1.1  christos {
   2212  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_tcpdumpchroot fix|check"
   2213  1.37     lukem 
   2214  1.37     lukem 	failed=0;
   2215  1.37     lukem 	if [ -r "${DEST_DIR}/var/chroot/tcpdump/etc/protocols" ]; then
   2216  1.37     lukem 		if [ "$1" = "fix" ]; then
   2217  1.37     lukem 			rm "${DEST_DIR}/var/chroot/tcpdump/etc/protocols"
   2218  1.37     lukem 			failed=$(( ${failed} + $? ))
   2219  1.37     lukem 			rmdir "${DEST_DIR}/var/chroot/tcpdump/etc"
   2220  1.37     lukem 			failed=$(( ${failed} + $? ))
   2221  1.37     lukem 		else
   2222  1.37     lukem 			failed=1
   2223  1.37     lukem 		fi
   2224  1.37     lukem 	fi
   2225  1.37     lukem 	return ${failed}
   2226  1.37     lukem }
   2227  1.37     lukem 
   2228  1.37     lukem 
   2229  1.37     lukem #
   2230  1.37     lukem #	uid
   2231  1.37     lukem #
   2232  1.37     lukem 
   2233  1.37     lukem additem uid "required users in /etc/master.passwd"
   2234  1.37     lukem do_uid()
   2235  1.37     lukem {
   2236  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_uid fix|check"
   2237  1.37     lukem 
   2238  1.37     lukem 	check_ids "$1" users "${DEST_DIR}/etc/master.passwd" \
   2239  1.37     lukem 	    "${SRC_DIR}/etc/master.passwd" 12 \
   2240  1.37     lukem 	    postfix SKIP named ntpd sshd SKIP _pflogd _rwhod SKIP _proxy \
   2241  1.37     lukem 	    _timedc _sdpd _httpd _mdnsd _tests _tcpdump _tss SKIP _rtadvd \
   2242  1.37     lukem 	    SKIP _unbound _nsd SKIP _dhcpcd
   2243  1.37     lukem }
   2244  1.37     lukem 
   2245  1.37     lukem 
   2246  1.37     lukem #
   2247  1.37     lukem #	varrwho
   2248  1.37     lukem #
   2249  1.37     lukem 
   2250  1.37     lukem additem varrwho "required ownership of files in /var/rwho"
   2251  1.37     lukem do_varrwho()
   2252  1.37     lukem {
   2253  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_varrwho fix|check"
   2254  1.37     lukem 
   2255  1.37     lukem 	contents_owner "$1" "${DEST_DIR}/var/rwho" _rwhod _rwhod
   2256  1.37     lukem }
   2257  1.37     lukem 
   2258  1.37     lukem 
   2259  1.37     lukem #
   2260  1.37     lukem #	varshm
   2261  1.37     lukem #
   2262  1.37     lukem 
   2263  1.37     lukem additem varshm "check for a tmpfs mounted on /var/shm"
   2264  1.37     lukem do_varshm()
   2265  1.37     lukem {
   2266  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_varshm fix|check"
   2267  1.37     lukem 	op="$1"
   2268  1.37     lukem 	failed=0
   2269  1.37     lukem 
   2270  1.37     lukem 	[ -f "${DEST_DIR}/etc/fstab" ] || return 0
   2271  1.37     lukem 	if ${GREP} -E "^var_shm_symlink" "${DEST_DIR}/etc/rc.conf" >/dev/null 2>&1;
   2272  1.37     lukem 	then
   2273  1.37     lukem 		failed=0;
   2274  1.37     lukem 	elif ${GREP} -w "/var/shm" "${DEST_DIR}/etc/fstab" >/dev/null 2>&1;
   2275  1.37     lukem 	then
   2276  1.37     lukem 		failed=0;
   2277  1.37     lukem 	else
   2278  1.37     lukem 		if [ "${op}" = "check" ]; then
   2279  1.37     lukem 			failed=1
   2280  1.37     lukem 			msg "No /var/shm mount found in ${DEST_DIR}/etc/fstab"
   2281  1.37     lukem 		elif [ "${op}" = "fix" ]; then
   2282  1.37     lukem 			printf '\ntmpfs\t/var/shm\ttmpfs\trw,-m1777,-sram%%25\n' \
   2283  1.37     lukem 				>> "${DEST_DIR}/etc/fstab"
   2284  1.37     lukem 			msg "Added tmpfs with 25% ram limit as /var/shm"
   2285  1.37     lukem 
   2286  1.37     lukem 		fi
   2287  1.37     lukem 	fi
   2288  1.37     lukem 
   2289  1.37     lukem 	return ${failed}
   2290  1.37     lukem }
   2291  1.37     lukem 
   2292  1.37     lukem 
   2293  1.37     lukem #
   2294  1.37     lukem #	wscons
   2295  1.37     lukem #
   2296  1.37     lukem 
   2297  1.37     lukem additem wscons "wscons configuration file update"
   2298  1.37     lukem do_wscons()
   2299  1.37     lukem {
   2300  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_wscons fix|check"
   2301  1.37     lukem 	op="$1"
   2302   1.1  christos 
   2303   1.1  christos 	[ -f "${DEST_DIR}/etc/wscons.conf" ] || return 0
   2304   1.1  christos 
   2305   1.1  christos 	failed=0
   2306   1.1  christos 	notfixed=""
   2307   1.1  christos 	if [ "${op}" = "fix" ]; then
   2308   1.1  christos 		notfixed="${NOT_FIXED}"
   2309   1.1  christos 	fi
   2310   1.1  christos 	while read _type _arg1 _rest; do
   2311   1.1  christos 		if [ "${_type}" = "mux" -a "${_arg1}" = "1" ]; then
   2312   1.1  christos 			msg \
   2313   1.1  christos     "Obsolete wscons.conf(5) entry \""${_type} ${_arg1}"\" found.${notfixed}"
   2314   1.1  christos 			failed=1
   2315   1.1  christos 		fi
   2316   1.1  christos 	done < "${DEST_DIR}/etc/wscons.conf"
   2317   1.1  christos 
   2318   1.1  christos 	return ${failed}
   2319   1.1  christos }
   2320   1.1  christos 
   2321  1.37     lukem 
   2322   1.1  christos #
   2323  1.37     lukem #	x11
   2324   1.1  christos #
   2325  1.37     lukem 
   2326   1.1  christos additem x11 "x11 configuration update"
   2327   1.1  christos do_x11()
   2328   1.1  christos {
   2329  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_x11 fix|check"
   2330   1.1  christos 	op="$1"
   2331   1.1  christos 
   2332   1.1  christos 	failed=0
   2333   1.1  christos 	_etcx11="${DEST_DIR}/etc/X11"
   2334  1.42     lukem 	_libx11=""
   2335   1.1  christos 	if [ ! -d "${_etcx11}" ]; then
   2336   1.1  christos 		msg "${_etcx11} is not a directory; skipping check"
   2337   1.1  christos 		return 0
   2338   1.1  christos 	fi
   2339   1.1  christos 	if [ -d "${DEST_DIR}/usr/X11R6/." ]
   2340   1.1  christos 	then
   2341   1.1  christos 		_libx11="${DEST_DIR}/usr/X11R6/lib/X11"
   2342   1.1  christos 		if [ ! -d "${_libx11}" ]; then
   2343   1.1  christos 			msg "${_libx11} is not a directory; skipping check"
   2344   1.1  christos 			return 0
   2345   1.1  christos 		fi
   2346   1.1  christos 	fi
   2347   1.1  christos 
   2348   1.1  christos 	_notfixed=""
   2349   1.1  christos 	if [ "${op}" = "fix" ]; then
   2350   1.1  christos 		_notfixed="${NOT_FIXED}"
   2351   1.1  christos 	fi
   2352   1.1  christos 
   2353  1.42     lukem 	# check if /usr/X11R6/lib/X11 needs to migrate to /etc/X11
   2354  1.42     lukem 	if [ -n "${_libx11}" ]; then
   2355  1.42     lukem 		for d in \
   2356  1.42     lukem 			    fs lbxproxy proxymngr rstart twm xdm xinit xserver xsm \
   2357  1.42     lukem 		    ; do
   2358  1.42     lukem 			sd="${_libx11}/${d}"
   2359  1.42     lukem 			ld="/etc/X11/${d}"
   2360  1.42     lukem 			td="${DEST_DIR}${ld}"
   2361  1.42     lukem 			if [ -h "${sd}" ]; then
   2362  1.42     lukem 				continue
   2363  1.42     lukem 			elif [ -d "${sd}" ]; then
   2364  1.42     lukem 				tdfiles="$(find "${td}" \! -type d)"
   2365  1.42     lukem 				if [ -n "${tdfiles}" ]; then
   2366  1.42     lukem 					msg "${sd} exists yet ${td} already" \
   2367  1.42     lukem 					    "contains files${_notfixed}"
   2368  1.42     lukem 				else
   2369  1.42     lukem 					msg "Migrate ${sd} to ${td}${_notfixed}"
   2370  1.42     lukem 				fi
   2371  1.42     lukem 				failed=1
   2372  1.42     lukem 			elif [ -e "${sd}" ]; then
   2373  1.42     lukem 				msg "Unexpected file ${sd}${_notfixed}"
   2374  1.42     lukem 				continue
   2375   1.1  christos 			else
   2376  1.42     lukem 				continue
   2377   1.1  christos 			fi
   2378  1.42     lukem 		done
   2379  1.42     lukem 	fi
   2380   1.1  christos 
   2381   1.1  christos 	# check if xdm resources have been updated
   2382   1.1  christos 	if [ -r ${_etcx11}/xdm/Xresources ] && \
   2383   1.1  christos 	    ! ${GREP} 'inpColor:' ${_etcx11}/xdm/Xresources > /dev/null; then
   2384   1.1  christos 		msg "Update ${_etcx11}/xdm/Xresources${_notfixed}"
   2385   1.1  christos 		failed=1
   2386   1.1  christos 	fi
   2387   1.1  christos 
   2388   1.1  christos 	return ${failed}
   2389   1.1  christos }
   2390   1.1  christos 
   2391  1.37     lukem 
   2392   1.1  christos #
   2393   1.1  christos #	xkb
   2394   1.1  christos #
   2395   1.1  christos # /usr/X11R7/lib/X11/xkb/symbols/pc used to be a directory, but changed
   2396   1.1  christos # to a file on 2009-06-12.  Fixing this requires removing the directory
   2397   1.1  christos # (which we can do) and re-extracting the xbase set (which we can't do),
   2398   1.1  christos # or at least adding that one file (which we may be able to do if X11SRCDIR
   2399   1.1  christos # is available).
   2400   1.1  christos #
   2401  1.37     lukem 
   2402   1.1  christos additem xkb "clean up for xkbdata to xkeyboard-config upgrade"
   2403   1.1  christos do_xkb()
   2404   1.1  christos {
   2405  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_xkb fix|check"
   2406   1.1  christos 	op="$1"
   2407   1.1  christos 	failed=0
   2408   1.1  christos 
   2409   1.1  christos 	pcpath="/usr/X11R7/lib/X11/xkb/symbols/pc"
   2410   1.1  christos 	pcsrcdir="${X11SRCDIR}/external/mit/xkeyboard-config/dist/symbols"
   2411   1.1  christos 
   2412   1.1  christos 	filemsg="\
   2413   1.1  christos ${pcpath} was a directory, should be a file.
   2414   1.1  christos     To fix, extract the xbase set again."
   2415   1.1  christos 
   2416   1.1  christos 	_notfixed=""
   2417   1.1  christos 	if [ "${op}" = "fix" ]; then
   2418   1.1  christos 		_notfixed="${NOT_FIXED}"
   2419   1.1  christos 	fi
   2420   1.1  christos 
   2421   1.1  christos 	if [ ! -d "${DEST_DIR}${pcpath}" ]; then
   2422   1.1  christos 		return 0
   2423   1.1  christos 	fi
   2424   1.1  christos 
   2425   1.1  christos 	# Delete obsolete files in the directory, and the directory
   2426   1.1  christos 	# itself.  If the directory contains unexpected extra files
   2427   1.1  christos 	# then it will not be deleted.
   2428   1.1  christos 	( [ -f "${DEST_DIR}"/var/db/obsolete/xbase ] \
   2429   1.1  christos 	    &&  ${SORT} -ru "${DEST_DIR}"/var/db/obsolete/xbase \
   2430   1.1  christos 	    | ${GREP} -E "^\\.?${pcpath}/" ;
   2431   1.1  christos 	    echo "${pcpath}" ) \
   2432   1.1  christos 	| obsolete_paths "${op}"
   2433   1.1  christos 	failed=$(( ${failed} + $? ))
   2434   1.1  christos 
   2435   1.1  christos 	# If the directory was removed above, then try to replace it with
   2436   1.1  christos 	# a file.
   2437   1.1  christos 	if [ -d "${DEST_DIR}${pcpath}" ]; then
   2438   1.1  christos 		msg "${filemsg}${_notfixed}"
   2439   1.1  christos 		failed=$(( ${failed} + 1 ))
   2440   1.1  christos 	else
   2441   1.1  christos 		if ! find_file_in_dirlist pc "${pcpath}" \
   2442   1.1  christos 			"${pcsrcdir}" "${SRC_DIR}${pcpath%/*}"
   2443   1.1  christos 		then
   2444   1.1  christos 			msg "${filemsg}${_notfixed}"
   2445   1.1  christos 			failed=$(( ${failed} + 1 ))
   2446   1.1  christos 		else
   2447   1.1  christos 			# ${dir} is set by find_file_in_dirlist()
   2448   1.1  christos 			populate_dir "${op}" true \
   2449   1.1  christos 				"${dir}" "${DEST_DIR}${pcpath%/*}" 444 \
   2450   1.1  christos 				pc
   2451   1.1  christos 			failed=$(( ${failed} + $? ))
   2452   1.1  christos 		fi
   2453   1.1  christos 	fi
   2454   1.1  christos 
   2455   1.1  christos 	return $failed
   2456   1.1  christos }
   2457   1.1  christos 
   2458   1.1  christos 
   2459   1.1  christos #
   2460  1.37     lukem #	obsolete_stand
   2461  1.37     lukem #	obsolete_stand_debug
   2462   1.1  christos #
   2463   1.1  christos 
   2464  1.21  christos obsolete_stand_internal()
   2465   1.1  christos {
   2466  1.21  christos 	local prefix="$1"
   2467  1.21  christos 	shift
   2468  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_obsolete_stand fix|check"
   2469  1.21  christos 	local op="$1"
   2470  1.21  christos 	local failed=0
   2471   1.1  christos 
   2472   1.1  christos 	for dir in \
   2473  1.21  christos 	    ${prefix}/stand/${MACHINE} \
   2474  1.21  christos 	    ${prefix}/stand/${MACHINE}-4xx \
   2475  1.21  christos 	    ${prefix}/stand/${MACHINE}-booke \
   2476  1.21  christos 	    ${prefix}/stand/${MACHINE}-xen \
   2477  1.21  christos 	    ${prefix}/stand/${MACHINE}pae-xen
   2478   1.1  christos 	do
   2479  1.34     lukem 		[ -d "${DEST_DIR}${dir}" ] && obsolete_stand "${dir}"
   2480   1.1  christos 	done | obsolete_paths "${op}"
   2481   1.1  christos 	failed=$(( ${failed} + $? ))
   2482   1.1  christos 
   2483   1.1  christos 	return ${failed}
   2484   1.1  christos }
   2485   1.1  christos 
   2486  1.21  christos adddisableditem obsolete_stand "remove obsolete files from /stand"
   2487  1.21  christos do_obsolete_stand()
   2488  1.21  christos {
   2489  1.21  christos 	obsolete_stand_internal "" "$@"
   2490  1.21  christos 	return $?
   2491  1.21  christos }
   2492  1.21  christos 
   2493  1.21  christos adddisableditem obsolete_stand_debug "remove obsolete files from /usr/libdata/debug/stand"
   2494  1.21  christos do_obsolete_stand_debug()
   2495  1.21  christos {
   2496  1.21  christos 	obsolete_stand_internal "/usr/libdata/debug" "$@"
   2497  1.21  christos 	return $?
   2498  1.21  christos }
   2499  1.21  christos 
   2500  1.37     lukem 
   2501  1.37     lukem #
   2502  1.37     lukem #	obsolete
   2503  1.37     lukem #
   2504  1.37     lukem # NOTE: This item is last to allow other items to move obsolete files.
   2505  1.37     lukem #
   2506  1.37     lukem 
   2507  1.37     lukem listarchsubdirs()
   2508  1.37     lukem {
   2509   1.1  christos 	if ! $SOURCEMODE; then
   2510   1.1  christos 		echo "@ARCHSUBDIRS@"
   2511   1.2  christos 	else
   2512   1.2  christos 		${SED} -n -e '/ARCHDIR_SUBDIR/s/[[:space:]]//gp' \
   2513  1.35     lukem 		    "${SRC_DIR}/compat/archdirs.mk"
   2514   1.1  christos 	fi
   2515   1.2  christos }
   2516   1.2  christos 
   2517  1.37     lukem getarchsubdirs()
   2518  1.37     lukem {
   2519   1.1  christos 	local m
   2520   1.1  christos 	case ${MACHINE_ARCH} in
   2521   1.1  christos 	*arm*|*aarch64*)	m=arm;;
   2522   1.1  christos 	x86_64)			m=amd64;;
   2523   1.1  christos 	*)			m=${MACHINE_ARCH};;
   2524   1.1  christos 	esac
   2525   1.1  christos 
   2526   1.2  christos 	for i in $(listarchsubdirs); do
   2527   1.2  christos 		echo $i
   2528   1.2  christos 	done | ${SORT} -u | ${SED} -n -e "/=${m}/s@.*=${m}/\(.*\)@\1@p"
   2529   1.1  christos }
   2530   1.1  christos 
   2531  1.37     lukem getcompatlibdirs()
   2532  1.37     lukem {
   2533   1.1  christos 	for i in $(getarchsubdirs); do
   2534   1.7  nakayama 		if [ -d "${DEST_DIR}/usr/lib/$i" ]; then
   2535   1.1  christos 			echo /usr/lib/$i
   2536   1.1  christos 		fi
   2537   1.1  christos 	done
   2538   1.1  christos }
   2539   1.1  christos 
   2540   1.1  christos additem obsolete "remove obsolete file sets and minor libraries"
   2541   1.1  christos do_obsolete()
   2542   1.1  christos {
   2543  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_obsolete fix|check"
   2544   1.1  christos 	op="$1"
   2545   1.1  christos 	failed=0
   2546   1.1  christos 
   2547   1.1  christos 	${SORT} -ru "${DEST_DIR}"/var/db/obsolete/* | obsolete_paths "${op}"
   2548   1.1  christos 	failed=$(( ${failed} + $? ))
   2549   1.1  christos 
   2550   1.1  christos 	(
   2551   1.1  christos 		obsolete_libs /lib
   2552   1.1  christos 		obsolete_libs /usr/lib
   2553   1.1  christos 		obsolete_libs /usr/lib/i18n
   2554   1.1  christos 		obsolete_libs /usr/X11R6/lib
   2555   1.1  christos 		obsolete_libs /usr/X11R7/lib
   2556   1.1  christos 		for i in $(getcompatlibdirs); do
   2557   1.1  christos 			obsolete_libs $i
   2558   1.1  christos 		done
   2559   1.1  christos 	) | obsolete_paths "${op}"
   2560   1.1  christos 	failed=$(( ${failed} + $? ))
   2561   1.1  christos 
   2562   1.1  christos 	return ${failed}
   2563   1.1  christos }
   2564   1.1  christos 
   2565  1.37     lukem 
   2566   1.1  christos #
   2567   1.1  christos #	end of items
   2568   1.1  christos #	------------
   2569   1.1  christos #
   2570   1.1  christos 
   2571   1.1  christos 
   2572  1.43     lukem help()
   2573   1.1  christos {
   2574  1.43     lukem 	cat << _USAGE_
   2575  1.50     lukem Usage: ${PROGNAME} [-a ARCH] [-d DEST_DIR] [-m MACHINE] [-s SRC_ARG] [-x XSRC_DIR] OPERATION ...
   2576  1.47     lukem        ${PROGNAME} -?
   2577  1.47     lukem 
   2578   1.1  christos 	Perform post-installation checks and/or fixes on a system's
   2579   1.1  christos 	configuration files.
   2580   1.1  christos 	If no items are provided, a default set of checks or fixes is applied.
   2581   1.1  christos 
   2582   1.1  christos 	Options:
   2583  1.48     lukem 	-?		Display this help, and exit.
   2584  1.49     lukem 	-a ARCH		Set \$MACHINE_ARCH to ARCH.	[${MACHINE_ARCH}]
   2585  1.46     lukem 	-d DEST_DIR	Destination directory to check. [${DEST_DIR:-/}]
   2586  1.49     lukem 	-m MACHINE	Set \$MACHINE to MACHINE.	[${MACHINE}]
   2587  1.50     lukem 	-s SRC_ARG	Location of the source files.  This may be any of
   2588  1.46     lukem 			the following:
   2589  1.50     lukem 			-s SRC_DIR	A directory that contains a NetBSD
   2590  1.50     lukem 					source tree.
   2591  1.50     lukem 			-s TGZ_DIR	A directory in which one or both of
   2592  1.50     lukem 					"etc.tgz" and "xetc.tgz" have been
   2593  1.50     lukem 					extracted.
   2594  1.50     lukem 			-s TGZ_FILE	A distribution set file such as
   2595  1.50     lukem 					"etc.tgz" or "xetc.tgz".
   2596  1.50     lukem 					May be specified multipled times.
   2597   1.1  christos 							[${SRC_DIR:-/usr/src}]
   2598  1.46     lukem 	-x XSRC_DIR	Location of the X11 source files.  This must be
   2599   1.1  christos 			a directory that contains a NetBSD xsrc tree.
   2600   1.1  christos 							[${XSRC_DIR:-/usr/src/../xsrc}]
   2601  1.46     lukem 
   2602  1.46     lukem 	Supported values for OPERATION:
   2603  1.48     lukem 	help		Display this help, and exit.
   2604  1.46     lukem 	list		List available items.
   2605  1.46     lukem 	check ITEM ...	Perform post-installation checks on ITEMs.
   2606  1.47     lukem 	diff [-bcenpuw] ITEM ...
   2607  1.46     lukem 			Similar to 'check' but also output difference of files,
   2608  1.47     lukem 			using diff with the provided options.
   2609  1.46     lukem 	fix ITEM ...	Apply fixes that 'check' determines need to be applied.
   2610  1.48     lukem 	usage		Display this help, and exit.
   2611   1.1  christos _USAGE_
   2612  1.43     lukem }
   2613  1.43     lukem 
   2614  1.43     lukem usage()
   2615  1.43     lukem {
   2616  1.43     lukem 	help 1>&2
   2617   1.1  christos 	exit 2
   2618   1.1  christos }
   2619   1.1  christos 
   2620   1.1  christos 
   2621   1.1  christos list()
   2622   1.1  christos {
   2623   1.1  christos 	echo "Default set of items (to apply if no items are provided by user):"
   2624  1.38     lukem 	echo " Item                 Description"
   2625  1.38     lukem 	echo " ----                 -----------"
   2626   1.1  christos 	for i in ${defaultitems}; do
   2627   1.1  christos 		eval desc=\"\${desc_${i}}\"
   2628  1.38     lukem 		printf " %-20s %s\n" "${i}" "${desc}"
   2629   1.1  christos 	done
   2630   1.1  christos 	echo "Items disabled by default (must be requested explicitly):"
   2631  1.38     lukem 	echo " Item                 Description"
   2632  1.38     lukem 	echo " ----                 -----------"
   2633   1.1  christos 	for i in ${otheritems}; do
   2634   1.1  christos 		eval desc=\"\${desc_${i}}\"
   2635  1.38     lukem 		printf " %-20s %s\n" "${i}" "${desc}"
   2636   1.1  christos 	done
   2637   1.1  christos }
   2638   1.1  christos 
   2639   1.1  christos 
   2640   1.1  christos main()
   2641   1.1  christos {
   2642  1.44     lukem 	DIRMODE=false		# true if "-s" specified a directory
   2643  1.45     lukem 	ITEMS=			# items to check|diff|fix. [${defaultitems}]
   2644  1.44     lukem 	N_SRC_ARGS=0		# number of "-s" args in SRC_ARGLIST
   2645  1.44     lukem 	SOURCEMODE=false	# true if "-s" specified a source directory
   2646   1.1  christos 	SRC_ARGLIST=		# quoted list of one or more "-s" args
   2647   1.1  christos 	SRC_DIR="${SRC_ARG}"	# set default value for early usage()
   2648  1.44     lukem 	TGZLIST=		# quoted list list of tgz files
   2649  1.44     lukem 	TGZMODE=false		# true if "-s" specifies a tgz file
   2650   1.1  christos 	XSRC_DIR="${SRC_ARG}/../xsrc"
   2651  1.44     lukem 	XSRC_DIR_FIX=
   2652   1.1  christos 
   2653   1.1  christos 	case "$(uname -s)" in
   2654   1.1  christos 	Darwin)
   2655   1.1  christos 		# case sensitive match for case insensitive fs
   2656   1.1  christos 		file_exists_exact=file_exists_exact
   2657   1.1  christos 		;;
   2658   1.1  christos 	*)
   2659   1.1  christos 		file_exists_exact=:
   2660   1.1  christos 		;;
   2661   1.1  christos 	esac
   2662   1.1  christos 
   2663  1.45     lukem 		# Validate options.
   2664  1.45     lukem 		#
   2665  1.47     lukem 	while getopts :a:d:m:s:x: ch; do
   2666   1.1  christos 		case "${ch}" in
   2667  1.46     lukem 		a)
   2668  1.46     lukem 			MACHINE_ARCH="${OPTARG}"
   2669  1.46     lukem 			;;
   2670  1.46     lukem 		d)
   2671  1.46     lukem 			DEST_DIR="${OPTARG}"
   2672  1.46     lukem 			;;
   2673  1.46     lukem 		m)
   2674  1.46     lukem 			MACHINE="${OPTARG}"
   2675  1.46     lukem 			;;
   2676   1.1  christos 		s)
   2677   1.1  christos 			qarg="$(shell_quote "${OPTARG}")"
   2678   1.1  christos 			N_SRC_ARGS=$(( $N_SRC_ARGS + 1 ))
   2679   1.1  christos 			SRC_ARGLIST="${SRC_ARGLIST}${SRC_ARGLIST:+ }-s ${qarg}"
   2680   1.1  christos 			if [ -f "${OPTARG}" ]; then
   2681   1.1  christos 				# arg refers to a *.tgz file.
   2682   1.1  christos 				# This may happen twice, for both
   2683   1.1  christos 				# etc.tgz and xetc.tgz, so we build up a
   2684   1.1  christos 				# quoted list in TGZLIST.
   2685   1.1  christos 				TGZMODE=true
   2686   1.1  christos 				TGZLIST="${TGZLIST}${TGZLIST:+ }${qarg}"
   2687   1.1  christos 				# Note that, when TGZMODE is true,
   2688   1.1  christos 				# SRC_ARG is used only for printing
   2689   1.1  christos 				# human-readable messages.
   2690   1.1  christos 				SRC_ARG="${TGZLIST}"
   2691   1.1  christos 			elif [ -d "${OPTARG}" ]; then
   2692   1.1  christos 				# arg refers to a directory.
   2693   1.1  christos 				# It might be a source directory, or a
   2694   1.1  christos 				# directory where the sets have already
   2695   1.1  christos 				# been extracted.
   2696   1.1  christos 				DIRMODE=true
   2697   1.1  christos 				SRC_ARG="${OPTARG}"
   2698   1.1  christos 				if [ -f "${OPTARG}/etc/Makefile" ]; then
   2699   1.1  christos 					SOURCEMODE=true
   2700   1.1  christos 				fi
   2701   1.1  christos 			else
   2702   1.1  christos 				err 2 "Invalid argument for -s option"
   2703   1.1  christos 			fi
   2704   1.1  christos 			;;
   2705   1.1  christos 		x)
   2706   1.1  christos 			if [ -d "${OPTARG}" ]; then
   2707   1.1  christos 				# arg refers to a directory.
   2708   1.1  christos 				XSRC_DIR="${OPTARG}"
   2709   1.1  christos 				XSRC_DIR_FIX="-x ${OPTARG} "
   2710   1.1  christos 			else
   2711   1.1  christos 				err 2 "Not a directory for -x option"
   2712   1.1  christos 			fi
   2713   1.1  christos 			;;
   2714  1.47     lukem 		"?")
   2715  1.47     lukem 			if [ "${OPTARG}" = "?" ]; then
   2716  1.47     lukem 				help
   2717  1.47     lukem 				return	# no further processing or validation
   2718  1.47     lukem 			fi
   2719  1.47     lukem 			warn "Unknown option -${OPTARG}"
   2720  1.47     lukem 			usage
   2721  1.47     lukem 			;;
   2722  1.47     lukem 
   2723  1.47     lukem 		:)
   2724  1.47     lukem 			warn "Missing argument for option -${OPTARG}"
   2725  1.47     lukem 			usage
   2726  1.47     lukem 			;;
   2727  1.47     lukem 
   2728   1.1  christos 		*)
   2729  1.47     lukem 			err 3 "Unimplemented option -${ch}"
   2730   1.1  christos 			;;
   2731   1.1  christos 		esac
   2732   1.1  christos 	done
   2733   1.1  christos 	shift $((${OPTIND} - 1))
   2734  1.43     lukem 	if [ $# -eq 0 ] ; then
   2735  1.43     lukem 		warn "Missing operation"
   2736  1.43     lukem 		usage
   2737  1.43     lukem 	fi
   2738  1.45     lukem 	op="$1"
   2739  1.45     lukem 	shift
   2740   1.1  christos 
   2741   1.1  christos 	if [ "$N_SRC_ARGS" -gt 1 ] && $DIRMODE; then
   2742   1.1  christos 		err 2 "Multiple -s args are allowed only with tgz files"
   2743   1.1  christos 	fi
   2744   1.1  christos 	if [ "$N_SRC_ARGS" -eq 0 ]; then
   2745   1.1  christos 		# The default SRC_ARG was set elsewhere
   2746   1.1  christos 		DIRMODE=true
   2747   1.1  christos 		SOURCEMODE=true
   2748   1.1  christos 		SRC_ARGLIST="-s $(shell_quote "${SRC_ARG}")"
   2749   1.1  christos 	fi
   2750   1.1  christos 
   2751  1.45     lukem 		# Validate 'diff' first, as it becomes 'check'
   2752  1.45     lukem 		#
   2753  1.45     lukem 	case "${op}" in
   2754  1.45     lukem 
   2755  1.45     lukem 	diff)
   2756  1.45     lukem 		op=check
   2757  1.45     lukem 		DIFF_STYLE=n			# default style is RCS
   2758  1.45     lukem 		OPTIND=1
   2759  1.47     lukem 		while getopts :bcenpuw ch; do
   2760  1.45     lukem 			case "${ch}" in
   2761  1.45     lukem 			c|e|n|u)
   2762  1.45     lukem 				if [ "${DIFF_STYLE}" != "n" -a \
   2763  1.45     lukem 				    "${DIFF_STYLE}" != "${ch}" ]; then
   2764  1.47     lukem 					warn "diff: conflicting output style: -${ch}"
   2765  1.47     lukem 					usage
   2766  1.45     lukem 				fi
   2767  1.45     lukem 				DIFF_STYLE="${ch}"
   2768  1.45     lukem 				;;
   2769  1.45     lukem 			b|p|w)
   2770  1.45     lukem 				DIFF_OPT="${DIFF_OPT} -${ch}"
   2771  1.45     lukem 				;;
   2772  1.47     lukem 			"?")
   2773  1.47     lukem 				# NOTE: not supporting diff -?
   2774  1.47     lukem 				warn "diff: Unknown option -${OPTARG}"
   2775  1.47     lukem 				usage
   2776  1.47     lukem 				;;
   2777  1.47     lukem 			:)
   2778  1.47     lukem 				warn "diff: Missing argument for option -${OPTARG}"
   2779  1.47     lukem 				usage
   2780  1.47     lukem 				;;
   2781  1.45     lukem 			*)
   2782  1.47     lukem 				err 3 "diff: Unimplemented option -${ch}"
   2783  1.45     lukem 				;;
   2784  1.45     lukem 			esac
   2785  1.45     lukem 		done
   2786  1.45     lukem 		shift $((${OPTIND} - 1))
   2787  1.45     lukem 		;;
   2788  1.45     lukem 
   2789  1.45     lukem 	esac
   2790  1.45     lukem 
   2791  1.45     lukem 		# Validate operation and items.
   2792  1.45     lukem 		#
   2793  1.45     lukem 	case "${op}" in
   2794  1.45     lukem 
   2795  1.45     lukem 	check|fix)
   2796  1.45     lukem 		ITEMS="$*"
   2797  1.45     lukem 		: ${ITEMS:="${defaultitems}"}
   2798  1.45     lukem 
   2799  1.45     lukem 		# ensure that all supplied items are valid
   2800  1.45     lukem 		#
   2801  1.45     lukem 		for i in ${ITEMS}; do
   2802  1.45     lukem 			eval desc=\"\${desc_${i}}\"
   2803  1.45     lukem 			[ -n "${desc}" ] || err 2 "Unsupported ${op} '"${i}"'"
   2804  1.45     lukem 		done
   2805  1.45     lukem 		;;
   2806  1.45     lukem 
   2807  1.45     lukem 	help|usage)
   2808  1.45     lukem 		help
   2809  1.45     lukem 		return	# no further processing or validation
   2810  1.45     lukem 		;;
   2811  1.45     lukem 
   2812  1.45     lukem 	list)
   2813  1.45     lukem 		# processed below
   2814  1.45     lukem 		;;
   2815  1.45     lukem 
   2816  1.45     lukem 	*)
   2817  1.45     lukem 		warn "Unknown operation '"${op}"'"
   2818  1.45     lukem 		usage
   2819  1.45     lukem 		;;
   2820  1.45     lukem 
   2821  1.45     lukem 	esac
   2822  1.45     lukem 
   2823   1.1  christos 	#
   2824   1.1  christos 	# If '-s' arg or args specified tgz files, extract them
   2825   1.1  christos 	# to a scratch directory.
   2826   1.1  christos 	#
   2827   1.1  christos 	if $TGZMODE; then
   2828   1.1  christos 		ETCTGZDIR="${SCRATCHDIR}/etc.tgz"
   2829   1.1  christos 		echo "Note: Creating temporary directory ${ETCTGZDIR}"
   2830   1.1  christos 		if ! mkdir "${ETCTGZDIR}"; then
   2831   1.1  christos 			err 2 "Can't create ${ETCTGZDIR}"
   2832   1.1  christos 		fi
   2833   1.1  christos 		( # subshell to localise changes to "$@"
   2834   1.1  christos 			eval "set -- ${TGZLIST}"
   2835   1.1  christos 			for tgz in "$@"; do
   2836   1.1  christos 				echo "Note: Extracting files from ${tgz}"
   2837   1.1  christos 				cat "${tgz}" | (
   2838   1.1  christos 					cd "${ETCTGZDIR}" &&
   2839   1.1  christos 					tar -zxf -
   2840   1.1  christos 				) || err 2 "Can't extract ${tgz}"
   2841   1.1  christos 			done
   2842   1.1  christos 		)
   2843   1.1  christos 		SRC_DIR="${ETCTGZDIR}"
   2844   1.1  christos 	else
   2845   1.1  christos 		SRC_DIR="${SRC_ARG}"
   2846   1.1  christos 	fi
   2847   1.1  christos 
   2848   1.1  christos 	[ -d "${SRC_DIR}" ]	|| err 2 "${SRC_DIR} is not a directory"
   2849   1.1  christos 	[ -d "${DEST_DIR}" ]	|| err 2 "${DEST_DIR} is not a directory"
   2850   1.1  christos 	[ -n "${MACHINE}" ]	|| err 2 "\${MACHINE} is not defined"
   2851   1.1  christos 	[ -n "${MACHINE_ARCH}" ] || err 2 "\${MACHINE_ARCH} is not defined"
   2852   1.1  christos 	if ! $SOURCEMODE && ! [ -f "${SRC_DIR}/etc/mtree/set.etc" ]; then
   2853   1.1  christos 		err 2 "Files from the etc.tgz set are missing"
   2854   1.1  christos 	fi
   2855   1.1  christos 
   2856   1.1  christos 		# If directories are /, clear them, so various messages
   2857   1.1  christos 		# don't have leading "//".   However, this requires
   2858   1.1  christos 		# the use of ${foo:-/} to display the variables.
   2859   1.1  christos 		#
   2860   1.1  christos 	[ "${SRC_DIR}" = "/" ]	&& SRC_DIR=""
   2861   1.1  christos 	[ "${DEST_DIR}" = "/" ]	&& DEST_DIR=""
   2862   1.1  christos 
   2863   1.1  christos 	detect_x11
   2864   1.1  christos 
   2865  1.45     lukem 		# Perform operation.
   2866  1.45     lukem 		#
   2867   1.1  christos 	case "${op}" in
   2868   1.1  christos 
   2869   1.1  christos 	check|fix)
   2870  1.45     lukem 		[ -n "${ITEMS}" ] || err 2 "${op}: missing items"
   2871   1.1  christos 
   2872   1.1  christos 		echo "Source directory: ${SRC_DIR:-/}"
   2873   1.1  christos 		if $TGZMODE; then
   2874   1.1  christos 			echo " (extracted from: ${SRC_ARG})"
   2875   1.1  christos 		fi
   2876   1.1  christos 		echo "Target directory: ${DEST_DIR:-/}"
   2877   1.1  christos 		items_passed=
   2878   1.1  christos 		items_failed=
   2879  1.45     lukem 		for i in ${ITEMS}; do
   2880   1.1  christos 			echo "${i} ${op}:"
   2881   1.1  christos 			( eval do_${i} ${op} )
   2882   1.1  christos 			if [ $? -eq 0 ]; then
   2883   1.1  christos 				items_passed="${items_passed} ${i}"
   2884   1.1  christos 			else
   2885   1.1  christos 				items_failed="${items_failed} ${i}"
   2886   1.1  christos 			fi
   2887   1.1  christos 		done
   2888   1.1  christos 
   2889   1.1  christos 		if [ "${op}" = "check" ]; then
   2890   1.1  christos 			plural="checks"
   2891   1.1  christos 		else
   2892   1.1  christos 			plural="fixes"
   2893   1.1  christos 		fi
   2894   1.1  christos 
   2895   1.1  christos 		echo "${PROGNAME} ${plural} passed:${items_passed}"
   2896   1.1  christos 		echo "${PROGNAME} ${plural} failed:${items_failed}"
   2897   1.1  christos 		if [ -n "${items_failed}" ]; then
   2898   1.1  christos 		    exitstatus=1;
   2899   1.1  christos 		    if [ "${op}" = "check" ]; then
   2900   1.1  christos 			[ "$MACHINE" = "$(uname -m)" ] && m= || m=" -m $MACHINE"
   2901   1.1  christos 			cat <<_Fix_me_
   2902   1.1  christos To fix, run:
   2903   1.1  christos     ${HOST_SH} ${0} ${SRC_ARGLIST} ${XSRC_DIR_FIX}-d ${DEST_DIR:-/}$m fix${items_failed}
   2904   1.1  christos Note that this may overwrite local changes.
   2905   1.1  christos _Fix_me_
   2906   1.1  christos 		    fi
   2907   1.1  christos 		fi
   2908  1.45     lukem 		;;
   2909   1.1  christos 
   2910  1.45     lukem 	list)
   2911  1.45     lukem 		echo "Source directory: ${SRC_DIR:-/}"
   2912  1.45     lukem 		echo "Target directory: ${DEST_DIR:-/}"
   2913  1.45     lukem 		if $TGZMODE; then
   2914  1.45     lukem 			echo " (extracted from: ${SRC_ARG})"
   2915  1.45     lukem 		fi
   2916  1.45     lukem 		list
   2917   1.1  christos 		;;
   2918   1.1  christos 
   2919   1.1  christos 	*)
   2920  1.45     lukem 			# diff, help, usage handled during operation validation
   2921  1.45     lukem 		err 3 "Unimplemented operation '"${op}"'"
   2922   1.1  christos 		;;
   2923   1.1  christos 
   2924   1.1  christos 	esac
   2925   1.1  christos }
   2926   1.1  christos 
   2927   1.2  christos if [ -n "$POSTINSTALL_FUNCTION" ]; then
   2928   1.2  christos 	eval "$POSTINSTALL_FUNCTION"
   2929   1.2  christos 	exit 0
   2930   1.2  christos fi
   2931   1.2  christos 
   2932   1.1  christos # defaults
   2933   1.1  christos #
   2934   1.1  christos PROGNAME="${0##*/}"
   2935   1.1  christos SRC_ARG="/usr/src"
   2936   1.1  christos DEST_DIR="/"
   2937   1.1  christos : ${MACHINE:="$( uname -m )"}	# assume native build if $MACHINE is not set
   2938   1.1  christos : ${MACHINE_ARCH:="$( uname -p )"}# assume native build if not set
   2939   1.1  christos 
   2940   1.1  christos DIFF_STYLE=
   2941  1.45     lukem DIFF_OPT=
   2942   1.1  christos NOT_FIXED=" (FIX MANUALLY)"
   2943   1.1  christos SCRATCHDIR="$( mkdtemp )" || err 2 "Can't create scratch directory"
   2944   1.1  christos trap "/bin/rm -rf \"\${SCRATCHDIR}\" ; exit 0" 1 2 3 15	# HUP INT QUIT TERM
   2945   1.1  christos 
   2946   1.1  christos umask 022
   2947   1.1  christos exec 3>/dev/null
   2948   1.1  christos exec 4>/dev/null
   2949   1.1  christos exitstatus=0
   2950   1.1  christos 
   2951   1.1  christos main "$@"
   2952   1.1  christos /bin/rm -rf "${SCRATCHDIR}"
   2953   1.1  christos exit $exitstatus
   2954