3 g3 @sy(ddlZejddddlmZdZWn,eefk rTddlZddlZdZYnXddl Z ddl Z ddl m Z m Z dd Zd d Zd Zd ZdZdZdZdZdZdZd ZdZdZdZdZdZd ZdZdZ dZ!dZ"d Z#dZ$dZ%dZ&dZ'd Z(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2d Z3dZ4dZ5dZ6dZ7dZ8d Z9dZ:dZ;dZdZ?d Z@dZAdZBdZCdZDdZEddZFd d!ZGd"d#ZHd$d%ZId&d'ZJdS)(NGUdevz1.0)rTF)PCIUSBc Csrtrtj}n tjdg}|jd|jd|jd|jd|jd}g}x|D]}|j}||jt|dt|t |d}|d d krd |d <|d d krd |d <|dkr|j dr|j d|d<|j |d<|j dkrqX|j drqX|j ddkr qX|j ddkrqXn|dkrv|j d}|rN|jd\|d<|d<|j d}|r|jd\|d<|d<n>|dkr|j dr|j d|d<|j dr|j d|d<|j dr`|j ddkr`|j ds|j d r`|j dr |j d}tjd!|} n|j d }tjd"|} | r`| jd#|d<| jd$|d<| jd%|d<| jd&|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' pciusbblockZccwscsi0)busdriverZpciTypeZdetachedclassZdescr NOTHERr unknownZID_BUSr device partitionZDM_NAMEZMAJOR17PCI_ID:Zprop1Zprop2Z PCI_SUBSYS_IDZprop3Zprop4 ID_VENDOR_ID ID_MODEL_IDZID_PATHZDEVPATHz.*scsi-(\d+):(\d+):(\d+):(\d+)z!.*/(\d+):(\d+):(\d+):(\d+)/block/)gi_gudevrZClientgudevZquery_by_subsystem get_subsystem get_driver_clasify_pci_type_clasify_class_get_device_desc has_property get_propertyZget_name get_devtypesplitresearchgroupappend) ZclientZdevicesresultr subsystemZ result_item pci_classZ pci_subsyspathmr0$/usr/lib/python3.6/hardware_gudev.py get_devicessn   2                  r2cCs$tj}|d|d|dd}|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' rrr)zsystem.kernel.namezsystem.kernel.versionzsystem.kernel.machine)osuname)r4r+r0r0r1get_computer_infons  r5rZ00Z01Z02Z03Z04Z802346Z05Z06Z07Z08r9CcCs|dkr dSdSdS)z) return 1 if device is PCI, otherwise -1 rrz-1Nr0)r,r0r0r1r sr cCs>t|jd\}}|j}|tkr&dS|tkrF|tkr:dS|tkrFdS|jd}|rt|j}d|krhdSd|krtdS|rZ|tkrdS|t kr|t krd S|t krd Sn|t kr|t krd S|tkrd S|tkrd S|tkrdSnx|tko|tkrdS|tkr|tkrdS|tkr8|tkr(dS|tkrZdSn"|tkrZ|tksV|tkrZdS|dkr|jds|jdr|jddkrdSdSn|dkrdS|dkr|jdkrt|}|dks|dkrdS|dkrd S|d!krdSdStjd"|j}|rd#S|dkr"d S|d$ks6|d%kr:dSd&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_CLASSrZKEYBOARDZMOUSEZ ID_SERIALZkeyboardZmouseZVIDEOrZFIREWIREZIDEZSCSIZRAIDZFLOPPYZMODEMZSCANNERZCAPTUREZAUDIOZSOCKETrZID_CDROMZID_TYPEZcdZCDROMZHDZsoundr Z scsi_devicerrZTAPEz .*/lp\d+$ZPRINTERrrN) _parse_pci_classr$rPCI_BASE_CLASS_NETWORKPCI_BASE_CLASS_INPUTPCI_CLASS_INPUT_KEYBOARDPCI_CLASS_INPUT_MOUSElowerPCI_BASE_CLASS_DISPLAYPCI_BASE_CLASS_SERIALPCI_CLASS_SERIAL_USBPCI_CLASS_SERIAL_FIREWIREPCI_BASE_CLASS_STORAGEPCI_CLASS_STORAGE_IDEPCI_CLASS_STORAGE_SCSIPCI_CLASS_STORAGE_RAIDPCI_CLASS_STORAGE_FLOPPYPCI_BASE_CLASS_COMMUNICATIONPCI_CLASS_COMMUNICATION_MODEMPCI_CLASS_INPUT_SCANNERPCI_BASE_CLASS_MULTIMEDIAPCI_CLASS_MULTIMEDIA_VIDEOPCI_CLASS_MULTIMEDIA_AUDIOPCI_BASE_CLASS_BRIDGEPCI_CLASS_BRIDGE_PCMCIAPCI_CLASS_BRIDGE_CARDBUSr#r%_get_scsi_dev_typer'r(get_sysfs_path)rZ base_classZ sub_classr,Z id_serialZdev_typer/r0r0r1r!s             r!c CsV|j}d}d}|dkrN|jdjd\}}t}d|j||j||f}n|dkr0|jd}t}|rd|j||j||jdf}n|jd kr|jd krd }n|jd krd }nd}nj|jdko|jdrD|jdjddd\}}dt |d}dt |d}d|j||j||f}n|dkrD|jd}|rN|SdSdS)z. Return human readable description of device. Nrrrz%s|%srrrZ usb_interfaceZusbhidzUSB HID InterfaceZhubzUSB Hub Interfacez USB InterfaceZ usb_deviceZPRODUCT/rz%.4xrZID_MODELr) rr$r&rZ get_vendorZ get_devicerr%rint) rr,Zcommandr+Z vendor_idZ device_idrrZmodel_idr0r0r1r"%s8  "     r"cCs(|dkr dS|dd|dd fSdS) 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 Nrr)NNir\r0)r-r0r0r1r>Gsr>c Cs@ytd|jd}Wntk r*dSX|j}|j|S)zQ Return SCSI type of device in raw format as presented in /sys/...devpath../type z%s/typerr)openrWIOErrorreadlineclose)rfr+r0r0r1rVSsrV)KZgiZrequire_versionZ gi.repositoryrr ImportError ValueErrorrZglibr3r'Zhwdatarrr2r5rHrJrIrLZPCI_CLASS_STORAGE_IPIrKZPCI_CLASS_STORAGE_OTHERr?ZPCI_CLASS_NETWORK_ETHERNETZPCI_CLASS_NETWORK_TOKEN_RINGZPCI_CLASS_NETWORK_FDDIZPCI_CLASS_NETWORK_ATMZPCI_CLASS_NETWORK_OTHERrDZPCI_CLASS_DISPLAY_VGAZPCI_CLASS_DISPLAY_XGAZPCI_CLASS_DISPLAY_3DZPCI_CLASS_DISPLAY_OTHERrPrQrRZPCI_CLASS_MULTIMEDIA_PHONEZPCI_CLASS_MULTIMEDIA_OTHERrSZPCI_CLASS_BRIDGE_HOSTZPCI_CLASS_BRIDGE_ISAZPCI_CLASS_BRIDGE_EISAZPCI_CLASS_BRIDGE_MCZPCI_CLASS_BRIDGE_PCIrTZPCI_CLASS_BRIDGE_NUBUSrUZPCI_CLASS_BRIDGE_RACEWAYZPCI_CLASS_BRIDGE_OTHERrMZPCI_CLASS_COMMUNICATION_SERIALZ PCI_CLASS_COMMUNICATION_PARALLELZ#PCI_CLASS_COMMUNICATION_MULTISERIALrNZPCI_CLASS_COMMUNICATION_OTHERr@rAZPCI_CLASS_INPUT_PENrBrOZPCI_CLASS_INPUT_GAMEPORTZPCI_CLASS_INPUT_OTHERrErGZPCI_CLASS_SERIAL_ACCESSZPCI_CLASS_SERIAL_SSArFZPCI_CLASS_SERIAL_FIBERZPCI_CLASS_SERIAL_SMBUSr r!r"r>rVr0r0r0r1s   P`"