KIEKjes Upload System
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
2.2 KiB

#!/bin/sh
set -e
action=watch
device=
usbbid=
usbvid=
usbpid=
usbcls=
usbsubcls=
usbproto=
usage() {
echo "usage: $0 [-h] [-r DEVICE | -w [-b BUSID] [-v VENDORID] [-p PRODUCTID] [-c CLASS] [-C SUBCLASS] [-P PROTOCOL]]" >&2
}
while getopts hwrb:v:p:c:C:P: opt; do
case "$opt" in
w) action=watch;;
r) action=remove; device="$OPTARG";;
b) usbbid="$OPTARG";;
v) usbvid="$(printf "%04x" 0x$OPTARG)";;
p) usbpid="$(printf "%04x" 0x$OPTARG)";;
c) usbcls="$(printf "%02x" $OPTARG)";;
C) usbsubcls="$(printf "%02x" $OPTARG)";;
P) usbproto="$(printf "%02x" $OPTARG)";;
h) usage; exit 0;;
?) usage; exit 255;;
esac
done
shift $(($OPTIND - 1))
case "$action" in
watch)
inotifywait -e create -m -r /dev/bus/usb | {
while read -r basedir action devname; do (
bus="${basedir#/dev/bus/usb}"
bus="${bus#/}"
[ -n "$bus" ] || continue
busnum="$(echo "$bus" | sed -e 's/^0+//')"
devnum="$(echo "$devname" | sed -e 's/^0+//')"
[ -z "$usbbid" ] || [ "$busnum" -eq "$usbbid" ] || continue
# ref: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/stable/sysfs-bus-usb?h=v5.19#n63
sysdir="$(echo /sys/bus/usb/devices/$busnum-$devnum:*)"
devvid="$(cat "$sysdir/idVendor" | tr '[A-Z]' '[a-z]')"
[ -z "$usbvid" ] || [ "$devvid" = "$usbvid" ] || continue
devpid="$(cat "$sysdir/idProduct" | tr '[A-Z]' '[a-z]')"
[ -z "$usbpid" ] || [ "$devpid" = "$usbpid" ] || continue
devcls="$(cat "$sysdir/bDeviceClass" | tr '[A-Z]' '[a-z]')"
[ -z "$usbcls" ] || [ "$devcls" = "$usbcls" ] || continue
debsubcls="$(cat "$sysdir/bDeviceSubClass" | tr '[A-Z]' '[a-z]')"
[ -z "$usbsubcls" ] || [ "$devsubcls" = "$usbsubcls" ] || continue
devproto="$(cat "$sysdir/bDeviceProtocol" | tr '[A-Z]' '[a-z]')"
[ -z "$usbproto" ] || [ "$devproto" = "$usbproto" ] || continue
rp-make "$sysdir" protocol=usb rm_command="$0 -r '$sysdir'"
) || true; done
}
;;
remove)
# todo
;;
esac