HEX
Server: Apache/2.4.65 (Unix) OpenSSL/3.5.5
System: Linux cpanel.ns-taberra.com 5.14.0-681.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Feb 11 20:19:22 UTC 2026 x86_64
User: asif201 (1002)
PHP: 8.3.0
Disabled: NONE
Upload Files
File: //usr/share/virt-manager/virtinst/__pycache__/diskbackend.cpython-39.pyc
a

�hA^�@sFddlZddlZddlZddlZddlZddlmZddlmZm	Z	ddl
mZdd�Zdd	�Z
d
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�ZGd+d,�d,�ZGd-d.�d.e�Z Gd/d0�d0e �Z!Gd1d2�d2e �Z"Gd3d4�d4e�Z#Gd5d6�d6e�Z$dS)7�N�)�log)�StoragePool�
StorageVolume)�xmlutilc
Cshz|�|�}|��|dfWStjyb}z,|��rF|��tjkrF�d|fWYd}~Sd}~00dS)z�
    Try to find a volume matching the full passed path. Call info() on
    it to ensure the volume wasn't removed behind libvirt's back
    N)ZstorageVolLookupByPath�info�libvirtZlibvirtErrorZget_error_codeZVIR_ERR_NO_STORAGE_VOL)�conn�path�vol�e�r
�//usr/share/virt-manager/virtinst/diskbackend.py�_lookup_vol_by_paths

rcCs&tj�|�}||��vr"|�|�SdS)z�
    Try to lookup a volume for 'path' in parent 'pool' by it's filename.
    This sometimes works in cases where full volume path lookup doesn't,
    since not all libvirt storage backends implement path lookup.
    N)�osr
�basenameZlistVolumesZstorageVolLookupByName)�poolr
�namer
r
r�_lookup_vol_by_basename)srcCsFz*t�|tj�}t�|dd�}t�|�Wnty@d}Yn0|S)Nr�)r�open�O_RDONLY�lseek�close�	Exception)r
�fd�sizer
r
r�_get_block_size4s
rcCs,tj�|�sdSt|�r t|�Stj�|�S�Nr)rr
�exists�_stat_is_blockr�getsize�r
r
r
r�	_get_size?s
r#cCs&tj�|�sdSt�t�|�tj�S�NF)rr
r�stat�S_ISBLK�ST_MODEr"r
r
rr Gsr c
Cs�t||�\}}|r||��fSt�|tj�|��}|s:dSzFtj|dd�t||�\}}|r~zt||�}Wnt	y|Yn0Wn4t	y�}zd}d}t
|�}WYd}~n
d}~00|s�|s�|r�ttd�||d���||fS)z�
    Try to lookup storage objects for the passed path.

    Returns (volume, parent pool). Only one is returned at a time.
    �NNT)ZrefreshNz$Cannot use storage %(path)s: %(err)s)r
�err)
rZstoragePoolLookupByVolumerZlookup_pool_by_pathrr
�dirnameZensure_pool_is_runningrr�str�
ValueError�_)r	r
r�ignorerZverrrr
r
r�_check_if_path_managedMs*
r/cCsF|pd}gd�}t|�rdS|D] }|�|d�s:||kr dSq dS)N�)z/devz/sysz/procF�/T)�path_is_url�
startswith)r
Z
skip_prefixes�prefixr
r
r�_can_auto_manageqsr5cCs.ddlm}||�}|jdkr*|j�d�S|S)Nr)�URIZrbdr1)Zurir6�schemer
�strip)r
r6Zuriobjr
r
r�_get_storage_search_path~s

r9cCs�|j��sdS|sdSt|�s4t||�s4tj�|�}t|�}t||�\}}|sZ|sZt	|�sd|||fStj�
|�}tj�|��dd�}|s�d}t
�||�}t�d||�t
|�}||_|j|_||_|jdddd�}t||�}|||fS)	zP
    If path is not managed, try to create a storage pool to probe the path
    )NNN� r-Zdirpoolz%Attempting to build pool=%s target=%sFT)Zbuild�createZ	autostart)ZsupportZconn_storager2�path_is_network_volrr
