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

Annotation of openbsd/fw_update/fw_install.sh, Revision 1.1

1.1     ! afresh1     1: #!/bin/ksh
        !             2: set -e
        !             3:
        !             4: scan_dmesg() {
        !             5:        # no bsort for now
        !             6:        sed -n "$1" /var/run/dmesg.boot
        !             7: }
        !             8:
        !             9: installed_firmware() {
        !            10:        for fw in ${PKGDIR}/$1-firmware*; do
        !            11:                [ -e "$fw" ] || continue
        !            12:                echo ${fw##*/}
        !            13:        done
        !            14: }
        !            15:
        !            16: set -A _KERNV -- $( scan_dmesg '/^OpenBSD \([1-9][0-9]*\.[0-9]\)\([^ ]*\) .*/ { s//\1 \2/p; q; }' )
        !            17: VNAME=${_KERNV[0]}
        !            18: OSDIR=$VNAME
        !            19: if ((${#_KERNV[*]} > 1)) && [ "$_KERNV[1]" = "-current" -o "$_KERNV[1]" = "-beta" ]; then
        !            20:        OSDIR=snapshots
        !            21: fi
        !            22:
        !            23: FWURL=http://firmware.openbsd.org/firmware/${OSDIR}
        !            24: PKGDIR=${DESTDIR}/var/db/pkg
        !            25: PATTERNS="file:${0%/*}/firmware_patterns"
        !            26:
        !            27: drivers=$(
        !            28:        last=''
        !            29:        ftp -D "Detecting" -Vmo- $PATTERNS |
        !            30:        while read d m; do
        !            31:                [ "$last" = "$d" ] && continue
        !            32:                [ "$m" ] || m="^$d[0-9][0-9]* at "
        !            33:                [ "$( scan_dmesg "/$m/ { p; q; }" )" ] || continue
        !            34:                echo $d
        !            35:                last=$d
        !            36:        done
        !            37: )
        !            38:
        !            39: if [ -z "$drivers" ]; then
        !            40:        echo "No devices found which need firmware files to be downloaded." >&2
        !            41:        exit 0
        !            42: fi
        !            43:
        !            44: tmpdir=${DESTDIR}/tmp/fw_update
        !            45: [ -e "$tmpdir" ] && rm -rf "$tmpdir"
        !            46: mkdir -p "$tmpdir"
        !            47: cd "$tmpdir"
        !            48:
        !            49: # TODO: Drop privs during fetch and verify
        !            50: ftp -D Get -Vm "$FWURL/SHA256.sig"
        !            51:
        !            52: # Probably should bundle the firmware sigfile on the installer,
        !            53: # although we can just get it from the recently installed system.
        !            54: if [ "$DESTDIR" ]; then
        !            55:        sigfile=$( sed -n '/^untrusted comment: verify with \(.*\)$/ { s//\1/p; q; }' SHA256.sig )
        !            56:        if [ ! -e "/etc/signify/$sigfile" ] \
        !            57:          && [ -e "${DESTDIR}/etc/signify/$sigfile" ]; then
        !            58:                cp -a "${DESTDIR}/etc/signify/$sigfile" "/etc/signify/$sigfile"
        !            59:        fi
        !            60: fi
        !            61:
        !            62: signify -Ve -x SHA256.sig -m - < SHA256.sig > SHA256
        !            63:
        !            64: for d in $drivers; do
        !            65:        firmware=$( sed -n "s/.*(\($d-firmware-.*\.tgz\)).*/\1/p" SHA256 )
        !            66:        installed=$( installed_firmware $d )
        !            67:
        !            68:        for i in $installed; do
        !            69:                if [ "$firmware" = "$i.tgz" ]; then
        !            70:                        echo "Firmware for $d already installed ($installed)"
        !            71:                        continue 2
        !            72:                fi
        !            73:        done
        !            74:
        !            75:        mkdir $d
        !            76:
        !            77:        # TODO: Drop privs during fetch and verify
        !            78:        ftp -D "Get/Verify" -Vmo- "$FWURL/$firmware" | sha256 -bph "$d/h" > "$firmware"
        !            79:        fgrep -qx "SHA256 ($firmware) = $(<$d/h)" SHA256
        !            80:
        !            81:        # TODO: Check hash for files before deleting
        !            82:        if [ "$installed" ] && [ -e "${PKGDIR}/$installed/+CONTENTS" ]; then
        !            83:                echo "Uninstalling $installed"
        !            84:                cwd=${PKGDIR}/$installed
        !            85:
        !            86:                remove="${cwd}/+CONTENTS ${cwd}"
        !            87:
        !            88:                while read c g; do
        !            89:                        case $c in
        !            90:                        @cwd) cwd=$g
        !            91:                          ;;
        !            92:                        @*) continue
        !            93:                          ;;
        !            94:                        *)  remove="$cwd/$c $remove"
        !            95:                          ;;
        !            96:                        esac
        !            97:                done < "${PKGDIR}/$installed/+CONTENTS"
        !            98:
        !            99:                for r in $remove ; do
        !           100:                        if [ -d "$r" ]; then
        !           101:                                # Try hard not to actually remove recursively
        !           102:                                # without rmdir on the install media.
        !           103:                                [ "$r/*" = $( echo "$r"/* ) ] && rm -rf "$r"
        !           104:                        else
        !           105:                                rm -f "$r"
        !           106:                        fi
        !           107:                done
        !           108:        fi
        !           109:
        !           110:        # TODO: Add some details about the install to +CONTENTS like pkg_add
        !           111:        # TODO: Or, maybe we save the firmware someplace and make pkg_add reinstall
        !           112:        echo "Installing $firmware"
        !           113:        tar -zxphf "$firmware" -C /etc "firmware/*"
        !           114:        mkdir -p ${PKGDIR}/${firmware%.tgz}/
        !           115:        tar -zxphf "$firmware" -C "${PKGDIR}/${firmware%.tgz}" "+*"
        !           116:     ed -s "${PKGDIR}/${firmware%.tgz}/+CONTENTS" <<EOL
        !           117: /^@comment pkgpath/ -1a
        !           118: @option manual-installation
        !           119: @option firmware
        !           120: @comment install-script
        !           121: .
        !           122: w
        !           123: EOL
        !           124: done
        !           125:

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