예제 #1
0
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)
예제 #2
0
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