o nnhL@sdZddlmZddlZddlZddlZddlZddlZddlZ ddl m Z ddl m Z mZddlmZmZmZmZddlmZmZdd lmZmZde_de_dddZdddZdS)zaPayload management for sending Ansible files and test content to other systems (VMs, containers).) annotationsN)ANSIBLE_BIN_SYMLINK_MAP)IntegrationConfig ShellConfig)displayANSIBLE_SOURCE_ROOT remove_tree is_subdir) data_context PayloadConfig) CommonConfig ExitHandlerargsr dst_pathstrreturnNonec sh|jrdSttj}ii}dd|D}d$d d d%fd d d%fdd d%fdd }tsL|t||tfddt Dtj j sdd|D}t |ttfsfdd|D}t}g}g}|D]'tj kr|fddtj Dqq|fddDqqn|}g}t|d}tjD]} | |qdd|D}tj jr|dd|D||tt|}tjdt|ddt} tj|ddtjd &} |D]\} } tjd!| | fdd| j| | || |d"qWdn 1swYt| }t j!"|}tjd#|t||fdddS)&z Create a payload for delegation.NcSs*g|]\}}|dr|dkr||fqS)zlib/ansible/_vendor/zlib/ansible/_vendor/__init__.py) startswith).0abs_pathrel_pathrI/usr/local/lib/python3.10/dist-packages/ansible_test/_internal/payload.py 5sz"create_payload..tar_infotarfile.TarInfomodeintrt.Optional[tarfile.TarInfo]cSs0|jtjtjBtjBM_|j|O_|S)zs Apply the specified permissions to the given file. Existing file type bits are preserved. )rstatS_IRWXUS_IRWXGS_IRWXOrrrrrapply_permissions;sz)create_payload..apply_permissionscs0|tjtjBtjBtjBtjBtjBtjBS)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_IRUSRS_IRGRPS_IROTHS_IXUSRS_IXGRPS_IXOTHS_IWUSRrr%rrmake_executableEsz'create_payload..make_executablecs|tjtjBtjBtjBS)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-r.rrmake_non_executableRs z+create_payload..make_non_executablecs|jdrtj|jd}n!tjjr1t|jtjjj r1tj|jtjjj }nd}|r<||}|S|j t j t j Bt jB@rN|}|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. zansible/ansibleN)pathrgetosrelpathr content collectionr directoryrr r)r*r+r$)r%r/r0 permissionsrrdetect_permissions^s   z*create_payload..detect_permissionsc3s4|]}|drtjd|ddfVqdS)z../r1N)rr4r2joinrr2)r/rr ys2z!create_payload..cSs:g|]}t|ddst|ddst|ddr|qS)rzbin/z lib/ansible/ztest/lib/ansible_test/r rfrrrr}s    cSs*g|]}t|ddr|ddkr|qS)rzlib/ansible/modules/zlib/ansible/modules/__init__.pyr?r@rrrrs*c3s$|] }tjj||fVqdSN)r4r2r<rootr=layoutrrr>s"c3s2|]}tjj|tjjj|fVqdSrB)r4r2r<rCr7r8r=rDrrr>s0)filesr9cSs"g|] \}}|tjd|fqS)r1r4r2r<rsrcdstrrrrs"css.|]\}}|tjtjjj|fVqdSrB)r4r2r<r r6r7r8rHrrrr>s,z1Creating a payload archive containing %d files...r) verbosityzw:gz)r compresslevelformatz%s -> %s)filterzDCreated a %d byte payload archive containing %d files in %d seconds.)rrrrrr)rrrr)#explainlistr ansible_sourcerextendcreate_temporary_bin_filesupdatedictrvaluesr6 is_ansible isinstancerrcreate_collection_layouts all_filesr payload_callbacksr7sortedsetrinfolentimetarfileopen GNU_FORMATaddr3r4r2getsize)rrrFfiltersr:collection_layouts content_files extra_filespayload_configcallbackstarttarrIrJdurationpayload_size_bytesr)r%rEr/r0r9rcreate_payload*sf         "          rqtuple[tuple[str, str], ...]csl|jrdn#tjdddtttD]\}}tj |}t ||qt fddt tDS)zICreate a temporary ansible bin directory populated using the symlink map.z/tmp/ansible-tmp-binr1bin)prefixsuffixc3s,|]}tj|tjd|fVqdS)rsNrG)rname temp_pathrrr>s*z-create_temporary_bin_files..)rPtempfilemkdtemprregisterr ritemsr4r2r<symlinktupler])rrvdestr2rrwrrTs rT)rr rrrr)rr rrr)__doc__ __future__rr4r rbryratypingt constantsrconfigrrutilrrr r datar r util_commonr rpwdgrprqrTrrrrs$