diff --git a/pkgs/request-usb/package.nix b/pkgs/request-usb/package.nix new file mode 100644 index 0000000..69ed284 --- /dev/null +++ b/pkgs/request-usb/package.nix @@ -0,0 +1,63 @@ +{ writeShellScriptBin }: + +writeShellScriptBin "request-usb" '' + set -euo pipefail + + parseArgs() { + N_CONSTRAINTS=0 + while [[ -n "''${1:-}" ]]; do + local x= + case "$1" in + "--manufacturer" ) + N_CONSTRAINTS=$(( $N_CONSTRAINTS + 1 )) + MANUFACTURER="$2" + shift 2 + ;; + "--manufacturer="* ) + N_CONSTRAINTS=$(( $N_CONSTRAINTS + 1 )) + MANUFACTURER=''${1#--manufacturer=} + shift 1 + ;; + "--" ) + break + ;; + *) + printUsage + ;; + esac + done + } + printUsage() { + echo "$(caller)" >&2 + echo "Usage: request-usb [--manufacturer=MANUFACTURER]" >&2 + exit 1 + } + + findFirst() { + local d= + + [[ ''${N_CONSTRAINTS:-0} != 0 ]] || printUsage + for d in /sys/bus/usb/devices/* ; do + [[ -e "$d/manufacturer" ]] || continue + [[ -e "$d/uevent" ]] || continue + + read -r x < "$d/manufacturer" + if ! [[ -z "''${MANUFACTURER:-}" || "$MANUFACTURER" = "$x" ]] ; then + continue + fi + + # NOTE: Other predicates here + # ... + + echo -n "$d" + return + done + return 1 + } + + parseArgs $@ + d=$(findFirst) + export $( cat "$d/uevent" ) + sudo chown "$USER" /dev/bus/usb/"$BUSNUM"/"$DEVNUM" + echo -n /dev/bus/usb/"$BUSNUM"/"$DEVNUM" +''