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