
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
UZ3                 @   s  y(d dl Z e jdd d dlmZ dZW n( ek
rP   d dlZd dlZdZY nX d dlZd dl	Z	d dl
mZmZ dd	 Zd
d ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>dZ?dZ@dZAdZBdZCdZDdd ZEd d! ZFd"d# ZGd$d% ZHd&d' ZIdS )(    NGUdevz1.0)r   TF)PCIUSBc        
      C   sr  t rtj } ntjdg} | jd| jd | jd | jd | jd }g }x|D ]}|j }||j t|dt|t	|d}|d	 d
krd|d	< |d d
krd|d< |dkr|j
dr|jd|d< |j |d< |j dkrqX|jdrqX|jddkr
qX|jddkrqXn|dkrv|jd}|rN|jd\|d< |d< |jd}|r|jd\|d< |d< n>|dkr|j
dr|jd|d< |j
dr|jd|d< |j
dr`|jddkr`|j
ds|j
d r`|j
dr|jd}tjd!|}	n|jd }tjd"|}	|	r`|	jd#|d< |	jd$|d< |	jd%|d< |	jd&|d< |j| qXW |S )'aE   Returns list of dictionaries with keys for every device in system
        (values are provide as example):
        'bus' : 'pci'
        'driver' : 'pcieport-driver'
        'pciType' : '1'
        'detached' : '0'
        'class' : 'OTHER'
        'desc' : 'Intel Corporation|5000 Series Chipset PCI Express x4 Port 2'
     pciusbblockZccwscsi0)busdriverZpciTypeZdetachedclassZdescr   NOTHERr   unknownZID_BUSr   device	partitionZDM_NAMEZMAJOR17PCI_ID:Zprop1Zprop2ZPCI_SUBSYS_IDZprop3Zprop4ID_VENDOR_IDID_MODEL_IDZID_PATHZDEVPATHz.*scsi-(\d+):(\d+):(\d+):(\d+)z!.*/(\d+):(\d+):(\d+):(\d+)/block/            )gi_gudevr   ZClientgudevZquery_by_subsystemget_subsystem
get_driver_clasify_pci_type_clasify_class_get_device_deschas_propertyget_propertyZget_nameget_devtypesplitresearchgroupappend)
ZclientZdevicesresultr   	subsystemZresult_item	pci_classZ
pci_subsyspathm r0   $/usr/lib/python3.6/hardware_gudev.pyget_devices   sn    
2








r2   c              C   s$   t j } | d | d | d d}|S )z Return dictionaries with keys (values are provided as example):
        'system.formfactor': 'unknown'
        'system.kernel.version': '2.6.18-128.1.6.el5xen'
            'system.kernel.machine': 'i686'
        'system.kernel.name': 'Linux'
    r   r   r   )zsystem.kernel.namezsystem.kernel.versionzsystem.kernel.machine)osuname)r4   r+   r0   r0   r1   get_computer_infon   s
    r5   r   Z00Z01Z02Z03Z04Z802346Z05Z06Z07Z08r   9Cc             C   s   | dkrdS dS dS )z) return 1 if device is PCI, otherwise -1 r   r   z-1Nr0   )r,   r0   r0   r1   r       s    r    c             C   s>  t | jd\}}| j }|tkr&dS |tkrF|tkr:dS |tkrFdS | jd}|rt|j }d|krhdS d|krtdS |rZ|tkrdS |t	kr|t
krd	S |tkrd
S n|tkr|tkrdS |tkrdS |tkrdS |tkrdS nx|tko|tk rdS |tkr|tkrdS |tkr8|tkr(dS |tkrZdS n"|tkrZ|tksV|tkrZdS |dkr| jds| jdr| jddkrdS dS n|dkrdS |dkr| jdkrt| }|dks|dkrdS |dkrd S |d!krdS dS tjd"| j }|rd#S |dkr"dS |d$ks6|d%kr:dS d&S )'a   Clasify type of device. Returned value is one of following string:
        NETWORK, KEYBOARD, MOUSE, VIDEO, USB, IDE, SCSI, RAID, MODEM, SCANNER
        CAPTURE, AUDIO, FIREWIRE, SOCKET, CDROM, HD, FLOPPY, TAPE, PRINTER, OTHER
        or None if it is neither PCI nor USB device.
    Z	PCI_CLASSr   ZKEYBOARDZMOUSEZ	ID_SERIALZkeyboardZmouseZVIDEOr   ZFIREWIREZIDEZSCSIZRAIDZFLOPPYZMODEMZSCANNERZCAPTUREZAUDIOZSOCKETr   ZID_CDROMZID_TYPEZcdZCDROMZHDZsoundr	   Zscsi_devicer      r   ZTAPE   z	.*/lp\d+$ZPRINTERr   r   N) _parse_pci_classr$   r   PCI_BASE_CLASS_NETWORKPCI_BASE_CLASS_INPUTPCI_CLASS_INPUT_KEYBOARDPCI_CLASS_INPUT_MOUSElowerPCI_BASE_CLASS_DISPLAYPCI_BASE_CLASS_SERIALPCI_CLASS_SERIAL_USBPCI_CLASS_SERIAL_FIREWIREPCI_BASE_CLASS_STORAGEPCI_CLASS_STORAGE_IDEPCI_CLASS_STORAGE_SCSIPCI_CLASS_STORAGE_RAIDPCI_CLASS_STORAGE_FLOPPYPCI_BASE_CLASS_COMMUNICATIONPCI_CLASS_COMMUNICATION_MODEMPCI_CLASS_INPUT_SCANNERPCI_BASE_CLASS_MULTIMEDIAPCI_CLASS_MULTIMEDIA_VIDEOPCI_CLASS_MULTIMEDIA_AUDIOPCI_BASE_CLASS_BRIDGEPCI_CLASS_BRIDGE_PCMCIAPCI_CLASS_BRIDGE_CARDBUSr#   r%   _get_scsi_dev_typer'   r(   get_sysfs_path)r   Z
