o `o1@snddlmZddlZddlZddlmZddlmZddlmZddl Z Gdddej j Z ej de dS) )strN)log)util)BackendExceptionc@sjeZdZdZddZddZddZdd Zdd d Zd dZ ddZ ddZ ddZ ddZ ddZd S) PCABackendz Backend for OVH PCA c Cs(tjj||zddlm}ddlm}Wnty*}ztdt |d}~ww||_ ||_ i}dt j vrLdt j vrLt j d|d<t j d|d<n0d t j vrUtd d t j vr^td d t j vrgtdt j d |d<t j d |d<t j d |d<i}dt j vrt j d|d<t j ddkrdt j vr|dt j didt j vr|dt j didt j vr|dt j didt j vr|dt j didt j vr|dt j didt j vr|d t j did!t j vr|d"t j d!id#t j vr |d$t j d#id%t j vr|d&t j d%ind'|d<dt j vr.t j d|d<d%t j vr>|d&t j d%i||d(<d|d)<||_d*d+|jd,D}|d|_|rfd-d,||_nd.|_d/}d0} d} z|d6i|j|_|j|j} Wn,|yYn#ty}ztd1|jjt |ftjjWYd}~nd}~ww| durtd2|jzt | |gg} |jj!|j| d3WdSty}ztd4|jjt |ftjjWYd}~dSd}~ww|r| | "|krtd5|j| | "|fdSdSdS)7Nr) Connection)ClientExceptionzBPCA backend requires the python-swiftclient library. Exception: %sPCA_PREAUTHURLPCA_PREAUTHTOKEN preauthurl preauthtoken PCA_USERNAMEz*PCA_USERNAME environment variable not set. PCA_PASSWORDz*PCA_PASSWORD environment variable not set. PCA_AUTHURLz)PCA_AUTHURL environment variable not set.userkeyauthurlPCA_AUTHVERSION auth_version3PCA_USER_DOMAIN_NAMEuser_domain_namePCA_USER_DOMAIN_IDuser_domain_idPCA_PROJECT_DOMAIN_NAMEproject_domain_namePCA_PROJECT_DOMAIN_IDproject_domain_idPCA_TENANTNAME tenant_namePCA_ENDPOINT_TYPE endpoint_type PCA_USERIDuser_id PCA_TENANTID tenant_idPCA_REGIONNAME region_name2 os_optionsretriescSsg|]}|dkr|qS)).0xr,r,?/usr/lib/python3/dist-packages/duplicity/backends/pcabackend.py psz'PCABackend.__init__../z%s/r+PCAzX-Storage-PolicyConnection failed: %s %szCreating container %s)headersz Container creation failed: %s %sz>Container '%s' exists but its storage policy is '%s' not '%s'.r,)# duplicitybackendBackend__init__ swiftclientrr ImportErrorrrresp_excconn_clsosenvironupdate conn_kwargspathsplitpop containerjoinprefixconnhead_container Exceptionr FatalError __class____name__ ErrorCodeconnection_failedInfodict put_containerlower) self parsed_urlrrer@r) url_partspolicy policy_headercontainer_metadatar4r,r,r/r8$s                   zPCABackend.__init__cCs&t||jr|jdkrtjjSdSdS)Ni) isinstancer; http_statusrrMbackend_not_found)rS operationrUr,r,r/ _error_codes  zPCABackend._error_codecCs0|j|j|jt|tt|jddS)Nrb)rG put_objectrDrFrfsdecodeopenname)rS source_pathremote_filenamer,r,r/_putszPCABackend._putcCsd|t|}|r0tt|jd}|D]}||qWddS1s)wYdSdS)Nwb)unsealrrarbrcwrite)rSre local_pathbodyfchunkr,r,r/_gets "zPCABackend._getNcCs|jj|jd|jdd}|d}|r:|dd}|dd}|jj|j||d|jddd}|r8|d||s|durEt||dS|dS) NFzpolicy_extra=true) full_listingrA query_stringrc version_id)markerversion_markerrorArp)rG get_containerrDrFgetextendfilter)rSffilterrvlistingrtrur,r,r/ __list_objss&  zPCABackend.__list_objscsfddDS)Ncs(g|]}t|dtjdqS)rcN)rfsencodelenrF)r-orSr,r/r0s(z$PCABackend._list..)_PCABackend__list_objsrr,rr/_listszPCABackend._listcCs |j|j|jt|dSN)rG delete_objectrDrFrra)rSfilenamer,r,r/_deletes zPCABackend._deletecCs,|j|j|jt|}dt|diS)Nsizezcontent-length)rG head_objectrDrFrraint)rSrsobjectr,r,r/_queryszPCABackend._queryc Csz|jj|j|j|dd\}}td||WS|jyo}zI|jdkrMt|j d}t |d\}}t |d\}}d|||f} td|| fnt d |j j t|ftjjWYd}~dSWYd}~dSd}~ww) Ni)resp_chunk_sizez"File %s was successfully unsealed.iz Retry-After< %dh%02dm%02dsz/File %s is being unsealed, operation ETA is %s.r3)rG get_objectrDrFrrOr;r[rhttp_response_headersdivmodrJrKrLrrMrN) rSre_rkrUdurationmshetar,r,r/rhs.   zPCABackend.unsealcsd}tttj||jfddd}d}|D]1}t|d}|d}td||f|d krCtd |||dd }q|d krId }q|rX| }t ||sLtd dS)z This is called before downloading volumes from this backend by main engine. For PCA, volumes passed as argument need to be unsealed. This method is blocking, showing a status at regular interval rcs |dvSNrcr,r.u_remote_filenamesr,r/s z7PCABackend.pre_process_download_batch..rzFrcpolicy_retrieval_statezVolume %s. State : %s. sealedLaunching unseal of volume %s.T unsealingz%All volumes to download are unsealed.N) listmaprrarrrONoticerh unseal_statustimesleep)rSremote_filenamesretry_intervalobjsone_object_not_unsealedrrrr,rr/pre_process_download_batchs(  z%PCABackend.pre_process_download_batchc sd}|jfddd}d}|D]D}|d}t|d}|dkr9td |td |||dd }q|d krTt|d }td||f||krR|}d }qt|d\} } t| d\} } d| | | f} td| |S)z: Shows unsealing status for input volumes Fcst|dvSr)rrarrr,r/rsz*PCABackend.unseal_status..rrrrcrz,Error: volume is still in sealed state : %s.rTrpolicy_retrieval_delayz%s available in %d seconds.rrz0Need to wait %s before all volumes are unsealed.) rrrarrrhrrOr) rSrrr max_durationrrrrrrrmax_duration_etar,rr/rs. zPCABackend.unseal_statusr)rL __module__ __qualname____doc__r8r^rfrnrrrrrhrrr,r,r,r/r so  !rpca)builtinsrr=duplicity.backendr5rrduplicity.errorsrrr6r7rregister_backendr,r,r,r/s    u