o
    !d[                     @   s:  d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dlm!Z! d dlm"Z" d dlm#Z# d dlm$Z$ d dlm%Z% d dlm&Z& d dlm'Z' d dl(m)Z) e *e+Z,G d d! d!e-Z.G d"d# d#e-Z/G d$d% d%e-Z0G d&d' d'e0Z1G d(d) d)e0Z2G d*d+ d+e0Z3G d,d- d-e1Z4G d.d/ d/e2Z5G d0d1 d1e0Z6G d2d3 d3e0Z7dS )4    N)TransferManager)human_readable_sizeMAX_UPLOAD_SIZEfind_bucket_keyrelative_pathcreate_warningNonSeekableStream)*create_transfer_config_from_runtime_config)UploadResultSubscriber)DownloadResultSubscriber)CopyResultSubscriber)UploadStreamResultSubscriber)DownloadStreamResultSubscriber)DeleteResultSubscriber)QueuedResult)SuccessResult)FailureResult)DryRunResult)ResultRecorder)ResultPrinter)OnlyShowErrorsResultPrinter)NoProgressResultPrinter)ResultProcessor)CommandResultRecorder)RequestParamsMapperStdoutBytesWriter)ProvideSizeSubscriber)"ProvideUploadContentTypeSubscriber) ProvideCopyContentTypeSubscriber)!ProvideLastModifiedTimeSubscriber)DirectoryCreatorSubscriber)DeleteSourceFileSubscriber)DeleteSourceObjectSubscriber) DeleteCopySourceObjectSubscriber)get_binary_stdinc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	S3TransferHandlerFactory   c                 C   s   || _ || _dS )a  Factory for S3TransferHandlers

        :type cli_params: dict
        :param cli_params: The parameters provide to the CLI command

        :type runtime_config: RuntimeConfig
        :param runtime_config: The runtime config for the CLI command
            being run
        N)_cli_params_runtime_config)self
cli_paramsZruntime_config r,   Fusr/lib/python3.10/site-packages/awscli/customizations/s3/s3handler.py__init__:   s   

z!S3TransferHandlerFactory.__init__c           	      C   sr   t | j}| j|_| j|_t||}td|j|j	 t
 }|g}| || t||}t|||}t|| j|S )ag  Creates a S3TransferHandler instance

        :type client: botocore.client.Client
        :param client: The client to power the S3TransferHandler

        :type result_queue: queue.Queue
        :param result_queue: The result queue to be used to process results
            for the S3TransferHandler

        :returns: A S3TransferHandler instance
        z7Using a multipart threshold of %s and a part size of %s)r	   r)   MAX_IN_MEMORY_CHUNKSZmax_in_memory_upload_chunksZmax_in_memory_download_chunksr   LOGGERdebugZmultipart_thresholdZmultipart_chunksizer   _add_result_printerr   r   S3TransferHandlerr(   )	r*   Zclientresult_queueZtransfer_configtransfer_managerresult_recorderresult_processor_handlersZresult_processorZcommand_result_recorderr,   r,   r-   __call__G   s0   
z!S3TransferHandlerFactory.__call__c                 C   sh   | j drd S | j drt|}n| j drt|}n| j ds)t|}nt|}|| d S )NquietZonly_show_errors	is_streamZprogress)r(   getr   r   r   append)r*   r6   r7   Zresult_printerr,   r,   r-   r2   k   s   


z,S3TransferHandlerFactory._add_result_printerN)__name__
__module____qualname__r/   r.   r8   r2   r,   r,   r,   r-   r&   7   s
    $r&   c                   @   s   e Zd Zdd Zdd ZdS )r3   c                 C   sP   || _ || _| j | jj|f}t| t| t| t| t| t| t	| g| _
