<p>Pau Espin Pedrol has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11460">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">utils: Introduce show_usb_device.py<br><br>This is a small script written by Alexander Couzens that is useful to<br>list modems and its properties in a quick and easy way in<br>osmo-gsm-tester setup.<br><br>Change-Id: Iec049e2d56d61ecd50b65b64d95d69641fa0f8be<br>---<br>A utils/show_usb_device.py<br>1 file changed, 97 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/60/11460/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/utils/show_usb_device.py b/utils/show_usb_device.py</span><br><span>new file mode 100755</span><br><span>index 0000000..9136234</span><br><span>--- /dev/null</span><br><span>+++ b/utils/show_usb_device.py</span><br><span>@@ -0,0 +1,97 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env python3</span><br><span style="color: hsl(120, 100%, 40%);">+# Alexander Couzens <lynxis@fe80.eu></span><br><span style="color: hsl(120, 100%, 40%);">+# MIT</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# show usb device with their net and serial devices</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import os</span><br><span style="color: hsl(120, 100%, 40%);">+import usb.core</span><br><span style="color: hsl(120, 100%, 40%);">+import usb.util</span><br><span style="color: hsl(120, 100%, 40%);">+from pprint import pprint</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def get_path_ids(bus, port_numbers):</span><br><span style="color: hsl(120, 100%, 40%);">+    port_numbers = [str(port) for port in port_numbers]</span><br><span style="color: hsl(120, 100%, 40%);">+    ports = '.'.join(port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+    return '{}-{}'.format(bus, ports)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def get_usb_dir(bus, port_numbers):</span><br><span style="color: hsl(120, 100%, 40%);">+    return '/sys/bus/usb/devices/' + get_path_ids(bus, port_numbers) + '/'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def get_usbmisc_from_usb(bus, port_numbers):</span><br><span style="color: hsl(120, 100%, 40%);">+    usbmisc_ifaces = []</span><br><span style="color: hsl(120, 100%, 40%);">+    path = get_usb_dir(bus, port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+    path_ids = get_path_ids(bus, port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    usb_interfaces = [f for f in os.listdir(path) if f.startswith(path_ids)]</span><br><span style="color: hsl(120, 100%, 40%);">+    for usb_iface in usb_interfaces:</span><br><span style="color: hsl(120, 100%, 40%);">+        listdir = [f for f in os.listdir(path + usb_iface) if f == ('usbmisc')]</span><br><span style="color: hsl(120, 100%, 40%);">+        if listdir:</span><br><span style="color: hsl(120, 100%, 40%);">+            # found a net iface</span><br><span style="color: hsl(120, 100%, 40%);">+            usbmisc_ifaces += os.listdir(path + usb_iface + '/usbmisc/')</span><br><span style="color: hsl(120, 100%, 40%);">+    return usbmisc_ifaces</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def get_net_from_usb(bus, port_numbers):</span><br><span style="color: hsl(120, 100%, 40%);">+    net_ifaces = []</span><br><span style="color: hsl(120, 100%, 40%);">+    path = get_usb_dir(bus, port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+    path_ids = get_path_ids(bus, port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    usb_interfaces = [f for f in os.listdir(path) if f.startswith(path_ids)]</span><br><span style="color: hsl(120, 100%, 40%);">+    for usb_iface in usb_interfaces:</span><br><span style="color: hsl(120, 100%, 40%);">+        listdir = [f for f in os.listdir(path + usb_iface) if f == ('net')]</span><br><span style="color: hsl(120, 100%, 40%);">+        if listdir:</span><br><span style="color: hsl(120, 100%, 40%);">+            # found a net iface</span><br><span style="color: hsl(120, 100%, 40%);">+            net_ifaces += os.listdir(path + usb_iface + '/net/')</span><br><span style="color: hsl(120, 100%, 40%);">+    return net_ifaces</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def get_serial_from_usb(bus, port_numbers):</span><br><span style="color: hsl(120, 100%, 40%);">+    serial_ifaces = []</span><br><span style="color: hsl(120, 100%, 40%);">+    path = get_usb_dir(bus, port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+    path_ids = get_path_ids(bus, port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    usb_interfaces = [f for f in os.listdir(path) if f.startswith(path_ids)]</span><br><span style="color: hsl(120, 100%, 40%);">+    for usb_iface in usb_interfaces:</span><br><span style="color: hsl(120, 100%, 40%);">+        serial_ifaces += [f for f in os.listdir(path + usb_iface) if f.startswith('tty')]</span><br><span style="color: hsl(120, 100%, 40%);">+    return serial_ifaces</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def get_product(bus, port_numbers):</span><br><span style="color: hsl(120, 100%, 40%);">+    usb_dir = get_usb_dir(bus, port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+    try:</span><br><span style="color: hsl(120, 100%, 40%);">+        product = open(os.path.join(usb_dir, 'product')).read().strip()</span><br><span style="color: hsl(120, 100%, 40%);">+    except OSError as exp:</span><br><span style="color: hsl(120, 100%, 40%);">+        product = "Unknown"</span><br><span style="color: hsl(120, 100%, 40%);">+    return product</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def get_manuf(bus, port_numbers):</span><br><span style="color: hsl(120, 100%, 40%);">+    usb_dir = get_usb_dir(bus, port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+    try:</span><br><span style="color: hsl(120, 100%, 40%);">+        manuf = open(os.path.join(usb_dir, 'manufacturer')).read().strip()</span><br><span style="color: hsl(120, 100%, 40%);">+    except OSError:</span><br><span style="color: hsl(120, 100%, 40%);">+        manuf = "Unknown"</span><br><span style="color: hsl(120, 100%, 40%);">+    return manuf</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def get_name(bus, port_numbers):</span><br><span style="color: hsl(120, 100%, 40%);">+    manuf = get_manuf(bus, port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+    product = get_product(bus, port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+    return "%s %s" % (manuf, product)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if __name__ == '__main__':</span><br><span style="color: hsl(120, 100%, 40%);">+    USB_DEVS = [dev for dev in usb.core.find(find_all=True)]</span><br><span style="color: hsl(120, 100%, 40%);">+    RESULT = {}</span><br><span style="color: hsl(120, 100%, 40%);">+    for device in USB_DEVS:</span><br><span style="color: hsl(120, 100%, 40%);">+        result = {}</span><br><span style="color: hsl(120, 100%, 40%);">+        if not device.port_numbers:</span><br><span style="color: hsl(120, 100%, 40%);">+            continue</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # retrieve manuf + product from /sys because non-root user can not ask the usb device</span><br><span style="color: hsl(120, 100%, 40%);">+        result['name'] = get_name(device.bus, device.port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+        result['path'] = get_usb_dir(device.bus, device.port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+        result['net'] = get_net_from_usb(device.bus, device.port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+        result['cdc'] = get_usbmisc_from_usb(device.bus, device.port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+        result['serial'] = get_serial_from_usb(device.bus, device.port_numbers)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # only show device which have serial or net devices</span><br><span style="color: hsl(120, 100%, 40%);">+        if result['net'] or result['serial']:</span><br><span style="color: hsl(120, 100%, 40%);">+            RESULT[device] = result</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    pprint(RESULT)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11460">change 11460</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/11460"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-gsm-tester </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Iec049e2d56d61ecd50b65b64d95d69641fa0f8be </div>
<div style="display:none"> Gerrit-Change-Number: 11460 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>