
    |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GG$$[1MGG$$_5M%m.F.F}WYW]W]G].^.^ YZgYhhi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    .//ww(Hxww''Xue(LMww''
3(;(;L266<Q(R(R RS[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                  X5      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    1Q4r   )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Xr*++i,OT:[[u5
++i,++i,kk-4 RXX&96BB 5^ rww~~g..g& /7U WW\\/6:

J.*%LLN++O<	XQyk1GGLL> '',,zT)+=>
Gd+#(3XYx rww~~g..g& /7w  /w777>>"233#(5RSZR[3\]r rww~~g..g& /7m "$g~!FNN 2D:JCP# '#(3hiZ rww~~g..g& /7U ww||GX6H**//#C#.K  h% nn ${GL#%?? >>Q& #

 1 1'( 1 KI',9OPY{7[\ &%H rww~~g..g& /7y ' & NNFH-T: 	F-tWcB	
 WW__%67
	C* ]F(:A>IK

:.==++DOOF4K4K "Z >Iww~~i00#**Irww7G7G	7R+ST	 / 0 ;)+')4	(GD!X		$!UW[\  ) , $",,.224
 rww~~g..g& /7  9 9 9 9 O &%` % X$MtUVWWX 	CKK>BB	C*    
		.4X
 	

 rww~~g..g&  /7
 rww~~g..g&  /7sv  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    
kk-4)+6ww~~m,,BGGNN=4Q4Q 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   /
Xr*RXX&96BB 5 
 WW\\/6:
ww~~j)) 
 	*%JJz*D==++v~Z6I77>>),,779%DNN "ll&44T]]CMMO!	  +$ 	2D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  XS'   [/        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\kk-4++i,OT:[[u5
++i,++i,kk-4+K8ww~~o..bggnn_6U6U 2;-@X rww~~g..g& /7M WW___5
'',,z\#hlln>V>V>X:Y9Z+[\
Gd+ 	FOT7;	
 #(3YZr rww~~g..g& /7q  /w7KK(48GGLL.AMww~~m,,FM49IJ#' FG'#(3ijR rww~~g..g& /7O WW\\';7Fww||GX6Hww~~f%%$7tDww~~h''jjoo''2$ (D)X$.. ${GL&)#C ~~*$'JJ$5$5gh$5$O	+0=VW`Va;bc *)4 rww~~g..g& /7% + *) @A 
 rww~~g..g& /7  9 9 9 ; *):    
		137X
 	

 rww~~g..g&  /7
 rww~~g..g&  /7s   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    " 	 	    !"::>>./gg&&rww||HeYP['\]Ogg&&'?@O"BJ
21
h_r   