
    VhL                        d Z ddlmZ ddlZddlZddlZddlZddlZddlZ	ddl
mZ ddlmZmZ ddlmZmZmZmZ ddlmZmZ dd	lmZmZ de_        de_        dd
ZddZy)zaPayload management for sending Ansible files and test content to other systems (VMs, containers).    )annotationsN   )ANSIBLE_BIN_SYMLINK_MAP)IntegrationConfigShellConfig)displayANSIBLE_SOURCE_ROOTremove_tree	is_subdir)data_contextPayloadConfig)CommonConfigExitHandlerc           
        | j                   ryt        t               j                        }i i }|D cg c]  \  }}|j	                  d      r|dk(  r||f! }}}dddfddfddfd}t
        sO|j                  t        |              |j                  t        fdt        j                         D                     t               j                  j                  s|D cg c]1  }t        |d	   d
      st        |d	   d      st        |d	   d      r|3 }}t        | t         t"        f      s'|D cg c]  }t        |d	   d      r	|d	   dk(  s| }}t               j%                         }g }	g }
|D ]|  t               j                  k(  r;|	j                  fdt               j                  j'                         D               U|
j                  fdj'                         D               ~ n|}	g }
t)        |	      }t               j*                  D ]
  } ||        |D cg c]'  \  }}|t,        j.                  j1                  d|      f) }}}t               j                  j2                  r)|j                  d |	D               |j                  |
       t5        t7        |            }t9        j:                  dt=        |      z  d	       t?        j>                         }tA        jB                  |ddt@        jD                        5 }|D ]E  \  }}t9        j:                  |d|d       |jG                  |||jI                  ||             G 	 ddd       t?        j>                         |z
  }t,        j.                  jK                  |      }t9        j:                  d|t=        |      |fz  d	       yc c}}w c c}w c c}w c c}}w # 1 sw Y   |xY w)z Create a payload for delegation.Nzlib/ansible/_vendor/zlib/ansible/_vendor/__init__.pyc                    | xj                   t        j                  t        j                  z  t        j                  z   z  c_         | xj                   |z  c_         | S )zs
        Apply the specified permissions to the given file.
        Existing file type bits are preserved.
        )modestatS_IRWXUS_IRWXGS_IRWXO)tar_infor   s     N/home/dcms/DCMS/lib/python3.12/site-packages/ansible_test/_internal/payload.pyapply_permissionsz)create_payload.<locals>.apply_permissions;   s>    
 	4<<$,,6EFF    c                     | t         j                  t         j                  z  t         j                  z  t         j                  z  t         j
                  z  t         j                  z  t         j                  z        S )z
        Make the given file executable and readable by all, and writeable by the owner.
        Existing file type bits are preserved.
        This ensures consistency of test results when using unprivileged users.
        )r   S_IRUSRS_IRGRPS_IROTHS_IXUSRS_IXGRPS_IXOTHS_IWUSRr   r   s    r   make_executablez'create_payload.<locals>.make_executableE   s^     !LL4<<'$,,6LL<<(*.,,7LL
 	
r   c                     | t         j                  t         j                  z  t         j                  z  t         j                  z        S )z
        Make the given file readable by all, and writeable by the owner.
        Existing file type bits are preserved.
        This ensures consistency of test results when using unprivileged users.
        )r   r   r   r   r"   r#   s    r   make_non_executablez+create_payload.<locals>.make_non_executableR   s:     !LL4<<'$,,6LL
 	
