Remove -r toggle and generally be less smart.
authorflorian <florian@openbsd.org>
Tue, 24 Sep 2024 07:33:35 +0000 (07:33 +0000)
committerflorian <florian@openbsd.org>
Tue, 24 Sep 2024 07:33:35 +0000 (07:33 +0000)
The default is to install the next release. Snapshots are only
installed when invoked with -s.

The logic on what to do per default got out of hand and it was very
difficult to reason about what sysupgrade(8) actually did. deraadt@
then suggested that we should dumb it all down, sysupgrade(8) is there
to upgrade from one release to the next. More advance usage needs to
be requested by the user.

With all this simplification we can now be a bit more smart to work
out what the next release is. With that, snapshots right before a
release can be sysupgrade(8)'ed to the official release.

OK sthen on a previous version that was much more complicated but
allowed shortly-before-release -> release upgrade

testing sthen on this version

Guidance, prodding & OK deraadt

usr.sbin/sysupgrade/sysupgrade.8
usr.sbin/sysupgrade/sysupgrade.sh

index 7fb1f18..3f03b7c 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $OpenBSD: sysupgrade.8,v 1.14 2024/09/05 06:39:54 jmc Exp $
+.\"    $OpenBSD: sysupgrade.8,v 1.15 2024/09/24 07:33:35 florian Exp $
 .\"
 .\" Copyright (c) 2019 Florian Obser <florian@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: September 5 2024 $
+.Dd $Mdocdate: September 24 2024 $
 .Dt SYSUPGRADE 8
 .Os
 .Sh NAME
@@ -22,8 +22,7 @@
 .Nd upgrade system to the next release or a new snapshot
 .Sh SYNOPSIS
 .Nm
-.Op Fl fkn
-.Op Fl r | s
+.Op Fl fkns
 .Op Fl b Ar base-directory
 .Op Ar installurl
 .Sh DESCRIPTION
@@ -66,12 +65,9 @@ By default they will be deleted after the upgrade.
 Fetch and verify the files and create
 .Pa /bsd.upgrade
 but do not reboot.
-.It Fl r
-Upgrade to the next release.
-This is the default if the system is currently running a release.
 .It Fl s
 Upgrade to a snapshot.
-This is the default if the system is currently running a snapshot.
+The default is to upgrade to the next release.
 .El
 .Pp
 See
index 0b9624a..71aa321 100644 (file)
@@ -1,6 +1,6 @@
 #!/bin/ksh
 #
-# $OpenBSD: sysupgrade.sh,v 1.52 2024/06/19 05:22:33 otto Exp $
+# $OpenBSD: sysupgrade.sh,v 1.53 2024/09/24 07:33:35 florian Exp $
 #
 # Copyright (c) 1997-2015 Todd Miller, Theo de Raadt, Ken Westerback
 # Copyright (c) 2015 Robert Peichaer <rpe@openbsd.org>
@@ -35,7 +35,7 @@ err()
 
 usage()
 {
-       echo "usage: ${0##*/} [-fkn] [-r | -s] [-b base-directory] [installurl]" 1>&2
+       echo "usage: ${0##*/} [-fkns] [-b base-directory] [installurl]" 1>&2
        return 1
 }
 
@@ -72,11 +72,11 @@ rmel() {
        echo -n "$_c"
 }
 
-RELEASE=false
 SNAP=false
 FORCE=false
 KEEP=false
 REBOOT=true
+WHAT='release'
 
 while getopts b:fknrs arg; do
        case ${arg} in
@@ -84,7 +84,7 @@ while getopts b:fknrs arg; do
        f)      FORCE=true;;
        k)      KEEP=true;;
        n)      REBOOT=false;;
-       r)      RELEASE=true;;
+       r)      ;;
        s)      SNAP=true;;
        *)      usage;;
        esac
@@ -92,13 +92,6 @@ done
 
 (($(id -u) != 0)) && err "need root privileges"
 
-if $RELEASE && $SNAP; then
-       usage
-fi
-
-set -A _KERNV -- $(sysctl -n kern.version |
-       sed 's/^OpenBSD \([1-9][0-9]*\.[0-9]\)\([^ ]*\).*/\1 \2/;q')
-
 shift $(( OPTIND -1 ))
 
 case $# in
