<p>Pau Espin Pedrol <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/11460">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Harald Welte: Looks good to me, approved
Jenkins Builder: Verified
</div><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;"><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: merged </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: 4 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>