�abspathr9r/r5r*r�replacerZfind_free_namer�debugrZTYPE_DIR�type�target_path�installr)r	r
Z
searchpathrrr*ZpoolnameZpoolxmlr
r
r�manage_path�s.


rCcCstt�d|pd��S)z!
    Detect if path is a URL
    z[a-zA-Z]+(\+[a-zA-Z]+)?://.*r0)�bool�re�matchr"r
r
rr2�sr2cCs.|��D] }|r|j|kr|jdkSqdS)zF
    Detect if path is a network volume such as rbd, gluster, etc
    �networkF)Zfetch_all_volsrAr@)r	r
Zvolxmlr
r
rr<�sr<cCs�|r|jr|jS|r8|��}|tjkr*dS|tjkr8dS|rr|��d}|tjkrVdS|tjkrddS|tjkrrdS|r�t|�r�dS|r�t|�s�dSnt	j
�|�r�dSt|�r�dSdS)z,
    Try to get device type for volume.
    �blockrGr�file�dir)
r@Z
get_disk_typerZ
TYPE_BLOCKZTYPE_NETWORKrZ	TYPE_FILEr2r5rr
�isdirr )r
�vol_xml�
vol_objectZpool_xmlZremote�tr
r
r�
_get_dev_type�s6





rOcCsZ|durdSz6t||�\}}|}|r*WdS|��s@tj�|�WSWntyTYn0dS)z{
    Return True if the path certainly exists, False if we are unsure.
    See DeviceDisk entry point for more details
    NFT)r/�	is_remoterr
rr)r	r
rrr.r
r
r�path_definitely_exists�srQZsetfaclcCshtdd||g}tj|tjtjd�}|��\}}t�d|�|sD|rRt�d||�|jdkrdt|��dS)Nz--modifyz	user:%s:x��stdout�stderrzRan command '%s'z
out=%s
err=%sr)	�SETFACL�
subprocess�Popen�PIPE�communicaterr?�
returncoder,)r*�username�cmd�proc�outr)r
r
r�_fix_perms_acls
r_cCsRt�d|�t�|�j}|tjB}t�||�t�|�j|krNttd�|��dS)NzSetting +x on %sz!Permissions on '%s' did not stick)	rr?rr%�st_mode�S_IXOTH�chmodr,r-)r*�modeZnewmoder
r
r�_fix_perms_chmods
rdcCs�d}i}|D]�}|rfzt||�WqWn>tyd}z&t�d|�t�d�d}WYd}~n
d}~00zt|�Wqty�}zt|�||<WYd}~qd}~00q|S)NTzsetfacl failed: %sztrying chmodF)r_rrr?rdr+)�dirlistr[ZuseaclZerrdictr*rr
r
r�set_dirs_searchables 

$rfc
Cs�zt�|�}Wnty"YdS0||jkr6tj}n||jkrHtj}ntj}t|j	|@�r`dSd|g}z$t
j|t
jt
jd�}|�
�\}}Wnty�t�d�YdS0|jdkr�t�d||�dSd|}	tt�|	�d	d
�|��S)z8
    Check if passed directory is searchable by uid
    FTZgetfaclrRz Didn't find the getfacl command.rzCmd '%s' failed: %szuser:%s:..xzutf-8r>)rr%�OSError�st_uid�S_IXUSR�st_gid�S_IXGRPrarDr`rVrWrXrYrr?rZrE�search�encode)
r*�uidr[Zstatinfo�flagr\r]r^r)�patternr
r
r�_is_dir_searchable5s.



rqcCsZtj�|�r|}d}ntj�|�\}}g}|rVt|||�sD|�|�tj�|�\}}q*|S)z�
    Check each dir component of the passed path, see if they are
    searchable by the uid/username, and return a list of paths
    which aren't searchable
    �-)rr
rK�splitrq�append)r
rnr[r*�baseZfixlistr
r
r�is_path_searchableYs
rvc@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�ZdS)�_StorageBasezA
    Storage base class, defining the API used by DeviceDisk
    cCs||_d|_dS�N)�_conn�_parent_pool_xml��selfr	r
