Ftdi fixer.py
From ArmadeusWiki
Sources from here
#!/usr/bin/python # vim: set ts=4 sw=4 expandtab syntax=python: """ FTDI device permission fixer Can be called from a udev rule to ensure connected FTDI devices have world-writable permissions for use by user applications J. Hipps <jacob@ycnrg.org> https://ycnrg.org/ """ import os import sys import usb1 def find_usb_device(vid, pid): """locate usb device with libusb""" usb = usb1.USBContext() for tdev in usb.getDeviceList(): if tdev.getVendorID() == vid and tdev.getProductID() == pid: n_bus = tdev.getBusNumber() n_dev = tdev.getDeviceAddress() n_port = tdev.getPortNumber() return (n_bus, n_dev) return None def fix_dev_perms(bus, dev): """fix perms for entry in /dev/bus""" db_path = '/dev/bus/usb/%03d/%03d' % (bus, dev) try: os.stat(db_path) except Exception as e: print("Entry not accessible [%s]: %s" % (db_path, str(e))) return False try: os.chmod(db_path, 0o0666) except Exception as e: print("Failed to update perms for %s: %s" % (db_path, str(e))) return False return True def _main(): """entry point""" if 'ID_VENDOR_ID' in os.environ and 'ID_MODEL_ID' in os.environ: try: d_vid = int(os.environ['ID_VENDOR_ID'], 16) d_pid = int(os.environ['ID_MODEL_ID'], 16) except: print("Failed to convert values from env") sys.exit(2) else: if len(sys.argv) < 3: print("usage: ftdi_fixer.py [VENDOR_ID PRODUCT_ID]") sys.exit(1) try: d_vid = int(sys.argv[1], 16) d_pid = int(sys.argv[2], 16) except: print("Failed to convert hex values") sys.exit(2) udev = find_usb_device(d_vid, d_pid) if udev: fix_dev_perms(*udev) else: print("Failed to locate device") sys.exit(1) sys.exit(0) if __name__ == '__main__': _main()