- Update to 1.0

- Add LICENSE
- Stage support

Submitted by:	jhb (maintainer)
This commit is contained in:
Antoine Brodin 2013-11-12 20:03:21 +00:00
parent a4cb2a06df
commit 0b5ceea154
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=333612
3 changed files with 149 additions and 49 deletions

View file

@ -2,7 +2,7 @@
# $FreeBSD$ # $FreeBSD$
PORTNAME= etcupdate PORTNAME= etcupdate
PORTVERSION= 0.4 PORTVERSION= 1.0
CATEGORIES= sysutils CATEGORIES= sysutils
MASTER_SITES= # none MASTER_SITES= # none
DISTFILES= # none DISTFILES= # none
@ -10,17 +10,17 @@ DISTFILES= # none
MAINTAINER= jhb@FreeBSD.org MAINTAINER= jhb@FreeBSD.org
COMMENT= Manage updates to /etc automatically COMMENT= Manage updates to /etc automatically
LICENSE= BSD
NO_BUILD= yes NO_BUILD= yes
NO_WRKSUBDIR= yes NO_WRKSUBDIR= yes
SRC= ${.CURDIR}/src SRC= ${.CURDIR}/src
MAN8= ${PORTNAME}.8 PLIST_FILES= sbin/etcupdate man/man8/etcupdate.8.gz
PLIST_FILES= sbin/etcupdate
NO_STAGE= yes
do-install: do-install:
${INSTALL_SCRIPT} ${SRC}/${PORTNAME}.sh ${PREFIX}/sbin/${PORTNAME} ${INSTALL_SCRIPT} ${SRC}/${PORTNAME}.sh ${STAGEDIR}${PREFIX}/sbin/${PORTNAME}
${INSTALL_MAN} ${SRC}/${PORTNAME}.8 ${PREFIX}/man/man8 ${INSTALL_MAN} ${SRC}/${PORTNAME}.8 ${STAGEDIR}${PREFIX}/man/man8
.include <bsd.port.mk> .include <bsd.port.mk>

View file