r
r�__init__xsz_StorageBase.__init__cCs
t��dSrx��NotImplementedError�r|r
r
r�get_size|sz_StorageBase.get_sizecCs
t��dSrxr~r�r
r
r�get_dev_typesz_StorageBase.get_dev_typecCs
t��dSrxr~r�r
r
r�get_driver_type�sz_StorageBase.get_driver_typecCs
t��dSrxr~r�r
r
r�get_vol_install�sz_StorageBase.get_vol_installcCs
t��dSrxr~r�r
r
r�get_vol_object�sz_StorageBase.get_vol_objectcCs
t��dSrxr~r�r
r
r�get_parent_pool�sz_StorageBase.get_parent_poolcCs.|js(|��r(t|j|���d�d�|_|jS�Nr�Zparsexml)rzr�rry�XMLDescr�r
r
r�get_parent_pool_xml�s
�z _StorageBase.get_parent_pool_xmlcCs
t��dSrxr~r�r
r
r�validate�sz_StorageBase.validatecCs
t��dSrxr~r�r
r
r�get_path�sz_StorageBase.get_pathcCsdSr$r
r�r
r
r�is_stub�sz_StorageBase.is_stubcCs
t��dSrxr~r�r
r
r�is_size_conflict�sz_StorageBase.is_size_conflictcCs
t��dSrxr~r�r
r
r�will_create_storage�sz _StorageBase.will_create_storagecCs|}t�d|jj��dS)Nz%s can't create storage)r�DevError�	__class__�__name__)r|�meterr.r
r
rr;�sz_StorageBase.createN)r��
__module__�__qualname__�__doc__r}r�r�r�r�r�r�r�r�r�r�r�r�r;r
r
r
rrwssrwc@sxeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�ZdS)�_StorageCreatorzK
    Base object for classes that will actually create storage on disk
    cCs.t�||�d|_d|_d|_d|_d|_dSrx)rwr}�_pool�_vol_install�_path�_size�	_dev_typer{r
r
rr}�sz_StorageCreator.__init__cCst�dSrxr~�r|r�r
r
rr;�sz_StorageCreator.createcCst�dSrxr~r�r
r
rr��sz_StorageCreator.validatecCst�dSrxr~r�r
r
rr��sz_StorageCreator.get_sizecCsX|jrR|jsRt|j|jj�d�d�}|��dkr<|jj|_ntj	�
|j|jj�|_|jS)Nrr�rG)r�r�rryrr�r�rrr
�joinrA)r|Zxmlobjr
r
rr��sz_StorageCreator.get_pathcCs|jSrx�r�r�r
r
rr��sz_StorageCreator.get_vol_installcCs|jSrxr�r�r
r
r�get_vol_xml�sz_StorageCreator.get_vol_xmlcCs,|js&t|j|jd|��|j���|_|jSrx)r�rOr�r�r�ryrPr�r
r
rr��s�z_StorageCreator.get_dev_typecCs|jr|j��r|jjSdS�N�raw)r��supports_format�formatr�r
r
rr��s
z_StorageCreator.get_driver_typecCsdS�NTr
r�r
r
rr��sz#_StorageCreator.will_create_storagecCsdSrxr
r�r
r
rr��sz_StorageCreator.get_vol_objectcCs|jr|jjSdSrx)r�rr�r
r
rr��sz_StorageCreator.get_parent_poolcCsdSr$r
r�r
r
rr�sz_StorageCreator.existsN)r�r�r�r�r}r;r�r�r�r�r�r�r�r�r�r�rr
r
r
rr��s
	r�c@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�ManagedStorageCreatorz�
    Handles storage creation via libvirt APIs. All the actual creation
    logic lives in StorageVolume, this is mostly about pulling out bits
    from that class and mapping them to DeviceDisk elements
    cCst�||�|j|_||_dSrx)r�r}rr�r�)r|r	Zvol_installr
