minix/distrib/sets/maketars
David van Moolenbroek 77e79d3374 etc: synchronize master.password, group to NetBSD
IMPORTANT: this change has a docs/UPDATING entry!

This change is a long overdue switch-over from the old MINIX set of
user and group accounts to the NetBSD set.  This switch-over is
increasingly important now that we are importing more and more
utilities from NetBSD, several of which expect various user accounts
to exist.  By switching over in one go, we save ourselves various
headaches in the long run, even if the switch-over itself is a bit
painful for existing MINIX users.

The newly imported master.passwd and group files have three exceptions
compared to their NetBSD originals:

1. There is a custom "service" account for MINIX 3 services.  This
   account is used to limit run-time privileges of various system
   services, and is not used for any files on disk.  Its user ID may
   be changed later, but should always correspond to whatever the
   SERVICE_UID definition is set to.
2. The user "bin" has its shell set to /bin/sh, instead of NetBSD's
   /sbin/nologin.  The reason for this is that the test set in
   /usr/tests/minix-posix will not be able to run otherwise.
3. The group "operator" has been set to group ID 0, to match its old
   value.  This tweak is purely for transitioning purposes: as of
   writing, pkgsrc packages are still using root:operator as owner and
   group for most installed files.  Sometime later, we can change back
   "operator" to group ID 5 without breaking anything, because it does
   not appear that this group name is used for anything important.

Change-Id: I689bcfff4cf7ba85c27d1ae579057fa3f8019c68
2017-02-18 21:37:24 +00:00

246 lines
5.5 KiB
Bash

