3 g3@sDddlZddlZddlZddlmZmZddZddZdZdZ d Z d Z d Z d Z d ZdZdZd Zd Zd Zd ZdZdZd Zd Zd ZdZdZd Zd Zd ZdZdZ d Z!d Z"d Z#d Z$dZ%dZ&dZ'dZ(d Z)dZ*dZ+d Z,d Z-d Z.d Z/dZ0dZ1d Z2d Z3d Z4d Z5d Z6dZ7dZ8d Z9d Z:d Z;d ZddZ?ddZ@dd ZAd!d"ZBd#d$ZCdS)%N)PCIUSBc CsFtj}|j}g}x*|jdjdjdjdjdD]}|j}||jt|dt|t|d}|dd krzd |d<|d d krd |d <|dkrt |d rt |d |d<|j |d<|j dkrq:t |drq:t |ddkrq:t |ddkrq:n|dkrJt |d}|r"|j d\|d<|d<t |d}|r|j d\|d<|d<n>|dkrt |drnt |d|d<t |drt |d|d<t |d r4t |d dkr4t |dst |dr4t |drt |d}t jd |} nt |d}t jd!|} | r4| jd"|d<| jd#|d<| jd$|d<| jd%|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' 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/)pyudevZContextZ list_devicesZmatch_subsystem subsystemr _clasify_pci_type_clasify_class_get_device_desc_get_device_propertyZsys_name device_typesplitresearchgroupappend) contextZdevicesresultrrZ result_item pci_classZ pci_subsyspathmr+#/usr/lib/python3.6/hardware_udev.py get_devicessj ,                 r-cCs$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)r/r'r+r+r,get_computer_infobs  r0rZ00Z01Z02Z03Z04Z802346Z05Z06Z07Z08r9CcCs|dkr dSdSdS)z) return 1 if device is PCI, otherwise -1 rrz-1Nr+)rr+r+r,rsrc Cs,y |jj|Stk r&|j|SXdS)zS return the property of the given device independent of the implementation version N)Z propertiesgetAttributeError)rZpropr+r+r,rs rcCs:tt|d\}}|j}|tkr$dS|tkrD|tkr8dS|tkrDdSt|d}|rr|j}d|krfdSd|krrdS|rX|tkrdS|t kr|t krd S|t krd Sn|t kr|t krd S|tkrd S|tkrd S|tkrdSnx|tko|tkrdS|tkr|tkrdS|tkr6|tkr&dS|tkrXdSn"|tkrX|tksT|tkrXdS|dkrt|dst|drt|ddkrdSdSn|dkrdS|dkr|jdkrt|}|dks|dkrdS|dkrd S|d!krdSdStjd"|j}|rd#S|dkrd S|d$ks2|d%kr6dSd&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 ZKEYBOARDZMOUSEZ ID_SERIALZkeyboardZmouseZVIDEOrZFIREWIREZIDEZSCSIZRAIDZFLOPPYZMODEMZSCANNERZCAPTUREZAUDIOZSOCKETrZID_CDROMZID_TYPEZcdZCDROMZHDZsoundrZ scsi_devicerrZTAPEz .*/lp\d+$ZPRINTERrrN)_parse_pci_classrrPCI_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 _get_scsi_dev_typer"r#sys_path)rZ base_classZ sub_classrZ id_serialZdev_typer*r+r+r,rs             rc CsL|j}d}d}|dkrLt|djd\}}t}d|j||j||f}n|dkr&t|d}t}|rd|j||j|t|df}n|jd kr|jd krd }n|jd krd }nd}nh|jdkot|dr:t|djddd\}}dt |d}dt |d}d|j||j||f}n|dkr:t|d}|rD|SdSdS)z. Return human readable description of device. Nrrrz%s|%srrrZ usb_interfaceZusbhidzUSB HID InterfaceZhubzUSB Hub Interfacez USB InterfaceZ usb_deviceZPRODUCT/rz%.4xrZID_MODEL) rrr!rZ get_vendorZ get_devicerr r int) rrZcommandr'Z vendor_idZ device_idrrZmodel_idr+r+r,r s8  "     rcCs(|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)NNirZr+)r(r+r+r,r;Bsr;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)openrTIOErrorreadlineclose)rfr'r+r+r,rSNsrS)Drr.r"Zhwdatarrr-r0rErGrFrIZPCI_CLASS_STORAGE_IPIrHZPCI_CLASS_STORAGE_OTHERr<ZPCI_CLASS_NETWORK_ETHERNETZPCI_CLASS_NETWORK_TOKEN_RINGZPCI_CLASS_NETWORK_FDDIZPCI_CLASS_NETWORK_ATMZPCI_CLASS_NETWORK_OTHERrAZPCI_CLASS_DISPLAY_VGAZPCI_CLASS_DISPLAY_XGAZPCI_CLASS_DISPLAY_3DZPCI_CLASS_DISPLAY_OTHERrMrNrOZPCI_CLASS_MULTIMEDIA_PHONEZPCI_CLASS_MULTIMEDIA_OTHERrPZPCI_CLASS_BRIDGE_HOSTZPCI_CLASS_BRIDGE_ISAZPCI_CLASS_BRIDGE_EISAZPCI_CLASS_BRIDGE_MCZPCI_CLASS_BRIDGE_PCIrQZPCI_CLASS_BRIDGE_NUBUSrRZPCI_CLASS_BRIDGE_RACEWAYZPCI_CLASS_BRIDGE_OTHERrJZPCI_CLASS_COMMUNICATION_SERIALZ PCI_CLASS_COMMUNICATION_PARALLELZ#PCI_CLASS_COMMUNICATION_MULTISERIALrKZPCI_CLASS_COMMUNICATION_OTHERr=r>ZPCI_CLASS_INPUT_PENr?rLZPCI_CLASS_INPUT_GAMEPORTZPCI_CLASS_INPUT_OTHERrBrDZPCI_CLASS_SERIAL_ACCESSZPCI_CLASS_SERIAL_SSArCZPCI_CLASS_SERIAL_FIBERZPCI_CLASS_SERIAL_SMBUSrrrrr;rSr+r+r+r,sM`"