@@ -112,58 +105,57 @@ esac
 [[ $MIRROR == @(file|ftp|http|https)://* ]] ||
        err "invalid installurl: $MIRROR"
 
-if ! $RELEASE && [[ ${#_KERNV[*]} == 2 ]]; then
-       if [[ ${_KERNV[1]} != '-stable' ]]; then
-               SNAP=true
-       fi
+if $SNAP; then
+       WHAT='snapshot'
 fi
 
-if $RELEASE && [[ ${_KERNV[1]} == '-beta' ]]; then
-       NEXT_VERSION=${_KERNV[0]}
-else
-       NEXT_VERSION=$(echo ${_KERNV[0]} + 0.1 | bc)
-fi
+VERSION=$(uname -r)
+NEXT_VERSION=$(echo ${VERSION} + 0.1 | bc)
 
 if $SNAP; then
        URL=${MIRROR}/snapshots/${ARCH}/
 else
        URL=${MIRROR}/${NEXT_VERSION}/${ARCH}/
+       ALT_URL=${MIRROR}/${VERSION}/${ARCH}/
 fi
 
 install -d -o 0 -g 0 -m 0755 ${SETSDIR}
 cd ${SETSDIR}
 
 echo "Fetching from ${URL}"
-unpriv -f SHA256.sig ftp -N sysupgrade -Vmo SHA256.sig ${URL}SHA256.sig
-
-_KEY=openbsd-${_KERNV[0]%.*}${_KERNV[0]#*.}-base.pub
-_NEXTKEY=openbsd-${NEXT_VERSION%.*}${NEXT_VERSION#*.}-base.pub
-
-if $SNAP; then
-       unpriv -f SHA256 signify -Ve -x SHA256.sig -m SHA256
+if ! $SNAP; then
+       if ! unpriv -f SHA256.sig ftp -N sysupgrade -Vmo SHA256.sig ${URL}SHA256.sig; then
+               echo "Fetching from ${ALT_URL}"
+               unpriv -f SHA256.sig ftp -N sysupgrade -Vmo SHA256.sig ${ALT_URL}SHA256.sig
+               URL=${ALT_URL}
+       fi
 else
-       read _LINE <SHA256.sig
-       case ${_LINE} in
-       *\ ${_KEY})     SIGNIFY_KEY=/etc/signify/${_KEY} ;;
-       *\ ${_NEXTKEY}) SIGNIFY_KEY=/etc/signify/${_NEXTKEY} ;;
-       *)              err "invalid signing key" ;;
-       esac
-
-       [[ -f ${SIGNIFY_KEY} ]] || err "cannot find ${SIGNIFY_KEY}"
-
-       unpriv -f SHA256 signify -Ve -p "${SIGNIFY_KEY}" -x SHA256.sig -m SHA256
+       unpriv -f SHA256.sig ftp -N sysupgrade -Vmo SHA256.sig ${URL}SHA256.sig
 fi
 
+unpriv -f SHA256 signify -Ve -x SHA256.sig -m SHA256
 rm SHA256.sig
 
 if cmp -s /var/db/installed.SHA256 SHA256 && ! $FORCE; then
-       echo "Already on latest snapshot."
+       echo "Already on latest ${WHAT}."
        exit 0
 fi
 
-# BUILDINFO INSTALL.*, bsd*, *.tgz
+unpriv -f BUILDINFO ftp -N sysupgrade -Vmo BUILDINFO ${URL}BUILDINFO
+unpriv cksum -qC SHA256 BUILDINFO
+
+if [[ -e /var/db/installed.BUILDINFO ]]; then
+       installed_build_ts=$(cut -f3 -d' ' /var/db/installed.BUILDINFO)
+       build_ts=$(cut -f3 -d' ' BUILDINFO)
+       if (( $build_ts <= $installed_build_ts )) && ! $FORCE; then
+               echo "Downloaded ${WHAT} is older than installed system. Use -f to force downgrade."
+               exit 1
+       fi
+fi
+
+# INSTALL.*, bsd*, *.tgz
 SETS=$(sed -n -e 's/^SHA256 (\(.*\)) .*/\1/' \
-    -e '/^BUILDINFO$/p;/^INSTALL\./p;/^bsd/p;/\.tgz$/p' SHA256)
+    -e '/^INSTALL\./p;/^bsd/p;/\.tgz$/p' SHA256)
 
 OLD_FILES=$(ls)
 OLD_FILES=$(rmel SHA256 $OLD_FILES)
@@ -187,15 +179,6 @@ if [[ -n ${DL} ]]; then
        unpriv cksum -qC SHA256 ${DL}
 fi
 
-if [[ -e /var/db/installed.BUILDINFO && -e BUILDINFO ]]; then
-       installed_build_ts=$(cut -f3 -d' ' /var/db/installed.BUILDINFO)
-       build_ts=$(cut -f3 -d' ' BUILDINFO)
-       if (( $build_ts < $installed_build_ts )) && ! $FORCE; then
-               echo "Downloaded snapshot is older than installed snapshot. Use -f to force downgrade."
-               exit 1
-       fi
-fi
-
 cat <<__EOT >/auto_upgrade.conf
 Location of sets = disk
 Pathname to the sets = ${SETSDIR}/