@ -25,7 +25,7 @@
.\" .\"
.\" $FreeBSD$ .\" $FreeBSD$
.\" .\"
.Dd March 16, 2012 .Dd November 12, 2013
.Dt ETCUPDATE 8 .Dt ETCUPDATE 8
.Os .Os
.Sh NAME .Sh NAME
@ -33,7 +33,7 @@
.Nd "manage updates to system files not updated by installworld" .Nd "manage updates to system files not updated by installworld"
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Op Fl nBF .Op Fl npBF
.Op Fl d Ar workdir .Op Fl d Ar workdir
.Op Fl r | Fl s Ar source | Fl t Ar tarball .Op Fl r | Fl s Ar source | Fl t Ar tarball
.Op Fl A Ar patterns .Op Fl A Ar patterns
@ -64,6 +64,7 @@
.Op Fl M Ar options .Op Fl M Ar options
.Nm .Nm
.Cm resolve .Cm resolve
.Op Fl p
.Op Fl d Ar workdir .Op Fl d Ar workdir
.Op Fl D Ar destdir .Op Fl D Ar destdir
.Op Fl L Ar logfile .Op Fl L Ar logfile
@ -112,7 +113,6 @@ The
utility will not perform a new merge until all conflicts from an earlier utility will not perform a new merge until all conflicts from an earlier
merge are resolved. merge are resolved.
.Sh MODES .Sh MODES
.Pp
The The
.Nm .Nm
utility supports several modes of operation. utility supports several modes of operation.
@ -343,25 +343,7 @@ then nothing will be output.
.Sh OPTIONS .Sh OPTIONS
The following options are available. The following options are available.
Note that most options do not apply to all modes. Note that most options do not apply to all modes.
.Bl -tag -width ".Fl d Ar workdir" .Bl -tag -width ".Fl A Ar patterns"
.It Fl B
Do not build generated files in a private object tree.
Instead,
reuse the generated files from a previously built object tree that matches
the source tree.
This can be useful to avoid gratuitous conflicts in sendmail configuration
files when bootstrapping.
It can also be useful for building a tarball that matches a specific
world build.
.It Fl d Ar workdir
Specify an alternate directory to use as the work directory.
The work directory is used to store the
.Dq current
and
.Dq previous
trees as well as unresolved conflicts.
The default work directory is
.Pa <destdir>/var/db/etcupdate .
.It Fl A Ar patterns .It Fl A Ar patterns
Always install the new version of any files that match any of the patterns Always install the new version of any files that match any of the patterns
listed in listed in
@ -377,9 +359,20 @@ Note that ignored files specified via the
variable or the variable or the
.Fl I .Fl I
option will not be installed. option will not be installed.
.It Fl B
Do not build generated files in a private object tree.
Instead,
reuse the generated files from a previously built object tree that matches
the source tree.
This can be useful to avoid gratuitous conflicts in
.Xr sendmail 8
configuration
files when bootstrapping.
It can also be useful for building a tarball that matches a specific
world build.
.It Fl D Ar destdir .It Fl D Ar destdir
Specify an alternate destination directory as the target of a merge. Specify an alternate destination directory as the target of a merge.
This is analagous to the This is analogous to the
.Dv DESTDIR .Dv DESTDIR
variable used with variable used with
.Sq make installworld . .Sq make installworld .
@ -387,6 +380,15 @@ The default destination directory is an empty string which results in
merges updating merges updating
.Pa /etc .Pa /etc
on the local machine. on the local machine.
.It Fl d Ar workdir
Specify an alternate directory to use as the work directory.
The work directory is used to store the
.Dq current
and
.Dq previous
trees as well as unresolved conflicts.
The default work directory is
.Pa <destdir>/var/db/etcupdate .
.It Fl F .It Fl F
Ignore changes in the FreeBSD ID string when comparing files in the Ignore changes in the FreeBSD ID string when comparing files in the
destination directory to files in either of the destination directory to files in either of the
@ -480,6 +482,33 @@ option is not specified,
then a temporary then a temporary
.Dq current .Dq current
tree will be extracted to perform the comparison. tree will be extracted to perform the comparison.
.It Fl p
Enable
.Dq pre-world
mode.
Only merge changes to files that are necessary to successfully run
.Sq make installworld
or
.Sq make installkernel .
When this flag is enabled,
the existing
.Dq current
and
.Dq previous
trees are left alone.
Instead,
a temporary tree is populated with the necessary files.
This temporary tree is compared against the
.Dq current
tree.
This allows a normal update to be run after
.Sq make installworld
has completed.
Any conflicts generated during a
.Dq pre-world
update should be resolved by a
.Dq pre-world
.Cm resolve .
.It Fl r .It Fl r
Do not update the Do not update the
.Dq current .Dq current
@ -744,7 +773,11 @@ but it has been removed in the destination directory.
.Xr newaliases 1 , .Xr newaliases 1 ,
.Xr sh 1 , .Xr sh 1 ,
.Xr pwd_mkdb 8 .Xr pwd_mkdb 8
.\".Sh HISTORY .Sh HISTORY
The
.Nm
utility first appeared in
.Fx 10.0 .
.Sh AUTHORS .Sh AUTHORS
The The
.Nm .Nm

View file

