While testing some other stuff, job@ noticed that fw_update(8) kept reinstalling the bwfm firmware. After some research it turns out that fw_update ignores installed packages that aren't marked "@option firmware" and it does that too hard. I'll likely commit the below patch to at least warn folks that something is wrong, but I don't think I want to start ignoring that @option. Installing firmware from the ports tree with `make install` is one way for this to happen.
One side effect of this is fw_update will move a temporary directory full of package registration into the existing directory, which the below patch will also fix. Unfortunately if that has happened, neither fw_update or pkg_delete will happily clean up that package and cleanup requires rm -r. Should I try to work up a patch to clean that up automatically? Should packaging firmware add that option to the +CONTENTS, instead of relying on fw_update at install time? $ cd /usr/ports/sysutils/firmware/bwfm $ make install ===> Installing bwfm-firmware-20200316.1.3p3 from /usr/ports/packages/sparc64/all/ bwfm-firmware-20200316.1.3p3: ok $ grep @option /var/db/pkg/bwfm-firmware-20200316.1.3p3/+CONTENTS @option manual-installation $ doas pkg_delete bwfm-firmware-20200316.1.3p3 bwfm-firmware-20200316.1.3p3: ok $ doas fw_update /usr/ports/packages/sparc64/all/bwfm-firmware-20200316.1.3p3.tgz fw_update: added bwfm; updated none; kept none $ grep @option /var/db/pkg/bwfm-firmware-20200316.1.3p3/+CONTENTS @option manual-installation @option firmware $ Comments or suggestions before I commit this? diff --git a/fw_update.sh b/fw_update.sh index 02261dd..11eae49 100644 --- a/fw_update.sh +++ b/fw_update.sh @@ -320,7 +320,8 @@ detect_firmware() { } add_firmware () { - local _f="${1##*/}" _m="${2:-Install}" _pkgname + local _f="${1##*/}" _m="${2:-Install}" + local _pkgdir="${DESTDIR}/var/db/pkg" _pkg FWPKGTMP="$( tmpdir "${DESTDIR}/var/db/pkg/.firmware" )" local _flags=-vm case "$VERBOSE" in @@ -333,9 +334,16 @@ add_firmware () { -s ",^firmware,${DESTDIR}/etc/firmware," \ -C / -zxphf - "+*" "firmware/*" - _pkgname="$( sed -n '/^@name /{s///p;q;}' "${FWPKGTMP}/+CONTENTS" )" - if [ ! "$_pkgname" ]; then - echo "Failed to extract name from $1, partial install" 2>&1 + _pkg="$( sed -n '/^@name /{s///p;q;}' "${FWPKGTMP}/+CONTENTS" )" + if [ ! "$_pkg" ]; then + warn "Failed to extract name from $1, partial install" + rm -rf "$FWPKGTMP" + unset FWPKGTMP + return 1 + fi + + if [ -e "$_pkgdir/$_pkg" ]; then + warn "Failed to register: $_pkgdir/$_pkg is not firmware" rm -rf "$FWPKGTMP" unset FWPKGTMP return 1 @@ -351,7 +359,7 @@ w EOL chmod 755 "$FWPKGTMP" - mv "$FWPKGTMP" "${DESTDIR}/var/db/pkg/${_pkgname}" + mv "$FWPKGTMP" "$_pkgdir/$_pkg" unset FWPKGTMP }