dS )a  Backend for performing S3 transfers

        :type transfer_manager: s3transfer.manager.TransferManager
        :param transfer_manager: Transfer manager to use for transfers

        :type cli_params: dict
        :param cli_params: The parameters passed to the CLI command in the
            form of a dictionary

        :type result_command_recorder: ResultCommandRecorder
        :param result_command_recorder: The result command recorder to be
            used to get the final result of the transfer
        N)_transfer_manager_result_command_recorderr4   UploadStreamRequestSubmitterDownloadStreamRequestSubmitterUploadRequestSubmitterDownloadRequestSubmitterCopyRequestSubmitterDeleteRequestSubmitterLocalDeleteRequestSubmitter_submitters)r*   r5   r+   Zresult_command_recorderZsubmitter_argsr,   r,   r-   r.   z   s   

zS3TransferHandler.__init__c              	   C   s   | j > | j+ d}|D ]}| jD ]}||r#||r!|d7 } nqq| j | W d   n1 s5w   Y  W d   n1 sDw   Y  | j  S )a  Process iterable of FileInfos for transfer

        :type fileinfos: iterable of FileInfos
        param fileinfos: Set of FileInfos to submit to underlying transfer
            request submitters to make transfer API calls to S3

        :rtype: CommandResult
        :returns: The result of the command that specifies the number of
            failures and warnings encountered.
        r      N)rA   r@   rI   
can_submitsubmitZnotify_total_submissionsZget_command_result)r*   Z	fileinfosZtotal_submissionsfileinfoZ	submitterr,   r,   r-   call   s$   



zS3TransferHandler.callN)r=   r>   r?   r.   rN   r,   r,   r,   r-   r3   y   s    %r3   c                   @   s   e Zd ZdZdZdd Zdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS ) BaseTransferRequestSubmitterNc                 C   s   || _ || _|| _dS )a\  Submits transfer requests to the TransferManager

        Given a FileInfo object and provided CLI parameters, it will add the
        necessary extra arguments and subscribers in making a call to the
        TransferManager.

        :type transfer_manager: s3transfer.manager.TransferManager
        :param transfer_manager: The underlying transfer manager

        :type result_queue: queue.Queue
        :param result_queue: The result queue to use

        :type cli_params: dict
        :param cli_params: The associated CLI parameters passed in to the
            command as a dictionary.
        N)r@   _result_queuer(   )r*   r5   r4   r+   r,   r,   r-   r.      s   
z%BaseTransferRequestSubmitter.__init__c                 C   s   |  |}|s| |S dS )a  Submits a transfer request based on the FileInfo provided

        There is no guarantee that the transfer request will be made on
        behalf of the fileinfo as a fileinfo may be skipped based on
        circumstances in which the transfer is not possible.

        :type fileinfo: awscli.customizations.s3.fileinfo.FileInfo
        :param fileinfo: The FileInfo to be used to submit a transfer
            request to the underlying transfer manager.

        :rtype: s3transfer.futures.TransferFuture
        :returns: A TransferFuture representing the transfer if it the
            transfer was submitted. If it was not submitted nothing
            is returned.
        N)_warn_and_signal_if_skip
_do_submit)r*   rM   Zshould_skipr,   r,   r-   rL      s   

z#BaseTransferRequestSubmitter.submitc                 C      t d)a  Checks whether it can submit a particular FileInfo

        :type fileinfo: awscli.customizations.s3.fileinfo.FileInfo
        :param fileinfo: The FileInfo to check if the transfer request
            submitter can handle.

        :returns: True if it can use the provided FileInfo to make a transfer
            request to the underlying transfer manager. False, otherwise.
        zcan_submit()NotImplementedErrorr*   rM   r,   r,   r-   rK      s   