@ -61,14 +61,15 @@
usage() usage()
{ {
cat <<EOF cat <<EOF
usage: etcupdate [-nBF] [-d workdir] [-r | -s source | -t tarball] [-A patterns] usage: etcupdate [-npBF] [-d workdir] [-r | -s source | -t tarball]
[-D destdir] [-I patterns] [-L logfile] [-M options] [-A patterns] [-D destdir] [-I patterns] [-L logfile]
[-M options]
etcupdate build [-B] [-d workdir] [-s source] [-L logfile] [-M options] etcupdate build [-B] [-d workdir] [-s source] [-L logfile] [-M options]
<tarball> <tarball>
etcupdate diff [-d workdir] [-D destdir] [-I patterns] [-L logfile] etcupdate diff [-d workdir] [-D destdir] [-I patterns] [-L logfile]
etcupdate extract [-B] [-d workdir] [-s source | -t tarball] [-L logfile] etcupdate extract [-B] [-d workdir] [-s source | -t tarball] [-L logfile]
[-M options] [-M options]
etcupdate resolve [-d workdir] [-D destdir] [-L logfile] etcupdate resolve [-p] [-d workdir] [-D destdir] [-L logfile]
etcupdate status [-d workdir] [-D destdir] etcupdate status [-d workdir] [-D destdir]
EOF EOF
exit 1 exit 1
@ -181,22 +182,31 @@ always_install()
# $1 - directory to store new tree in # $1 - directory to store new tree in
build_tree() build_tree()
{ {
local make local destdir dir file make
make="make $MAKE_OPTIONS" make="make $MAKE_OPTIONS"
log "Building tree at $1 with $make" log "Building tree at $1 with $make"
mkdir -p $1/usr/obj >&3 2>&1 mkdir -p $1/usr/obj >&3 2>&1
(cd $SRCDIR; $make DESTDIR=$1 distrib-dirs) >&3 2>&1 || return 1 destdir=`realpath $1`
if ! [ -n "$nobuild" ]; then if [ -n "$preworld" ]; then
(cd $SRCDIR; \ # Build a limited tree that only contains files that are
MAKEOBJDIRPREFIX=$1/usr/obj $make _obj SUBDIR_OVERRIDE=etc && # crucial to installworld.
MAKEOBJDIRPREFIX=$1/usr/obj $make everything SUBDIR_OVERRIDE=etc && for file in $PREWORLD_FILES; do
MAKEOBJDIRPREFIX=$1/usr/obj $make DESTDIR=$1 distribution) \ dir=`dirname /$file`
mkdir -p $1/$dir >&3 2>&1 || return 1
cp -p $SRCDIR/$file $1/$file || return 1
done
elif ! [ -n "$nobuild" ]; then
(cd $SRCDIR; $make DESTDIR=$destdir distrib-dirs &&
MAKEOBJDIRPREFIX=$destdir/usr/obj $make _obj SUBDIR_OVERRIDE=etc &&
MAKEOBJDIRPREFIX=$destdir/usr/obj $make everything SUBDIR_OVERRIDE=etc &&
MAKEOBJDIRPREFIX=$destdir/usr/obj $make DESTDIR=$destdir distribution) \
>&3 2>&1 || return 1 >&3 2>&1 || return 1
else else
(cd $SRCDIR; $make DESTDIR=$1 distribution) >&3 2>&1 || return 1 (cd $SRCDIR; $make DESTDIR=$destdir distrib-dirs &&
$make DESTDIR=$destdir distribution) >&3 2>&1 || return 1
fi fi
chflags -R noschg $1 >&3 2>&1 || return 1 chflags -R noschg $1 >&3 2>&1 || return 1
rm -rf $1/usr/obj >&3 2>&1 || return 1 rm -rf $1/usr/obj >&3 2>&1 || return 1
@ -218,9 +228,15 @@ build_tree()
# source tree. # source tree.
extract_tree() extract_tree()
{ {
local files
# If we have a tarball, extract that into the new directory. # If we have a tarball, extract that into the new directory.
if [ -n "$tarball" ]; then if [ -n "$tarball" ]; then
if ! (mkdir -p $NEWTREE && tar xf $tarball -C $NEWTREE) \ files=
if [ -n "$preworld" ]; then
files="$PREWORLD_FILES"
fi
if ! (mkdir -p $NEWTREE && tar xf $tarball -C $NEWTREE $files) \
>&3 2>&1; then >&3 2>&1; then
echo "Failed to extract new tree." echo "Failed to extract new tree."
remove_tree $NEWTREE remove_tree $NEWTREE
@ -1298,6 +1314,11 @@ resolve_cmd()
return return
fi fi
if ! [ -d $NEWTREE ]; then
echo "The current tree is not present to resolve conflicts."
exit 1
fi
conflicts=`(cd $CONFLICTS; find . ! -type d) | sed -e 's/^\.//'` conflicts=`(cd $CONFLICTS; find . ! -type d) | sed -e 's/^\.//'`
for file in $conflicts; do for file in $conflicts; do
resolve_conflict $file resolve_conflict $file
@ -1343,7 +1364,7 @@ update_cmd()
usage usage
fi fi
log "update command: rerun=$rerun tarball=$tarball" log "update command: rerun=$rerun tarball=$tarball preworld=$preworld"
if [ `id -u` -ne 0 ]; then if [ `id -u` -ne 0 ]; then
echo "Must be root to update a tree." echo "Must be root to update a tree."
@ -1376,9 +1397,22 @@ update_cmd()
echo "Unable to create temporary directory." echo "Unable to create temporary directory."
exit 1 exit 1
fi fi
# A pre-world dryrun has already set OLDTREE to
# point to the current stock tree.
if [ -z "$preworld" ]; then
OLDTREE=$NEWTREE OLDTREE=$NEWTREE
fi
NEWTREE=$dir NEWTREE=$dir
# For a pre-world update, blow away any pre-existing
# NEWTREE.
elif [ -n "$preworld" ]; then
if ! remove_tree $NEWTREE; then
echo "Unable to remove pre-world tree."
exit 1
fi
# Rotate the existing stock tree to the old tree. # Rotate the existing stock tree to the old tree.
elif [ -d $NEWTREE ]; then elif [ -d $NEWTREE ]; then
# First, delete the previous old tree if it exists. # First, delete the previous old tree if it exists.
@ -1422,6 +1456,12 @@ EOF
rm -f $WARNINGS rm -f $WARNINGS
mkdir -p $CONFLICTS mkdir -p $CONFLICTS
# Ignore removed files for the pre-world case. A pre-world
# update uses a stripped-down tree.
if [ -n "$preworld" ]; then
> $WORKDIR/removed.files
fi
# The order for the following sections is important. In the # The order for the following sections is important. In the
# odd case that a directory is converted into a file, the # odd case that a directory is converted into a file, the
# existing subfiles need to be removed if possible before the # existing subfiles need to be removed if possible before the
@ -1535,7 +1575,8 @@ always=
dryrun= dryrun=
ignore= ignore=
nobuild= nobuild=
while getopts "d:nrs:t:A:BD:FI:L:M:" option; do preworld=
while getopts "d:nprs:t:A:BD:FI:L:M:" option; do
case "$option" in case "$option" in
d) d)
WORKDIR=$OPTARG WORKDIR=$OPTARG
@ -1543,6 +1584,9 @@ while getopts "d:nrs:t:A:BD:FI:L:M:" option; do
n) n)
dryrun=YES dryrun=YES
;; ;;
p)
preworld=YES
;;
r) r)
rerun=YES rerun=YES
;; ;;
@ -1633,6 +1677,9 @@ WARNINGS=$WORKDIR/warnings
# Use $EDITOR for resolving conflicts. If it is not set, default to vi. # Use $EDITOR for resolving conflicts. If it is not set, default to vi.
EDITOR=${EDITOR:-/usr/bin/vi} EDITOR=${EDITOR:-/usr/bin/vi}
# Files that need to be updated before installworld.
PREWORLD_FILES="etc/master.passwd etc/group"
# Handle command-specific argument processing such as complaining # Handle command-specific argument processing such as complaining
# about unsupported options. Since the configuration file is always # about unsupported options. Since the configuration file is always
# included, do not complain about extra command line arguments that # included, do not complain about extra command line arguments that
@ -1644,19 +1691,39 @@ case $command in
echo echo
usage usage
fi fi
if [ -n "$rerun" -a -n "$preworld" ]; then
echo "Only one of -p or -r can be specified."
echo
usage
fi
;; ;;
build|diff|resolve|status) build|diff|status)
if [ -n "$dryrun" -o -n "$rerun" -o -n "$tarball" -o
-n "$preworld" ]; then
usage
fi
;;
resolve)
if [ -n "$dryrun" -o -n "$rerun" -o -n "$tarball" ]; then if [ -n "$dryrun" -o -n "$rerun" -o -n "$tarball" ]; then
usage usage
fi fi
;; ;;
extract) extract)
if [ -n "$dryrun" -o -n "$rerun" ]; then if [ -n "$dryrun" -o -n "$rerun" -o -n "$preworld" ]; then
usage usage
fi fi
;; ;;
esac esac
# Pre-world mode uses a different set of trees. It leaves the current
# tree as-is so it is still present for a full etcupdate run after the
# world install is complete. Instead, it installs a few critical files
# into a separate tree.
if [ -n "$preworld" ]; then
OLDTREE=$NEWTREE
NEWTREE=$WORKDIR/preworld
fi
# Open the log file. Don't truncate it if doing a minor operation so # Open the log file. Don't truncate it if doing a minor operation so
# that a minor operation doesn't lose log info from a major operation. # that a minor operation doesn't lose log info from a major operation.
if ! mkdir -p $WORKDIR 2>/dev/null; then if ! mkdir -p $WORKDIR 2>/dev/null; then