#!/usr/bin/env bash
# usb-status -- display USB power management status on Linux

{
printf "%s\t%s\t%s\t%s\t%s\t%s\n" "ID" "DEVICE" "AUTO" "STATUS" "CONTROL" "LEVEL"
for dev in /sys/bus/usb/devices/*; do
	if ! test -e $dev/power/autosuspend; then
		continue
	fi

	vid=$(< $dev/idVendor)
	pid=$(< $dev/idProduct)
	modalias=usb:v${vid^^}p${pid^^}

	manu=$(systemd-hwdb query $modalias | sed -n 's/^ID_VENDOR_FROM_DATABASE=//p')
	if [[ ! $manu ]]; then
		if [[ -e $dev/manufacturer ]]; then
			manu=$(< $dev/manufacturer)
		else
			manu="Unknown vendor $vid"
		fi
	fi

	prod=$(systemd-hwdb query $modalias | sed -n 's/^ID_MODEL_FROM_DATABASE=//p')
	if [[ ! $prod ]]; then
		if [[ -e $dev/product ]]; then
			prod=$(< $dev/product)
		else
			prod="Unknown product $pid"
		fi
	fi

	autosusp=$(< $dev/power/autosuspend)
	rstat=$(< $dev/power/runtime_status)
	control=$(< $dev/power/control)
	level=$(< $dev/power/level)

	manu=${manu//"$(uname -sr)"/"$(uname -s)"}

	printf "%s\t%s\t%s\t%s\t%s\t%s\n" "${dev##*/}" "$manu $prod" "$autosusp" "${rstat:0:10}" "$control" "$level"
done
} | column -t -s $'\t'
