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

View file

@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd March 16, 2012
.Dd November 12, 2013
.Dt ETCUPDATE 8
.Os
.Sh NAME
@ -33,7 +33,7 @@
.Nd "manage updates to system files not updated by installworld"
.Sh SYNOPSIS
.Nm
.Op Fl nBF
.Op Fl npBF
.Op Fl d Ar workdir
.Op Fl r | Fl s Ar source | Fl t Ar tarball
.Op Fl A Ar patterns
@ -64,6 +64,7 @@
.Op Fl M Ar options
.Nm
.Cm resolve
.Op Fl p
.Op Fl d Ar workdir
.Op Fl D Ar destdir
.Op Fl L Ar logfile
@ -112,7 +113,6 @@ The
utility will not perform a new merge until all conflicts from an earlier
merge are resolved.
.Sh MODES
.Pp
The
.Nm
utility supports several modes of operation.
@ -150,7 +150,7 @@ tree.
An older
.Dq previous
tree is removed if it exists.
By default the new
By default the new
.Dq current
tree is built from a source tree.
However,
@ -343,25 +343,7 @@ then nothing will be output.
.Sh OPTIONS
The following options are available.
Note that most options do not apply to all modes.
.Bl -tag -width ".Fl d Ar workdir"
.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 .
.Bl -tag -width ".Fl A Ar patterns"
.It Fl A Ar patterns
Always install the new version of any files that match any of the patterns
listed in
@ -377,9 +359,20 @@ Note that ignored files specified via the
variable or the
.Fl I
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
Specify an alternate destination directory as the target of a merge.
This is analagous to the
This is analogous to the
.Dv DESTDIR
variable used with
.Sq make installworld .
@ -387,6 +380,15 @@ The default destination directory is an empty string which results in
merges updating
.Pa /etc
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
Ignore changes in the FreeBSD ID string when comparing files in the
destination directory to files in either of the
@ -480,6 +482,33 @@ option is not specified,
then a temporary
.Dq current
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
Do not update the
.Dq current
@ -739,12 +768,16 @@ but it has been removed in the destination directory.
.El
.Sh SEE ALSO
.Xr cap_mkdb 1 ,
.Xr diff 1 ,
.Xr diff 1 ,
.Xr make 1 ,
.Xr newaliases 1 ,
.Xr sh 1 ,
.Xr pwd_mkdb 8
.\".Sh HISTORY
.Sh HISTORY
The
.Nm
utility first appeared in
.Fx 10.0 .
.Sh AUTHORS
The
.Nm

View file

@ -61,14 +61,15 @@
usage()
{
cat <<EOF
usage: etcupdate [-nBF] [-d workdir] [-r | -s source | -t tarball] [-A patterns]
[-D destdir] [-I patterns] [-L logfile] [-M options]
usage: etcupdate [-npBF] [-d workdir] [-r | -s source | -t tarball]
[-A patterns] [-D destdir] [-I patterns] [-L logfile]
[-M options]
etcupdate build [-B] [-d workdir] [-s source] [-L logfile] [-M options]
<tarball>
etcupdate diff [-d workdir] [-D destdir] [-I patterns] [-L logfile]
etcupdate extract [-B] [-d workdir] [-s source | -t tarball] [-L logfile]
[-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]
EOF
exit 1
@ -181,22 +182,31 @@ always_install()
# $1 - directory to store new tree in
build_tree()
{
local make
local destdir dir file make
make="make $MAKE_OPTIONS"
log "Building tree at $1 with $make"
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
(cd $SRCDIR; \
MAKEOBJDIRPREFIX=$1/usr/obj $make _obj SUBDIR_OVERRIDE=etc &&
MAKEOBJDIRPREFIX=$1/usr/obj $make everything SUBDIR_OVERRIDE=etc &&
MAKEOBJDIRPREFIX=$1/usr/obj $make DESTDIR=$1 distribution) \
if [ -n "$preworld" ]; then
# Build a limited tree that only contains files that are
# crucial to installworld.
for file in $PREWORLD_FILES; do
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
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
chflags -R noschg $1 >&3 2>&1 || return 1
rm -rf $1/usr/obj >&3 2>&1 || return 1
@ -218,9 +228,15 @@ build_tree()
# source tree.
extract_tree()
{
local files
# If we have a tarball, extract that into the new directory.
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
echo "Failed to extract new tree."
remove_tree $NEWTREE
@ -1298,6 +1314,11 @@ resolve_cmd()
return
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/^\.//'`
for file in $conflicts; do
resolve_conflict $file
@ -1343,7 +1364,7 @@ update_cmd()
usage
fi
log "update command: rerun=$rerun tarball=$tarball"
log "update command: rerun=$rerun tarball=$tarball preworld=$preworld"
if [ `id -u` -ne 0 ]; then
echo "Must be root to update a tree."
@ -1376,9 +1397,22 @@ update_cmd()
echo "Unable to create temporary directory."
exit 1
fi
OLDTREE=$NEWTREE
# A pre-world dryrun has already set OLDTREE to
# point to the current stock tree.
if [ -z "$preworld" ]; then
OLDTREE=$NEWTREE
fi
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.
elif [ -d $NEWTREE ]; then
# First, delete the previous old tree if it exists.
@ -1421,6 +1455,12 @@ EOF
# Initialize conflicts and warnings handling.
rm -f $WARNINGS
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
# odd case that a directory is converted into a file, the
@ -1535,7 +1575,8 @@ always=
dryrun=
ignore=
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
d)
WORKDIR=$OPTARG
@ -1543,6 +1584,9 @@ while getopts "d:nrs:t:A:BD:FI:L:M:" option; do
n)
dryrun=YES
;;
p)
preworld=YES
;;
r)
rerun=YES
;;
@ -1633,6 +1677,9 @@ WARNINGS=$WORKDIR/warnings
# Use $EDITOR for resolving conflicts. If it is not set, default to 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
# about unsupported options. Since the configuration file is always
# included, do not complain about extra command line arguments that
@ -1644,19 +1691,39 @@ case $command in
echo
usage
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
usage
fi
;;
extract)
if [ -n "$dryrun" -o -n "$rerun" ]; then
if [ -n "$dryrun" -o -n "$rerun" -o -n "$preworld" ]; then
usage
fi
;;
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
# that a minor operation doesn't lose log info from a major operation.
if ! mkdir -p $WORKDIR 2>/dev/null; then