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__/multibackend.cpython-310.pyc
o

nD!a�=�@s�ddlmZe��ddlZddlZddlZddlZddlZddl	Zddl
Z
ddlZddl
mZddlmZddlmZddlmZGdd�dejj�Zej�d	e�dS)
�)�standard_libraryN)�BackendException)�config)�log)�utilc@s�eZdZdZgZiZegd��ZdZeddg�Z	dZ
eddg�ZdZdZ
ed	d
��Zdd�Zd
d�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS)�MultiBackendz�Store files across multiple remote stores. URL is a path to a local file
    containing URLs/other config defining the remote store)�mode�onfail�subpath�stripe�mirror�continue�abort�rc
Cstj�|���}t|j�dkrt�Sztjj|jdd�}Wnty;}zt	�
td�|j|ft	j�t
d��d}~wwt�}t|���D]9\}}t|�dkrat	�
td�|j|ft	j�t
d��|tjvrxt	�
td	�|j|ft	j�t
d��|d||<qE|S)
NrT)�strict_parsingz2MultiBackend: Could not parse query string %s: %s zCould not parse query string�zAMultiBackend: Invalid query string %s: more than one value for %szInvalid query stringz;MultiBackend: Invalid query string %s: unknown parameter %s)�urllib�parse�urlparse�geturl�len�query�dict�parse_qs�
ValueErrorr�Log�_�ERRORr�list�itemsr�#_MultiBackend__knownQueryParameters)�
parsed_url�reparsed_url�queryMultiDict�e�	queryDict�name�	valueList�r(�A/usr/lib/python3/dist-packages/duplicity/backends/multibackend.py�get_query_paramsWs@
����
��

��zMultiBackend.get_query_paramsc
CsZtjj�||�t�|�}d|vr|d|_d|vr|d|_|jtjvr7t	�
td�d|jft	j�t
d��|jtjvrOt	�
td�d|jft	j�t
d��d|vrX|d|_zt|j��
}t�|�}Wd�n1snwYWn+ty�}zt	�
td�|��t	j�t	�
td�|j|ft	j�t
d	��d}~ww|D]�}|d
|j}tjjdkr�|�d�}t	�
td
�|t	j�d|vr�|dD]}t	�
td�|d|dft	j�|dtj|d<q�tj�|�}	|j�|	�d|v�r*|jdk�rt
d��|dD]$}
t	�
td�|
t	j�|
|j v�r"|j |
�|	��q|	g|j |
<�qq�dS)Nrr	z&MultiBackend: illegal value for %s: %sz MultiBackend: invalid mode valuez"MultiBackend: invalid onfail valuer
zMultiBackend: Url %sz0MultiBackend: Could not load config file %s: %s zCould not load config file�url�zutf-8zMultiBackend: use store %s�envzMultiBackend: set env %s = %sr&�value�prefixesrz=Multibackend: stripe mode not supported with prefix affinity.z-Multibackend: register affinity for prefix %s)!�	duplicity�backend�Backend�__init__rr*�_MultiBackend__mode�_MultiBackend__onfail_mode�_MultiBackend__mode_allowedSetrrrrr�%_MultiBackend__onfail_mode_allowedSet�_MultiBackend__subpath�open�path�json�load�IOError�
strip_auth�sys�version_info�major�encode�INFO�os�environ�get_backend�_MultiBackend__stores�append�_MultiBackend__affinities)�selfr!�queryParams�f�configsr$rr+r-�store�prefixr(r(r)r3vs�
 


��
��
��
��
����


��
��

����zMultiBackend.__init__csF�jr �fdd�t�j���D�}�fdd�|D�}|r t|�S�jS)Ncs g|]}t����|�r|�qSr()r�fsdecode�
startswith)�.0�k)�filenamer(r)�
<listcomp>�� z1MultiBackend._eligible_stores.<locals>.<listcomp>cs h|]}�j|D]}|�q	qSr()rI)rRrOrN)rJr(r)�	<setcomp>�rVz0MultiBackend._eligible_stores.<locals>.<setcomp>)rIr�keysrG)rJrT�matching_prefixes�matching_storesr()rTrJr)�_eligible_stores�szMultiBackend._eligible_storesc	
CsTd}|�|�}|jdkrd|_|j}	||j}z=|jd}|t|�dkr(d}t�td�|j|jj�	�ftj
�|�||�d}||_|dkrLWdS|jdkrTWdSWnSty�}zGt�td�|j|jj�	�||ftj
�||_|jd	kr�t�td
�|tj�td��|j|kr�|s�t�td�|tj�td��WYd}~nd}~wwq)
NFrrTrz+MultiBackend: _put: write to store #%s (%s)rzGMultiBackend: failed to write to store #%s (%s), try #%s, Exception: %srz3MultiBackend: failed to write %s. Aborting process.zfailed to writezMMultiBackend: failed to write %s. Tried all backing stores and none succeeded)r[r4�_MultiBackend__write_cursorrrrrr1r!r>�DEBUG�put�	ExceptionrCr5rr)	rJ�source_path�remote_filename�passed�stores�firstrN�nextr$r(r(r)�_put�s`




