o ­·@aã@sŽddlmZddlmZddlZddlZddlZddlZddl m Z ddlm Z m Z m Z Gdd„dejjƒZej de¡ejj dg¡dS) é)Úprint_function)ÚmapN)ÚInvalidBackendURL)ÚconfigÚtempdirÚutilc@sHeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dS)Ú RsyncBackendzÏConnect to remote store using rsync rsync backend contributed by Sebastian Wilhelmi rsyncd auth, alternate port support Copyright 2010 by Edgar Soldin c CsXtjj ||¡ |j}d}dtjvrtjd=| ¡r2| ¡\}}d||  d¡f|_ |r1d|}n-|r8|dnd}|j   d¡rLd||j   d ¡f|_ n d ||j   d ¡f|_ |j r_d |j }|j d d krm|j d 7_ |jr„| ¡r{|jtjd <n |jd|j |_ d|_| ¡}|r’|tjd<| ¡r™|}nd|tjf}tj}d||f|_dS)zrsyncBackend initializerÚÚ RSYNC_RSHz%s::%sz/:z --port=%sú:z//z%s/%sú/z%s%sz-p %séÿÿÿÿÚUSERú@FÚRSYNC_PASSWORDz-e 'ssh %s -oBatchMode=yes %s'z rsync %s %sN)Ú duplicityÚbackendÚBackendÚ__init__ÚhostnameÚosÚenvironÚ over_rsyncdÚget_rsync_pathÚlstripÚ url_stringÚpathÚ startswithÚportÚusernameÚ use_getpassÚ get_passwordrÚ ssh_optionsÚ rsync_optionsÚcmd) ÚselfÚ parsed_urlÚhostrrÚ host_stringÚpasswordÚ portOptionÚ rsyncOptions©r,úA/usr/lib/python3/dist-packages/duplicity/backends/rsyncbackend.pyr(sB   €   zRsyncBackend.__init__cCs|jj}t d|¡r dSdS)Nz::[^:]*$TF)r&rÚreÚsearch)r%Úurlr,r,r-r_s zRsyncBackend.over_rsyncdcCsD|jj}t d|¡}|r| d¡| d¡ d¡fStd| |¡ƒ‚)Nz(:\d+|)?::([^:]*)$éér z"Could not determine rsync path: %s)r&rr.r/ÚgrouprrÚmunge_password)r%r0Úmr,r,r-rfs ÿzRsyncBackend.get_rsync_pathcCs:t |¡}tj |j|¡}d|j|j|f}| |¡dS©Nz%s %s %s© rÚfsdecoderrÚjoinrr$Úuc_nameÚsubprocess_popen)r%Ú source_pathÚremote_filenameÚ remote_pathÚ commandliner,r,r-Ú_putnó zRsyncBackend._putcCs:t |¡}tj |j|¡}d|j||jf}| |¡dSr6r7)r%r=Ú local_pathr>r?r,r,r-Ú_gettrAzRsyncBackend._getcCsBdd„}d|j|jf}| |¡\}}}dd„t|| d¡ƒDƒS)NcSs,| ¡}t|ƒdkr|ddkr|dSdS)NéÚ.)ÚsplitÚlen)ÚstrÚliner,r,r-rF{sz!RsyncBackend._list..splitz%s %scSsg|] }|rt |¡‘qSr,)rÚfsencode)Ú.0Úxr,r,r-Ú ƒsz&RsyncBackend._list..Ú )r$rr;rrF)r%rFr?ÚresultÚstdoutÚstderrr,r,r-Ú_listzszRsyncBackend._listc Cs"|}g}| ¡D]}||vr| |¡q| |¡qt ¡}t ¡ ¡\}}|g}|D]4}t  |¡}t j   ||¡} | | ¡zt | dƒ} WntyTt||dYq+wt||d|  ¡q+| ¡d|j|||jf} | | ¡|D]}z t t j|¡Wquty‰Yquwt  |¡dS)NÚw)Úfilez0%s --recursive --delete --exclude-from=%s %s/ %s)rRÚremoveÚappendÚtempfileÚmkdtemprÚdefaultÚ mkstemp_filerr8rrr9ÚopenÚIsADirectoryErrorÚprintÚcloser$rr;Úignore_missingÚunlinkÚrmdir) r%Ú filename_listÚ delete_listÚdont_delete_listrTÚdirÚexcludeÚ exclude_nameÚ to_deleterÚfr?r,r,r-Ú _delete_list…sB       þ  ÿ  ÿzRsyncBackend._delete_listN) Ú__name__Ú __module__Ú __qualname__Ú__doc__rrrr@rCrRrjr,r,r,r-r!s7 rÚrsync)Ú __future__rÚbuiltinsrrr.rWÚduplicity.backendrÚduplicity.errorsrrrrrrrÚregister_backendÚ uses_netlocÚextendr,r,r,r-Ús