Index: gft_hwcomp.py |
diff --git a/gft_hwcomp.py b/gft_hwcomp.py |
index ff2b8e0e36b5eeb191b070fc02b65b184adcbd42..a8534d64fabc7aa25f9ff548111d97136b72a2c6 100755 |
--- a/gft_hwcomp.py |
+++ b/gft_hwcomp.py |
@@ -135,6 +135,40 @@ class HardwareComponents(object): |
return loaded |
@Memorize |
+ def is_legacy_device_record(self, record): |
+ """ Returns if a matching record looks like a legacy device. """ |
+ # Current format: [0-9a-f]{4}:[0-9a-f]{4} |
+ return True if re.match('[0-9a-f]{4}:[0-9a-f]{4}', record) else False |
+ |
+ @Memorize |
+ def _get_legacy_device_list(self): |
+ # pci: cat /proc/bus/pci/devices | cut -f 2 # 0.004s < lspci=0.012s |
+ device_list = [] |
+ pci_device_file = '/proc/bus/pci/devices' |
+ if os.path.exists(pci_device_file): |
+ with open(pci_device_file) as handle: |
+ pci_list = [data.split('\t', 2)[1] |
+ for data in handle.readlines()] |
+ device_list += ['%s:%s' % (entry[:4], entry[4:]) |
+ for entry in pci_list] |
+ else: |
+ DebugMsg('Failed to read %s. Execute lspci.' % pci_device_list) |
+ pci_list = [entry.split()[2:4] |
+ for entry in |
+ gft_common.SystemOutput('lspci -n -mm').splitlines()] |
+ device_list += ['%s:%s' % (vendor.strip('"'), product.strip('"')) |
+ for (vendor, product) in pci_list] |
+ # usb: realpath(/sys/bus/usb/devices/*:*)/../id* # 0.05s < lspci=0.078s |
+ usb_devs = glob.glob('/sys/bus/usb/devices/*:*') |
+ for dev in usb_devs: |
+ path = os.path.join(os.path.realpath(dev), '..') |
+ device_list += ['%s:%s' % |
+ (gft_common.ReadOneLine(os.path.join(path, 'idVendor')), |
+ gft_common.ReadOneLine(os.path.join(path, 'idProduct')))] |
+ DebugMsg('Legacy device list: ' + ', '.join(device_list)) |
+ return device_list |
+ |
+ @Memorize |
def _get_all_connection_info(self): |
""" Probes available connectivity and device information """ |
connection_info = { |
@@ -649,12 +683,24 @@ class HardwareComponents(object): |
if '*' in approved_values: |
return |
- for value in exact_values: |
- if value not in approved_values: |
- if cid in self._failures: |
- self._failures[cid].append(value) |
- else: |
- self._failures[cid] = [value] |
+ unmatched = [value for value in exact_values |
+ if value not in approved_values] |
+ if not unmatched: |
+ return |
+ |
+ # there's some error, let's try to match them in legacy list |
+ legacy_approved = filter(self.is_legacy_device_record, approved_values) |
+ if set(legacy_approved) == set(approved_values): |
+ DebugMsg('Start legacy search for cid: ' + cid) |
+ # safe for legacy match |
+ legacy_list = self._get_legacy_device_list() |
+ matched = list(set(legacy_list).intersection(set(approved_values))) |
+ if matched: |
+ DebugMsg('Changed detected list: %s->%s' % (self._system[cid], matched)) |
+ self._system[cid] = matched |
+ return |
+ # update with remaining error. |
+ self._failures[cid] = unmatched |
@Memorize |
def verify_probable_component(self, cid, approved_values): |