#!/usr/bin/env perl # find-device-port-linux-udev - Kaleidoscope helper tool # Copyright (C) 2017-2018 Keyboard.io, Inc. # # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation, version 3. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with # this program. If not, see <http://www.gnu.org/licenses/>. use warnings; use strict; use FindBin qw{$Bin}; die "Usage: $0 VID PID [-v]\n" unless @ARGV >= 2; my $vid = shift @ARGV; my $pid = shift @ARGV; my $verbose = shift @ARGV if (@ARGV); my $prefix = '/dev/serial/by-id/'; my @paths = `ls $prefix`; my %devices; my @log; sub debug { if ($verbose) { print STDERR @_; } else { push @log, @_; } } sub print_warning { print STDERR @_; } debug "Looking for USB device with vid=$vid and pid=$pid\n"; for my $path (@paths) { chomp($path); debug "Examining $path\n"; debug " not symlink\n" unless -l $prefix . $path; next unless -l $prefix . $path; my @data = `udevadm info -q property --name=${prefix}${path}`; for my $line (@data) { chomp($line); my ( $key, $val ) = split( /=/, $line, 2 ); $devices{$path}{$key} = $val; } if ( hex $devices{$path}{'ID_VENDOR_ID'} != hex $vid ) { debug " ID_VENDOR_ID $devices{$path}{'ID_VENDOR_ID'} != $vid\n"; next; } if ( hex $devices{$path}{'ID_MODEL_ID'} != hex $pid ) { debug " ID_MODEL_ID $devices{$path}{'ID_MODEL_ID'} != $pid\n"; next; } debug " Found keyboard!\n"; if ( $devices{$path}{'ID_MM_DEVICE_IGNORE'} ) { debug " ID_MM_DEVICE_IGNORE is set - good!\n"; } if ( $devices{$path}{'ID_MM_CANDIDATE'}) { my $rules = "$Bin/../etc/99-kaleidoscope.rules"; print_warning <<EOWARN WARNING: your udev rules are currently configured to suggest that your keyboard is suitable for use by ModemManager. This means that there is a risk of ModemManager interfering. To avoid this, copy $rules to /etc/udev/rules.d EOWARN } print $devices{$path}{DEVNAME}; exit(0); } print_warning(join("\n",@log)); print_warning("ERROR: I couldn't find a USB device matching the keyboard's USB Vendor and Device IDs\n");