HEX
Server: Apache
System: Linux pdx1-shared-a1-38 6.6.104-grsec-jammy+ #3 SMP Tue Sep 16 00:28:11 UTC 2025 x86_64
User: mmickelson (3396398)
PHP: 8.1.31
Disabled: NONE
Upload Files
File: //usr/lib/python3/dist-packages/duplicity/backends/__pycache__/_boto_single.cpython-310.pyc
o

�~�_�:�@s�ddlmZddlmZddlmZddlZddlZddlZ	ddl	m
Z
ddl	mZddlm
Z
mZddl	mZdd	l	mZd
Zdd�ZGd
d�de	jj�ZdS)�)�division)�str)�ThreadPoolExecutorN)�config)�log)�FatalBackendException�BackendException)�progress)�utilz2.1.1c	Cs0zJddlm}t|d�sJ�zddlm}ddlm}d}|�}Wn
ty.d}d}YnwtjrA|r8|�}nt�	dtj
j�n|rG|�}nd}Wnty]t�	d	ttj
j
�Ynw|jsj|jtjd
�}n|dkspJ�|j|j|jtjd�}t|d
�r�|dur�t�	dtj
j�|S||_|Std��)Nr)�S3Connection�lookup)�OrdinaryCallingFormat)�SubdomainCallingFormatTFz�Use of new-style (subdomain) S3 bucket addressing wasrequested, but does not seem to be supported by the boto library. Either you need to upgrade your boto library or duplicity has failed to correctly detect the appropriate support.z_This backend (s3) requires boto library, version %s or later, (http://code.google.com/p/boto/).)�	is_secure�s3)�host�portr�calling_formatz�It seems we previously failed to detect support for calling formats in the boto library, yet the support is there. This is almost certainly a duplicity bug.�Boto requires a bucket name.)�boto.s3.connectionr�hasattrr
r�ImportErrorr�s3_use_new_styler�
FatalError�	ErrorCode�boto_old_style�BOTO_MIN_VERSION�boto_lib_too_old�hostname�connect�s3_unencrypted_connectionr�boto_calling_formatrr)	�scheme�
parsed_url�storage_urirr
r�
cfs_supportedr�conn�r'�A/usr/lib/python3/dist-packages/duplicity/backends/_boto_single.py�get_connection&sX
�������
���r)c@szeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zddd�Zdd�ZdS)�BotoBackenda�
    Backend for Amazon's Simple Storage System, (aka Amazon S3), though
    the use of the boto module, (http://code.google.com/p/boto/).

    To make use of this backend you must set aws_access_key_id
    and aws_secret_access_key in your ~/.boto or /etc/boto.cfg
    with your Amazon Web Services key id and secret respectively.
    Alternatively you can export the environment variables
    AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.
    cCstjj�||�zddl}ddlm}Wnty�w|jt	ks$J�dd�|j