#!/bin/sh
#
# $NetBSD: maketars,v 1.84 2015/05/27 15:18:29 martin Exp $
#
# Make release tar files for some or all lists. Usage:
# maketars [-b] [-x] [-i installdir] [-a arch] [-m machine] [-s setsdir]
# [-M metalog] [-N etcdir] [-F setlistsdir] [-d destdir]
# [-t tardir] [-U] [setname ...]
#
# The default sets are "base comp debug etc games man misc tests text"
# The X sets are "xbase xcomp xdebug xetc xfont xserver"
# The extsrc sets are "extbase extcomp extetc"
#
# If '-i installdir' is given, copy the given sets to installdir
# (using pax -rw ...) instead of creating tar files.
# In this case, remove "etc", "xetc", and "extetc" from the list of default sets.
#
prog="${0##*/}"
rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
. "${rundir}/sets.subr"
# set defaults
lists=
tars="${RELEASEDIR}"
dest="${DESTDIR}"
metalog=
installdir=
etcdir=
setlistdir=
setfilesonly=false
quiet=false
skipkeys=time,md5,sha1,sha384,sha512,rmd160,cksum
preserve="-pe"
usage()
{
cat 1>&2 <<USAGE
Usage: ${prog} [-L base,x,ext] [-b] [-x] [-y] [-i idir] [-a arch] [-m machine]
[-s setsdir] [-S] [-M metalog] [-N etcdir] [-F setlistdir]
[-d dest] [-t targetdir] [setname ...]
-L base,x,ext Make specified lists
-b Make both netbsd and x11 lists
-x Only make x11 lists
[Default: make netbsd lists]
-y Only make extsrc lists
[Default: make netbsd lists]
-i idir Install sets to idir instead of creating tar files
-a arch Set arch (e.g, m68k, mipseb, mipsel, powerpc) [${MACHINE_ARCH}]
-m machine Set machine (e.g, amiga, i386, macppc) [${MACHINE}]
-q Quiet operation
-s setsdir Directory to find sets [${setsdir}]
-F setlistdir output directory for generated set lists [${dest}/etc/mtree/]
-S Exit after creating set files ${dest}/etc/mtree/set.*
-M metalog metalog file
-N etcdir etc dir for metalog use [${dest}/etc]
-U do not preserve file permissions (with -i ..)
-d dest \${DESTDIR} [${dest}]
-t targetdir \${RELEASEDIR} [${tars}]
[setname ...] Sets to build [${lists}]
USAGE
exit 1
}
msg()
{
$quiet || echo $*
}
# handle args
while getopts L:bxyi:a:m:qs:F:SM:N:Ud:t: ch; do
case ${ch} in
L)
save_IFS="${IFS}"
IFS=,
for _list in ${OPTARG}; do
case $_list in
base) lists="${lists} ${nlists}" ;;
x) lists="${lists} ${xlists}" ;;
ext) lists="${lists} ${extlists}" ;;
esac
done
IFS="${save_IFS}"
;;
# backward compat
b)
lists="${nlists} ${xlists}"
;;
x)
lists="${xlists}"
;;
y)
lists="${extlists}"
;;
i)
installdir="${OPTARG}"
;;
a)
MACHINE_ARCH="${OPTARG}"
MACHINE_CPU="$(arch_to_cpu "${OPTARG}")"
;;
m)
MACHINE="${OPTARG}"
;;
q)
quiet=true
;;
s)
setsdir="${OPTARG}"
;;
F)
setlistdir="${OPTARG}"
;;
S)
setfilesonly=true
;;
M)
metalog="${OPTARG}"
;;
N)
etcdir="${OPTARG}"
;;
U)
preserve=
;;
d)
dest="${OPTARG}"
;;
t)
tars="${OPTARG}"
;;
*)
usage
;;
esac
done
shift $((${OPTIND} - 1))
if [ -n "${installdir}" ]; then # if -i, remove etc + xetc + extetc from the default list
lists="$(echo ${lists} | ${SED} -e 's/ etc / /;s/ xetc / /;s/ extetc / /')"
fi
if [ -n "$*" ]; then
lists="$*"
fi
if [ -z "${tars}" -a -z "${installdir}" ]; then
echo >&2 "${prog}: \${RELEASEDIR} must be set, or -i must be used"
exit 1
fi
if [ -z "${dest}" ]; then
echo >&2 "${prog}: \${DESTDIR} must be set"
exit 1
fi
: ${etcdir:="${dest}/etc"}
SDIR="$(${MKTEMP} -d "/tmp/${prog}.XXXXXX")"
TMPFILES=
: ${setlistdir:="${dest}/etc/mtree"}
cleanup()
{
es=$?
/bin/rm -rf "${SDIR}" ${TMPFILES}
trap - 0
exit ${es}
}
trap cleanup 0 2 3 13 # EXIT INT QUIT PIPE
#
# build the setfiles
#
for setname in ${lists}; do
${HOST_SH} "${setsdir}/makeflist" -a "${MACHINE_ARCH}" -m "${MACHINE}" \
-s "${setsdir}" "${setname}" > "${SDIR}/flist.${setname}" \
|| exit 1
if [ ! -s "${SDIR}/flist.${setname}" ]; then
echo >&2 "makeflist output is empty for ${setname}"
exit 1
fi
${setfilesonly} && msg "Creating ${setlistdir}/set.${setname}"
if [ -n "${metalog}" ]; then
${AWK} -f "${rundir}/getdirs.awk" "${SDIR}/flist.${setname}" \
> "${SDIR}/flist.${setname}.full" \
|| exit 1
(
echo "/set uname=root gname=wheel"
${AWK} -f "${rundir}/join.awk" \
"${SDIR}/flist.${setname}.full" "${metalog}"
echo "./etc/mtree/set.${setname} type=file mode=0444"
) | ${MTREE} -CS -k all -R "${skipkeys}" -N "${etcdir}" \
> "${setlistdir}/set.${setname}" \
|| exit 1
# We deliberately do not add set.${setname} to ${metalog},
# because we depend on it as an input.
else
${MTREE} -c -p "${dest}" -k all -R "${skipkeys}" \
-O "${SDIR}/flist.${setname}" | ${MTREE} -C -k all > \
"${setlistdir}/set.${setname}"
fi
done
if ${setfilesonly}; then # exit after creating the set lists
exit 0
fi
runpax() {
local s="$1"
shift
(cd "${dest}" &&
${PAX} -dOw -N"${etcdir}" -M "$@" < "${setlistdir}/set.${s}")
}
#
# now build the tarfiles
#
GZIP=-9n # for pax -z
export GZIP
es=0
for setname in ${lists:-${nlists}}; do
out="${setname}.tgz"
if [ -n "${installdir}" ]; then
msg "Copying set ${setname}"
runpax "${setname}" -r ${preserve} "${installdir}"
else
if [ -n "${metalog}" -a "${tars}/${out}" -nt "${metalog}" ]
then
msg "${out} is up to date"
continue
fi
msg "Creating ${out}"
rm -f "${tars}/${out}"
TMPFILES="${TMPFILES} ${tars}/${out}.tmp"
runpax "${setname}" -z --use-compress-program \
${COMPRESS_PROGRAM} > "${tars}/${out}.tmp" &&
mv "${tars}/${out}.tmp" "${tars}/${out}"
fi
es=$((${es} + $?))
done
if [ ${es} -gt 255 ]; then
es=255
fi
exit ${es}