o @a@sddlmZddlmZddlZddlZddlZddlZddl m Z ddlm Z m Z m Z GdddejjZejdeejjdgdS) )print_function)mapN)InvalidBackendURL)configtempdirutilc@sHeZdZdZddZddZddZdd Zd d Zd d Z ddZ dS) RsyncBackendzConnect 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|| df|_ |r1d|}n-|r8|dnd}|j drLd||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 %sUSER@FRSYNC_PASSWORDz-e 'ssh %s -oBatchMode=yes %s'z rsync %s %sN) duplicitybackendBackend__init__hostnameosenviron over_rsyncdget_rsync_pathlstrip url_stringpath startswithportusername use_getpass get_passwordr ssh_options rsync_optionscmd) self parsed_urlhostrr host_stringpassword portOption rsyncOptionsr,A/usr/lib/python3/dist-packages/duplicity/backends/rsyncbackend.pyr(sB      zRsyncBackend.__init__cCs|jj}td|r dSdS)Nz::[^:]*$TF)r&rresearch)r%urlr,r,r-r_s zRsyncBackend.over_rsyncdcCsD|jj}td|}|r|d|ddfStd||)Nz(:\d+|)?::([^:]*)$r z"Could not determine rsync path: %s)r&rr.r/grouprrmunge_password)r%r0mr,r,r-rfs zRsyncBackend.get_rsync_pathcCs:t|}tj|j|}d|j|j|f}||dSNz%s %s %s rfsdecoderrjoinrr$uc_namesubprocess_popen)r% source_pathremote_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}||\}}}ddt||dDS)NcSs,|}t|dkr|ddkr|dSdS)N.)splitlen)strliner,r,r-rF{sz!RsyncBackend._list..splitz%s %scSsg|] }|rt|qSr,)rfsencode).0xr,r,r- sz&RsyncBackend._list.. )r$rr;rrF)r%rFr?resultstdoutstderrr,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 tt j|WqutyYquwt |dS)Nw)filez0%s --recursive --delete --exclude-from=%s %s/ %s)rRremoveappendtempfilemkdtemprdefault mkstemp_filerr8rrr9openIsADirectoryErrorprintcloser$rr;ignore_missingunlinkrmdir) r% filename_list delete_listdont_delete_listrTdirexclude exclude_name to_deleterfr?r,r,r- _delete_listsB           zRsyncBackend._delete_listN) __name__ __module__ __qualname____doc__rrrr@rCrRrjr,r,r,r-r!s7 rrsync) __future__rbuiltinsrrr.rWduplicity.backendrduplicity.errorsrrrrrrrregister_backend uses_netlocextendr,r,r,r-s