blob: 9136234942f17d4f6f7752839ebbeef22b847740 [file] [log] [blame]
Alexander Couzens2decdba2018-10-25 14:34:09 +02001#!/usr/bin/env python3
2# Alexander Couzens <lynxis@fe80.eu>
3# MIT
4
5# show usb device with their net and serial devices
6
7import os
8import usb.core
9import usb.util
10from pprint import pprint
11
12def get_path_ids(bus, port_numbers):
13 port_numbers = [str(port) for port in port_numbers]
14 ports = '.'.join(port_numbers)
15 return '{}-{}'.format(bus, ports)
16
17def get_usb_dir(bus, port_numbers):
18 return '/sys/bus/usb/devices/' + get_path_ids(bus, port_numbers) + '/'
19
20def get_usbmisc_from_usb(bus, port_numbers):
21 usbmisc_ifaces = []
22 path = get_usb_dir(bus, port_numbers)
23 path_ids = get_path_ids(bus, port_numbers)
24
25 usb_interfaces = [f for f in os.listdir(path) if f.startswith(path_ids)]
26 for usb_iface in usb_interfaces:
27 listdir = [f for f in os.listdir(path + usb_iface) if f == ('usbmisc')]
28 if listdir:
29 # found a net iface
30 usbmisc_ifaces += os.listdir(path + usb_iface + '/usbmisc/')
31 return usbmisc_ifaces
32
33def get_net_from_usb(bus, port_numbers):
34 net_ifaces = []
35 path = get_usb_dir(bus, port_numbers)
36 path_ids = get_path_ids(bus, port_numbers)
37
38 usb_interfaces = [f for f in os.listdir(path) if f.startswith(path_ids)]
39 for usb_iface in usb_interfaces:
40 listdir = [f for f in os.listdir(path + usb_iface) if f == ('net')]
41 if listdir:
42 # found a net iface
43 net_ifaces += os.listdir(path + usb_iface + '/net/')
44 return net_ifaces
45
46def get_serial_from_usb(bus, port_numbers):
47 serial_ifaces = []
48 path = get_usb_dir(bus, port_numbers)
49 path_ids = get_path_ids(bus, port_numbers)
50
51 usb_interfaces = [f for f in os.listdir(path) if f.startswith(path_ids)]
52 for usb_iface in usb_interfaces:
53 serial_ifaces += [f for f in os.listdir(path + usb_iface) if f.startswith('tty')]
54 return serial_ifaces
55
56def get_product(bus, port_numbers):
57 usb_dir = get_usb_dir(bus, port_numbers)
58 try:
59 product = open(os.path.join(usb_dir, 'product')).read().strip()
60 except OSError as exp:
61 product = "Unknown"
62 return product
63
64def get_manuf(bus, port_numbers):
65 usb_dir = get_usb_dir(bus, port_numbers)
66 try:
67 manuf = open(os.path.join(usb_dir, 'manufacturer')).read().strip()
68 except OSError:
69 manuf = "Unknown"
70 return manuf
71
72def get_name(bus, port_numbers):
73 manuf = get_manuf(bus, port_numbers)
74 product = get_product(bus, port_numbers)
75 return "%s %s" % (manuf, product)
76
77if __name__ == '__main__':
78 USB_DEVS = [dev for dev in usb.core.find(find_all=True)]
79 RESULT = {}
80 for device in USB_DEVS:
81 result = {}
82 if not device.port_numbers:
83 continue
84
85 # retrieve manuf + product from /sys because non-root user can not ask the usb device
86 result['name'] = get_name(device.bus, device.port_numbers)
87 result['path'] = get_usb_dir(device.bus, device.port_numbers)
88 result['net'] = get_net_from_usb(device.bus, device.port_numbers)
89 result['cdc'] = get_usbmisc_from_usb(device.bus, device.port_numbers)
90 result['serial'] = get_serial_from_usb(device.bus, device.port_numbers)
91
92 # only show device which have serial or net devices
93 if result['net'] or result['serial']:
94 RESULT[device] = result
95
96 pprint(RESULT)
97