ó
    |sIj51  ã                  ó~  • S SK Jr  S SKrS SKrS SKrS SKrS SKJr  S SKJr  \" S5      r	\R                  R                  S5      r\(       a8  \R                  R                  \R                  R                  \SSS	5      5      rO\R                  R                  S
5      rSS jrSS jrSS jrSS jrSS jrSS jrg)é    )ÚannotationsN)Údatetime)Ú
get_loggerzactions.backupÚWOLFPANEL_DEV_HOMEÚvarÚbackupsÚ	wolfpanelz/var/backups/wolfpanelc                ó$  • U (       d  [        S5      e[        R                  R                  U 5      n[        R                  R                  [        5      nX:w  a6  UR                  U[        R                  -   5      (       d  [        SU S35      eU$ )z?Ensure the path is strictly within the allowed BACKUP_BASE_DIR.zbackup_path is requiredz9Access denied: Path is outside of backup base directory (Ú))Ú
ValueErrorÚosÚpathÚrealpathÚBACKUP_BASE_DIRÚ
startswithÚsepÚPermissionError)Úbackup_pathÚresolved_pathÚbase_resolveds      Ú8D:\Programs\laragon\www\wolf\agent\src\actions\backup.pyÚ_verify_safe_pathr      sy   € æÜÐ2Ó3Ð3ä—G‘G×$Ñ$ [Ó1€MÜ—G‘G×$Ñ$¤_Ó5€MàÓ%¨m×.FÑ.FÀ}ÔWY×W]ÑW]ÑG]×.^Ñ.^ÜÐ YÐZgÐYhÐhiÐjÓkÐkàÐó    c                ó¸  • U (       d  [        S5      e[        R                  R                  U 5      n[        (       aC  [        R                  R                  [        R                  R                  [        SS5      5      nO[        R                  R                  S5      nX:w  a6  UR                  U[        R                  -   5      (       d  [        SU S35      eU$ )zTEnsure the docroot is strictly inside allowed folders (like var/www or dev var/www).zdocroot is requiredr   Úwwwz/var/wwwz2Access denied: Docroot is outside allowed folder (r   )	r   r   r   r   ÚDEV_HOMEÚjoinr   r   r   )ÚdocrootÚresolvedÚallowed_bases      r   Ú_verify_docrootr!   !   sŸ   € æÜÐ.Ó/Ð/ä�w‰w×Ñ Ó(€Hß‚xÜ—w‘w×'Ñ'¬¯©¯©´X¸uÀeÓ(LÓM‰ä—w‘w×'Ñ'¨
Ó3ˆàÓ¨×(;Ñ(;¸LÌ2Ï6É6Ñ<Q×(RÑ(RÜÐ RÐS[ÐR\Ð\]Ð^Ó_Ð_à€Or   c           	     óÆ  • Sn U R                  SS5      nU R                  SS5      nU R                  SS5      nU R                  SS5      nU R                  S	S5      nU R                  S
S5      nU R                  SS5      nU(       a  [        R                  " SU5      (       dI  SSS.U(       a=  [        R                  R                  U5      (       a   [        R                  " U5        $ $ $ [        R                  R                  [        U5      n	[        R                  " U	SS9  [        U	5        [        R                  " 5       R                  S5      n
U SU
 S3n[        R                  R                  X›5      n[        R                  R                  U	SU
 35      n[        R                  " USS9  U(       Ga  U(       dI  SSS.U(       a=  [        R                  R                  U5      (       a   [        R                  " U5        $ $ $ [!        U5      n[        R                  R                  U5      (       dL  SSU 3S.U(       a=  [        R                  R                  U5      (       a   [        R                  " U5        $ $ $ [        R                  R                  US5      n["        R$                  " SSUSUS/SSS9  U(       Gay  U(       a  U(       dI  SSS.U(       a=  [        R                  R                  U5      (       a   [        R                  " U5        $ $ $ [        R                  R                  US5      n[        R&                  R)                  5       nU(       a  UUS'   [+        US5       n["        R$                  " S S!US"S#U/UU["        R,                  SS$9nUR.                  S%:w  ao  UR0                  R3                  S&S'S(9nSS)U 3S.sSSS5        U(       a=  [        R                  R                  U5      (       a   [        R                  " U5        $ $ $  SSS5        ["        R$                  " S*U/SS+9  ["        R$                  " SSUSUS/SSS9  [        R                  R5                  U5      n S%S,KJn  U" 5       n[;        US-S.5      n/ n[        R<                  " U	5       H©  nUR?                  S5      (       d  M  URA                  S5      (       a  M3  [        R                  R                  U	U5      n[        R                  RC                  U5      (       d  My  URE                  U[        R                  RG                  U5      45        M«     URI                  S/ S09  [K        U5      U:”  a?  USU*  nU H3  u  nn [        RL                  " U5        [N        RQ                  S1U5        M5     SUUU[        R                  " 5       RU                  5       S4.U(       a=  [        R                  R                  U5      (       a   [        R                  " U5        $ $ $ ! [         a     $ f = f! [         a     $ f = f! [         a     $ f = f! [         a     $ f = f! [         a     $ f = f! , (       d  f       GN\= f! [         a#  n[N        RS                  S2UU5         SnAGM.  SnAff = f! [         a!  n[N        RS                  S3U5         SnAGN%SnAff = f! [         a     $ f = f! [         a‚  n[N        RW                  S5U5        S[Y        U5      S.s SnAU(       aM  [        R                  R                  U5      (       a(   [        R                  " U5        $ ! [         a     $ f = f$ $ SnAff = f! U(       aM  [        R                  R                  U5      (       a(   [        R                  " U5        f ! [         a     f f = ff f = f)6z:Create a backup of website files and/or database securely.NÚdomainÚ r   Úinclude_filesTÚ
include_dbFÚdb_nameÚdb_userÚdb_passwordú^[a-zA-Z0-9.-]+$úInvalid domain name format©ÚsuccessÚerror©Úexist_okz%Y%m%d_%H%M%SÚ_ú.tar.gzÚtmp_z#docroot is required to backup fileszdocroot directory not found: úfiles.tar.gzÚtarz-czfú-CÚ.©Úcapture_outputÚcheckz3db_name and db_user are required to backup databaseúdb.sqlÚ	MYSQL_PWDÚwbÚ	mysqldumpú-uú-hú	127.0.0.1)ÚenvÚstdoutÚstderrr:   r   úutf-8Úignore©ÚerrorszDatabase dump failed: Úgzip©r:   )Úload_configÚbackup_retentioné   c                ó   • U S   $ )Né   © ©Úxs    r   Ú<lambda>Ú&handle_backup_create.<locals>.<lambda>“   s   € ¨1¨Qª4r   )Úkeyz2Deleted old backup file according to retention: %sz'Failed to delete old backup file %s: %sz$Failed to apply backup retention: %s)r-   r   ÚfilenameÚ
size_bytesÚ
created_atzBackup creation failed: %s)-ÚgetÚreÚmatchr   r   ÚexistsÚshutilÚrmtreeÚ	Exceptionr   r   Úmakedirsr   r   ÚnowÚstrftimer!   Ú
subprocessÚrunÚenvironÚcopyÚopenÚPIPEÚ
returncoderD   ÚdecodeÚgetsizeÚconfigrK   ÚgetattrÚlistdirÚendswithr   ÚisfileÚappendÚgetmtimeÚsortÚlenÚremoveÚlogÚinfoÚwarningÚ	isoformatr.   Ústr) ÚpayloadÚtmp_dirr#   r   r%   r&   r'   r(   r)   Ú
backup_dirÚ	timestamprV   Úfinal_backup_pathÚresolved_docrootÚfiles_archive_pathÚsql_pathrB   Úsql_fileÚresÚ	error_msgrW   rK   rl   Ú	retentionÚall_backupsÚnameÚ	full_pathÚ	to_deleter   r1   ÚeÚexcs                                    r   Úhandle_backup_creater�   2   s�  € à€GðØ—‘˜X rÓ*ˆØ—+‘+˜i¨Ó,ˆØŸ™ O°TÓ:ˆØ—[‘[ ¨uÓ5ˆ
à—+‘+˜i¨Ó,ˆØ—+‘+˜i¨Ó,ˆØ—k‘k -°Ó4ˆö œRŸXšXÐ&9¸6×BÑBà Ø5ñö^ ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&ð /ˆ7ôU —W‘W—\‘\¤/°6Ó:ˆ
Ü
�Š�J¨Ò.Ü˜*Ô%ä—L’L“N×+Ñ+¨OÓ<ˆ	Ø�X˜Q˜y˜k¨Ð1ˆÜŸG™GŸL™L¨Ó>Ðô —'‘'—,‘,˜z¨T°)°Ð+=Ó>ˆÜ
�Š�G dÒ+çÞØ#(Ð3XÑYöx ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&ð /ˆ7ôw  /¨wÓ7ÐÜ—7‘7—>‘>Ð"2×3Ñ3Ø#(Ð5RÐSZÐR[Ð3\Ñ]ör ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&ð /ˆ7ôm "$§¡§¡¨g°~Ó!FÐÜ�NŠNØ˜Ð 2°DÐ:JÈCÐPØ#Øò÷ Þ¦'Ø#(Ð3hÑiöZ ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&ð /ˆ7ôU —w‘w—|‘| G¨XÓ6ˆHÜ—*‘*—/‘/Ó#ˆCÞØ#.��KÑ ô �h Ô%¨Ü —n’nØ  $¨°°{ÀGÐLØØ#Ü%Ÿ?™?Øñ�ð —>‘> QÓ&Ø #§
¡
× 1Ñ 1°'À(Ð 1Ð K�IØ',Ð9OÐPYÈ{Ð7[Ñ\÷ &Ð%öH ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&ð /ˆ7ðy '÷ &ô �NŠN˜F HÐ-°TÒ:ô 	�ŠØ�FÐ-¨t°W¸cÐBØØò	
ô —W‘W—_‘_Ð%6Ó7ˆ
ð	CÝ*Ù “]ˆFÜ Ð(:¸AÓ>ˆIàˆKÜŸ
š
 :Ö.�Ø—=‘= ×+Ó+°D·O±OÀF×4KÓ4KÜ "§¡§¡¨Z¸Ó >�IÜ—w‘w—~‘~ i×0Ó0Ø#×*Ñ*¨I´r·w±w×7GÑ7GÈ	Ó7RÐ+SÖTñ	 /ð ×Ñ¡ÐÑ0ô �;Ó )Ó+Ø'¨¨)¨Ð4�	Û(‘G�D˜!ðXÜŸ	š	 $œÜŸ™Ð!UÐW[Ö\ñ  )ð Ø,Ø Ø$Ü"Ÿ,š,›.×2Ñ2Ó4ñ
ö ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&ð /ˆ7øô ó Ùðû”9ó Ùðû”9ó Ùðû”9ó Ùðû”9ó Ùðú÷O &Ö%ûô` %ó XÜŸ™Ð$MÈtÐUV×WÓWûðXûäó 	CÜ�K‰KÐ>À×BÒBûð	Cûô* ó Ùðûô ó 
Ü�	‰	Ð.°Ô4àÜ˜“Xñ
ô 	
ö
 ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&øÜó Ùðúð /ˆ7ûð
ûö ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&øÜó Ùðúð /ˆ7úsv  „B%[; ÃX+Ã.C[; Ç4X;È6[; É/YÊA[; Ì
YÌ#A[; Í9AY;Ï	[; ÐY+Ð&A[; ÒA	Z= ÓZ= Ó&AZ= Ô,A!Z= Ö,ZÖ:Z= Ö>([; Ø[+Ø+
X8Ø7X8Ø;
YÙYÙ
YÙYÙ
Y(Ù'Y(Ù+
Y8Ù7Y8Ù;
Z
Ú[; Ú
Z:ÚZ5Ú.Z= Ú5Z:Ú:Z= Ú=
[(Û[#Û[; Û#[(Û([; Û+
[8Û7[8Û;
^Ü#^Ü(^Ü)^
 Ý]0Ý0
]=Ý<]=Þ^Þ^
 Þ
,_ Þ7_ß_ ß
_ß_ ß_ß_ c                óŠ  •  U R                  SS5      n[        U5      n[        R                  R	                  U5      (       a$  [        R                  R                  U5      (       d  SSU 3S.$ [        R                  " U5        SSS.$ ! [         a.  n[        R                  SU5        S[        U5      S.s S	nA$ S	nAff = f)
z&Delete a backup archive file securely.r   r$   FúBackup file not found: r,   T)r-   ÚdeletedzBackup deletion failed: %sN)rY   r   r   r   r\   rp   ru   r_   rv   r.   rz   )r{   r   r   rŒ   s       r   Úhandle_backup_deleter‘   ·   s°   € ð
Ø—k‘k -°Ó4ˆÜ)¨+Ó6ˆä�w‰w�~‰~˜m×,Ñ,´B·G±G·N±NÀ=×4QÑ4Qà Ø2°;°-Ð@ñð ô
 	�	Š	�-Ô àØñ
ð 	
øô ó 
Ü�	‰	Ð.°Ô4àÜ˜“Xñ
õ 	
ûð
ús$   ‚A,B
 Á/B
 Â

CÂ#B=Â7CÂ=Cc                ó’  •  U R                  SS5      nU(       a  [        R                  " SU5      (       d  SSS.$ [        R                  R                  [        U5      n[        R                  R                  U5      (       d  S/ S.$ [        U5        / n[        R                  " U5       HÈ  nUR                  S	5      (       a  S
U;   a  M!  [        R                  R                  X$5      n[        R                  R                  U5      (       d  Mf  [        R                  " U5      nUR                  UUR                  [        R                   " UR"                  5      R%                  5       US.5        MÊ     UR'                  S SS9  SUS.$ ! [(         a.  n[*        R-                  SU5        S[/        U5      S.s SnA$ SnAff = f)z"List backup archives for a domain.r#   r$   r*   Fr+   r,   T)r-   r   r2   r3   )rV   rW   rX   r   c                ó   • U S   $ )NrX   rP   rQ   s    r   rS   Ú$handle_backup_list.<locals>.<lambda>ö   s   €  1 \¢?r   )rU   ÚreversezBackup listing failed: %sN)rY   rZ   r[   r   r   r   r   r\   r   rn   ro   rp   Ústatrq   Úst_sizer   ÚfromtimestampÚst_mtimery   rs   r_   rv   r.   rz   )r{   r#   r}   r   rˆ   r‰   r–   rŒ   s           r   Úhandle_backup_listrš   Ð   sw  € ð/
Ø—‘˜X rÓ*ˆÞœRŸXšXÐ&9¸6×BÑBà Ø5ñð ô
 —W‘W—\‘\¤/°6Ó:ˆ
Ü�w‰w�~‰~˜j×)Ñ)àØñð ô
 	˜*Ô%àˆÜ—J’J˜zÖ*ˆDØ—=‘= ×+Ñ+¨v¸«~ÙäŸ™Ÿ™ ZÓ6ˆIÜ—7‘7—>‘> )×,Ñ,Ùä—7’7˜9Ó%ˆDà�N‰NØ Ø"Ÿl™lÜ&×4Ò4°T·]±]ÓC×MÑMÓOØ!ñ	ö ñ +ð$ 	�‰Ñ2¸DˆÑAð Øñ
ð 	
øô ó 
Ü�	‰	Ð-¨sÔ3àÜ˜“Xñ
õ 	
ûð
ús*   ‚9F ¼AF Â	DF Æ
GÆ#GÆ;GÇGc           	     ót  • Sn U R                  SS5      nU R                  SS5      nU R                  SS5      nU R                  SS5      nU R                  S	S5      nU R                  S
S5      nU R                  SS5      n[        U5      n	[        R                  R	                  U	5      (       a$  [        R                  R                  U	5      (       dL  SSU 3S.U(       a=  [        R                  R	                  U5      (       a   [        R                  " U5        $ $ $ [        R                  R                  U	5      n
[        R                  R                  U
S[        [        R                  " 5       R                  5       5       35      n[        R                  " USS9  [         R"                  " SSU	SU/SSS9  U(       aå  U(       dI  SSS.U(       a=  [        R                  R	                  U5      (       a   [        R                  " U5        $ $ $ [%        U5      n[        R                  " USS9  [        R                  R                  US5      n[        R                  R	                  U5      (       a  [         R"                  " SSUSU/SSS9  O[&        R)                  S5        U(       Ga÷  U(       a  U(       dI  SSS.U(       a=  [        R                  R	                  U5      (       a   [        R                  " U5        $ $ $ [        R                  R                  US5      n[        R                  R                  US5      n[        R                  R	                  U5      (       a  [         R"                  " SSU/SS9  [        R                  R	                  U5      (       aë  [        R*                  R-                  5       nU(       a  X�S'   [/        US5       n[         R"                  " SS US!S"U/UU[         R0                  SS#9nUR2                  S$:w  ao  UR4                  R7                  S%S&S'9nSS(U 3S.sSSS5        U(       a=  [        R                  R	                  U5      (       a   [        R                  " U5        $ $ $  SSS5        O[&        R)                  S)5        SSS*.U(       a=  [        R                  R	                  U5      (       a   [        R                  " U5        $ $ $ ! [         a     $ f = f! [         a     $ f = f! [         a     $ f = f! [         a     $ f = f! , (       d  f       N—= f! [         a     $ f = f! [         a‚  n[&        R9                  S+U5        S[;        U5      S.s SnAU(       aM  [        R                  R	                  U5      (       a(   [        R                  " U5        $ ! [         a     $ f = f$ $ SnAff = f! U(       aM  [        R                  R	                  U5      (       a(   [        R                  " U5        f ! [         a     f f = ff f = f),z=Restore website files and/or database from a backup securely.Nr   r$   r   Úrestore_filesTÚ
restore_dbFr'   r(   r)   r�   r,   Úrestore_tmp_r/   r5   z-xzfr6   r8   z$docroot is required to restore filesr4   z(files.tar.gz not found in backup archivez4db_name and db_user are required to restore databasez	db.sql.gzr;   Úgunzipz-frJ   r<   ÚrbÚmysqlr?   r@   rA   )rB   ÚstdinrD   r:   r   rE   rF   rG   zDatabase restore failed: z"db.sql not found in backup archive)r-   ÚrestoredzBackup restoration failed: %s)rY   r   r   r   r\   rp   r]   r^   r_   Údirnamer   Úintr   ra   r~   r`   rc   rd   r!   rv   rx   re   rf   rg   rh   ri   rD   rj   r.   rz   )r{   r|   r   r   rœ   r�   r'   r(   r)   Úresolved_backupÚ
parent_dirr€   Úfiles_archiveÚsql_gzr‚   rB   rƒ   r„   r…   rŒ   s                       r   Úhandle_backup_restorerª     sõ  € à€Gð\Ø—k‘k -°Ó4ˆØ—+‘+˜i¨Ó,ˆØŸ™ O°TÓ:ˆØ—[‘[ ¨uÓ5ˆ
à—+‘+˜i¨Ó,ˆØ—+‘+˜i¨Ó,ˆØ—k‘k -°Ó4ˆä+¨KÓ8ˆÜ�w‰w�~‰~˜o×.Ñ.´b·g±g·n±nÀ_×6UÑ6Uà Ø2°;°-Ð@ñöX ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&ð /ˆ7ôM —W‘W—_‘_ _Ó5ˆ
Ü—'‘'—,‘,˜z¨\¼#¼h¿lºl»n×>VÑ>VÓ>XÓ:YÐ9ZÐ+[Ó\ˆÜ
�Š�G dÒ+ô 	�ŠØ�F˜O¨T°7Ð;ØØò	
ö ÞØ#(Ð3YÑZör ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&ð /ˆ7ôq  /¨wÓ7ÐÜ�KŠKÐ(°4Ò8äŸG™GŸL™L¨°.ÓAˆMÜ�w‰w�~‰~˜m×,Ñ,Ü—’Ø˜F M°4Ð9IÐJØ#'Øóô —‘ÐFÔGçÞ¦'Ø#(Ð3iÑjöR ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&ð /ˆ7ôO —W‘W—\‘\ '¨;Ó7ˆFÜ—w‘w—|‘| G¨XÓ6ˆHä�w‰w�~‰~˜f×%Ñ%ä—’ ¨$°Ð7¸tÒDä�w‰w�~‰~˜h×'Ñ'Ü—j‘j—o‘oÓ'�ÞØ'2˜Ñ$ô ˜( DÔ)¨XÜ$Ÿ.š.Ø  $¨°°{ÀGÐLØØ&Ü)Ÿ™Ø#ñ�Cð —~‘~¨Ó*Ø$'§J¡J×$5Ñ$5°gÀhÐ$5Ð$O˜	Ø+0Ð=VÐW`ÐVaÐ;bÑc÷ *Ð)ö4 ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&ð /ˆ7ð% +÷ *Ð)ô —‘Ð@ÔAð Øñ
ö ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&ð /ˆ7øô ó Ùðû”9ó Ùðû”9ó Ùðû”9ó Ùðú÷; *Õ)ûô: ó Ùðûô ó 
Ü�	‰	Ð1°3Ô7àÜ˜“Xñ
ô 	
ö
 ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&øÜó Ùðúð /ˆ7ûð
ûö ”r—w‘w—~‘~ g×.Ñ.ðÜ—’˜gÕ&øÜó Ùðúð /ˆ7úsô   „CU ÄS1Ä!B.U Ç;TÈB/U Ë/TÌCU ÏAT1Ð;	U Ñ0T!Ò
"U ÓUÓ1
S>Ó=S>Ô
TÔTÔ
TÔTÔ!
T.Ô-T.Ô1
T?Ô;U Õ
UÕUÕ
WÕ#WÕ?WÖ W! Ö0W×
W×W×W×W! ×!,X7ØX%Ø$X7Ø%
X2Ø/X7Ø1X2Ø2X7)r   rz   Úreturnrz   )r   rz   r«   rz   )r{   Údictr«   r¬   )Ú
__future__r   r   rZ   r]   rc   r   Úloggerr   rv   re   rY   r   r   r   r   r   r   r!   r�   r‘   rš   rª   rP   r   r   Ú<module>r¯      sš   ðÝ "ã 	Û 	Û Û Ý Ý áÐ!Ó"€à�:‰:�>‰>Ð.Ó/€ÞØ—g‘g×&Ñ& r§w¡w§|¡|°H¸eÀYÐP[Ó'\Ó]�Oà—g‘g×&Ñ&Ð'?Ó@€Oôôô"BôJ
ô21
õh_r   