After getting fw_update(8) into a state where it could get some testing,
I found that the man page indicated that -v should indicate different
levels of verbosity and I currently only had one.

This was useful as I didn't really like the output anyway.

Now one -v prints out an additional line when it's doing something to
the firmware.  Two add a progress bar and mentions "detecting". Three
provide a bit more debugging mostly from ftp(1).

Also a couple extra small improvements, hiding errors from killing the
ftp subprocess which could happen if it exits before we do, just
using `firmware_devicename "$_d"` instead of `echo "${...}"`, and using
a normal [=] comparison instead of [[=]] because we don't want pattern
matching there.


Comments, OK?


Index: usr.sbin/fw_update/fw_update.sh
===================================================================
RCS file: /cvs/src/usr.sbin/fw_update/fw_update.sh,v
retrieving revision 1.24
diff -u -p -r1.24 fw_update.sh
--- usr.sbin/fw_update/fw_update.sh     5 Jan 2022 16:32:46 -0000       1.24
+++ usr.sbin/fw_update/fw_update.sh     6 Jan 2022 01:28:03 -0000
@@ -35,7 +35,7 @@ FWURL=http://firmware.openbsd.org/firmwa
 FWPUB_KEY=${DESTDIR}/etc/signify/openbsd-${VERSION}-fw.pub
 
 DRYRUN=false
-VERBOSE=false
+VERBOSE=0
 DELETE=false
 DOWNLOAD=true
 INSTALL=true
@@ -75,14 +75,17 @@ fetch() {
        # we have su(1) and doas(1) is unlikely to be configured.
        set -o monitor # make sure ftp gets its own process group
        (
-       flags=-VM
-       "$VERBOSE" && flags=-vm
+       _flags=-vm
+       case "$VERBOSE" in
+               0|1) _flags=-VM ;;
+                 2) _flags=-Vm ;;
+       esac
        if [ -x /usr/bin/su ]; then
                exec /usr/bin/su -s /bin/ksh "$_user" -c \
-                   "/usr/bin/ftp -N '${0##/}' -D 'Get/Verify' $flags -o- 
'$_src'" > "$_dst"
+                   "/usr/bin/ftp -N '${0##/}' -D 'Get/Verify' $_flags -o- 
'$_src'" > "$_dst"
        else
                exec /usr/bin/doas -u "$_user" \
-                   /usr/bin/ftp -N "${0##/}" -D 'Get/Verify' $flags -o- 
"$_src" > "$_dst"
+                   /usr/bin/ftp -N "${0##/}" -D 'Get/Verify' $_flags -o- 
"$_src" > "$_dst"
        fi
        ) & FTPPID=$!
        set +o monitor
@@ -97,7 +100,7 @@ fetch() {
                                SECONDS=0
                                sleep 1
                        else
-                               kill -INT -"$FTPPID"
+                               kill -INT -"$FTPPID" 2>/dev/null
                                _error=" (timed out)"
                        fi
                else
@@ -183,24 +186,28 @@ detect_firmware() {
        set -sA _devices -- $(
            firmware_in_dmesg
            for _d in $( installed_firmware '*' '-firmware-' '*' ); do
-               echo "$( firmware_devicename "$_d" )"
+               firmware_devicename "$_d"
            done
        )
 
        [ "${_devices[*]:-}" ] || return 0
        for _d in "${_devices[@]}"; do
-               [[ $_last = $_d ]] && continue
-               echo $_d
+               [ "$_last" = "$_d" ] && continue
+               echo "$_d"
                _last="$_d"
        done
 }
 
 add_firmware () {
-       local _f="${1##*/}" _pkgname
+       local _f="${1##*/}" _m="${2:-Install}" _pkgname
        FWPKGTMP="$( tmpdir "${DESTDIR}/var/db/pkg/.firmware" )"
-       local flags=-VM
-       "$VERBOSE" && flags=-vm
-       ftp -N "${0##/}" -D "Install" "$flags" -o- "file:${1}" |
+       local _flags=-vm
+       case "$VERBOSE" in
+               0|1) _flags=-VM ;;
+               2|3) _flags=-Vm ;;
+       esac
+
+       ftp -N "${0##/}" -D "$_m" "$_flags" -o- "file:${1}" |
                tar -s ",^\+,${FWPKGTMP}/+," \
                    -s ",^firmware,${DESTDIR}/etc/firmware," \
                    -C / -zxphf - "+*" "firmware/*"
@@ -232,7 +239,7 @@ delete_firmware() {
        local _cwd _pkg="$1" _pkgdir="${DESTDIR}/var/db/pkg"
 
        # TODO: Check hash for files before deleting
-       "$VERBOSE" && echo "Uninstalling $_pkg"
+       [ "$VERBOSE" -gt 2 ] && echo -n "Uninstall $_pkg ..."
        _cwd="${_pkgdir}/$_pkg"
 
        if [ ! -e "$_cwd/+CONTENTS" ] ||
@@ -267,6 +274,10 @@ delete_firmware() {
                        rm -f "$_r"
                fi
        done
+
+       [ "$VERBOSE" -gt 2 ] && echo " done."
+
+       return 0
 }
 
 usage() {
@@ -284,7 +295,7 @@ do
        D) OPT_D=true ;;
        n) DRYRUN=true ;;
        p) LOCALSRC="$OPTARG" ;;
