aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoine Brodin <antoine@FreeBSD.org>2013-11-12 20:03:21 +0000
committerAntoine Brodin <antoine@FreeBSD.org>2013-11-12 20:03:21 +0000
commit0b5ceea1544b9e3a1822e644e3010e9e97e647e3 (patch)
tree945abf44e33b51447def23e90d6cc5d5ae5c1f12
parenta4cb2a06df9f6d2c15d7dc95f18b331266c174aa (diff)
downloadports-0b5ceea1544b9e3a1822e644e3010e9e97e647e3.tar.gz
ports-0b5ceea1544b9e3a1822e644e3010e9e97e647e3.zip
- Update to 1.0
- Add LICENSE - Stage support Submitted by: jhb (maintainer)
Notes
Notes: svn path=/head/; revision=333612
-rw-r--r--sysutils/etcupdate/Makefile12
-rw-r--r--sysutils/etcupdate/src/etcupdate.885
-rw-r--r--sysutils/etcupdate/src/etcupdate.sh103
3 files changed, 150 insertions, 50 deletions
diff --git a/sysutils/etcupdate/Makefile b/sysutils/etcupdate/Makefile
index 6a2c0d5f2db1..77734b47f880 100644
--- a/sysutils/etcupdate/Makefile
+++ b/sysutils/etcupdate/Makefile
@@ -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>
diff --git a/sysutils/etcupdate/src/etcupdate.8 b/sysutils/etcupdate/src/etcupdate.8
index a81ba86c26b6..91e9e1af15eb 100644
--- a/sysutils/etcupdate/src/etcupdate.8
+++ b/sysutils/etcupdate/src/etcupdate.8
@@ -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
diff --git a/sysutils/etcupdate/src/etcupdate.sh b/sysutils/etcupdate/src/etcupdate.sh
index 22168360d796..96e507e4388f 100644
--- a/sysutils/etcupdate/src/etcupdate.sh
+++ b/sysutils/etcupdate/src/etcupdate.sh
@@ -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
-
- 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) \
+ destdir=`realpath $1`
+
+ 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|status)
+ if [ -n "$dryrun" -o -n "$rerun" -o -n "$tarball" -o
+ -n "$preworld" ]; then
+ usage
+ fi
;;
- build|diff|resolve|status)
+ 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