z'BaseTransferRequestSubmitter.can_submitc                 C   s   i }| j r|  || j g }| || | jr2d| ji}| jddr'd|d< || jdi | | jds?| |||S | | d S )Nr4   is_moveFmovetransfer_typeZdryrunr,   )	REQUEST_MAPPER_METHODr(   _add_additional_subscribersRESULT_SUBSCRIBER_CLASSrP   r;   r<   _submit_transfer_request_submit_dryrun)r*   rM   
extra_argssubscribersresult_kwargsr,   r,   r-   rR      s   
z'BaseTransferRequestSubmitter._do_submitc                 C   s@   |j }| jddrd}| |\}}| jt|||d d S )NrW   FrX   rY   srcdest)operation_namer(   r;   _format_src_destrP   putr   )r*   rM   rY   rc   rd   r,   r,   r-   r^     s   z+BaseTransferRequestSubmitter._submit_dryrunc                 C      d S Nr,   r*   r`   rM   r,   r,   r-   r[        z8BaseTransferRequestSubmitter._add_additional_subscribersc                 C   rS   )Nz_submit_transfer_request()rT   )r*   rM   r_   r`   r,   r,   r-   r]        z5BaseTransferRequestSubmitter._submit_transfer_requestc                 C   s    |   D ]	}||r dS qd S )NT)_get_warning_handlers)r*   rM   Zwarning_handlerr,   r,   r-   rQ     s
   z5BaseTransferRequestSubmitter._warn_and_signal_if_skipc                 C   s   g S ri   r,   r*   r,   r,   r-   rm     s   z2BaseTransferRequestSubmitter._get_warning_handlersc                 C   s   | j do| j d S )NZguess_mime_typecontent_type)r(   r;   rn   r,   r,   r-   _should_inject_content_type$  s   z8BaseTransferRequestSubmitter._should_inject_content_typec                 C   sf   | j ds1| s1td|j|jf  | j ds/td|j d|j|jf }| j	| dS dS )NZforce_glacier_transferz@Encountered glacier object s3://%s. Not performing %s on object.Zignore_glacier_warningss3://zObject is of storage class GLACIER. Unable to perform %s operations on GLACIER objects. You must restore the object to be able to perform the operation. See aws s3 %s help for additional parameter options to ignore or force these transfers.TF)
r(   r;   Zis_glacier_compatibler0   r1   rc   re   r   rP   rg   )r*   rM   warningr,   r,   r-   _warn_glacier*  s"   


z*BaseTransferRequestSubmitter._warn_glacierc                 C   sD   dt jj }t j|j|}|r t|jd}| j| dS dS )Nz..z#File references a parent directory.TF)	ospathsepnormpathZcompare_key
startswithr   rP   rg   )r*   rM   Zparent_prefixZescapes_cwdrr   r,   r,   r-   _warn_parent_reference?  s   z3BaseTransferRequestSubmitter._warn_parent_referencec                 C   rS   )zAReturns formatted versions of a fileinfos source and destination.rf   rT   rV   r,   r,   r-   rf   L  s   z-BaseTransferRequestSubmitter._format_src_destc                 C   s   t |S ri   )r   r*   ru   r,   r,   r-   _format_local_pathP  rl   z/BaseTransferRequestSubmitter._format_local_pathc                 C   s   | dr|S d| S )Nrq   )rx   rz   r,   r,   r-   _format_s3_pathS  s   
z,BaseTransferRequestSubmitter._format_s3_path)r=   r>   r?   rZ   r\   r.   rL   rK   rR   r^   r[   r]   rQ   rm   rp   rs   ry   rf   r{   r|   r,   r,   r,   r-   rO      s$    	rO   c                   @   sN   e Zd ZejZeZdd Zdd Z	dd Z
dd Zd	d
 Zdd Zdd ZdS )rD   c                 C   
   |j dkS )Nuploadre   rV   r,   r,   r-   rK   ]     
