/usr/share/pyshared/udevdiscover/device/usb.py is in udev-discover 0.2.2-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 | # -*- coding: utf-8 -*-
# vim: ts=4
###
#
# Copyright (c) 2010 J. Félix Ontañón
#
# usb_class_names adapted from gnome-device-manager
# Copyright (C) 2007 David Zeuthen
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 3 as
# published by the Free Software Foundation
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Authors : J. Félix Ontañón <fontanon@emergya.es>
#
import subprocess
import re
from udevdiscover.device import Device
from udevdiscover.utils import memoized
UNKNOWN_NAME = 'Unknown USB Device'
USB_DB_CMD = '/lib/udev/usb-db'
vendor_regex = re.compile('(?<=ID_VENDOR_FROM_DATABASE=).*')
model_regex = re.compile('(?<=ID_MODEL_FROM_DATABASE=).*')
usb_class_names = {
(0x01, -1, -1): (_('Audio'), _('Audio')),
(0x01, 0x01, -1): (_('Audio Control'), _('Audio Control')),
(0x01, 0x02, -1): (_('Audio Streaming'), _('Audio Streaming')),
(0x01, 0x03, -1): (_('Audio MIDI Streaming'), _('Audio MIDI Streaming')),
(0x02, -1, -1): (_('Communications'), _('Communications')),
(0x02, 0x01, -1): (_('Direct Line'), _('Direct Line Communications')),
(0x02, 0x02, -1): (_('Modem'), _('Modem Communications')),
(0x02, 0x02, 0x01): (_('Modem (AT v.25ter)'), _('Modem (AT v.25ter) Communications')),
(0x02, 0x02, 0x02): (_('Modem (PCCA101)'), _('Modem (PCCA101) Communications')),
(0x02, 0x02, 0x03): (_('Modem (PCCA101)'), _('Modem (PCCA101 + wakeup) Communications')),
(0x02, 0x02, 0x04): (_('Modem (GSM)'), _('Modem (GSM) Communications')),
(0x02, 0x02, 0x05): (_('Modem (3G)'), _('Modem (3G) Communications')),
(0x02, 0x02, 0x06): (_('Modem (CDMA)'), _('Modem (CDMA) Communications')),
(0x02, 0x02, 0xfe): (_('Modem'), _('Modem (Defined by command set descriptor) Communications')),
(0x02, 0x02, 0xff): (_('Modem (Vendor Specific)'), _('Modem (Vendor Specific) Communications')),
(0x02, 0x03, -1): (_('Telephone'), _('Telephone Communications')),
(0x02, 0x04, -1): (_('Multi-Channel'), _('Multi-Channel Communications')),
(0x02, 0x05, -1): (_('CAPI Control'), _('CAPI Control')),
(0x02, 0x06, -1): (_('Ethernet Networking'), _('Ethernet Networking')),
(0x02, 0x07, -1): (_('ATM Networking'), _('ATM Networking')),
(0x02, 0x08, -1): (_('Wireless Handset Control'), _('Wireless Handset Control')),
(0x02, 0x09, -1): (_('Device Management'), _('Device Management')),
(0x02, 0x0a, -1): (_('Mobile Direct Line'), _('Mobile Direct Line')),
(0x02, 0x0b, -1): (_('OBEX'), _('OBEX')),
(0x02, 0x0c, -1): (_('Ethernet Emulation'), _('Ethernet Emulation')),
(0x02, 0x0c, 0x07): (_('Ethernet Emulation'), _('Ethernet Emulation (EEM)')),
(0x03, -1, -1): (_('HID Device'), _('HID Device')),
(0x03, -1, 0x00): (_('HID Device'), _('HID Device')),
(0x03, -1, 0x01): (_('Keyboard HID Device'), _('Keyboard HID Device')),
(0x03, -1, 0x02): (_('Mouse HID Device'), _('Mouse HID Device ')),
(0x03, 0x01, 0x00): (_('HID Device'), _('HID Device Interface (Boot)')),
(0x03, 0x01, 0x01): (_('Keyboard HID Device'), _('Keyboard HID Device Interface (Boot)')),
(0x03, 0x01, 0x02): (_('Mouse HID Device'), _('Mouse HID Device Interface (Boot)')),
(0x06, -1, -1): (_('Imaging Device'), _('Imaging Device')),
(0x06, 0x01, -1): (_('Still Image Capture'), _('Still Image Capture')),
(0x06, 0x01, 0x01): (_('PTP Imaging Device'), _('PTP Imaging Device')),
(0x07, -1, -1): (_('Printer'), _('Printing')),
(0x07, 0x01, 0x01): (_('Printer'), _('Printing Interface (Unidirectional)')),
(0x07, 0x01, 0x01): (_('Printer'), _('Printing Interface (Bidirectional)')),
(0x07, 0x01, 0x01): (_('Printer'), _('Printing Interface (IEEE 1284.4 Compatible Bidirectional)')),
(0x07, 0x01, 0xff): (_('Printer'), _('Printing Interface (Vendor Specific)')),
(0x08, -1, -1): (_('USB Mass Storage'), _('USB Mass Storage')),
(0x08, 0x01, -1): (_('USB Mass Storage'), _('USB Mass Storage (Flash)')),
(0x08, 0x02, -1): (_('USB Mass Storage'), _('USB Mass Storage (SFF-8020i, MMC-2 (ATAPI))')),
(0x08, 0x03, -1): (_('USB Mass Storage'), _('USB Mass Storage (QIC-157)')),
(0x08, 0x04, -1): (_('USB Mass Storage'), _('USB Mass Storage (Floppy (UFI))')),
(0x08, 0x05, -1): (_('USB Mass Storage'), _('USB Mass Storage (SFF-8070i)')),
(0x08, 0x06, -1): (_('USB Mass Storage'), _('USB Mass Storage (SCSI)')),
(0x09, -1, -1): (_('Hub'), _('Hub')),
(0x09, 0x00, 0x00): (_('Hub'), _('Hub')),
(0x09, 0x00, 0x01): (_('Hub'), _('Hub Interface (Single TT)')),
(0x09, 0x00, 0x02): (_('Hub'), _('Hub Interface (TT per port)')),
(0x0a, -1, -1): (_('CDC Data'), _('CDC Data')),
(0x0a, -1, 0x31): (_('HDLC Data'), _('HDLC Data')),
(0x0a, -1, 0x32): (_('Transparent Data'), _('Transparent Data')),
(0x0a, -1, 0x50): (_('Q.921M Data'), _('Q.921M Data')),
(0x0a, -1, 0x51): (_('Q.921 Data'), _('Q.921 Data')),
(0x0a, -1, 0x52): (_('Q.921TM Data'), _('Q.921TM Data')),
(0x0a, -1, 0x90): (_('V.42bis Data'), _('V.42bis Data')),
(0x0a, -1, 0x91): (_('Q.932 EuroISDN Data'), _('Q.932 EuroISDN Data')),
(0x0a, -1, 0x92): (_('V.120 V.24 rate ISDN Data'), _('V.120 V.24 rate ISDN Data')),
(0x0a, -1, 0x93): (_('CAPI 2.0 Data'), _('CAPI 2.0 Data')),
(0x0a, -1, 0xfd): (_('Host Based Data Driver'), _('Host Based Driver Data')),
(0x0a, -1, 0xfe): (_('CDC PUF Data'), _('CDC PUF Data')),
(0x0a, -1, 0xff): (_('Vendor Specific Data'), _('Vendor Specific Data')),
(0x0b, -1, -1): (_('Chip / Smart Card'), _('Chip / Smart Card')),
(0x0d, -1, -1): (_('Content Security'), _('Content Security')),
(0x0e, -1, -1): (_('Video'), _('Video')),
(0x0e, 0x01, -1): (_('Video Control'), _('Video Control')),
(0x0e, 0x02, -1): (_('Video Streaming'), _('Video Streaming')),
(0x0e, 0x03, -1): (_('Video Interface Collection'), _('Video Interface Collection')),
(0xdc, -1, -1): (_('Diagnostics'), _('Diagnostics')),
(0xe0, -1, -1): (_('Wireless Adapter'), _('Wireless Adapter')),
(0xe0, 0x01, -1): (_('Wireless Radio'), _('Wireless Radio')),
(0xe0, 0x01, 0x01): (_('Bluetooth Adapter'), _('Bluetooth Adapter')),
(0xe0, 0x01, 0x02): (_('Ultra Wideband Radio Control'), _('Ultra Wideband Radio Control')),
(0xe0, 0x01, 0x03): (_('RNDIS'), _('RNDIS')),
(0xe0, 0x02, -1): (_('Wireless USB Wire Adapter'), _('Wireless USB Wire Adapter')),
(0xe0, 0x02, 0x01): (_('Wireless USB Wire Adapter'), _('Host Wire Adapter Control/Data Streaming')),
(0xe0, 0x02, 0x02): (_('Wireless USB Wire Adapter'), _('Device Wire Adapter Control/Data Streaming')),
(0xe0, 0x02, 0x03): (_('Wireless USB Wire Adapter'), _('Device Wire Adapter Isochronous Streaming')),
(0xef, -1, -1): (_('Miscellanous'), _('Miscellanous')),
(0xef, 0x01, 0x01): (_('MS ActiveSync'), _('MS ActiveSync')),
(0xef, 0x01, 0x02): (_('Palm Sync'), _('Palm Sync')),
(0xef, 0x02, -1): (_('Miscellanous Common'), _('Miscellanous Common')),
(0xef, 0x02, 0x01): (_('Interface Association'), _('Interface Association')),
(0xef, 0x02, 0x02): (_('Wire Adapter Multifunction'), _('Wire Adapter Multifunction Peripheral')),
(0xef, 0x03, 0x01): (_('Cable Based Association'), _('Cable Based Association')),
(0xfe, -1, -1): (_('Application Specific'), _('Application Specific')),
(0xfe, 0x01, -1): (_('Device Firmware Update'), _('Device Firmware Update')),
(0xfe, 0x02, -1): (_('IRDA Bridge'), _('IRDA Bridge')),
(0xfe, 0x03, -1): (_('Test and Measurement'), _('Test and Measurement')),
(0xfe, 0x03, 0x01): (_('TMC Test and Measurement'), _('TMC Test and Measurement')),
(0xfe, 0x03, 0x02): (_('USB488 Test and Measurement'), _('USB488 Test and Measurement')),
}
def get_device_object(device):
devtype = device.get_devtype()
if devtype == 'usb_interface':
return USBInterface(device)
else:
return USBDevice(device)
@memoized
def get_usb_short_long_names(usb_class, usb_subclass, usb_protocol):
key = [usb_class]
klasses = [k for k in usb_class_names.keys() if k[0] == usb_class]
if not klasses:
return None, None
subklasses = [s for s in klasses if s[1] == usb_subclass]
if not subklasses:
key.append(-1)
else:
key.append(usb_subclass)
if not (key[0], key[1], usb_protocol) in klasses:
key.append(-1)
else:
key.append(usb_protocol)
if usb_class_names.has_key(tuple(key)):
return usb_class_names[tuple(key)]
else:
return usb_class_names[(usb_class, -1, -1)]
@memoized
def get_usb_vendor_model_names(sysfs_path):
vendor_name, model_name = None, None
process = subprocess.Popen([USB_DB_CMD, sysfs_path], stdout=subprocess.PIPE)
if process.wait() == 0:
output = process.communicate()[0]
vendor_res = vendor_regex.search(output)
model_res = model_regex.search(output)
if vendor_res: vendor_name = vendor_res.group(0)
if model_res: model_name = model_res.group(0)
return vendor_name, model_name
class USBDevice(Device):
DEFAULT_ICON = 'udev-discover-device-usb'
@property
def nice_label(self):
short_name = None
prop_type = self.device.get_property('TYPE')
if prop_type:
usb_type = map(int, prop_type.split('/'))
short_name, long_name = get_usb_short_long_names(usb_type[0],
usb_type[1], usb_type[2])
if not short_name:
return 'USB Device'
return short_name
@property
def icon(self):
if self.device.has_property('ID_MEDIA_PLAYER'):
return 'multimedia-player'
else:
return self.DEFAULT_ICON
@property
def vendor_name(self):
return self.device.get_property('ID_VENDOR') or \
get_usb_vendor_model_names(self.path.split('/sys')[1])[0]
@property
def model_name(self):
return self.device.get_property('ID_MODEL') or \
get_usb_vendor_model_names(self.path.split('/sys')[1])[1]
class USBInterface(Device):
DEFAULT_ICON = 'udev-discover-device-usb'
@property
def nice_label(self):
usb_type = map(int, self.device.get_property('INTERFACE').split('/'))
short_name, long_name = get_usb_short_long_names(usb_type[0],
usb_type[1], usb_type[2])
if not short_name:
return 'USB Interface'
return "%s Interface" % short_name
|