#!/usr/bin/env python3 # Alexander Couzens # MIT # show usb device with their net and serial devices import os import usb.core import usb.util from pprint import pprint def get_path_ids(bus, port_numbers): port_numbers = [str(port) for port in port_numbers] ports = '.'.join(port_numbers) return '{}-{}'.format(bus, ports) def get_usb_dir(bus, port_numbers): return '/sys/bus/usb/devices/' + get_path_ids(bus, port_numbers) + '/' def get_usbmisc_from_usb(bus, port_numbers): usbmisc_ifaces = [] path = get_usb_dir(bus, port_numbers) path_ids = get_path_ids(bus, port_numbers) usb_interfaces = [f for f in os.listdir(path) if f.startswith(path_ids)] for usb_iface in usb_interfaces: listdir = [f for f in os.listdir(path + usb_iface) if f == ('usbmisc')] if listdir: # found a net iface usbmisc_ifaces += os.listdir(path + usb_iface + '/usbmisc/') return usbmisc_ifaces def get_net_from_usb(bus, port_numbers): net_ifaces = [] path = get_usb_dir(bus, port_numbers) path_ids = get_path_ids(bus, port_numbers) usb_interfaces = [f for f in os.listdir(path) if f.startswith(path_ids)] for usb_iface in usb_interfaces: listdir = [f for f in os.listdir(path + usb_iface) if f == ('net')] if listdir: # found a net iface net_ifaces += os.listdir(path + usb_iface + '/net/') return net_ifaces def get_serial_from_usb(bus, port_numbers): serial_ifaces = [] path = get_usb_dir(bus, port_numbers) path_ids = get_path_ids(bus, port_numbers) usb_interfaces = [f for f in os.listdir(path) if f.startswith(path_ids)] for usb_iface in usb_interfaces: serial_ifaces += [f for f in os.listdir(path + usb_iface) if f.startswith('tty')] return serial_ifaces def get_product(bus, port_numbers): usb_dir = get_usb_dir(bus, port_numbers) try: product = open(os.path.join(usb_dir, 'product')).read().strip() except OSError as exp: product = "Unknown" return product def get_manuf(bus, port_numbers): usb_dir = get_usb_dir(bus, port_numbers) try: manuf = open(os.path.join(usb_dir, 'manufacturer')).read().strip() except OSError: manuf = "Unknown" return manuf def get_name(bus, port_numbers): manuf = get_manuf(bus, port_numbers) product = get_product(bus, port_numbers) return "%s %s" % (manuf, product) if __name__ == '__main__': USB_DEVS = [dev for dev in usb.core.find(find_all=True)] RESULT = {} for device in USB_DEVS: result = {} if not device.port_numbers: continue # retrieve manuf + product from /sys because non-root user can not ask the usb device result['name'] = get_name(device.bus, device.port_numbers) result['path'] = get_usb_dir(device.bus, device.port_numbers) result['net'] = get_net_from_usb(device.bus, device.port_numbers) result['cdc'] = get_usbmisc_from_usb(device.bus, device.port_numbers) result['serial'] = get_serial_from_usb(device.bus, device.port_numbers) # only show device which have serial or net devices if result['net'] or result['serial']: RESULT[device] = result pprint(RESULT)