
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
UˆŠZô3  ã               @   sD  d dl Z 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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d„ Z>dd„ Z?dd„ Z@dd „ ZAd!d"„ ZBd#d$„ ZCdS )%é    N)ÚPCIÚUSBc        
      C   sF  t jƒ } | jƒ }g }�x*|jdƒjdƒjdƒjdƒjdƒD �]}|j}||jt|ƒdt|ƒt|ƒdœ}|d d	krzd
|d< |d d	krŽd|d< |dkròt	|dƒr®t	|dƒ|d< |j
|d< |jdkrÄq:t	|dƒrÐq:t	|dƒdkràq:t	|dƒdkrðq:n–|dk�rJt	|dƒ}|�r"|jdƒ\|d< |d< t	|dƒ}|�rˆ|jdƒ\|d< |d< n>|dk�rˆt	|dƒ�rnt	|dƒ|d< t	|dƒ�rˆt	|dƒ|d< t	|dƒ�r4t	|dƒdk�r4t	|dƒ�s¼t	|dƒ�r4t	|dƒ�ràt	|dƒ}tjd |ƒ}	nt	|dƒ}tjd!|ƒ}	|	�r4|	jd"ƒ|d< |	jd#ƒ|d< |	jd$ƒ|d< |	jd%ƒ|d< |j|ƒ q:W |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/é   é   é   é   )ÚpyudevZContextZlist_devicesZmatch_subsystemÚ	subsystemr
   Ú_clasify_pci_typeÚ_clasify_classÚ_get_device_descÚ_get_device_propertyZsys_nameÚdevice_typeÚsplitÚreÚsearchÚgroupÚappend)
ÚcontextZdevicesÚresultr   r   Zresult_itemÚ	pci_classZ
pci_subsysÚpathÚm© r+   ú#/usr/lib/python3.6/hardware_udev.pyÚget_devices   sj    ,









r-   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)r/   r'   r+   r+   r,   Úget_computer_infob   s
    r0   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-1Nr+   )r   r+   r+   r,   r   ²   s    r   c             C   s,   y| j j|ƒS  tk
r&   | j|ƒS X dS )zS return the property of the given device independent of the implementation version N)Z
propertiesÚgetÚAttributeError)r   Zpropr+   r+   r,   r   ¹   s    r   c             C   s:  t t| dƒƒ\}}| j}|tkr$dS |tkrD|tkr8dS |tkrDdS t| dƒ}|rr|jƒ }d|krfdS d|krrdS |�rX|tkr„dS |t	kr¦|t
kr˜d	S |tkr¤d
S n²|tkrà|tkrºdS |tkrÆdS |tkrÒdS |tkrÞdS nx|tkoî|tk� rödS |tk�r|tk�rdS |tk�r6|tk�r&dS |tk�rXdS n"|tk�rX|tk�sT|tk�rXdS |dk�r”t| dƒ�sŠt| dƒ�rŽt| dƒdk�rŽdS dS n|dk�r¢dS |dk�rø| jdk�røt| ƒ}|dk�sÔ|dk�rØdS |dk�ræd S |d!k�rôdS dS tjd"| jƒ}|�rd#S |dk�rdS |d$k�s2|d%k�r6d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    Ú_get_scsi_dev_typer"   r#   Úsys_path)r   Z
base_classZ	sub_classr   Z	id_serialZdev_typer*   r+   r+   r,   r   À   sŒ    










r   c       	      C   sL  | j }d}d}|dkrLt| dƒjdƒ\}}tƒ }d|j|ƒ|j||ƒf }nî|dk�r&t| dƒ}tƒ }|rŒd|j|ƒ|j|t| dƒƒf }n˜| jd	kr¼| jd
kr¦d}n| jdkr¶d}nd}nh| jdkoÎt| dƒ�r:t| dƒjdƒdd… \}}dt	|dƒ }dt	|dƒ }d|j|ƒ|j||ƒf }n|dk�r:t| dƒ}|�rD|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_MODELÚ )
r   r   r!   r   Z
get_vendorZ
get_devicer   r    r
   Úint)	r   r   Zcommandr'   Z	vendor_idZ	device_idr   r   Zmodel_idr+   r+   r,   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   )NNiúÿÿÿéüÿÿÿrZ   éþÿÿÿr+   )r(   r+   r+   r,   r;   B  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   éÿÿÿÿ)ÚopenrT   ÚIOErrorÚreadlineÚclose)r   Úfr'   r+   r+   r,   rS   N  s    rS   )Dr   r.   r"   Zhwdatar   r   r-   r0   rE   rG   rF   rI   ZPCI_CLASS_STORAGE_IPIrH   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_OTHERrA   ZPCI_CLASS_DISPLAY_VGAZPCI_CLASS_DISPLAY_XGAZPCI_CLASS_DISPLAY_3DZPCI_CLASS_DISPLAY_OTHERrM   rN   rO   ZPCI_CLASS_MULTIMEDIA_PHONEZPCI_CLASS_MULTIMEDIA_OTHERrP   ZPCI_CLASS_BRIDGE_HOSTZPCI_CLASS_BRIDGE_ISAZPCI_CLASS_BRIDGE_EISAZPCI_CLASS_BRIDGE_MCZPCI_CLASS_BRIDGE_PCIrQ   ZPCI_CLASS_BRIDGE_NUBUSrR   ZPCI_CLASS_BRIDGE_RACEWAYZPCI_CLASS_BRIDGE_OTHERrJ   ZPCI_CLASS_COMMUNICATION_SERIALZ PCI_CLASS_COMMUNICATION_PARALLELZ#PCI_CLASS_COMMUNICATION_MULTISERIALrK   ZPCI_CLASS_COMMUNICATION_OTHERr=   r>   ZPCI_CLASS_INPUT_PENr?   rL   ZPCI_CLASS_INPUT_GAMEPORTZPCI_CLASS_INPUT_OTHERrB   rD   ZPCI_CLASS_SERIAL_ACCESSZPCI_CLASS_SERIAL_SSArC   ZPCI_CLASS_SERIAL_FIBERZPCI_CLASS_SERIAL_SMBUSr   r   r   r   r;   rS   r+   r+   r+   r,   Ú<module>   s‚   M`"