z!UploadRequestSubmitter.can_submitc                 C   sF   | t|j |  r| t  | jddr!| t  d S d S NrW   F)r<   r   sizerp   r   r(   r;   r"   rj   r,   r,   r-   r[   `  s   z2UploadRequestSubmitter._add_additional_subscribersc                 C   .   t |j\}}| |}| jj|||||dS N)fileobjbucketkeyr_   r`   )r   rd   _get_fileinr@   r~   )r*   rM   r_   r`   r   r   Zfileinr,   r,   r-   r]   g     
z/UploadRequestSubmitter._submit_transfer_requestc                 C      |j S ri   )rc   rV   r,   r,   r-   r   o     z"UploadRequestSubmitter._get_fileinc                 C      | j gS ri   )_warn_if_too_largern   r,   r,   r-   rm   r  rl   z,UploadRequestSubmitter._get_warning_handlersc                 C   sT   t |dr&|jtkr(t|j}d|ttf }t||dd}| j| d S d S d S )Nr   z&File %s exceeds s3 upload limit of %s.F)Z	skip_file)	getattrr   r   r   rc   r   r   rP   rg   )r*   rM   	file_pathZwarning_messagerr   r,   r,   r-   r   u  s   
z)UploadRequestSubmitter._warn_if_too_largec                 C       |  |j}| |j}||fS ri   )r{   rc   r|   rd   r*   rM   rc   rd   r,   r,   r-   rf        z'UploadRequestSubmitter._format_src_destN)r=   r>   r?   r   Zmap_put_object_paramsrZ   r
   r\   rK   r[   r]   r   rm   r   rf   r,   r,   r,   r-   rD   Y  s    
rD   c                   @   sF   e Zd ZejZeZdd Zdd Z	dd Z
dd Zd	d
 Zdd ZdS )rE   c                 C   r}   )Ndownloadr   rV   r,   r,   r-   rK     r   z#DownloadRequestSubmitter.can_submitc                 C   sV   | t|j | t  | t|j| j | jddr)| t	|j
 d S d S r   )r<   r   r   r!   r    Zlast_updaterP   r(   r;   r#   source_clientrj   r,   r,   r-   r[     s   
z4DownloadRequestSubmitter._add_additional_subscribersc                 C   r   r   )r   rc   _get_fileoutr@   r   )r*   rM   r_   r`   r   r   fileoutr,   r,   r-   r]     r   z1DownloadRequestSubmitter._submit_transfer_requestc                 C   r   ri   )rd   rV   r,   r,   r-   r     r   z%DownloadRequestSubmitter._get_fileoutc                 C   s   | j | jgS ri   )rs   ry   rn   r,   r,   r-   rm     s   z.DownloadRequestSubmitter._get_warning_handlersc                 C   r   ri   )r|   rc   r{   rd   r   r,   r,   r-   rf     r   z)DownloadRequestSubmitter._format_src_destN)r=   r>   r?   r   Zmap_get_object_paramsrZ   r   r\   rK   r[   r]   r   rm   rf   r,   r,   r,   r-   rE     s    	rE   c                   @   s>   e Zd ZejZeZdd Zdd Z	dd Z
dd Zd	d
 ZdS )rF   c                 C   r}   )Ncopyr   rV   r,   r,   r-   rK     r   zCopyRequestSubmitter.can_submitc                 C   sJ   | t|j |  r| t  | jddr#| t|j d S d S r   )	r<   r   r   rp   r   r(   r;   r$   r   rj   r,   r,   r-   r[     s   
z0CopyRequestSubmitter._add_additional_subscribersc           	      C   s@   t |j\}}t |j\}}||d}| jj||||||jdS )N)ZBucketKey)r   r   copy_sourcer_   r`   r   )r   rd   rc   r@   r   r   )	r*   rM   r_   r`   r   r   Zsource_bucketZ
source_keyr   r,   r,   r-   r]     s   
z-CopyRequestSubmitter._submit_transfer_requestc                 C   r   ri   )rs   rn   r,   r,   r-   rm     rl   z*CopyRequestSubmitter._get_warning_handlersc                 C   s    |  |j}|  |j}||fS ri   )r|   rc   rd   r   r,   r,   r-   rf     r   z%CopyRequestSubmitter._format_src_destN)r=   r>   r?   r   Zmap_copy_object_paramsrZ   r   r\   rK   r[   r]   rm   rf   r,   r,   r,   r-   rF     s    
rF   c                   @   0   e Zd ZeZdd Zdd Zdd Zdd Zd	S )
rB   c                 C      |j dko
| jdS )Nr~   r:   re   r(   r;   rV   r,   r,   r-   rK        

z'UploadStreamRequestSubmitter.can_submitc                 C   s0   | j dd }|d ur|tt| d S d S )Nexpected_size)r(   r;   r<   r   int)r*   r`   rM   r   r,   r,   r-   r[     s   z8UploadStreamRequestSubmitter._add_additional_subscribersc                 C   s   t  }t|S ri   )r%   r   )r*   rM   Zbinary_stdinr,   r,   r-   r     s   z(UploadStreamRequestSubmitter._get_fileinc                 C      dS N-r,   rz   r,   r,   r-   r{     rk   z/UploadStreamRequestSubmitter._format_local_pathN)	r=   r>   r?   r   r\   rK   r[   r   r{   r,   r,   r,   r-   rB     s    rB   c                   @   r   )
rC   c                 C   r   )Nr   r:   r   rV   r,   r,   r-   rK     r   z)DownloadStreamRequestSubmitter.can_submitc                 C   rh   ri   r,   rj   r,   r,   r-   r[     rk   z:DownloadStreamRequestSubmitter._add_additional_subscribersc                 C   s   t  S ri   r   rV   r,   r,   r-   r     r   z+DownloadStreamRequestSubmitter._get_fileoutc                 C   r   r   r,   rz   r,   r,   r-   r{     rk   z1DownloadStreamRequestSubmitter._format_local_pathN)	r=   r>   r?   r   r\   rK   r[   r   r{   r,   r,   r,   r-   rC     s    rC   c                   @   s.   e Zd ZejZeZdd Zdd Z	dd Z
dS )rG   c                 C      |j dko	|jdkS )NdeleteZs3re   Zsrc_typerV   r,   r,   r-   rK        
z!DeleteRequestSubmitter.can_submitc                 C   s"   t |j\}}| jj||||dS )N)r   r   r_   r`   )r   rc   r@   r   )r*   rM   r_   r`   r   r   r,   r,   r-   r]     s
   z/DeleteRequestSubmitter._submit_transfer_requestc                 C      |  |jd fS ri   )r|   rc   rV   r,   r,   r-   rf        z'DeleteRequestSubmitter._format_src_destN)r=   r>   r?   r   Zmap_delete_object_paramsrZ   r   r\   rK   r]   rf   r,   r,   r,   r-   rG     s    rG   c                   @   s,   e Zd ZdZdZdd Zdd Zdd ZdS )rH   Nc                 C   r   )Nr   localr   rV   r,   r,   r-   rK   
  r   z&LocalDeleteRequestSubmitter.can_submitc              
   C   s   |  |\}}d||d}zDz"| jtdddi| t|j | jtdi | W W dS  tyQ } z| jt	dd|i| W Y d }~W dS d }~ww    Y dS )Nr   rb   Ztotal_transfer_sizer   	exceptionTr,   )
rf   rP   rg   r   rt   removerc   r   	Exceptionr   )r*   rM   r_   r`   rc   rd   ra   er,   r,   r-   r]     s,   z4LocalDeleteRequestSubmitter._submit_transfer_requestc                 C   r   ri   )r{   rc   rV   r,   r,   r-   rf   -  r   z,LocalDeleteRequestSubmitter._format_src_dest)r=   r>   r?   rZ   r\   rK   r]   rf   r,   r,   r,   r-   rH     s    rH   )8loggingrt   Zs3transfer.managerr   Zawscli.customizations.s3.utilsr   r   r   r   r   r   Z'awscli.customizations.s3.transferconfigr	   Z awscli.customizations.s3.resultsr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   Zawscli.compatr%   	getLoggerr=   r0   objectr&   r3   rO   rD   rE   rF   rB   rC   rG   rH   r,   r,   r,   r-   <module>   sX    
B? ",$"