summaryrefslogtreecommitdiffstats
path: root/usr.sbin/sysmerge
diff options
context:
space:
mode:
authorajacoutot <ajacoutot@openbsd.org>2015-08-24 11:03:41 +0000
committerajacoutot <ajacoutot@openbsd.org>2015-08-24 11:03:41 +0000
commitd88d873b0fa6e9ee4afab4d41c74608b2890d88c (patch)
tree0af8cafb1327a5766d3569f9d95f6c88c9b9599f /usr.sbin/sysmerge
parent/usr/share/sysmerge -> /var/sysmerge (diff)
downloadwireguard-openbsd-d88d873b0fa6e9ee4afab4d41c74608b2890d88c.tar.xz
wireguard-openbsd-d88d873b0fa6e9ee4afab4d41c74608b2890d88c.zip
Make backup directory of replaced files persistent: /var/sysmerge/backups.
3 rotations so that we have history of modified files. In batch mode, when a file cannot be handled automatically, remove it from the checksum file so that the next interactive sysmerge(8) run will ask to merge the changes. ok rpe@
Diffstat (limited to 'usr.sbin/sysmerge')
-rw-r--r--usr.sbin/sysmerge/sysmerge.825
-rw-r--r--usr.sbin/sysmerge/sysmerge.sh66
2 files changed, 52 insertions, 39 deletions
diff --git a/usr.sbin/sysmerge/sysmerge.8 b/usr.sbin/sysmerge/sysmerge.8
index 0836ff6cc8b..d74fbae2bb3 100644
--- a/usr.sbin/sysmerge/sysmerge.8
+++ b/usr.sbin/sysmerge/sysmerge.8
@@ -1,4 +1,4 @@
-.\" $OpenBSD: sysmerge.8,v 1.70 2015/08/24 10:42:08 ajacoutot Exp $
+.\" $OpenBSD: sysmerge.8,v 1.71 2015/08/24 11:03:41 ajacoutot Exp $
.\"
.\" Copyright (c) 2008 Antoine Jacoutot <ajacoutot@openbsd.org>
.\"
@@ -40,10 +40,7 @@ All work is done under
(known as the
.Em work directory )
which contains the temporary root directory
-.Pa temproot ,
-and the
-.Pa backup
-directory containing modified and/or replaced files.
+.Pa temproot .
.Pp
.Nm
will work through the fileset,
@@ -121,11 +118,11 @@ The following files will always be skipped from direct comparison:
.Pa /etc/passwd ,
.Pa /etc/pwd.db ,
.Pa /etc/spwd.db ,
+.Pa /var/db/locate.database ,
+.Pa /var/mail/root ,
.Pa /var/sysmerge/etcsum ,
.Pa /var/sysmerge/examplessum ,
-.Pa /var/sysmerge/xetcsum ,
-.Pa /var/db/locate.database ,
-.Pa /var/mail/root .
+.Pa /var/sysmerge/xetcsum .
.Sh ENVIRONMENT
.Bl -tag -width "EDITORXXVISUAL"
.It Ev EDITOR , VISUAL
@@ -157,11 +154,17 @@ If unset, this defaults to
Default work directory.
The
.Sy temproot
-and
-.Sy backup
-directories are created relative to this.
+directory is created relative to this.
.It Pa /etc/sysmerge.ignore
Files and directories to ignore from comparison.
+.It Pa /var/sysmerge/backups
+Directory containing backup of
+.Nm
+last run modified files.
+Rotated automatically in order of increasing age from
+.Pa backups.0
+to
+.Pa backups.3 .
.It Pa /var/sysmerge/etc.tgz
Base system set containing the reference files
corresponding to the currently installed release.
diff --git a/usr.sbin/sysmerge/sysmerge.sh b/usr.sbin/sysmerge/sysmerge.sh
index aa75bbb6c56..073cbac2dc6 100644
--- a/usr.sbin/sysmerge/sysmerge.sh
+++ b/usr.sbin/sysmerge/sysmerge.sh
@@ -1,6 +1,6 @@
#!/bin/ksh -
#
-# $OpenBSD: sysmerge.sh,v 1.200 2015/08/24 10:42:08 ajacoutot Exp $
+# $OpenBSD: sysmerge.sh,v 1.201 2015/08/24 11:03:41 ajacoutot Exp $
#
# Copyright (c) 2008-2014 Antoine Jacoutot <ajacoutot@openbsd.org>
# Copyright (c) 1998-2003 Douglas Barton <DougB@FreeBSD.org>
@@ -49,9 +49,7 @@ sm_error() {
fi
done
- # do not empty _WRKDIR, it may still contain our backup files
- rm -rf ${_TMPROOT}
- rmdir ${_WRKDIR} 2>/dev/null
+ rm -rf ${_WRKDIR}
exit 1
}
@@ -79,6 +77,18 @@ sm_extract_sets() {
done
}
+sm_rotate_bak() {
+ local _b
+
+ for _b in $(jot 4 3 0); do
+ [[ -d ${_BKPDIR}.${_b} ]] && \
+ mv ${_BKPDIR}.${_b} ${_BKPDIR}.$((_b+1))
+ done
+ rm -rf ${_BKPDIR}.4
+ [[ -d ${_BKPDIR} ]] && mv ${_BKPDIR} ${_BKPDIR}.0
+ install -d ${_BKPDIR} || return
+}
+
# get pkg @sample information
exec_espie() {
local _tmproot
@@ -178,8 +188,8 @@ sm_init() {
# XXX remove after OPENBSD_6_0
# and remove /usr/share/sysmerge/* from _ignorefiles in sm_init()
- if [[ -d /usr/share/sysmerge && -d /var/sysmerge/ ]]; then
- mv -f /usr/share/sysmerge/*sum /var/sysmerge/
+ if [[ -d /usr/share/sysmerge && -d /var/sysmerge ]]; then
+ mv -f /usr/share/sysmerge/*sum /var/sysmerge/ 2>/dev/null
rm -rf /usr/share/sysmerge
fi
@@ -314,6 +324,7 @@ sm_install() {
fi
if [[ -f ${TARGET} ]]; then
+ sm_rotate_bak || return
mkdir -p ${_BKPDIR}/${_instdir} || return
cp -p ${TARGET} ${_BKPDIR}/${_instdir} || return
fi
@@ -477,19 +488,15 @@ sm_diff_loop() {
fi
else
# file does not exist on the target system
- if ${IS_LINK}; then
- if ${DIFFMODE}; then
- echo && _nonexistent=true
- else
- echo "===> Linking ${TARGET}"
- sm_install && \
- _autoinst="${_autoinst}${TARGET}\n" || \
- sm_warn "problem creating ${TARGET} link"
- return
- fi
- fi
if ${DIFFMODE}; then
- echo && _nonexistent=true
+ _nonexistent=true
+ ${BATCHMODE} || echo "\n===> Missing ${TARGET}\n"
+ elif ${IS_LINK}; then
+ echo "===> Linking ${TARGET}"
+ sm_install && \
+ _autoinst="${_autoinst}${TARGET}\n" || \
+ sm_warn "problem creating ${TARGET} link"
+ return
else
echo -n "===> Installing ${TARGET}"
sm_install && \
@@ -588,17 +595,20 @@ sm_check_an_eg() {
}
sm_post() {
+ local _f
+
cd ${_WRKDIR} && \
find . -type d -depth -empty -exec rmdir -p '{}' + 2>/dev/null
rmdir ${_WRKDIR} 2>/dev/null
- [[ -d ${_BKPDIR} ]] && \
- echo "===> Backup file(s):" && \
- find ${_BKPDIR} -type f -size +0
-
- [[ -d ${_TMPROOT} ]] && \
- sm_warn "file(s) left for comparison:" && \
- find ${_TMPROOT} -type f ! -name \*.merged -size +0
+ if [[ -d ${_TMPROOT} ]]; then
+ sm_warn "file(s) left for comparison:"
+ for _f in $(find ${_TMPROOT} ! -type d ! -name \*.merged -size +0)
+ do
+ echo "${_f}" && ${BATCHMODE} && [[ -f ${_f} ]] && \
+ sed -i "/$(sha256 -q ${_f})/d" /var/sysmerge/*sum
+ done
+ fi
mtree -qdef /etc/mtree/4.4BSD.dist -p / -U >/dev/null
[[ -d /etc/X11 ]] && \
@@ -623,11 +633,11 @@ shift $(( OPTIND -1 ))
[[ $(id -u) -ne 0 ]] && echo "${0##*/}: need root privileges" && usage
# global constants
+_BKPDIR=/var/sysmerge/backups
+_RELINT=$(uname -r | tr -d '.') || exit 1
_WRKDIR=$(mktemp -d -p ${TMPDIR:=/tmp} sysmerge.XXXXXXXXXX) || exit 1
-_BKPDIR=${_WRKDIR}/backups
_TMPROOT=${_WRKDIR}/temproot
-_RELINT=$(uname -r | tr -d '.') || exit 1
-readonly _WRKDIR _BKPDIR _TMPROOT _RELINT
+readonly _BKPDIR _RELINT _TMPROOT _WRKDIR
[[ -z ${VISUAL} ]] && EDITOR=${EDITOR:=/usr/bin/vi} || EDITOR=${VISUAL}
PAGER=${PAGER:=/usr/bin/more}