r   c                   | j                   j                  d      r:j                  t        j                   j	                  | j                   d            }nt               j                  j                  rt        | j                   t               j                  j                  j                        r`j                  t        j                   j	                  | j                   t               j                  j                  j                              }nd}|r | |      } | S | j                  t        j                  t        j                  z  t        j                  z  z  r
 |       } | S  |       } | S )z
        Detect and apply the appropriate permissions for a file.
        Existing file type bits are preserved.
        This ensures consistency of test results when using unprivileged users.
        zansible/ansibleN)path
startswithgetosrelpathr   content
collectionr   	directoryr   r   r   r    r!   )r   r   r   r$   r&   permissionss     r   detect_permissionsz*create_payload.<locals>.detect_permissions^   s    ==##J/??277??8==)#LMD^##..9X]]LNLbLbLmLmLwLw3x??277??8==,.BXBXBcBcBmBm#noDD(48H  ]]dllT\\9DLLHI 'x0H  +84Hr   c              3     K   | ];  }|j                  d       st        j                  j                  d|dd       f = yw)z../r(      N)r*   r,   r)   join).0r)   r$   s     r   	<genexpr>z!create_payload.<locals>.<genexpr>y   sU       YUY  BF  BQ  BQ  RW  BXRWW\\)T!"X>P  Ys
   A*Ar   zbin/zlib/ansible/ztest/lib/ansible_test/zlib/ansible/modules/zlib/ansible/modules/__init__.pyc              3  v   K   | ]0  }t         j                  j                  j                  |      |f 2 y wN)r,   r)   r5   rootr6   r)   layouts     r   r7   z!create_payload.<locals>.<genexpr>   s*     $|QUbggll6;;&Et%L$|s   69c              3     K   | ]b  }t         j                  j                  j                  |      t         j                  j                  j                  j
                  |      f d y wr9   )r,   r)   r5   r:   r/   r0   r;   s     r   r7   z!create_payload.<locals>.<genexpr>   sM       #Vz~BGGLLd$CRWW\\RXRcRcRmRmosEt#u  #Vs   A(A+)filesr1   r(   c              3     K   | ]O  \  }}|t         j                  j                  t               j                  j
                  j                  |      f Q y wr9   )r,   r)   r5   r   r.   r/   r0   )r6   srcdsts      r   r7   z!create_payload.<locals>.<genexpr>   s@     y_g_bdgc277<<(>(>(I(I(S(SUXYZys   AAz1Creating a payload archive containing %d files...)	verbosityzw:gz   )r   compresslevelformatz -> )filterzDCreated a %d byte payload archive containing %d files in %d seconds.)r   tarfile.TarInfor   intreturnt.Optional[tarfile.TarInfo])r   rG   rI   rJ   )&explainlistr   ansible_sourcer*   r	   extendcreate_temporary_bin_filesupdatedictr   valuesr.   
is_ansibler   
isinstancer   r   create_collection_layouts	all_filesr   payload_callbacksr,   r)   r5   r/   sortedsetr   infolentimetarfileopen
GNU_FORMATaddr+   getsize)argsdst_pathr>   filtersabs_pathrel_pathr2   fcollection_layoutscontent_filesextra_filespayload_configcallbackr@   rA   starttardurationpayload_size_bytesr   r<   r$   r&   r1   s                      @@@@@r   create_payloadrq   *   s   ||../E"$KUWG
 8=!38""#9:88 
8E 


 0 /56t  Y]t]{]{]}  Y  Y  	Z>!!,,! <q1Q4(1Q401Q4!9:  < <
 $.? @A %  C1Yqt=S-TXYZ[X\  aB  YBQ  CE  C)^EEG/1-/( 	VF///$$$|YeYgYoYoYyYyY{$|| ""  #V  CI  CS  CS  CU  #V  V	V "N
 !N44 ! 	 ! BGGXS#c277<<	3/0GEG~((ykxyy[! 3u:ELLDs5zQ]^_IIKE	hV1WEWEW	X K\_ 	KHCLLsC0A>GGCW[[6H%IGJ	KK
 yy{U"H2LLW[morsxoy  |D  [E  E  QR  SKP< C> HK Ks*   $O16OO O;,O$#AO**O3c                j   | j                   rdnt        j                  dd      t        j                  t
               t        j                         D ];  \  }}t        j                  j                  |      }t        j                  ||       = t        fdt        t              D              S )zICreate a temporary ansible bin directory populated using the symlink map.z/tmp/ansible-tmp-binr(   bin)prefixsuffixc              3     K   | ]D  }t         j                  j                  |      t         j                  j                  d |      f F yw)rs   N)r,   r)   r5   )r6   name	temp_paths     r   r7   z-create_temporary_bin_files.<locals>.<genexpr>   s5     xPT"'',,y$/eT1JKxs   A
A)rK   tempfilemkdtempr   registerr
   r   itemsr,   r)   r5   symlinktuplerX   )rb   rw   destr)   rx   s       @r   rO   rO      s    ||*	$$IeD	[)41779 	#JD$77<<	40DJJtT"	# xX^_vXwxxxr   )rb   r   rc   strrI   None)rb   r   rI   ztuple[tuple[str, str], ...])__doc__
__future__r   r,   r   r]   ry   r\   typingt	constantsr   configr   r   utilr   r	   r
   r   datar   r   util_commonr   r   pwdgrprq   rO    r   r   <module>r      sY    g " 	     
 
 PSfyr   