summaryrefslogtreecommitdiffstats
path: root/usr.sbin/syspatch
diff options
context:
space:
mode:
authorajacoutot <ajacoutot@openbsd.org>2017-08-22 13:32:50 +0000
committerajacoutot <ajacoutot@openbsd.org>2017-08-22 13:32:50 +0000
commita8f86fd300ae9a6cac47cc6ec6e0dcf9195b984a (patch)
tree62189a0581fad7ecf0641df75740a7d3aa7a80ca /usr.sbin/syspatch
parentRemove legacy code. (diff)
downloadwireguard-openbsd-a8f86fd300ae9a6cac47cc6ec6e0dcf9195b984a.tar.xz
wireguard-openbsd-a8f86fd300ae9a6cac47cc6ec6e0dcf9195b984a.zip
Add support for KARL:
- only extract the according /usr/share/compile/GENERIC{,.MP} - if a "kernel" patch was properly installed (or rolled back), run /usr/libexec/reorder_kernel _once_ just before exiting - don't backup /bsd anymore, reorder_kernel already does it for us - drop 2 now unused functions: install_kernel() and sp_cleanup() While it appears to work fine after some quick testing, it should still be considered WIP.
Diffstat (limited to 'usr.sbin/syspatch')
-rw-r--r--usr.sbin/syspatch/syspatch.816
-rw-r--r--usr.sbin/syspatch/syspatch.sh94
2 files changed, 33 insertions, 77 deletions
diff --git a/usr.sbin/syspatch/syspatch.8 b/usr.sbin/syspatch/syspatch.8
index d76c729e7fb..a3cf450909e 100644
--- a/usr.sbin/syspatch/syspatch.8
+++ b/usr.sbin/syspatch/syspatch.8
@@ -1,4 +1,4 @@
-.\" $OpenBSD: syspatch.8,v 1.18 2017/05/09 12:23:04 ajacoutot Exp $
+.\" $OpenBSD: syspatch.8,v 1.19 2017/08/22 13:32:50 ajacoutot Exp $
.\"
.\" Copyright (c) 2016 Antoine Jacoutot <ajacoutot@openbsd.org>
.\"
@@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: May 9 2017 $
+.Dd $Mdocdate: August 22 2017 $
.Dt SYSPATCH 8
.Os
.Sh NAME
@@ -33,9 +33,9 @@ When run without any options,
.Nm syspatch
will apply
.Em all
-missing patches by saving the original release kernel if needed, creating a
-rollback tarball containing the files it is about to replace, then extracting
-and installing all files contained in the syspatch tarball.
+missing patches, creating a rollback tarball containing the files it is about
+to replace, then extracting and installing all files contained in the syspatch
+tarball.
Patches are cumulative and as such it is not possible to install only a subset
of them.
.Pp
@@ -52,11 +52,7 @@ Revert all patches.
Revert the most recently installed patch.
.El
.Sh FILES
-.Bl -tag -width "/bsd.syspatch${OSrev}" -compact
-.It Pa /bsd.syspatch${OSrev}
-Backup of the original
-.Pa /bsd
-release kernel.
+.Bl -tag -width "/etc/installurl" -compact
.It Pa /etc/installurl
.Ox
mirror top-level URL for fetching patches.
diff --git a/usr.sbin/syspatch/syspatch.sh b/usr.sbin/syspatch/syspatch.sh
index 5a4300fe766..bc3f9c18fa4 100644
--- a/usr.sbin/syspatch/syspatch.sh
+++ b/usr.sbin/syspatch/syspatch.sh
@@ -1,6 +1,6 @@
#!/bin/ksh
#
-# $OpenBSD: syspatch.sh,v 1.123 2017/08/17 20:32:14 ajacoutot Exp $
+# $OpenBSD: syspatch.sh,v 1.124 2017/08/22 13:32:50 ajacoutot Exp $
#
# Copyright (c) 2016, 2017 Antoine Jacoutot <ajacoutot@openbsd.org>
#
@@ -42,7 +42,8 @@ apply_patch()
echo "Installing patch ${_patch##${_OSrev}-}"
install -d ${_edir} ${_PDIR}/${_patch}
- ${_BSDMP} && _s="-s /^bsd$//" || _s="-s /^bsd.mp$//"
+ ${_BSDMP} && _s="-s @usr/share/compile/GENERIC/.*@@g" ||
+ _s="-s @usr/share/compile/GENERIC.MP/.*@@g"
_files="$(tar -xvzphf ${_TMP}/syspatch${_patch}.tgz -C ${_edir} ${_s})"
checkfs ${_files}
@@ -50,12 +51,8 @@ apply_patch()
for _file in ${_files}; do
((_ret == 0)) || break
- if [[ ${_file} == @(bsd|bsd.mp) ]]; then
- install_kernel ${_edir}/${_file} || _ret=$?
- else
- [[ ${_file} == usr/sbin/syspatch ]] && _upself=true
- install_file ${_edir}/${_file} /${_file} || _ret=$?
- fi
+ [[ ${_file} == usr/sbin/syspatch ]] && _upself=true
+ install_file ${_edir}/${_file} /${_file} || _ret=$?
done
if ((_ret != 0)); then
@@ -66,6 +63,10 @@ apply_patch()
rm -rf ${_edir} ${_TMP}/syspatch${_patch}.tgz
trap exit INT
+ echo ${_files} | grep -Eqv \
+ '(^|[[:blank:]]+)usr/share/compile/GENERI(C|C.MP)/[[:print:]]+([[:blank:]]+|$)' ||
+ _KARL=true
+
${_upself} && sp_err "syspatch updated itself, run it again to install \
missing patches" 2
}
@@ -76,23 +77,13 @@ missing patches" 2
# - ignore rollback tarball: create_rollback() will handle the failure
# - compute total size of all files per fs, simpler and less margin for error
# (instead of computing before installing each file)
-# - if we install a kernel, double /bsd size (duplicate it in the list) when:
-# - we are on an MP system (to check /bsd size instead of nonexistent /bsd.mp)
-# - /bsd.syspatchXX is not present (create_rollback will copy it from /bsd)
checkfs()
{
local _d _dev _df _files="${@}" _ret _sz
[[ -n ${_files} ]]
- # XXX use shell substitution when available: bsd.mp -> bsd
- if echo "${_files}" |
- grep -Eq '(^|[[:blank:]]+)bs(d|d.mp)([[:blank:]]+|$)'; then
- ${_BSDMP} || [[ ! -f /bsd.syspatch${_OSrev} ]] &&
- _files="bsd ${_files}"
- fi
-
set +e # ignore errors due to:
- # - nonexistent files (e.g. /bsd.mp or syspatch is installing new files)
+ # - nonexistent files (i.e. syspatch is installing new files)
# - broken interpolation due to bogus devices like remote filesystems
eval $(cd / &&
stat -qf "_dev=\"\${_dev} %Sd\";
@@ -113,26 +104,17 @@ checkfs()
create_rollback()
{
# XXX annotate new files so we can remove them if we rollback?
- local _file _patch=$1 _rbfiles _ret=0 _s
+ local _file _patch=$1 _rbfiles _ret=0
[[ -n ${_patch} ]]
shift
local _files="${@}"
[[ -n ${_files} ]]
for _file in ${_files}; do
- if [[ ${_file} == bsd.mp ]] && ${_BSDMP}; then
- _file=bsd && _s="-s /^bsd$/&.mp/"
- fi
- [[ -f /${_file} ]] || continue
- # only save the original release kernel once
- if [[ ${_file} == bsd && ! -f /bsd.syspatch${_OSrev} ]]; then
- install -FSp /bsd /bsd.syspatch${_OSrev}
- fi
- _rbfiles="${_rbfiles} ${_file}"
+ [[ -f /${_file} ]] && _rbfiles="${_rbfiles} ${_file}"
done
- tar -C / -czf ${_PDIR}/${_patch}/rollback.tgz ${_s} ${_rbfiles} ||
- _ret=$?
+ tar -C / -czf ${_PDIR}/${_patch}/rollback.tgz ${_rbfiles} || _ret=$?
if ((_ret != 0)); then
sp_err "Failed to create rollback patch ${_patch##${_OSrev}-}" 0
@@ -163,14 +145,6 @@ install_file()
install -DFSp -m ${_fmode} -o ${_fown} -g ${_fgrp} ${_src} ${_dst}
}
-install_kernel()
-{
- local _kern=$1
- [[ -n ${_kern} ]]
-
- install -FSp ${_kern} /bsd
-}
-
ls_installed()
{
local _p
@@ -227,15 +201,7 @@ rollback_patch()
for _file in ${_files}; do
((_ret == 0)) || break
- if [[ ${_file} == @(bsd|bsd.mp) ]]; then
- install_kernel ${_edir}/${_file} || _ret=$?
- # remove the backup kernel if all kernel syspatches have
- # been reverted; non-fatal
- cmp -s /bsd /bsd.syspatch${_OSrev} &&
- rm -f /bsd.syspatch${_OSrev}
- else
- install_file ${_edir}/${_file} /${_file} || _ret=$?
- fi
+ install_file ${_edir}/${_file} /${_file} || _ret=$?
done
((_ret != 0)) || rm -r ${_PDIR}/${_patch} || _ret=$?
@@ -243,24 +209,10 @@ rollback_patch()
sp_err "Failed to revert patch ${_patch##${_OSrev}-}" ${_ret}
rm -rf ${_edir} # don't fill up /tmp when using `-R'; non-fatal
trap exit INT
-}
-sp_cleanup()
-{
- local _d _k
-
- # remove non matching release /var/syspatch/ content
- for _d in ${_PDIR}/{.[!.],}*; do
- [[ -e ${_d} ]] || continue
- [[ ${_d##*/} == ${_OSrev}-+([[:digit:]])_+([[:alnum:]]|_) ]] &&
- [[ -f ${_d}/rollback.tgz ]] || rm -r ${_d}
- done
-
- # remove non matching release backup kernel
- for _k in /bsd.syspatch+([[:digit:]]); do
- [[ -f ${_k} ]] || continue
- [[ ${_k} == /bsd.syspatch${_OSrev} ]] || rm ${_k}
- done
+ echo ${_files} | grep -Eqv \
+ '(^|[[:blank:]]+)usr/share/compile/GENERI(C|C.MP)/[[:print:]]+([[:blank:]]+|$)' ||
+ _KARL=true
}
unpriv()
@@ -298,10 +250,11 @@ _MIRROR="${_MIRROR}/syspatch/${_KERNV[0]}/$(machine)"
(($(sysctl -n hw.ncpufound) > 1)) && _BSDMP=true || _BSDMP=false
_PDIR="/var/syspatch"
_TMP=$(mktemp -d -p ${TMPDIR:-/tmp} syspatch.XXXXXXXXXX)
+_KARL=false
readonly _BSDMP _KERNV _MIRROR _OSrev _PDIR _TMP
-trap 'set +e; rm -rf "${_TMP}"' EXIT
+trap 'set +e; ${_KARL} && /usr/libexec/reorder_kernel; rm -rf "${_TMP}"' EXIT
trap exit HUP INT TERM
while getopts clRr arg; do
@@ -318,7 +271,14 @@ shift $((OPTIND - 1))
# default action: apply all patches
if ((OPTIND == 1)); then
- sp_cleanup
+ # XXX remove for OPENBSD_6_4
+ rm -f /bsd.syspatch+([[:digit:]])
+ # remove non matching release /var/syspatch/ content
+ for _D in ${_PDIR}/{.[!.],}*; do
+ [[ -e ${_D} ]] || continue
+ [[ ${_D##*/} == ${_OSrev}-+([[:digit:]])_+([[:alnum:]]|_) ]] &&
+ [[ -f ${_D}/rollback.tgz ]] || rm -r ${_D}
+ done
_PATCHES=$(ls_missing)
for _PATCH in ${_PATCHES}; do
apply_patch ${_OSrev}-${_PATCH}