def ddu_package_lookup(ddu_dev_instance, repo_list): """ Lookup a package containing a device driver for a device. Dependency: ${ddu directory}/scripts/probe.sh ${ddu directory}/scripts/comp_lookup.sh /usr/bin/pkg """ repo_search_all = False if len(repo_list) == 0: repo_search_all = True ddu_tmp_dir = os.environ.get('DDU_TMP_DIR') if ddu_tmp_dir is None: raise ddu_errors.DDuDevDataNotValid("DDU_TMP_DIR is not specified.") status, output = subprocess.getstatusoutput('%s/scripts/probe.sh init' % ABSPATH) if status != 0: print(output, file=sys.stderr) raise ddu_errors.DevScanNotStart() try: device_descriptor = ddu_dev_instance.get_description() device_compatible = ddu_dev_instance.get_compatible_name_string() device_binding = ddu_dev_instance.get_binding_name_string() except AttributeError: raise ddu_errors.DDuDevDataNotValid( "ddu_dev_data argument is invalid.") if repo_search_all == False: repo_names = '' for repo_index in repo_list: try: repo_names += str(repo_index.get_repo_name()) repo_names += " " except AttributeError: raise ddu_errors.RepositorylistNotValid( "repo list argument is invalid") status, output = subprocess.getstatusoutput( '%s/scripts/comp_lookup.sh \ \"%s\" \"%s\" || \ %s/scripts/comp_lookup.sh \ \"%s\" \"%s\"' % (ABSPATH, device_compatible, repo_names, ABSPATH, device_binding, repo_names)) else: status, output = subprocess.getstatusoutput( '%s/scripts/comp_lookup.sh \"%s\" || \ %s/scripts/comp_lookup.sh \"%s\"' % (ABSPATH, device_compatible, ABSPATH, device_binding)) if len(output) == 0: return ddu_package_object(pkg_type="UNK", pkg_name="", pkg_location="", inf_link="", compatible_name=device_compatible, flags_64bit="", device_descriptor=device_descriptor, third_party_from_search=False) package_type = output.split(":")[1] package_location = output.split(":")[0] if package_type in ["IPS", "SVR4", "UNK"]: if package_type == "IPS": status, driver_package = subprocess.getstatusoutput( '/usr/bin/cat %s/%s_dlink.tmp' % (ddu_tmp_dir, package_location)) status, driver_repo = subprocess.getstatusoutput( '/usr/bin/cat %s/%s_info.tmp' % (ddu_tmp_dir, package_location)) return ddu_package_object(pkg_type="PKG", pkg_name=driver_package, pkg_location=driver_repo, inf_link="", compatible_name=package_location, flags_64bit="", device_descriptor=device_descriptor, third_party_from_search=False) elif package_type == "SVR4": status, driver_package = subprocess.getstatusoutput( '/usr/bin/cat %s/%s_dlink.tmp' % (ddu_tmp_dir, package_location)) status, driver_repo = subprocess.getstatusoutput( '/usr/bin/cat %s/%s_info.tmp' % (ddu_tmp_dir, package_location)) media = os.path.basename(driver_repo) location = os.path.dirname(driver_repo) return ddu_package_object(pkg_type="SVR4", pkg_name=media, pkg_location=location, inf_link=driver_package, compatible_name=package_location, flags_64bit="", device_descriptor=device_descriptor, third_party_from_search=True) elif package_type == "UNK" and package_location != "": status, driver_package = subprocess.getstatusoutput( '/usr/bin/cat %s/%s_dlink.tmp' % (ddu_tmp_dir, package_location)) status, driver_repo = subprocess.getstatusoutput( '/usr/bin/cat %s/%s_info.tmp' % (ddu_tmp_dir, package_location)) media = os.path.basename(driver_package) location = os.path.dirname(driver_package) return ddu_package_object(pkg_type="UNK", pkg_name=media, pkg_location=location, inf_link=driver_repo, compatible_name=device_compatible, flags_64bit="", device_descriptor=device_descriptor, third_party_from_search=True) elif package_type == "UNK" and package_location == "": try: logfilepath = '%s/ddu_err.log' % (ddu_tmp_dir) logfile = open(logfilepath, 'a') logfile.write("No proper package found for %s" % str(device_descriptor)) logfile.close() except IOError: pass return ddu_package_object(pkg_type="UNK", pkg_name="", pkg_location="", inf_link="", compatible_name=device_compatible, flags_64bit="", device_descriptor=device_descriptor, third_party_from_search=False) raise ddu_errors.PackageNoFound(device_descriptor)
def ddu_devscan(return_missing_only=True, device_type="all"): """ Do a device scan. Returns either devices missing their driver, or all devices Dependency: ${ddu directory}/scripts/probe.sh ${ddu directory}/scripts/det_info.sh """ status, output = subprocess.getstatusoutput("%s/scripts/probe.sh init" % ABSPATH) if status != 0: print(output, file=sys.stderr) raise ddu_errors.DevScanNotStart("Error initializing for scan") drv_list = [] #find all drivers list if str(device_type).find("all") >= 0: systemxml = minidom.parse('%s/data/hdd.xml' % ABSPATH) category = systemxml.getElementsByTagName('category') for catelist in category: probehook = catelist.getElementsByTagName('probe')[0] for probedata in probehook.childNodes: if probedata.nodeType == Node.TEXT_NODE: probecmd = ABSPATH + '/' + probedata.data data_type = str(probedata.data).split(' ')[1] #performing scanning script by hardware category status, output = subprocess.getstatusoutput(probecmd) if status != 0: print(output, file=sys.stderr) raise ddu_errors.DevScanNotStart() if len(output) > 0: output_lines = output.splitlines() for line in output_lines: component_disc = line.split(':') #find missing drivers list if return_missing_only == True: #only handle missing driver contrller in #missing driver list if(component_disc[DEVICE_PARENT_FIELD] == '') and \ (component_disc[DEVICE_DRIVER_NAME_FIELD] == 'unknown'): drv_list.append( ddu_dev_data( item_id=component_disc[0], parent_item_id=component_disc[1], description=component_disc[2], device_id=component_disc[3], class_code=component_disc[4], pci_path=component_disc[5], driver_name="", instance_id=component_disc[7], attach_status=component_disc[8], vendor_id=component_disc[9], device_type=str(data_type))) #find all drivers list else: if component_disc[DEVICE_PARENT_FIELD] == '': if component_disc[DEVICE_DRIVER_NAME_FIELD] \ == 'unknown': drv_list.append( ddu_dev_data( item_id=component_disc[0], parent_item_id=component_disc[1], description=component_disc[2], device_id=component_disc[3], class_code=component_disc[4], pci_path=component_disc[5], driver_name="", instance_id=component_disc[7], attach_status=component_disc[8], vendor_id=component_disc[9], device_type=str(data_type))) else: drv_list.append( ddu_dev_data( item_id=component_disc[0], parent_item_id=component_disc[1], description=component_disc[2], device_id=component_disc[3], class_code=component_disc[4], pci_path=component_disc[5], driver_name=component_disc[6], instance_id=component_disc[7], attach_status=component_disc[8], vendor_id=component_disc[9], device_type=str(data_type))) else: drv_list.append( ddu_dev_data( item_id=component_disc[0], parent_item_id=component_disc[1], description=component_disc[2], device_id="", class_code="", pci_path=component_disc[4], driver_name=component_disc[5], instance_id=component_disc[6], attach_status=component_disc[7], vendor_id="", device_type=str(data_type))) #find specific driver list else: device_scan_cndi = device_type.split(',') for device_scan_index in device_scan_cndi: status, output = subprocess.getstatusoutput( "%s/scripts/probe.sh %s" % (ABSPATH, device_scan_index)) if status != 0: print(output, file=sys.stderr) raise ddu_errors.DevScanNotStart() if len(output) > 0: output_lines = output.splitlines() for line in output_lines: component_disc = line.split(':') #find missing drivers list if return_missing_only == True: #only handle missing driver contrller in #missing driver list if(component_disc[DEVICE_PARENT_FIELD] == '') and \ (component_disc[DEVICE_DRIVER_NAME_FIELD] == \ 'unknown'): drv_list.append( ddu_dev_data( item_id=component_disc[0], parent_item_id=component_disc[1], description=component_disc[2], device_id=component_disc[3], class_code=component_disc[4], pci_path=component_disc[5], driver_name="", instance_id=component_disc[7], attach_status=component_disc[8], vendor_id=component_disc[9], device_type=str(device_scan_index))) #find all drivers list else: if component_disc[DEVICE_PARENT_FIELD] == '': if component_disc[DEVICE_DRIVER_NAME_FIELD] == \ 'unknown': drv_list.append( ddu_dev_data( item_id=component_disc[0], parent_item_id=component_disc[1], description=component_disc[2], device_id=component_disc[3], class_code=component_disc[4], pci_path=component_disc[5], driver_name="", instance_id=component_disc[7], attach_status=component_disc[8], vendor_id=component_disc[9], device_type=str(device_scan_index))) else: drv_list.append( ddu_dev_data( item_id=component_disc[0], parent_item_id=component_disc[1], description=component_disc[2], device_id=component_disc[3], class_code=component_disc[4], pci_path=component_disc[5], driver_name=component_disc[6], instance_id=component_disc[7], attach_status=component_disc[8], vendor_id=component_disc[9], device_type=str(device_scan_index))) else: drv_list.append( ddu_dev_data( item_id=component_disc[0], parent_item_id=component_disc[1], description=component_disc[2], device_id="", class_code="", pci_path=component_disc[4], driver_name=component_disc[5], instance_id=component_disc[6], attach_status=component_disc[7], vendor_id="", device_type=str(device_scan_index))) return drv_list