[BACK]Return to fw_install.sh CVS log [TXT][DIR] Up to [local] / openbsd / fw_update

Diff for /openbsd/fw_update/fw_install.sh between version 1.25 and 1.46

version 1.25, 2021/11/11 02:38:32 version 1.46, 2021/12/02 03:46:50
Line 1 
Line 1 
 #!/bin/ksh  #!/bin/ksh
   #       $OpenBSD$
 set -e  set -e
   
 scan_dmesg() {  # Copyright (c) 2021 Andrew Hewus Fresh <afresh1@openbsd.org>
         # no bsort for now  #
         sed -n "$1" /var/run/dmesg.boot  # Permission to use, copy, modify, and distribute this software for any
 }  # purpose with or without fee is hereby granted, provided that the above
   # copyright notice and this permission notice appear in all copies.
   #
   # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   
 # Fake up some things from install.sub that we don't need to actually do  # Fake up some things from install.sub that we don't need to actually do
 prefetcharea_fs_list() {  prefetcharea_fs_list() {
         echo "/mnt/tmp"          echo "${DESTDIR}/tmp"
 }  }
 reset_watchdog() {  
 }  
   
 # tmpdir, do_as, unpriv, and unpriv2 are from install.sub  # tmpdir, do_as, and unpriv are from install.sub
   # modified to use su(1) when not in the installer.
   # modified to use mktemp(1) when not in the installer.
   
 # Create a temporary directory based on the supplied directory name prefix.  # Create a temporary directory based on the supplied directory name prefix.
 tmpdir() {  tmpdir() {
         local _i=1 _dir          local _i=1 _dir
           if [[ -z $1 ]]; then
                   echo No tmpdir >&2
                   exit 1
           fi
   
         until _dir="${1?}.$_i.$RANDOM" && mkdir -- "$_dir" 2>/dev/null; do          if [[ -e /usr/bin/mktemp ]]; then
                 ((++_i < 10000)) || return 1                  _dir=$( /usr/bin/mktemp -d $1 )
         done                  chown _sndio "$_dir"
           else
                   until _dir="${1%-+(X)}.$_i.$RANDOM" && mkdir -- "$_dir" 2>/dev/null; do
                       ((++_i < 10000)) || return 1
                   done
           fi
         echo "$_dir"          echo "$_dir"
 }  }
   
Line 49 
Line 68 
                 chown "$_user" "$_file"                  chown "$_user" "$_file"
         fi          fi
   
         doas -u "$_user" "$@"          if [[ -x /usr/bin/su ]]; then
                   /usr/bin/su -s /bin/ksh "$_user" -c "$*"
           else
                   doas -u "$_user" "$@"
           fi
         _rc=$?          _rc=$?
   
         while doas -u "$_user" kill -9 -1 2>/dev/null; do          while doas -u "$_user" kill -9 -1 2>/dev/null; do
Line 66 
Line 89 
         do_as _sndio "$@"          do_as _sndio "$@"
 }  }
   
 unpriv2() {  VNAME=${VNAME:-$(sysctl -n kern.osrelease)}
         do_as _file "$@"  VERSION=${VERSION:-"${VNAME%.*}${VNAME#*.}"}
 }  FWDIR=${FWDIR:-$VNAME}
   
 # "fail" needs to be replaced with the "ask_yn" loop like in the installer.  
 _issue=  
 fail() {  
         echo $_issue >&2  
         exit 1  
 }  
   
 VNAME=$(sysctl -n kern.osrelease)  
 VERSION="${VNAME%.*}${VNAME#*.}"  
 FWDIR="$VNAME"  
   
 # TODO: We need the firmware for the system we just installed  # TODO: We need the firmware for the system we just installed
 #       not the one we booted from.  For example:  #       not the one we booted from.  For example:
 #       * booting from a snapshot bsd.rd that thinks it is the 7.0 release  #       * booting from a snapshot bsd.rd that thinks it is the 7.0 release
