o „î¯`PLã@s¬ddlZddlZddlZddlZddlmmZddlZddl Z ddl Z ddl m Z ddl m Z ddl mZddl mZddlmZGdd„de jjƒZe j d e¡dS) éN)Úconfig)Úlog)Útempdir)Úprogress)ÚBackendExceptionc@s|eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„ZdS)Ú IDriveBackendcCs@tjj ||¡||_tj |j¡|_t d  |¡¡d|_ dS)Nzparsed_url: {0}F) Ú duplicityÚbackendÚBackendÚ__init__Ú parsed_urlÚstrip_auth_from_urlÚ url_stringrÚDebugÚformatÚ connected)Úselfr ©rúC/usr/lib/python3/dist-packages/duplicity/backends/idrivedbackend.pyr is  zIDriveBackend.__init__cCs|jS©N)r©rrrrÚuser_connectedsszIDriveBackend.user_connectedcCs”t d |¡¡z | |¡\}}}Wnty td |¡ƒ‚w||}zdd t d|¡¡d}t   |¡}Wnd}Yt d |¡¡|S)NzRequest command: {0}z'Unknown protocol failure on request {0}zÚz<[^>]+>zzRequest response: {0}) rrrÚsubprocess_popenÚKeyErrorrÚjoinÚreÚfindallÚETÚ fromstring)rÚ commandlineÚ_ÚreplyÚerrorÚresponseÚxmlÚelrrrÚrequestvs ÿzIDriveBackend.requestc Csdtj d¡}|dur1t d¡t d¡t d¡t d¡t d¡t d¡t d¡tdƒ‚tj |d ¡|_t  d |j¡tj d ¡|_ |j duret d¡t d ¡t d ¡t d¡tdƒ‚t  d|j ¡tj d¡}|dur”t d¡t d¡t d¡t d¡t d¡tdƒ‚t  d|¡d  |¡|_ t jdur­d|_d|_ndtj dt j¡|_zt |j¡WnFty}z9d|_|jtjkrÚt  d  |j¡¡n t d¡t d  |j¡¡t d¡t d¡td  |j¡ƒ‚WYd}~nd}~wwt  d  |j¡¡d|_tj d ¡|_|jdur6t d¡t d!¡t d"¡t d¡td#ƒ‚t  d$|j¡| |j|j d%  |j ¡¡ d&¡}|jd'd(kratd)|jd*ƒ‚|jd*d+krmtd,ƒ‚|jd-d.krytd/ƒ‚|jd0d1krºtj d2¡}|dur©t d¡t d3¡t d4¡t d5¡t d¡td6ƒ‚t  d7|¡|j d8  |¡7_ | |j|j d9  |j ¡¡ d&¡}|jd:|_| |j|j d;  |j |j¡¡}d|_| d<¡D]}|jd=|jkrd>|jd?d@|_që|jdur(| |j|j dA  |j|j |j¡¡ d<¡}d>|jd?d@|_d|_t  dB¡dS)CNÚ IDEVSPATHzH------------------------------------------------------------------------zHWARNING: No path to 'idevsutil_dedup' has been set. Download module fromzZ https://www.idrivedownloads.com/downloads/linux/download-options/IDrive_linux_64bit.zipÚorzZ https://www.idrivedownloads.com/downloads/linux/download-options/IDrive_linux_32bit.zipzTand place anywhere with exe rights. Then creat env var 'IDEVSPATH' with path to filezBNo IDEVSPATH env var set. Should contain folder to idevsutil_dedupÚidevsutil_dedupzIDrive command base: %sÚIDRIVEIDz WARNING: IDrive logon ID missingzACreate an environment variable IDriveID with your IDrive logon IDz1No IDRIVEID env var set. Should contain IDrive idz IDrive id: %sÚ IDPWDFILEz&WARNING: IDrive password file missgingz5Please create a file with your IDrive logon password,zMThen create an environment variable IDPWDFILE with path/filename of said filez;No IDPWDFILE env var set. Should contain file with passwordzIDrive pwdpath: %sz --password-file={0}Frú/z)Using existing directory {0} as fake-rootzOWARNING: Creation of FAKEROOT {0} failed; backup will use system temp directoryz-This might interfere with incremental backupsz$Creation of the directory {0} failedz>Directory {0} created as fake-root (Will clean-up afterwards!)TÚIDBUCKETz%WARNING: IDrive backup bucket missingzDCreate an environment variable IDBUCKET specifying the target bucketzs z(IDriveBackend.list_raw..cSsg|] }| d¡r|‘qS)ú[)Ú startswith©Ú.0ÚxrrrÚ sz*IDriveBackend.list_raw..cSstdd„|ƒS)NcSs| ¡Sr)Ústrip©ÚcrrrrWóú:IDriveBackend.list_raw....)ÚmaprUrrrrWscSsttdd„|ƒƒS)NcSs|dkS)Nrrr_rrrrWrarb)ÚlistÚfilter)ÚcolsrrrrWs)r>rBrÚurllibÚparseÚunquoter ÚlstriprFÚrstriprCrErrPrDrOrrrrcÚ splitlinesrd)rÚ remote_pathr r!ÚlÚfilteredrrrÚlist_raws$ ÿÿ ÿ zIDriveBackend.list_rawc Csöt d¡| ¡s | ¡| d¡}tj |j|¡}t j   |j j  d¡¡}t |j|¡t d |j|¡¡t d¡}| |¡| d¡|j|jd |j|j|j|j|¡}t d |¡¡| |¡\}} }t d  | ¡¡| ¡t |¡dS) NÚ_PUTúutf-8r-z*put_file: source_path={0}, remote_file={1}Úwrz6 --device-id={0} --files-from={1} / {2}@{3}::home/{4}zput_file put command: {0}zput_file put response: {0})rrrrSÚdecoder>rBrrFrgrhrir rjÚrenameÚnamerÚtempfileÚNamedTemporaryFileÚwriteÚseekrCrErPrDrOrÚcloseÚremove) rÚ source_pathÚremote_filenameÚfilenameÚ intrim_fileÚremote_dirpathÚflistÚ putrequestr!Ú putresponserrrÚ_puts&     ÿzIDriveBackend._putc CsJt d¡| ¡s | ¡| d¡}tj tj   |j j  d¡¡|j   d¡|¡ ¡}t d ||||j j¡¡t ¡}t d |¡¡t d¡}| |¡| d¡|j|jd |j|j|j|j|¡}t d  |¡¡| |¡\}} }t d  | ¡¡| ¡tj ||  d¡ d¡¡} t d  | |j¡¡t | |j¡t |¡dS) NÚ_GETrrr-zO_get: remote_filename={0}, local_path={1}, remote_path={2}, parsed_url.path={3}z*_get created temporary download folder: {}rsrz4 --device-id={0} --files-from={1} {2}@{3}::home/ {4}zget command: {0}z_get response: {0}z+_get moving file {0} to final location: {1}) rrrrSrtr>rBrrgrhrir rjrFrkrrwÚmkdtemprxryrzrCrErPrvrDrOrr{ruÚshutilÚrmtree) rr~Ú local_pathrrmÚtmpdirr‚r r!Ú getresponseÚdownloadedSrcPathrrrÚ_get5s8   ÿÿÿ   ÿzIDriveBackend._getcCs4t d¡| ¡s | ¡| ¡}dd„|Dƒ}|S)NÚ_LISTcSsg|]}|d‘qS)éÿÿÿÿrrZrrrr]dsz'IDriveBackend._list..)rrrrSrp)rrorrrÚ_list]s zIDriveBackend._listcCsèt d¡| ¡s | ¡| d¡}t d¡}| | d¡¡|  d¡t j   t j |jj  d¡¡|j d¡¡ ¡}t d ||¡¡|j|jd |j|j|j|j|¡}t d |¡¡| |¡\}}}t d  |¡¡| ¡dS) NÚ_DELETErrrsr-rz%delete: {0} from remote file path {1}úB --delete-items --device-id={0} --files-from={1} {2}@{3}::home/{4}ú delete: {0}údelete response: {0})rrrrSrtrwrxryrjrzr>rBrrgrhrir rFrkrrCrErPrvrDrOrr{)rr~rr‚rmÚ delrequestr!Ú delresponserrrÚ_deletehs,     ÿÿ ÿþ zIDriveBackend._deletecCsðt d¡| ¡s | ¡t d¡}|D]}| | d¡ d¡d¡q|  d¡t j   t j |jj  d¡¡|j d¡¡ ¡}t d |¡¡|j|jd |j|j|j|j|¡}t d  |¡¡| |¡\}}}t d  |¡¡| ¡dS) Nz _DELETE LISTrsrrr-Ú rz/delete multiple files from remote file path {0}r“r”r•)rrrrSrwrxryrtrjrzr>rBrrgrhrir rFrkrrCrErPrvrDrOrr{)rÚ filename_listr‚rrmr–r!r—rrrÚ _delete_list†s,    ÿÿ ÿþ zIDriveBackend._delete_listcCs(t d¡zt d¡WdSYdS)Nz$Removing IDrive temp folder evs_tempÚevs_temp)rrrˆr‰rrrrÚ_close¤s zIDriveBackend._closecsTt d¡| ¡s | ¡| ¡}|r‡fdd„|Dƒ}|r&dt|dƒiSddiS)NÚ_QUERYcó&g|]}|dˆ d¡kr|d‘qS©rrré©rtrZ©rrrr]´ó&z(IDriveBackend._query..Úsizerr©rrrrSrpÚint)rrrorr£rÚ_query¬s zIDriveBackend._querycspt d¡| ¡s | ¡| ¡}i}|D] ‰|r"‡fdd„|Dƒ}|r/dt|dƒi|ˆ<qddi|ˆ<q|S)NÚ _QUERY_LISTcrŸr r¢rZr£rrr]Ær¤z-IDriveBackend._query_list..r¥rrr¦)rršroÚinfoÚresultrr£rÚ _query_listºs zIDriveBackend._query_listcCs|jr t |j¡dSdSr)rGr>ÚrmdirrFrrrrÚ__del__ÎsÿzIDriveBackend.__del__N)Ú__name__Ú __module__Ú __qualname__r rr'rSrpr…rŽr‘r˜r›rr¨r¬r®rrrrrgs w(  rÚidrived)r>rgrwrÚxml.etree.ElementTreeÚetreeÚ ElementTreerrˆrJÚduplicity.backendrrrrrÚduplicity.errorsrr r rÚregister_backendrrrrÚs"     Dp