��
�
��

��
�����zMultiBackend._putcCsx|�|�}|D]%}|��}||vr|�||�dSt�td�|||jj��ftj	�qt�td�|tj
�td��)Nz,MultiBackend: failed to get %s to %s from %szKMultiBackend: failed to get %s. Tried all backing stores and none succeededz
failed to get)r[r�getrrrr1r!r>rCrr)rJra�
local_pathrc�s�flistr(r(r)�_gets"

��
��zMultiBackend._getc	Cs�g}|jD]E}dgftjd<|��}t�td�|jj�	�t
|�f�t
|�dkrEtjjrEt�
td|jj�	�t�tjj�f��dtj_|�|�qtdd�|D��}t�td�|tj�|S)	NFrzMultiBackend: %s: %d filesrzException during list of %s: %scSsh|]	}|D]}|�qqSr(r()rR�sublist�itemr(r(r)rW<sz%MultiBackend._list.<locals>.<setcomp>zMultiBackend: combined list: %s)rGr�are_errors_fatalrr�Noticerr1r!r>rr0�_last_exception�Warnr�uexcrHrr])rJ�listsri�l�resultr(r(r)�_list.s,

�
��
��zMultiBackend._listcCs�d}|�|�}|D],}|��}||vr5t|jd�r |�|g�nt|jd�r+|�|�d}|jdkr5dSq	|sEt�t	d�|tj
�dSdS)NF�_delete_list�_deleteTr�NMultiBackend: failed to delete %s. Tried all backing stores and none succeeded)r[r�hasattrr1�_do_delete_list�
_do_deleter4rrrr)rJrTrbrcrirjr(r(r)rxBs(


�
���zMultiBackend._deletecs�d}|j}|D]5}|����fdd�|D�}t|jd�r"|�|�nt|jd�r2|D]}|�|�q*d}|jdkr<dSq|sLt�t	d�|tj
�dSdS)	NFcsg|]}|�vr|�qSr(r()rRrL�rjr(r)rUlsz-MultiBackend._delete_list.<locals>.<listcomp>rwrxTrry)rGrrzr1r{r|r4rrrr)rJ�	filenamesrbrcri�cleanedrTr(r}r)rw^s*
�
���zMultiBackend._delete_listcCs(|jD]}t|jd�r|j�|�qdS)N�pre_process_download)rGrzr1r�)rJrTrNr(r(r)r�{s

��z!MultiBackend.pre_process_downloadcCsJt|�}|jD]}t|jd�r"|�|���}t|�dkr"|j�|�qdS)N�pre_process_download_batchr)�setrGrzr1�intersectionrrr�)rJr~�	set_filesrN�store_files_to_downloadr(r(r)r��s
��z'MultiBackend.pre_process_download_batchN)�__name__�
__module__�__qualname__�__doc__rGrI�	frozensetr r4r6r5r7r8r\�staticmethodr*r3r[rfrkrvrxrwr�r�r(r(r(r)r+s8�	�
e2r�multi)�futurer�install_aliasesrD�os.pathr?�urllib.requestr�urllib.parse�urllib.errorr;�duplicity.backendr0�duplicity.errorsrrrrr1r2r�register_backendr(r(r(r)�<module>s$`