�d�D�|_|jr;|j�
d�|_ntd��|j|_|jrPdd�|j�|_nd|_tj�|�|_||_d	�|jdd
�|j
�d�f�|_tjrv|j|_nd|_|��i|_dS)Nr)�LocationcSsg|]}|dkr|�qS)�r')�.0�xr'r'r(�
<listcomp>�sz(BotoBackend.__init__.<locals>.<listcomp>�/rz%s/r,z://�)�	duplicity�backend�Backend�__init__�botorr+r�Versionr�path�split�	url_parts�pop�bucket_namerr"�join�
key_prefix�strip_auth_from_url�straight_urlr#�lstrip�boto_uri_strr�s3_european_buckets�EU�my_location�resetConnection�_listed_keys)�selfr#r6r+r'r'r(r5�s4�
�

zBotoBackend.__init__cCs(|`i|_d|_d|_d|_|`|`dS�N)rG�bucketr&r$�rHr'r'r(�_close�szBotoBackend._closecCs�ddl}t|dd�r|j��d|_d|_d|_|`|`|�|j�|_t|j|j	|j�|_|j�
|j�sA|jj|j|j
d�|_dS|j�|j�|_dS)Nrr&F��location)r6�getattrr&�closerJr$rBr)r"r#rr<�
create_bucketrE�
get_bucket)rHr6r'r'r(rF�s

�zBotoBackend.resetConnectioncCs|��dSrI)rFrKr'r'r(�_retry_cleanup�szBotoBackend._retry_cleanupc
Cs�t�|�}tjrtjstdtjjd��|j	durHz
|j
�|j�|_	Wn%t
yG}zdt|�vr<|j
j|j|jd�|_	n�WYd}~nd}~ww|j	�|j|�}tjrWd}ntjr]d}ntjrcd}ntjrmd|vrmd	}nd
}t�d|j||f�tjr�d|d
d�}n(tjr�tjdur�tdtjjd��d|dtjd�}tjdur�tj|d<nd|d�}t��}|�|j ||�t��}t!||�p�d}	t"j#�$|j �|	}
t�%d|j|||
f�dS)Nz`European bucket creation was requested, but not new-style bucket addressing (--s3-use-new-style))�code�NoSuchBucketrM�REDUCED_REDUNDANCY�STANDARD_IA�
ONEZONE_IA�manifest�GLACIER�STANDARDzUploading %s/%s to %s Storagezapplication/octet-stream�AES256)�Content-Type�x-amz-storage-class�x-amz-server-side-encryptionzOS3 USE SSE KMS was requested, but key id not provided require (--s3-kms-key-id)zaws:kms)r]r^r_z+x-amz-server-side-encryption-aws-kms-key-idzx-amz-grant-full-control)r]r^�z7Uploaded %s/%s to %s Storage at roughly %f bytes/second)&r
�fsdecoderrCrrrr�s3_bucket_not_stylerJr&rRr<�	ExceptionrrQrE�new_keyr>�
s3_use_rrs�	s3_use_ia�s3_use_onezone_ia�s3_use_glacier�Infor@�
s3_use_sse�s3_use_sse_kms�
s3_kms_key_id�s3_kms_no_id�s3_kms_grant�time�upload�name�abs�osr8�getsize�Debug)rH�source_path�remote_filename�e�key�
storage_class�headers�upload_start�
upload_end�total_s�rough_upload_speedr'r'r(�_put�sx
�


�����
��

���
�zBotoBackend._putcCsDt�|�}|j|}|j|dd�|j|}|��|�|j�dS)NT)�wait)r
rar>�pre_process_downloadrGrF�get_contents_to_filenamerq)rHrw�
local_path�key_nameryr'r'r(�_gets


zBotoBackend._getcCs|jstd��|��S)NzNo connection to backend)rJr�list_filenames_in_bucketrKr'r'r(�_listszBotoBackend._listc	Cspg}|jj|jd�D]+}z |j�|jdd�}|�|�||j|j<t�d|j	|f�Wq
t
y5Yq
w|S)N)�prefixr,r`zListed %s/%s)rJ�listr>ry�replace�appendrGrrur@�AttributeError)rH�
filename_list�k�filenamer'r'r(r�s

�z$BotoBackend.list_filenames_in_bucketcCs t�|�}|j�|j|�dSrI)r
rarJ�
delete_keyr>)rHr�r'r'r(�_delete3s
zBotoBackend._deletecCs6t�|�}|j�|j|�}|durddiSd|jiS)N�size���)r
rarJrr>r�)rHr�ryr'r'r(�_query7s


zBotoBackend._querycCs0|j||tjtddtjd�d�|��dS)Nr1�i)�cb�num_cb)�set_contents_from_filenamer	�report_transfer�maxr�volsizerP)rHr�ryr{r'r'r(rp>s
�zBotoBackend.uploadFcCs�|j|}|j�|d�st|j�|��d|j|<|j|}|jdkrc|j�|j�js8t	�
d|�|jdd�|ret	�
d|�|j�|j�jrZt�
d�|��|j�|j�jsIt	�
d	|�dSdSdS)
NFrrZz.File %s is in Glacier storage, restoring to S3r`)�daysz+Waiting for file %s to restore from Glacier�<z.File %s was successfully restored from Glacier)r>rG�getr�rJrz�get_keyry�ongoing_restorerri�restorero�sleeprF)rHrwr�r�ryr'r'r(r�Es"



��z BotoBackend.pre_process_downloadcCsft�d�tdd��}|D]}t�|�}|�|j|d�q
Wd�n1s'wYt�d�dS)Nz&Starting batch unfreezing from Glacierzs3-unfreeze-glacier)�thread_name_prefixFz&Batch unfreezing from Glacier finished)rrirr
ra�submitr�)rH�remote_filenames�executorrwr'r'r(�pre_process_download_batchXs

��z&BotoBackend.pre_process_download_batchN)F)�__name__�
__module__�__qualname__�__doc__r5rLrFrSr�r�r�r�r�r�rpr�r�r'r'r'r(r*ys,	B
r*)�
__future__r�builtinsr�concurrent.futuresrrsro�duplicity.backendr2rr�duplicity.errorsrrr	r
rr)r3r4r*r'r'r'r(�<module>sS