Mini Shell

Direktori : /lib/python3.6/site-packages/blivet/devicelibs/__pycache__/
Upload File :
Current File : //lib/python3.6/site-packages/blivet/devicelibs/__pycache__/edd.cpython-36.opt-1.pyc

3

{)ce}�@s"ddlZddlZddlZddlZddlZddlmZejd�Zejd�Z	e	j
ej�ejd�Z
ejd�Zejd�Zejd	�Zejd
�Zejd�Zejd�Zejd
�Zejd�Zejd�Zejd�Zejd�Zejd�Zejd�ZGdd�de�ZGdd�de�Zddd�Zddd�Zd dd�Z dS)!�N�)�utilZblivetZtestdataz.*/int13_dev([0-9a-fA-F]+)/*$z2^(PCIX|PCI|XPRS|HTPT)\s*(\S*)\s*channel: (\S*)\s*$z'^ATAPI\s*device: (\S*)\s*lun: (\S*)\s*$z^ATA\s*device: (\S*)\s*$z"^SCSI\s*id: (\S*)\s*lun: (\S*)\s*$z^USB\s*serial_number: (\S*)\s*$z^1394\s*eui: (\S*)\s*$z%^FIBRE\s*wwid: (\S*)\s*lun: (\S*)\s*$z^I2O\s*identity_tag: (\S*)\s*$z^RAID\s*identity_tag: (\S*)\s*$z^SATA\s*device: (\S*)\s*$z&^SATA\s*device: (\S*)\s*pmp: (\S*)\s*$z,^SAS\s*sas_address: (\S*)\s*lun: \(\S*\)\s*$z!^(\S*)\s*unknown: (\S*) (\S*)\s*$c@sbeZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dS)�EddEntryz[ This object merely collects what the /sys/firmware/edd/* entries can
        provide.
    NcCs�tj|p
ddd�|_tj||jd�|_tj|�}t|jd�dd�|_d|_	tj
|jd�|_d|_d|_
d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_|j �dS)N�)�root��)�base�version)!r�Pathr�	sysfspath�re_bios_device_number�match�int�group�bios_device_number�	sysfslink�get_sysfs_attrr
�mbr_sig�sectors�host_bus�pci_dev�channel�	interface�type�atapi_device�	atapi_lun�
ata_device�ata_pmp�scsi_id�scsi_lun�
usb_serial�ieee1394_eui64�
fibre_wwid�	fibre_lun�i2o_identity�sas_address�sas_lun�load)�selfrrr�r*�/usr/lib/python3.6/edd.py�__init__Fs6
zEddEntry.__init__cCsLd}|jdk	r|d7}|jdk	r(|d7}t|j|j|jdk	g�rH|d7}|jdk	rZ|d7}t|jdk	|jdk	g�rz|d7}|j	dk	r�|d7}|j
dk	r�|d7}t|jdk	|jdk	g�r�|d	7}|j
dk	r�|d
7}|jdk	r�|d7}t|j|jg�r�|d7}|jdk	�r|d
7}t|j|jg��r(|d7}tj|j�}||d<||d<||S)Nzh%(t)spath: %(sysfspath)s version: %(version)s %(nl)s%(t)smbr_signature: %(mbr_sig)s sectors: %(sectors)sz	 %(type)sz(%(nl)s%(t)ssysfs pci path: %(sysfslink)szK%(nl)s%(t)shost_bus: %(host_bus)s pci_dev: %(pci_dev)s channel: %(channel)sz%%(nl)s%(t)sinterface: "%(interface)s"zB%(nl)s%(t)satapi_device: %(atapi_device)s atapi_lun: %(atapi_lun)sz%%(nl)s%(t)sata_device: %(ata_device)sz, ata_pmp: %(ata_pmp)sz7%(nl)s%(t)sscsi_id: %(scsi_id)s, scsi_lun: %(scsi_lun)sz%%(nl)s%(t)susb_serial: %(usb_serial)sz'%(nl)s%(t)s1394_eui: %(ieee1394_eui64)sz8%(nl)s%(t)sfibre wwid: %(fibre_wwid)s lun: %(fibre_lun)sz)%(nl)s%(t)si2o_identity: %(i2o_identity)sz<%(nl)s%(t)ssas_address: %(sas_address)s sas_lun: %(sas_lun)s�t�nl)rr�anyrrrrrrrrrr r!r"r#r$r%r&r'�copy�__dict__)r)Zline_padZ	separator�s�dr*r*r+�_fmt�s>






z
EddEntry._fmtcCsTt||j�r(t||j�r(|j|jkStj|j�}tj|j�}|d=|d=||kS)Nr)�
isinstance�	__class__r0r1)r)�other�ldict�rdictr*r*r+�__gt__�szEddEntry.__gt__cCsTt||j�r(t||j�r(|j|jkStj|j�}tj|j�}|d=|d=||kS)Nr)r5r6r0r1)r)r7r8r9r*r*r+�__eq__�szEddEntry.__eq__cCsTt||j�r(t||j�r(|j|jkStj|j�}tj|j�}|d=|d=||kS)Nr)r5r6r0r1)r)r7r8r9r*r*r+�__lt__�szEddEntry.__lt__cCs|jdd�S)N�	�
)r4)r)r*r*r+�__str__szEddEntry.__str__cCsd|jdd�fS)Nz<EddEntry%s>� r)r4)r)r*r*r+�__repr__szEddEntry.__repr__cCst|�|S)N)�str)r)�idxr*r*r+�__getitem__szEddEntry.__getitem__cCstt|��S)N)�lenrB)r)r*r*r+�__len__szEddEntry.__len__cCs�tj|jd�}||_|�r�y�|j�d|_|jdkrdtj|�}t|j	d��|_
t|j	d��|_�nR|jdkr�tj|�}t|j	d��|_
�n*|jdkr�tj|�}t|j	d��|_t|j	d��|_�n�|jdkr�tj|�}t|j	d�d	d
�|_�n�|jdk�rtj|�}t|j	d�d	d
�|_�n�|jdk�r`tj|�}t|j	d�d	d
�|_t|j	d�d	d
�|_�nV|jd
k�r�tj|�}t|j	d�d	d
�|_�n(|jdk�r�tj|�}t|j	d�d	d
�|_n�|jdk�rtj|�}|�r�t|j	d��|_
t|j	d��|_ntj|�}t|j	d��|_
n�|jdk�r�tj|�}t j|�}|�rdt|j	d�d	d
�|_!t|j	d�d	d
�|_"n@|�r�t|j	d�d	d
�|_!t|j	d�d	d
�|_"nt#j$d|j|�nt#j$d|j|�WnFt%k
�r�}z(|j&dk�r�t#j$d|j|�n|�WYdd}~XnXtj|jd�|_'tj|jd�}|�r.t|�|_(tj|jd�}|�r�t)j|�}|�r||j	d�|_*|j	d�|_+t|j	d��|_,nt#j$d|j|�dS)Nrr�ATAPIrr�ATA�SCSI�USBr)r	�1394�FIBRE�I2O�RAID�SATA�SAS�z'edd: can not match interface for %s: %sz*'NoneType' object has no attribute 'group'Z
mbr_signaturerrz&edd: can not match host_bus for %s: %s)-rrrr�splitr�re_interface_atapirrrrr�re_interface_atar�re_interface_scsirr �re_interface_usbr!�re_interface_1394r"�re_interface_fibrer#r$�re_interface_i2or%�re_interface_raidZ
raid_array�re_interface_edd4_satar�re_interface_edd3_sata�re_interface_sas�re_interface_unknownr&r'�log�warning�AttributeError�argsrr�re_host_bus_pcirrr)r)rrZ	sas_matchZ
unknown_match�erZhbusr*r*r+r(s�

















z
EddEntry.load)N)�__name__�
__module__�__qualname__�__doc__r,r4r:r;r<r?rArDrFr(r*r*r*r+r@s
~&


rc@sJeZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)�
EddMatcherz� This object tries to match given entry to a disk device name.

        Assuming, heuristic analysis and guessing hapens here.
    NcCs||_|pd|_dS)Nr)�eddr)r)�	edd_entryrr*r*r+r,kszEddMatcher.__init__c
sTtjd�jd�}g}�fdd�}g}�x*|j�D�]}tjd�jd�}tj|�jd�}tj||d�}tjd||�dg|jd�}t|�d	kr�q0|d
d�j	j
fkr�q0|djd
�s�q0|d}	t|ddd��}
d�j	j
i}d|}tj|�}
|
jdj|dd���}|�s(|j||	|
||d��q0x$|||	|
||�D]}|j|��q:Wq0Wx�|D]~}xv|f|�D]h}|�r�tjd�j	j
�j	j�j	j
�j	j|d�n2tjd�j	j
�j	j�j	j
�j	j|d�|j|��qhW�qXWt|�dk�rtjd�j	jdd�|D��t|�dk�r.|dd�j	_|ddStjd�j	j
�j	j�j	j
�j	j�dS)Nz/sys/block/*)rc3s�tjtj|dd�d|g��jd�}ttj|d��}�jjdkrT|�jjkrhdSn|�jjdkrhdS|dd�d|fg}d	g|d
|fg}tj|�}t	j
|�}tj|d|fg�}	tj|	�jd�}	tj|d|fg�}
tj|
�jd�}
x�|	|
gD]�}x�|j�D]�}|j|j
�}
|
dk�r,�q|
jd
�dk�r�t|
jd��}�jjdk�rb|dk�sp�jj|k�r�tj|�jd�|jd�dd�Vn>t|
jd��}	�jj|	k�rtj|�jd�|jd�dd�V�qW�qWdS)Nr��ata_port)r�port_norHrzlink%dz.*zdev%d\.(\d+)(\.(\d+)){0,1}$z	dev%d.*.*zdev%d.*rQ��/)�link�path���rs)rrZ
join_pathsrrrrjrr�re�compile�globr�ondiskrrrRr)�
componentsrm�ata_port_idxrrrq�fnrn�expZ
expmatcherZpmp�devZataglobZatapathrr)r)r*r+�
match_portss>


z7EddMatcher.devname_from_ata_pci_dev.<locals>.match_portrp)rrrqzsysfs link: "%s" -> "%s"z
/sys/block��z0000:%s�ZatarQZdevicez2target\d+:0:%(device)s/\d+:0:%(device)s:0/block/.*�)rxrmryrrrqzQedd: ignoring possible extra match for ATA device %s channel %s ata %d pmp %s: %srrzNedd: using possible extra match for ATA device %s channel %s ata %d pmp %s: %srz7edd: Found too many ATA devices for EDD device 0x%x: %scSsg|]}|d�qS)rqr*)�.0�ar*r*r+�
<listcomp>�sz7EddMatcher.devname_from_ata_pci_dev.<locals>.<listcomp>rrqzFedd: Could not find ATA device for pci dev %s channel %s ata %d pmp %s)rrrrv�sysfs_readlink�testdata_log�debugrRrErjr�
startswithrrrtrur�join�appendr_r`rr�errorrr)r)�patternZretriesr}�answersrrZ
emptyslashrqrxrmryrbr{�matcherrZportZretryr*)r)r+�devname_from_ata_pci_devosr2




z#EddMatcher.devname_from_ata_pci_devc	Cs|jjdks|jjdkrdSd}|jj|jj|jjd�}tj|||jdd�}g}xB|j�D]6}tj	|j
�}x$|D]}||}|j||d��qtWq^Wt|�dkr�t
jd|jjdd	�|D��t|�d
kr�|d
d|j_|d
dSt
jd
|jj|jj|jj|jj�dS)Nza../devices/pci0000:00/0000:%(pci_dev)s/virtio*/host*/target*:0:%(dev)d/*:0:%(dev)d:%(lun)d/block/)rr|�lunz/sys/block/)r)rqrrrz:Found too many VirtIO SCSI devices for EDD device 0x%x: %scSsg|]}|d�qS)rqr*)r�r�r*r*r+r�sz?EddMatcher.devname_from_virtio_scsi_pci_dev.<locals>.<listcomp>rrqrrzRedd: Could not find VirtIO SCSI device for pci dev %s channel %s scsi id %s lun %s)rjrr rrrrrv�os�listdirrwr�rEr_r�rr�infor)	r)�tmplrbr�r��mp�
block_entries�berqr*r*r+� devname_from_virtio_scsi_pci_devs.
z+EddMatcher.devname_from_virtio_scsi_pci_devc	Cs�d}|jj|jj|jj|jjd�}tj|||jdd�}g}xB|j�D]6}t	j
|j�}x$|D]}||}|j||d��q^WqHWt
|�dkr�tjd|jjdd	�|D��t
|�d
kr�|d
d|j_|d
dStjd
|jj|jj|jj|jj�dS)Nzn../devices/pci0000:00/0000:%(pci_dev)s/host%(chan)d/target%(chan)d:0:%(dev)d/%(chan)d:0:%(dev)d:%(lun)d/block/)rZchanr|r�z/sys/block/)r)rqrrrz3Found too many SCSI devices for EDD device 0x%x: %scSsg|]}|d�qS)rqr*)r�r�r*r*r+r�:sz8EddMatcher.devname_from_scsi_pci_dev.<locals>.<listcomp>rrqrrzKedd: Could not find SCSI device for pci dev %s channel %s scsi id %s lun %s)rjrrrr rrrrvr�r�rwr�rEr_r�rrr`)	r)r�rbr�r�r�r�r�rqr*r*r+�devname_from_scsi_pci_dev$s.
z$EddMatcher.devname_from_scsi_pci_devcCs�tjd|jjf|jdd�}g}xB|j�D]6}tj|j�}x$|D]}||}|j	||d��qBWq,Wt
|�dkr�tjd|jj
dd�|D��t
|�d	kr�|d	d
|j_|d	dStjd|jj|jj�dS)
Nz,../devices/pci0000:00/0000:%s/virtio*/block/z/sys/block/)r)rqrrrz5Found too many VirtIO devices for EDD device 0x%x: %scSsg|]}|d�qS)rqr*)r�r�r*r*r+r�Rsz8EddMatcher.devname_from_virt_pci_dev.<locals>.<listcomp>rrqrrz;edd: Could not find Virtio device for pci dev %s channel %s)rrrjrrrvr�r�rwr�rEr_r�rrr�r)r)r�r�r�r�r�rqr*r*r+�devname_from_virt_pci_devDs&
z$EddMatcher.devname_from_virt_pci_devcCs�|jjdkrdS|j�}|dk	r$|S|j�}|dk	r8|Sd}|jj|krntjd|jj|jj�tjd	|jj�|jjdkr�|jj	dk	r�|j
�}n|jjdkr�|j�}|jjr�t
jd
|jd�|jjd}tj|j�}tjd||�|S)NrGrJrKrMrNrLrPz.edd: interface type %s is not implemented (%s)zedd: interface details: %srHrOrIz/sys/block/)rz/devicezsysfs link: "%s" -> "%s")rGrJrKrMrNrLrP)rHrO)rjrr�r�rr_r`rrrr�r�rrrrr��readlinkrwr�r�)r)�nameZunsupportedrrrqr*r*r+�devname_from_pci_dev]s.
zEddMatcher.devname_from_pci_devcCsLtjd|jd�}x6|j�D]*\}}||jjkrtj||d�|j_|SqWdS)z� Try to match the edd entry based on its mbr signature.

            This will obviously fail for a fresh drive/image, but in extreme
            cases can also show false positives for randomly matching data.
        z/sys/block/)r)rqN)rrr�itemsrjrr�r)r)�mbr_dictZsysblockr�rr*r*r+�match_via_mbrsigszszEddMatcher.match_via_mbrsigs)N)rerfrgrhr,r�r�r�r�r�r�r*r*r*r+rids
! ricCshi}tjd|d�}xP|j�D]D}tj|�}td|jd�fdd�}tjd||�t	||d�||<qW|S)Nz/sys/firmware/edd/int13_dev*/)rz0x%srr)r	zedd: found device 0x%x at %s)
rrrvr
rrrr_r�r)rZ
edd_data_dictZglobstrrrrZbiosdevr*r*r+�collect_edd_data�s
r�c
Cspi}�xX|D�]N}d}y�tjd|d�|j}tj|jtj�}tj|dd�tj|d�}t	j
d|�}t	j
d|�}d	jd
d�|D��}tj|�t
jd||�WnXtk
r�}	z<t
jd
||	�tjd|jt|	��|dkr�tj|�wWYdd}	~	XnXd|}
|
dk�rtjd|j�qn8x6|j�D]*\}}||
k�r$tjd|
||j�iS�q$W|
||j<qWtjd|�|S)z� Read MBR signatures from devices.

        Returns a dict mapping device names to their MBR signatures. It is not
        guaranteed this will succeed, with a new disk for instance.
    rz/dev)ri�rr�IZBBBBrcSsg|]}d|f�qS)z%02xr*)r��xr*r*r+r��sz collect_mbrs.<locals>.<listcomp>zdevice %s data[440:443] = %sz!device %s data[440:443] raised %sz+edd: could not read mbrsig from disk %s: %sNz0x%08xZ
0x00000000z1edd: MBR signature on %s is zero. new disk image?z,edd: dupicite MBR signature %s for %s and %sz!edd: collected mbr signatures: %srs)rrr�r��openrw�O_RDONLY�lseek�read�struct�unpackr��closer�r��OSErrorr_r�rBr�r�)
�devicesrr�r|�fdrr�dataZmbrsigZsdatardZ
mbrsig_strZdev_nameZmbrsig_str_oldr*r*r+�collect_mbrs�sB




r�c
Cs�t||d�}t|d�}i}x�|j�D]�\}}t||d�}|j�}tjd||�|rbtjd||�n|j|�}|r~tjd||�|r�|j	|�}	|	r�tjd|	||�iS|||<q$tj
d|�q$W|S)a Generates the 'device name' -> 'edd number' mapping.

        The EDD kernel module that exposes /sys/firmware/edd is thoroughly
        broken, the information there is incomplete and sometimes downright
        wrong. So after we mine out all useful information that the files under
        /sys/firmware/edd/int13_*/ can provide, we resort to heuristics and
        guessing. Our first attempt is, by looking at the device type int
        'interface', attempting to map pci device number, channel number etc. to
        a sysfs path, check that the path really exists, then read the device
        name (e.g 'sda') from there. Should this fail we try to match contents
        of 'mbr_signature' to a real MBR signature found on the existing block
        devices.
    )rz edd: data extracted from 0x%x:%rz%edd: matched 0x%x to %s using PCI devz%edd: matched 0x%x to %s using MBR sigz5edd: both edd entries 0x%x and 0x%x seem to map to %sz#edd: unable to match edd entry 0x%x)r�r�r�rir�r_r�r�r��getr�)
r�rr�Zedd_entries_dictZedd_dictZ
edd_numberrkr�r�Zold_edd_numberr*r*r+�get_edd_dict�s*




r�)N)N)N)!Zloggingr�rtr�r0rrZ	getLoggerr_r�ZsetLevel�DEBUGrur
rcrSrTrUrVrWrXrYrZr\r[r]r^�objectrrir�r�r�r*r*r*r+�<module>s>















&&

/