Line 92 
Line 104 
 #       Otherwise, the fw_update after first boot will fix it up for us.  #       Otherwise, the fw_update after first boot will fix it up for us.
   
 HTTP_FWDIR=$FWDIR  HTTP_FWDIR=$FWDIR
 set -- $(scan_dmesg "/^OpenBSD $VNAME\([^ ]*\).*$/s//\1/p")  set -- sed -n "/^OpenBSD $VNAME\([^ ]*\).*$/s//\1/p" /var/run/dmesg.boot
 [[ $1 == -!(stable) ]] && HTTP_FWDIR=snapshots  [[ $1 == -!(stable) ]] && HTTP_FWDIR=snapshots
   
 FWURL=http://firmware.openbsd.org/firmware/${HTTP_FWDIR}  FWURL=http://firmware.openbsd.org/firmware/${HTTP_FWDIR}
 FWPUB_KEY=${DESTDIR}/etc/signify/openbsd-${VERSION}-fw.pub  FWPUB_KEY=${DESTDIR}/etc/signify/openbsd-${VERSION}-fw.pub
 FWPATTERNS="file:${0%/*}/firmware_patterns"  FWPATTERNS="${DESTDIR}/usr/share/misc/firmware_patterns"
   
 # TODO: support srclocal installation of firmware somehow  # TODO: support srclocal installation of firmware somehow
 fw_update() {  fw_install() {
         local _src=$1 _tmpfs_list _tmpfs _tmpsrc \          local _src=$1 _tmpfs_list _tmpfs _tmpsrc \
                 _t=Get _cfile="/tmp/SHA256" _pkgdir=/mnt/var/db/pkg \                  _t=Get _cfile="/tmp/SHA256" _pkgdir=${DESTDIR}/var/db/pkg \
                 _f _r _remove _i _installed                  _f _r _remove _i _installed
         local _srclocal=false _unpriv=unpriv          local _srclocal=false _unpriv=unpriv
   
         local _d _drivers=$(          local _d _drivers=$(
                 last=''                  last=''
                 $_unpriv ftp -D "Detecting" -Vmo- $FWPATTERNS |  
                 while read _d _m; do                  while read _d _m; do
                         grep=grep                          grep=grep
                         [ "$last" = "$_d" ] && continue                          [ "$last" = "$_d" ] && continue
Line 116 
Line 128 
                         $grep -q "$_m" /var/run/dmesg.boot || continue                          $grep -q "$_m" /var/run/dmesg.boot || continue
                         echo $_d                          echo $_d
                         last=$_d                          last=$_d
                 done                  done < $FWPATTERNS
         )          )
   
         if [ -z "$_drivers" ]; then          if [ -z "$_drivers" ]; then
Line 138 
Line 150 
                 # Create a download directory for the firmware and                  # Create a download directory for the firmware and
                 # check that the _sndio user can read files from                  # check that the _sndio user can read files from
                 # it. Otherwise cleanup and skip the filesystem.                  # it. Otherwise cleanup and skip the filesystem.
                 if _tmpsrc=$(tmpdir "$_tmpfs/firmware"); then                  if _tmpsrc=$(tmpdir "$_tmpfs/firmware-XXXXXXXXX"); then
                         (                          (
                         >$_tmpsrc/t &&                          >$_tmpsrc/t &&
                         $_unpriv cat $_tmpsrc/t                          $_unpriv cat $_tmpsrc/t
Line 164 
Line 176 
             echo "Signature check of SHA256.sig failed" >&2 && return 1              echo "Signature check of SHA256.sig failed" >&2 && return 1
   
         for _d in $_drivers; do          for _d in $_drivers; do
                 $UU && reset_watchdog                  _f=$( sed -n "s/.*(\($_d-firmware-.*\.tgz\)).*/\1/p" "$_cfile" | sed '$!d' )
                 _f=$( sed -n "s/.*(\($_d-firmware-.*\.tgz\)).*/\1/p" "$_cfile" )  
                 _installed=$(                  _installed=$(
                 for fw in "${_pkgdir}/$_d-firmware"*; do                  for fw in "${_pkgdir}/$_d-firmware"*; do
                         [ -e "$fw" ] || continue                          [ -e "$fw" ] || continue
Line 186 
Line 197 
                 # sha256. Create a flag file in case ftp failed. Firmware                  # sha256. Create a flag file in case ftp failed. Firmware
                 # from net is written to the prefetch area.                  # from net is written to the prefetch area.
                 ( $_unpriv ftp -D "$_t" -Vmo - "$_src/$_f" || >/tmp/fail ) |                  ( $_unpriv ftp -D "$_t" -Vmo - "$_src/$_f" || >/tmp/fail ) |
                 ( $_srclocal && unpriv2 sha256 -b >/tmp/h ||                  ( $_srclocal && sha256 -b >/tmp/h ||
                     unpriv2 -f /tmp/h sha256 -bph /tmp/h >"$_tmpsrc/$_f" )                      sha256 -bph /tmp/h >"$_tmpsrc/$_f" )
   
                 # Handle failed transfer.                  # Handle failed transfer.
                 if [[ -f /tmp/fail ]]; then                  if [[ -f /tmp/fail ]]; then
Line 212 
Line 223 
   
                         while read c g; do                          while read c g; do
                                 case $c in                                  case $c in
                                 @cwd) cwd="/mnt/$g"                                  @cwd) cwd="${DESTDIR}/$g"
                                   ;;                                    ;;
                                 @*) continue                                  @*) continue
                                   ;;                                    ;;
Line 237 
Line 248 
                 # TODO: Should we mark these so real fw_update can -Drepair?                  # TODO: Should we mark these so real fw_update can -Drepair?
                 ftp -D "Install" -Vmo- "file:$_tmpsrc/$_f" |                  ftp -D "Install" -Vmo- "file:$_tmpsrc/$_f" |
                         tar -s ",^\+,${_pkgdir}/${_f%.tgz}/+," \                          tar -s ",^\+,${_pkgdir}/${_f%.tgz}/+," \
                         -s ",^firmware,mnt/etc/firmware," \                          -s ",^firmware,${DESTDIR}/etc/firmware," \
                         -C / -zxphf - "+*" "firmware/*"                          -C / -zxphf - "+*" "firmware/*"
   
                 ed -s "${_pkgdir}/${_f%.tgz}/+CONTENTS" <<EOL                  ed -s "${_pkgdir}/${_f%.tgz}/+CONTENTS" <<EOL
Line 251 
Line 262 
         done          done
 }  }
   
 fw_update "$FWURL"  fw_install "$FWURL"

Legend:
Removed from v.1.25  
changed lines
  Added in v.1.46

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>