base_classZ	sub_classr,   Z	id_serialZdev_typer/   r0   r0   r1   r!      s    










r!   c       	      C   sV  | j  }d}d}|dkrN| jdjd\}}t }d|j||j||f }n|dkr0| jd}t }|rd|j||j|| jdf }n| j d	kr| j d
krd}n| j dkrd}nd}nj| j dko| jdrD| jdjddd \}}dt	|d }dt	|d }d|j||j||f }n|dkrD| jd}|rN|S dS dS )z. Return human readable description of device. Nr   r   r   z%s|%sr   r   r   Zusb_interfaceZusbhidzUSB HID InterfaceZhubzUSB Hub InterfacezUSB InterfaceZ
usb_deviceZPRODUCT/r   z%.4x   r   ZID_MODELr   )
r   r$   r&   r   Z
get_vendorZ
get_devicer   r%   r   int)	r   r,   Zcommandr+   Z	vendor_idZ	device_idr   r   Zmodel_idr0   r0   r1   r"   %  s8    

"

r"   c             C   s(   | dkrdS | dd | dd	 fS dS )
a=   Parse Class Code. Return touple of
        [base class code, sub-class code]
        You are usually interested to only first two.
        The third - "specific register-level programming interface" is ignored.
        For details, see the PCI Local Bus Specification 2.1/2.2 Section 6.2.1 Device Identification
    N   r   r   )NNir\   r0   )r-   r0   r0   r1   r>   G  s    r>   c             C   s@   yt d| j  d}W n tk
r*   dS X |j }|j  |S )zQ Return SCSI type of device in raw format as presented in /sys/...devpath../type z%s/typerr   )openrW   IOErrorreadlineclose)r   fr+   r0   r0   r1   rV   S  s    rV   )JZgiZrequire_versionZgi.repositoryr   r   ImportErrorr   Zglibr3   r'   Zhwdatar   r   r2   r5   rH   rJ   rI   rL   ZPCI_CLASS_STORAGE_IPIrK   ZPCI_CLASS_STORAGE_OTHERr?   ZPCI_CLASS_NETWORK_ETHERNETZPCI_CLASS_NETWORK_TOKEN_RINGZPCI_CLASS_NETWORK_FDDIZPCI_CLASS_NETWORK_ATMZPCI_CLASS_NETWORK_OTHERrD   ZPCI_CLASS_DISPLAY_VGAZPCI_CLASS_DISPLAY_XGAZPCI_CLASS_DISPLAY_3DZPCI_CLASS_DISPLAY_OTHERrP   rQ   rR   ZPCI_CLASS_MULTIMEDIA_PHONEZPCI_CLASS_MULTIMEDIA_OTHERrS   ZPCI_CLASS_BRIDGE_HOSTZPCI_CLASS_BRIDGE_ISAZPCI_CLASS_BRIDGE_EISAZPCI_CLASS_BRIDGE_MCZPCI_CLASS_BRIDGE_PCIrT   ZPCI_CLASS_BRIDGE_NUBUSrU   ZPCI_CLASS_BRIDGE_RACEWAYZPCI_CLASS_BRIDGE_OTHERrM   ZPCI_CLASS_COMMUNICATION_SERIALZ PCI_CLASS_COMMUNICATION_PARALLELZ#PCI_CLASS_COMMUNICATION_MULTISERIALrN   ZPCI_CLASS_COMMUNICATION_OTHERr@   rA   ZPCI_CLASS_INPUT_PENrB   rO   ZPCI_CLASS_INPUT_GAMEPORTZPCI_CLASS_INPUT_OTHERrE   rG   ZPCI_CLASS_SERIAL_ACCESSZPCI_CLASS_SERIAL_SSArF   ZPCI_CLASS_SERIAL_FIBERZPCI_CLASS_SERIAL_SMBUSr    r!   r"   r>   rV   r0   r0   r0   r1   <module>   s   
P`"