-       v) VERBOSE=true ;;
+       v) VERBOSE=$(( VERBOSE + 1 )) ;;
        :)
           echo "${0##*/}: option requires an argument -- -$OPTARG" >&2
           usage 2
@@ -327,6 +338,9 @@ set -sA devices -- "$@"
 if "$DELETE"; then
        [ "$OPT_D" ] && usage 22
 
+       # Show the "Uninstalling" message when just deleting not upgrading
+       [ "$VERBOSE" -gt 1 ] && VEROBOSE=3
+
        set -A installed
        if [ "${devices[*]:-}" ]; then
                "$ALL" && usage 22
@@ -354,7 +368,7 @@ if "$DELETE"; then
        if [ "${installed:-}" ]; then
                for fw in "${installed[@]}"; do
                        if "$DRYRUN"; then
-                               echo "Delete $fw"
+                               [ "$VERBOSE" -gt 0 ] && echo "Delete $fw"
                        else
                                delete_firmware "$fw" || continue
                        fi
@@ -362,7 +376,7 @@ if "$DELETE"; then
                done
        fi
 
-       deleted="${deleted:+${deleted#,}}"
+       deleted="${deleted#,}"
        echo "${0:##*/}: deleted ${deleted:-none}";
 
        exit
@@ -378,9 +392,9 @@ CFILE="$LOCALSRC/$CFILE"
 if [ "${devices[*]:-}" ]; then
        "$ALL" && usage 22
 else
-       "$VERBOSE" && echo -n "Detecting firmware ..."
+       [ "$VERBOSE" -gt 1 ] && echo -n "Detect firmware ..."
        set -sA devices -- $( detect_firmware )
-       "$VERBOSE" &&
+       [ "$VERBOSE" -gt 1 ] &&
            { [ "${devices[*]:-}" ] && echo " found." || echo " done." ; }
 fi
 
@@ -418,7 +432,7 @@ for f in "${devices[@]}"; do
        if "$INSTALL" && [ "${installed[*]:-}" ]; then
                for i in "${installed[@]}"; do
                        if [ "${f##*/}" = "$i.tgz" ]; then
-                               "$VERBOSE" && echo "Keep $i"
+                               [ "$VERBOSE" -gt 2 ] && echo "Keep $i"
                                kept="$kept,$d"
                                continue 2
                        fi
@@ -427,7 +441,7 @@ for f in "${devices[@]}"; do
 
        if [ -e "$f" ]; then
                if "$DOWNLOAD"; then
-                       "$VERBOSE" && ! "$INSTALL" &&
+                       [ "$VERBOSE" -gt 1 ] && ! "$INSTALL" &&
                            echo "Keep/Verify ${f##*/}"
                        "$DRYRUN"  || verify "$f" || continue
                        "$INSTALL" || kept="$kept,$d"
@@ -435,12 +449,15 @@ for f in "${devices[@]}"; do
                fi
        elif "$DOWNLOAD"; then
                if "$DRYRUN"; then
-                       "$VERBOSE" && echo "Get/Verify ${f##*/}"
+                       [ "$VERBOSE" -gt 0 ] && echo "Get/Verify ${f##*/}"
                else
-                       fetch  "$f" || continue
-                       verify "$f" || continue
+                       [ "$VERBOSE" -eq 1 ] && echo -n "Get/Verify ${f##*/} 
..."
+                       fetch  "$f" &&
+                       verify "$f" ||
+                           { [ "$VERBOSE" -eq 1 ] && echo " failed."; 
continue; }
+                       [ "$VERBOSE" -eq 1 ] && ! "$INSTALL" && echo " done."
                fi
-               "$INSTALL"  || added="$added,$d"
+               "$INSTALL" || added="$added,$d"
        elif "$INSTALL"; then
                echo "Cannot install ${f##*/}, not found" >&2
                continue
@@ -448,23 +465,35 @@ for f in "${devices[@]}"; do
 
        "$INSTALL" || continue
 
-       removed=false
+       update=''
        if [ "${installed[*]:-}" ]; then
                for i in "${installed[@]}"; do
                        "$DRYRUN" || delete_firmware "$i"
-                       removed=true
+                       update="Update"
                done
        fi
 
-       "$DRYRUN" || add_firmware "$f"
+       "$DRYRUN" || add_firmware "$f" "$update"
 
        f="${f##*/}"
        f="${f%.tgz}"
-       if "$removed"; then
-               "$DRYRUN" && echo "Update $f"
+       if [ "$update" ]; then
+               if [ "$VERBOSE" -eq 1 ] && "$DOWNLOAD" && ! "$DRYRUN"; then
+                       echo " updated."
+               elif [ "$VERBOSE" -eq 1 ]; then
+                       echo "Update $f"
+               elif [ "$VERBOSE" -gt 0 ] && "$DRYRUN"; then
+                       echo "Update $f"
+               fi
                updated="$updated,$d"
        else
-               "$DRYRUN" && echo "Install $f"
+               if [ "$VERBOSE" -eq 1 ] && "$DOWNLOAD" && ! "$DRYRUN"; then
+                       echo " installed."
+               elif [ "$VERBOSE" -eq 1 ]; then
+                       echo "Install $f"
+               elif [ "$VERBOSE" -gt 0 ] && "$DRYRUN"; then
+                       echo "Install $f"
+               fi
                added="$added,$d"
        fi
 done

Reply via email to