r
rr}�szManagedStorageCreator.__init__cCs|jj|d�S)N)r�)r�rBr�r
r
rr;szManagedStorageCreator.createcCs
|j��Srx)r�r�r�r
r
rr�sz&ManagedStorageCreator.is_size_conflictcCs
|j��Srx)r�r�r�r
r
rr�szManagedStorageCreator.validatecCst|jj�dddS)N��@)�floatr��capacityr�r
r
rr�
szManagedStorageCreator.get_sizeN)	r�r�r�r�r}r;r�r�r�r
r
r
rr��sr�c@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)�CloneStorageCreatorz�
    Handles manually copying local files for Cloner

    Many clone scenarios will use libvirt storage APIs, which will use
    the ManagedStorageCreator
    cCs.t�||�||_||_||_||_||_dSrx)r�r}r��_output_path�_input_pathr��_sparse)r|r	Zoutput_pathZ
input_pathr�sparser
r
rr}szCloneStorageCreator.__init__cCs|jSrx)r�r�r
r
rr�szCloneStorageCreator.get_sizecCs�d}d}|��dkr t|j�}n(t�tj�tj�|j���}|j|j	}t
|j�ddd}||kr�|jrvt
d�}nd}t
d�}|r�|d7}|t
d�|d	|d	d
�7}||fS)NFrH�zkThe filesystem will not have enough free space to fully allocate the sparse file when the guest is running.Tz2There is not enough free space to create the disk.r:z+%(mem1)s M requested > %(mem2)s M availablei)Zmem1Zmem2)r�r#r�r�statvfsr
r*r=�f_frsize�f_bavail�intr�r�r-)r|�ret�msgZavailZvfsZneedr
r
rr�"s*��
z$CloneStorageCreator.is_size_conflictcCsH|jdurttd�|����|��\}}|r6t|��|rDt�|�dS)Nz+size is required for non-existent disk '%s')r�r,r-r�r�rZwarning)r|r)r�r
r
rr�>s
zCloneStorageCreator.validatecCsNtd�dtj�|j�i}t|��ddd�}|�||�|�||�dS)NzCloning %(srcfile)sZsrcfiler�)	r-rr
rr�r�r��start�_clone_local)r|r��text�
size_bytesr
r
rr;HszCloneStorageCreator.createc
Cs8|jdkrt�d�dS|j|jkr2t�d�dStj�|j�s�|jr�d}d}d}z6t�|jtj	tj
Bd�}t�||�W|r�t�|�q�|r�t�|�0nd}d}t�d	|j|j||�d
}d\}}�z@z�t�|jtj
�}t�|jtj	tj
Bd�}d}	t�||�}
t|
�}|dk�r"|���q�|�rB||
k�rBt�||d
�n"t�||
�}||k�rd|���q�|	|7}	|	|kr�|�|	�q�WnZt�y�}
z@tjddd�td�|j|jt|
�d�}t|�d�WYd}
~
n
d}
~
00W|du�r�t�|�|du�r4t�|�n*|du�rt�|�|du�r2t�|�0dS)Nz	/dev/nullz"Source dev was /dev/null. Skippingz.Source and destination are the same. Skipping.iTi�i�Fz0Local Cloning %s to %s, sparse=%s, block_size=%ssr(rrzError while cloning)�exc_infozBError cloning diskimage %(inputpath)s to %(outputpath)s: %(error)s)Z	inputpathZ
outputpath�error)r�rr?r�rr
rr�r�O_WRONLY�O_CREAT�	ftruncaterr�read�len�endr�write�updatergr-r+�RuntimeError)r|r�r�Zclone_block_sizer�rZzerosZsrc_fdZdst_fd�i�data�s�brr�r
r
rr�Qs~


��

�"


�


z CloneStorageCreator._clone_localN)
r�r�r�r�r}r�r�r�r;r�r
r
r
rr�s	
	r�c@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�ZdS)�StorageBackendStubz�
    Class representing a storage path for a parsed XML disk, that we
    don't want to do slow resolving of unless requested
    cCs"t�||�||_||_||_dSrx)rwr}r�r��_driver_type)r|r	r
