o l`C#@sddlmZeddlmZddlmZddlmZddlm Z ddlm Z ddlm Z ddl m Z mZdd lZGd d d eZGd d d ejjZejded S))standard_library)object) quote_plus)log)progress)util)config)BackendExceptionFatalBackendExceptionNc@s4eZdZddZddZddZddZd d Zd S) B2ProgressListenercCdSNselfrr>/usr/lib/python3/dist-packages/duplicity/backends/b2backend.py __enter__)zB2ProgressListener.__enter__cCs ||_dSr )total_byte_count)rrrrrset_total_bytes,s z"B2ProgressListener.set_total_bytescCst||jdSr )rreport_transferr)r byte_countrrrbytes_completed/sz"B2ProgressListener.bytes_completedcCr r rrrrrclose2rzB2ProgressListener.closecCr r r)rexc_typeexc_valexc_tbrrr__exit__5rzB2ProgressListener.__exit__N)__name__ __module__ __qualname__rrrrrrrrrr (s  r c@sHeZdZdZddZddZddZdd Zd d Zd d Z ddZ dS) B2Backendz4 Backend for BackBlaze's B2 storage service c Cs,tjj||zddlm}|d}dd|D|_Wn gd|_Yzddlm }ddlm }dd l m }Wnt yz'ddlm }ddlm }dd lmadd lm }|jgd krhdd lmaWnzt yz ddlm }ddlm }dd lmadd lm }dd lmaWnPt y}zDd t|dd vrz ddlm }ddlm }dd lmadd lm }dd lmaWnt ydt|ddvrтtdwWYd}~nd}~wwYnwYnw|||_d|j _!|j"}|#} dd|j$%dddD|_&|j&r|j&'d|_"|j&'d} ntdd(dd|j&D|_$|j)d|| zt*+d|j$| |jj,-ft*j.Wnt/y`t*+d|j$| |jj,0ft*j.Ynwz|j1| |_2t*+dt*j.WdS|yzt*+dt*j.|j3| d|_2WYdSt4dw) zA Authorize to B2 api and set up needed variables r) __version__.cSsg|]}t|qSr)int.0xrrr Iz&B2Backend.__init__..)rrr)B2Api)InMemoryAccountInfo)NonExistentBucket)DownloadDestLocalFile r)FileVersionInfoFactoryb2sdknameb2z5B2 backend requires B2 Python SDK (pip install b2sdk)NB2cSsg|]}|dkr|qS)rr%rrrr(us@/zB2 requires a bucket namer6cSsg|]}|dqS)r8r)r&url_partrrrr(}r) productionzs                       zB2Backend.__init__cCstd|jt|t|jftj|jgdkr1|j t |jt|dt |jdS|j t |jt|d}| |jdS)z8 Download remote_filename to local_path z Get: %s -> %s)r/ rr8N) rr^rXrfsdecoder3rarAredownload_file_by_namerr-save_to)rremote_filename local_pathdfrrr_gets zB2Backend._getcCs^tdt|j|jt|ftj|jjt|jt |jt|ddt ddS)z5 Copy source_path to remote_filename z Put: %s -> %sr8zapplication/pgp-encrypted) content_typeprogress_listenerN) rr^rrnr3rXrareupload_local_filerr )r source_pathrqrrr_puts zB2Backend._putcsfddjjDS)z- List files on remote server cs$g|]\}}|jtjdqSr ) file_namelenrX)r&file_version_info folder_namerrrr(sz#B2Backend._list..)relsrXrrrr_lists  zB2Backend._listcCs^|jt|}td|tjtjr|j |dS| t |d}|j |j |jdS)z4 Delete filename from remote server z Delete: %sr8N)rXrrnrr^rar b2_hide_filesre hide_file file_infordelete_file_versionid_rz)rfilename full_filenamer|rrr_deletes zB2Backend._deletecCs`td|jt|tj|t|jt|d}d|dur-|jdur-t |jiSdiS)z+ Get size info of filename z Query: %sr8sizeN) rr^rXrrnrarrrr$)rrr|rrr_querys zB2Backend._querycCsh|jgdkr |j|S|jjj|jj|d|j}|dD]}t |}|j |kr/|Sqt d)Nr.r/fileszFile not found) rAreget_file_info_by_nameapisessionlist_file_namesrrXr1from_api_responserzr )rrresponseentryr|rrrrs    zB2Backend.file_infoN) rrr __doc__r?rtryrrrrrrrrr!9sS  r!r4)futurerinstall_aliasesbuiltinsr urllib.parserr<rrrrduplicity.errorsr r duplicity.backendr r=r>r!register_backendrrrrs