diff options
author | ajacoutot <ajacoutot@openbsd.org> | 2017-08-22 13:32:50 +0000 |
---|---|---|
committer | ajacoutot <ajacoutot@openbsd.org> | 2017-08-22 13:32:50 +0000 |
commit | a8f86fd300ae9a6cac47cc6ec6e0dcf9195b984a (patch) | |
tree | 62189a0581fad7ecf0641df75740a7d3aa7a80ca /usr.sbin/syspatch | |
parent | Remove legacy code. (diff) | |
download | wireguard-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.8 | 16 | ||||
-rw-r--r-- | usr.sbin/syspatch/syspatch.sh | 94 |
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} |