Zdev_typeZdriver_typer
r
rr}�szStorageBackendStub.__init__cCs|jSrx)r�r�r
r
rr��szStorageBackendStub.get_pathcCsdSrxr
r�r
r
rr��sz!StorageBackendStub.get_vol_objectcCsdSrxr
r�r
r
rr��szStorageBackendStub.get_vol_xmlcCsdSrxr
r�r
r
rr��sz"StorageBackendStub.get_parent_poolcCsdSrr
r�r
r
rr��szStorageBackendStub.get_sizecCsdSr�r
r�r
r
rr�szStorageBackendStub.existscCs|jSrx)r�r�r
r
rr��szStorageBackendStub.get_dev_typecCs|jSrx)r�r�r
r
rr��sz"StorageBackendStub.get_driver_typecCsdSrxr
r�r
r
rr��szStorageBackendStub.validatecCsdSrxr
r�r
r
rr��sz"StorageBackendStub.get_vol_installcCsdS�N)FNr
r�r
r
rr��sz#StorageBackendStub.is_size_conflictcCsdSr�r
r�r
r
rr��szStorageBackendStub.is_stubcCsdSr$r
r�r
r
rr��sz&StorageBackendStub.will_create_storageN)r�r�r�r�r}r�r�r�r�r�rr�r�r�r�r�r�r�r
r
r
rr��sr�c@sxeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�ZdS)�StorageBackendza
    Class that carries all the info about any existing storage that
    the disk references
    cCsft�||�||_||_||_|jdur.d|_|jrD|jsDt�d��d|_d|_d|_	d|_
d|_dS)Nzparent_pool must be specified)rwr}�_vol_object�_parent_poolr�rr��_vol_xmlrz�_existsr�r�)r|r	r
rMZparent_poolr
r
rr}�s

zStorageBackend.__init__cCs|jr|��jS|jSrx)r�r�rAr�r�r
r
rr��s
zStorageBackend.get_pathcCs|jSrx)r�r�r
r
rr��szStorageBackend.get_vol_objectcCs2|jdur,t|j|j�d�d�|_|j|j_|jSr�)r�rryr�r�r�rr�r
r
rr��s

zStorageBackend.get_vol_xmlcCs|jSrx)r�r�r
r
rr��szStorageBackend.get_parent_poolcCsL|jdurFd}|jr |��j}n|jr0t|j�}t|�ddd|_|jS)z1
        Return size of existing storage
        Nrr�)r�r�r�r�r�r#r�)r|r�r
r
rr�s

zStorageBackend.get_sizecCs�|jdur�|jrd|_n�|jdur*d|_np|��dkrV|j��sVtj�|j�rVd|_nD|j	rdd|_n6|��dkrxd|_n"|j��r�t
|j�s�d|_nd|_|jS)NTrGF)r�r�r�r�ryrPrr
rr�r5r�r
r
rr
s(


���zStorageBackend.existscCsB|jdur<d}|jr|��}t|j||j|��|j���|_|jS)z?
        Return disk 'type' value per storage settings
        N)r�r�r�rOr�r�ryrP)r|rLr
r
rr�'s
�zStorageBackend.get_dev_typecCs$|jr |����r|��jSdSdSr�)r�r�r�r�r�r
r
rr�8s

zStorageBackend.get_driver_typecCsdSrxr
r�r
r
rr�?szStorageBackend.validatecCsdSrxr
r�r
r
rr�BszStorageBackend.get_vol_installcCsdSr�r
r�r
r
rr�EszStorageBackend.is_size_conflictcCsdSr$r
r�r
r
rr�Hsz"StorageBackend.will_create_storageN)r�r�r�r�r}r�r�r�r�r�rr�r�r�r�r�r�r
r
r
rr��s
r�)%rrEr%rVr�loggerrZstoragerrr0rrrrr#r r/r5r9rCr2r<rOrQrUr_rdrfrqrvrwr�r�r�r�r�r
r
r
r�<module>	sB$
"
-
$7J4