=================================================================== RCS file: /cvs/openbsd/fw_update/fw_install.sh,v retrieving revision 1.11 retrieving revision 1.18 diff -u -r1.11 -r1.18 --- openbsd/fw_update/fw_install.sh 2021/10/17 03:07:48 1.11 +++ openbsd/fw_update/fw_install.sh 2021/10/18 00:33:07 1.18 @@ -80,6 +80,16 @@ VERSION="${VNAME%.*}${VNAME#*.}" FWDIR="$VNAME" +# TODO: We need the firmware for the system we just installed +# not the one we booted from. For example: +# * booting from a snapshot bsd.rd that thinks it is the 7.0 release +# will install the firmware from the 7.0 directory instead of +# from the snapshots dir. +# If they're using sysupgrade, then the installer kernel will be correct. +# If we're doing this in the installer we can check what they picked +# for downloading sets and use that value. +# Otherwise, the fw_update after first boot will fix it up for us. + HTTP_FWDIR=$FWDIR set -- $(scan_dmesg "/^OpenBSD $VNAME\([^ ]*\).*$/s//\1/p") [[ $1 == -!(stable) ]] && HTTP_FWDIR=snapshots @@ -90,19 +100,19 @@ PATTERNS="file:${0%/*}/firmware_patterns" fw_update() { - local _tmpsrc _f _remove _r - local _src=$FWURL _t=Get _cfile="$_tmpsrc/SHA256" _srclocal=false - local _drivers=$( + local _tmpsrc _f _r _remove _i _installed + local _src=$FWURL _t=Get _cfile="/tmp/SHA256" _srclocal=false + local _d _drivers=$( last='' ftp -D "Detecting" -Vmo- $PATTERNS | - while read d m; do + while read _d _m; do grep=grep - [ "$last" = "$d" ] && continue - [ "$m" ] || m="^$d[0-9][0-9]* at " - [ "$m" = "${m#^}" ] && grep=fgrep - $grep -q "$m" /var/run/dmesg.boot || continue - echo $d - last=$d + [ "$last" = "$_d" ] && continue + [ "$_m" ] || _m="^$_d[0-9][0-9]* at " + [ "$_m" = "${_m#^}" ] && grep=fgrep + $grep -q "$_m" /var/run/dmesg.boot || continue + echo $_d + last=$_d done ) @@ -122,8 +132,11 @@ [[ ! -d $_tmpsrc ]] && _issue="Cannot create prefetch area" && fail - cd "$_tmpsrc" + # Cleanup from previous runs. + rm -f $_cfile $_cfile.sig + _t=Get/Verify + ! $_unpriv ftp -D "$_t" -Vmo - "$_src/SHA256.sig" >"$_cfile.sig" && _issue="Cannot fetch SHA256.sig" && fail @@ -132,20 +145,19 @@ signify -Vep $FWPUB_KEY -x "$_cfile.sig" -m "$_cfile" && _issue="Signature check of SHA256.sig failed" && fail - for d in $_drivers; do - _f=$( sed -n "s/.*(\($d-firmware-.*\.tgz\)).*/\1/p" "$_cfile" ) - installed=$( installed_firmware "$d" ) + for _d in $_drivers; do + _f=$( sed -n "s/.*(\($_d-firmware-.*\.tgz\)).*/\1/p" "$_cfile" ) + _installed=$( installed_firmware "$_d" ) - for i in $installed; do - if [ "$_f" = "$i.tgz" ]; then - echo "Firmware for $d already installed ($installed)" + for _i in $_installed; do + if [ "$_f" = "$_i.tgz" ]; then + echo "Firmware for $_d already installed ($_installed)" continue 2 fi done rm -f /tmp/h /tmp/fail - _t=Get/Verify # Fetch firmware file and create a checksum by piping through # sha256. Create a flag file in case ftp failed. Firmware # from net is written to the prefetch area. @@ -171,22 +183,22 @@ fi # TODO: Check hash for files before deleting - if [ "$installed" ] && [ -e "${PKGDIR}/$installed/+CONTENTS" ]; then - echo "Uninstalling $installed" - cwd=${PKGDIR}/$installed + if [ "$_installed" ] && [ -e "${PKGDIR}/$_installed/+CONTENTS" ]; then + echo "Uninstalling $_installed" + cwd=${PKGDIR}/$_installed set -A _remove -- "${cwd}/+CONTENTS" "${cwd}" while read c g; do case $c in - @cwd) cwd=$g + @cwd) cwd="${DESTDIR}/$g" ;; @*) continue ;; *) set -A _remove -- "$cwd/$c" "${_remove[@]}" ;; esac - done < "${PKGDIR}/$installed/+CONTENTS" + done < "${PKGDIR}/$_installed/+CONTENTS" for _r in "${_remove[@]}" ; do if [ -d "$_r" ]; then @@ -202,9 +214,9 @@ # TODO: Add some details about the install to +CONTENTS like pkg_add # TODO: Or, maybe we save the firmware someplace and make pkg_add reinstall echo "Installing $_f" - tar -zxphf "$_f" -C /etc "firmware/*" + tar -zxphf "$_tmpsrc/$_f" -C "${DESTDIR}/etc" "firmware/*" mkdir -p ${PKGDIR}/${_f%.tgz}/ - tar -zxphf "$_f" -C "${PKGDIR}/${_f%.tgz}" "+*" + tar -zxphf "$_tmpsrc/$_f" -C "${PKGDIR}/${_f%.tgz}" "+*" ed -s "${PKGDIR}/${_f%.tgz}/+CONTENTS" <