cT`ddlZddlZddlZddlZddlmZddlmZddlm Z ddl m Z ddl m Z ddlmZdd lmZd Zejejd eZejeZGd d ZGddZddZdeddfdZdeddfdZdS)N)TemporaryDirectory)helpers)plesk) FtpBackupBase)Flags) safe_move)scanz.restore-infected~c eZdZdZdZdZdS)FileDatacRtj||_tj|jrPtj|j}|j|_tj |j |_ dSd|_d|_ dSN) ospathabspathfilenameexistsstatst_sizesizerDateTime fromtimestampst_mtimemtime)selfrrs M/opt/imunify360/venv/lib/python3.11/site-packages/restore_infected/restore.py__init__zFileData.__init__sy11 7>>$- ( ( 74=))D DI )77 FFDJJJDIDJJJcV|j|j|jf|j|j|jfkSr)rrr)rothers r__eq__zFileData.__eq__s0 4:t}5 J K N:   rcLd|jj|jS)Nz <{0}({1})>)format __class____name__rrs r__repr__zFileData.__repr__&s""4>#:DMJJJrN)r& __module__ __qualname__rr"r(rrr r sF   KKKKKrr c2eZdZdZdZdZdZdZdZdS) InfectedListcDd|D|_||_||_dS)Nc,g|]}t|Sr+)r .0fs r z)InfectedList.__init__..,s111ahqkk111r)files restore_dir scan_func)rr4r5r6s rrzInfectedList.__init__+s*115111 &"rc*t|jSr)boolr4r's r__bool__zInfectedList.__bool__0DJrc*t|jSr)iterr4r's r__iter__zInfectedList.__iter__3r:rc |j||jfi|}|}||}||||S)V Return list of cured files. This files are removed from InfectedList )restorer5keysr6_build_cured_list)rbackup check_listkw check_map scan_liststill_infecteds rcheckzInfectedList.check6sZ#FN:t/?FF2FF NN$$  22%%iNKKKrc(Ktj}|dtj|j||jfi|d{V}|}||d{V}| |||S)r?N) asyncioget_event_looprun_in_executor functoolspartialr@r5rAr6rB)rrCrDrElooprFrGrHs r async_checkzInfectedList.async_checkAs%''..    D,<  @B          NN$$ #~~i88888888%%iNKKKrcht|t|z }g}|D]}|| |jt||fJ#t $r6t dfd|jD|_YwxYw|S)Nz)Skipping restoration of a changed file %sc*g|]}|jk |Sr+r)r1r2dsts rr3z2InfectedList._build_cured_list..]s%IIIAqzS7H7Ha7H7H7Hr)setr4remover append ValueErrorloggerwarning)rrFrGrHcured cured_listsrcrUs @rrBzInfectedList._build_cured_listRsI^!4!44  . .CC.C . !!(3--000!!3*----  J J J?JIIIIII  Js'A//=B/.B/N) r&r)r*rr9r=rIrQrBr+rrr-r-*st###        L L LLLL"rr-cxt} |r%tj|t}tj|dt |S#t$rY}tjt|dd |ddg}t||d}~wwxYw)NT)exist_ok)dirzThere is a file in place of {}z7Most probably it is done to prevent `restore` to be runz,Remove this file to be able to restore again) RESTORE_DIRrrjoinRESTORE_DIR_NAMEmakedirsrFileExistsErrorlinesepstrr$)tmp_dirr5emessages rprep_restore_dirrmcsK3  B',,w0@AAK K$////"k2222 ...*// FF  , 3 3K @ @ E : #   g&&A-.s=A B9 AB44B9.c t|}t||j|}|||} | pi} g} g} |jdd|i| d|dD]K} t jrt| tr%g} |D]} | |j }nk#t$rY*t$rStd| |t urtdYwxYw||kr| || rb|j| | fi|}|D]P\}} t'||| |,#t($r| |YMwxYw| |snM| d|D|| | fS) NrjuntilFasync_rjzHUnexpected end of file reached during processing backup: {}. Skipping...z5Plesk multivolume backups currently are not supportedcg|] }|j Sr+rTr0s rr3z$restore_infected..555!1:555rr+)rmr-name pre_backupsbackupsrDisableFtpBackups isinstancer file_datarFileNotFoundErrorEOFErrorrZr[r$rrXrIr PermissionErrorcloseextendcleanup)backendr4rpr6pre_restore_hookrjrEr5 infected_listargssuccessfailedrCrD infected_file backup_file restore_listr^rUs rrestore_infectedrvs#7333K  (8)DDM   ue , ,D :2DG F!'/(-w%%  " z&-'H'H   * + +M $..}/EFF $      &&,fVnne##NNO  ++   k * * * *  (.=.vzHHRHHL( ( (S(c3'''NN3''''''''MM#&&&&&'    E  MM55}555666 OO F?s+B  D,ADDE''F F c Kt|}t||j|}|||dd{V} | pi} g} g} t j} |jdd|i| d|dd{VD]} tjrt| tr%g}|D]i} | dtj | j|jd{V}n#t $rYIwxYw||krT||j|rh|j| |fi|d{V}|D]P\}} t'||| |,#t($r| |YMwxYw| |sn| d|D|d{V| | fS)NroT)rrrprqcg|] }|j Sr+rTr0s rr3z*async_restore_infected..rtrr+)rmr-rurvrKrLrwrrxryrrMrNrOrzrr{rXrQr r}r~rr)rr4rpr6rrjrEr5rrrrrPrCrDrrrr^rUs rasync_restore_infectedrs#7333K  (8)DDM$$UE$$?? ? ? ? ? ? ?D :2DG F  ! # #D'(,g##  " z&-'H'H   * + +M $($8$8%(-*@%% %     ++   k * * * *  (!:!: ""&(""L) ( (S(c3'''NN3''''''''MM#&&&&&'    E  MM55}555666 //   F?s$(9C"" C/.C/.EE65E6r)rKrNloggingrtempfilerrbrbackup_backendsrbackup_backends_librconfigr safe_fileopsr r rer expanduserrdrc getLoggerr&rZr r-rmrrr+rrrs ''''''""""""......######&g  c3C!D!DEE  8 $ $KKKKKKKK,66666666r3333,   <<<<D   ::::::r