§
    óÇãi–B  ã                   ó  — d dl mZmZmZmZmZmZmZ d dlm	Z	 d dl
mZmZ d dlmZ d dlZd dlZd dlZd dlZd dlmZ d dlZd dlZddlmZmZ dd	lmZ  ed
dg¬¦  «        ZdddddddœZ ej        ¦   «         Z G d„ de	¦  «        Z G d„ de	¦  «        Z  ed¦  «        Z!de"dee#         fd„Z$e %                    dej&        ¬¦  «         ee¦  «        fdedefd„¦   «         Z'e (                    de ¬¦  «         ee¦  «        fdefd„¦   «         Z)e (                    d¦  «         ee¦  «        fde"defd „¦   «         Z*e +                    d¦  «         ee¦  «        fde"defd!„¦   «         Z,e %                    d"¦  «         ed#¦  «         ee¦  «        fd$edefd%„¦   «         Z-e %                    d&¦  «         ee¦  «        fde"defd'„¦   «         Z.e (                    d(¦  «         ee¦  «        fdefd)„¦   «         Z/dS )*é    )Ú	APIRouterÚDependsÚHTTPExceptionÚstatusÚBackgroundTasksÚ
UploadFileÚFile)Ú	BaseModel)ÚListÚOptional)ÚPathN)Údatetimeé   )Úget_current_admin_userÚUser)r   z/api/admin/backupÚbackup)ÚprefixÚtagsF)Úis_restoringÚ
started_atÚfilenameÚmessageÚcompleted_atÚsuccessc                   óX   — e Zd ZU eed<   eed<   eed<   eed<   eed<   ee         ed<   dS )ÚBackupMetadatar   Úbackup_versionÚflyway_versionÚ
created_atÚbackup_size_bytesÚ
componentsN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__Úintr   © ó    ú/app/app/api/backup.pyr   r      sX   € € € € € € Ø€M€M�MØÐÐÑØÐÐÑØ€O€O�OØÐÐÑØ�S”	ÐÐÑÐÐr)   r   c                   ó&   — e Zd ZU ee         ed<   dS )ÚBackupListResponseÚbackupsN)r"   r#   r$   r   r   r&   r(   r)   r*   r,   r,   &   s#   € € € € € € Ø�.Ô!Ð!Ð!Ñ!Ð!Ð!r)   r,   ú/app/backupsr   Úreturnc                 ó‚  — 	 ddl }ddl}t          | z  }|                     ¦   «         sdS |                     ¦   «         5 } |j        |d¦  «        5 }d}|                     ¦   «         D ] }|j                             d¦  «        r|} nŒ!|s(t          d¦  «         	 ddd¦  «         ddd¦  «         dS | 
                    ||¬¦  «         ddd¦  «         n# 1 swxY w Y   d}t          j        |¦  «        D ]\  }	}
}d|v rt          |	¦  «        dz  } nŒ|st          d¦  «         	 ddd¦  «         dS t          |d¦  «        5 }t          j        |¦  «        cddd¦  «         cddd¦  «         S # 1 swxY w Y   	 ddd¦  «         dS # 1 swxY w Y   dS # t           $ r}t          d	|› �¦  «         Y d}~dS d}~ww xY w)
z%Extract metadata from backup archive.r   Nzr:gzúbackup_metadata.jsonz0Error: backup_metadata.json not found in archive)Úpathz6Error: backup_metadata.json not found after extractionÚrzError reading backup metadata: )ÚtarfileÚtempfileÚ
BACKUP_DIRÚexistsÚTemporaryDirectoryÚopenÚ
getmembersÚnameÚendswithÚprintÚextractÚosÚwalkr   ÚjsonÚloadÚ	Exception)r   r4   r5   Úbackup_pathÚtemp_dirÚtarÚmetadata_fileÚmemberÚmetadata_pathÚrootÚdirsÚfilesÚfÚes                 r*   Úget_backup_metadatarO   -   sG  € ð&ØˆˆˆØˆˆˆå  8Ñ+ˆØ×!Ò!Ñ#Ô#ð 	Ø�4à×(Ò(Ñ*Ô*ð 	$¨hØ�”˜k¨6Ñ2Ô2ð :°cà $�Ø!ŸnšnÑ.Ô.ð ð �FØ”{×+Ò+Ð,BÑCÔCð Ø(.˜Ø˜ðð %ð  ÝÐMÑNÔNÐNØð:ð :ð :ñ :ô :ð :ð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð —’˜M°�Ñ9Ô9Ð9ð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :ð !ˆMÝ%'¤W¨XÑ%6Ô%6ð ð Ñ!��d˜EØ)¨UÐ2Ð2Ý$(¨¡J¤JÐ1GÑ$G�MØ�Eð 3ð !ð ÝÐOÑPÔPÐPØð1	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$õ4 �m SÑ)Ô)ð $¨QÝ”y ‘|”|ð$ð $ð $ð $ñ $ô $ð $ð5	$ð 	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð4$ð $ð $ð $øøøð $ð $ð $ð $ð $ð5	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øõ8 ð ð ð ÝÐ3°Ð3Ð3Ñ4Ô4Ð4Øˆtˆtˆtˆtˆtøøøøðøøøs­   ‚&F ªF ¾F
ÁA
CÂF
Â%F Â2CÃ	F
ÃC	ÃF
ÃC	ÃA
F
Ä'F Ä4F
ÅE1ÅF
Å$F Å1E5	Å5F
Å8E5	Å9F
Å=F Æ
FÆF ÆFÆF Æ
F>Æ!F9Æ9F>z/create)Ústatus_codeÚbackground_tasksÚcurrent_userc              ƒ   óŽ  K  — 	 t                                dd¬¦  «         ddlm}m} d}	 t          j        d¦  «        }|rs ||¦  «        }|                     ¦   «         5 }|                      |d¦  «        ¦  «        }| 	                    ¦   «         }	|	r|	d         }ddd¦  «         n# 1 swxY w Y   n)# t          $ r}
t          d	|
› �¦  «         Y d}
~
nd}
~
ww xY wt          j        ¦   «                              d
¦  «        }d|› d�}t           |z  }ddl}|                     ¦   «         5 }t#          |¦  «        }g }	 |d|› d�z  }ddt          j        dd¦  «        dt          j        dd¦  «        dt          j        dd¦  «        dt%          |¦  «        g	}t
          j                             ¦   «         }t          j        dd¦  «        |d<   t+          j        ||d¬¦  «         |                     d¦  «         n)# t          $ r}
t          d|
› �¦  «         Y d}
~
nd}
~
ww xY w	 |d |› d!�z  }d"dt          j        d#d$¦  «        d%t          j        d&d$¦  «        d'g}t+          j        |d¬(¦  «         |                     d$¦  «         n)# t          $ r}
t          d)|
› �¦  «         Y d}
~
nd}
~
ww xY w	 |d*|› d�z  }t1          j        |d+¦  «        5 }t
          j                             d,¦  «        r|                     d,d-¬.¦  «         t
          j                             d/¦  «        r|                     d/d0¬.¦  «         ddd¦  «         n# 1 swxY w Y   |                     d1¦  «         n)# t          $ r}
t          d2|
› �¦  «         Y d}
~
nd}
~
ww xY w	 |d3|› d�z  }t1          j        |d+¦  «        5 }t
          j                             d4¦  «        r|                     d4d5¬.¦  «         t
          j                             d6¦  «        r|                     d6d7¬.¦  «         t
          j                             d8¦  «        r|                     d8d9¬.¦  «         ddd¦  «         n# 1 swxY w Y   |                     d:¦  «         n)# t          $ r}
t          d;|
› �¦  «         Y d}
~
nd}
~
ww xY wt1          j        |d+¦  «        5 }|                     d<¦  «        D ]2}|                     ¦   «         r|                     ||j        ¬.¦  «         Œ3d=|t          j        ¦   «                               ¦   «         ||                     ¦   «         r| !                    ¦   «         j"        ndd>œ}|d?z  }t3          |d@¦  «        5 }tG          j$        ||dA¬B¦  «         ddd¦  «         n# 1 swxY w Y   |                     |d?¬.¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   tK          |¦  «        }dC||dDœS # tL          $ r ‚ t          $ r0}
tM          tN          j(        dEt%          |
¦  «        › �¬F¦  «        ‚d}
~
ww xY w)GzCreate a manual backup.T©ÚparentsÚexist_okr   )Úcreate_engineÚtextÚunknownÚDATABASE_URLzNSELECT version FROM flyway_schema_history ORDER BY installed_rank DESC LIMIT 1NzError getting Flyway version: z%Y%m%d_%H%M%Szstreama-backup-ú.tar.gzÚpostgres_backup_z.sqlÚpg_dumpz-hÚPOSTGRES_HOSTÚpostgresz-UÚPOSTGRES_USERÚstreamaz-dÚPOSTGRES_DBÚstreama2026z-fÚPOSTGRES_PASSWORDÚstreamÚ
PGPASSWORD)ÚenvÚcheckÚ
postgresqlzPostgreSQL backup failed: Úredis_backup_z.rdbz	redis-cliÚ
REDIS_HOSTÚredisz-aÚREDIS_PASSWORDÚBGSAVE)rh   zRedis backup failed: Úcaddy_backup_zw:gzz/caddy_dataÚ
caddy_data)Úarcnamez/caddy_configÚcaddy_configÚcaddyzCaddy backup failed: Úconfig_backup_z	/app/.envz.envz/app/docker-compose.ymlzdocker-compose.ymlz
/app/nginxÚnginxÚconfigzConfig backup failed: Ú*z2.0)r   r   r   r!   r    r1   Úwr   )ÚindentzBackup created successfully)r   r   ÚmetadatazBackup creation failed: ©rP   Údetail))r6   ÚmkdirÚ
sqlalchemyrW   rX   r?   ÚgetenvÚconnectÚexecuteÚfetchonerC   r=   r   ÚnowÚstrftimer5   r8   r   r%   ÚenvironÚcopyÚ
subprocessÚrunÚappendr4   r9   r2   r7   ÚaddÚglobÚis_filer;   Ú	isoformatÚstatÚst_sizerA   ÚdumprO   r   r   ÚHTTP_500_INTERNAL_SERVER_ERROR)rQ   rR   rW   rX   r   Údb_urlÚengineÚconnÚresultÚrowrN   Ú	timestampÚbackup_filenamerD   r5   rE   Ú	temp_pathr!   Úsql_fileÚcmdrg   Úrdb_fileÚcaddy_backup_filerF   Úconfig_backup_fileÚfilerz   rI   rM   s                                r*   Úcreate_backupr    X   sà  è è € ð@
å×Ò °ÐÑ5Ô5Ð5ð 	3Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ø"ˆð
	8Ý”Y˜~Ñ.Ô.ˆFØð 0Ø&˜ vÑ.Ô.�Ø—^’^Ñ%Ô%ð 0¨Ø!Ÿ\š\¨$¨$Ð/ñ  +Aô  +Añ  Bô  B�FØ Ÿ/š/Ñ+Ô+�CØð 0Ø),¨Q¬˜ð	0ð 0ð 0ñ 0ô 0ð 0ð 0ð 0ð 0ð 0ð 0øøøð 0ð 0ð 0ð 0øøõ
 ð 	8ð 	8ð 	8ÝÐ6°1Ð6Ð6Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7øøøøð	8øøøõ ”L‘N”N×+Ò+¨OÑ<Ô<ˆ	Ø>¨IÐ>Ð>Ð>ˆÝ  ?Ñ2ˆð 	ˆˆˆØ×(Ò(Ñ*Ô*ð W	G¨hÝ˜X™œˆIØˆJð8Ø$Ð'I¸)Ð'IÐ'IÐ'IÑI�àØ�"œ) O°ZÑ@Ô@Ø�"œ) O°YÑ?Ô?Ø�"œ) M°=ÑAÔAØ�#˜h™-œ-ð�õ ”j—o’oÑ'Ô'�Ý$&¤IÐ.AÀ8Ñ$LÔ$L��LÑ!Ý”˜s¨°4Ð8Ñ8Ô8Ð8Ø×!Ò! ,Ñ/Ô/Ð/Ð/øÝð 8ð 8ð 8ÝÐ6°1Ð6Ð6Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7øøøøð8øøøð3Ø$Ð'F°yÐ'FÐ'FÐ'FÑF�ð
  Ø�"œ) L°'Ñ:Ô:Ø�"œ)Ð$4°gÑ>Ô>Øð	�õ ”˜s¨$Ð/Ñ/Ô/Ð/Ø×!Ò! 'Ñ*Ô*Ð*Ð*øÝð 3ð 3ð 3ÝÐ1¨aÐ1Ð1Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2øøøøð3øøøð3Ø$-Ð0RÀ	Ð0RÐ0RÐ0RÑ$RÐ!Ý”\Ð"3°VÑ<Ô<ð IÀå”w—~’~ mÑ4Ô4ð EØŸš °|˜ÑDÔDÐDå”w—~’~ oÑ6Ô6ð IØŸš ¸˜ÑHÔHÐHðIð Ið Iñ Iô Ið Ið Ið Ið Ið Ið Iøøøð Ið Ið Ið Ið ×!Ò! 'Ñ*Ô*Ð*Ð*øÝð 3ð 3ð 3ÝÐ1¨aÐ1Ð1Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2øøøøð3øøøð4Ø%.Ð1TÀ)Ð1TÐ1TÐ1TÑ%TÐ"Ý”\Ð"4°fÑ=Ô=ð ?ÀÝ”w—~’~ kÑ2Ô2ð =ØŸš °V˜Ñ<Ô<Ð<Ý”w—~’~Ð&?Ñ@Ô@ð YØŸšÐ 9ÐCW˜ÑXÔXÐXÝ”w—~’~ lÑ3Ô3ð ?ØŸš °g˜Ñ>Ô>Ð>ð?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?ð ×!Ò! (Ñ+Ô+Ð+Ð+øÝð 4ð 4ð 4ÝÐ2¨qÐ2Ð2Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3øøøøð4øøøõ ”˜k¨6Ñ2Ô2ð G°cà%ŸNšN¨3Ñ/Ô/ð 9ð 9�DØ—|’|‘~”~ð 9ØŸš ¨d¬i˜Ñ8Ô8Ð8øð ',Ø&4Ý"*¤,¡.¤.×":Ò":Ñ"<Ô"<Ø",ØGR×GYÒGYÑG[ÔG[Ð)b¨×)9Ò)9Ñ);Ô);Ô)CÐ)CÐabðð �ð !*Ð,BÑ B�Ý˜-¨Ñ-Ô-ð 5°Ý”I˜h¨°!Ð4Ñ4Ô4Ð4ð5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5à—’˜Ð/E�ÑFÔFÐFð'Gð Gð Gñ Gô Gð Gð Gð Gð Gð Gð Gøøøð Gð Gð Gð GðIW	Gð W	Gð W	Gñ W	Gô W	Gð W	Gð W	Gð W	Gð W	Gð W	Gð W	Gøøøð W	Gð W	Gð W	Gð W	Gõr ' Ñ7Ô7ˆð 5Ø'Ø ð
ð 
ð 	
øõ
 ð ð ð ØÝð 
ð 
ð 
ÝÝÔ=Ø6­c°!©f¬fÐ6Ð6ð
ñ 
ô 
ð 	
øøøøð
øøøsÆ  „&X  «5B5 Á =B)ÂB5 Â)B-Â-B5 Â0B-Â1B5 Â4X  Â5
CÂ?CÃX  ÃCÃAX  Ä,W Ä?B<G<Ç;W Ç<
H"ÈHÈW ÈH"È"W È&A"J	ÊW Ê	
J/ÊJ*Ê%W Ê*J/Ê/W Ê3M+ËA-M
Ì>M+Í
M	ÍM+ÍM	ÍM+Í*W Í+
NÍ5NÎW ÎNÎW ÎRÎ3B#Q"ÑRÑ"Q&	Ñ&RÑ)Q&	Ñ*RÒW Ò
R)ÒR$ÒW Ò$R)Ò)W ÓB6W	Õ7VÖW	ÖVÖW	Ö"VÖ#W	Ö=W ×	W	×W ×W	×W ×X  × W$×$X  ×'W$×(X  Ø YØ+X?Ø?YÚ )Úresponse_modelc              ƒ   óž  K  — 	 t                                ¦   «         st          g ¬¦  «        S g }t          t                                d¦  «        d¬¦  «        D ]©}t          |j        ¦  «        }|r‘|                     t          |j        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    d	d
¦  «        | 	                    dg ¦  «        ¬¦  «        ¦  «         Œªt          |¬¦  «        S # t          $ r0}t          t          j        dt          |¦  «        › �¬¦  «        ‚d}~ww xY w)zList all available backups.)r-   zstreama-backup-*.tar.gzT)Úreverser   rY   r   r   r    r   r!   )r   r   r   r   r    r!   zFailed to list backups: r{   N)r6   r7   r,   Úsortedr‹   rO   r;   r‰   r   ÚgetrC   r   r   r‘   r%   )rR   r-   Úbackup_filerz   rN   s        r*   Úlist_backupsr¨   á   s]  è è € ð

Ý× Ò Ñ"Ô"ð 	2Ý%¨bÐ1Ñ1Ô1Ð1àˆÝ!¥*§/¢/Ð2KÑ"LÔ"LÐVZÐ[Ñ[Ô[ð 
	ð 
	ˆKÝ*¨;Ô+;Ñ<Ô<ˆHØð Ø—’�~Ø(Ô-Ø#+§<¢<Ð0@À)Ñ#LÔ#LØ#+§<¢<Ð0@À)Ñ#LÔ#LØ'Ÿ|š|¨L¸)ÑDÔDØ&.§l¢lÐ3FÈÑ&JÔ&JØ'Ÿ|š|¨L¸"Ñ=Ô=ð ñ  ô  ñ ô ð øõ "¨'Ð2Ñ2Ô2Ð2øÝð 
ð 
ð 
ÝÝÔ=Ø6­c°!©f¬fÐ6Ð6ð
ñ 
ô 
ð 	
øøøøð
øøøs   „(D ­C$D Ä
EÄ+EÅEz/{filename}c              ƒ   ó0  K  — 	 t           | z  }|                     ¦   «         st          t          j        d¬¦  «        ‚ddlm}  ||d| ¬¦  «        S # t          $ r ‚ t          $ r0}t          t          j        dt          |¦  «        › �¬¦  «        ‚d}~ww xY w)	zDownload a backup file.úBackup file not foundr{   r   )ÚFileResponsezapplication/gzip)Ú
media_typer   zFailed to download backup: N)
r6   r7   r   r   ÚHTTP_404_NOT_FOUNDÚfastapi.responsesr«   rC   r‘   r%   )r   rR   rD   r«   rN   s        r*   Údownload_backupr¯   ÿ   sã   è è € ð
Ý  8Ñ+ˆØ×!Ò!Ñ#Ô#ð 	ÝÝ"Ô5Ø.ðñ ô ð ð
 	3Ð2Ð2Ð2Ð2Ð2Øˆ|ØØ)Øð
ñ 
ô 
ð 	
øõ
 ð ð ð ØÝð 
ð 
ð 
ÝÝÔ=Ø9µ°Q±´Ð9Ð9ð
ñ 
ô 
ð 	
øøøøð
øøøs   „AA ÁBÁ%+BÂBc              ƒ   ó8  K  — 	 t           | z  }|                     ¦   «         st          t          j        d¬¦  «        ‚|                     ¦   «          ddiS # t          $ r ‚ t          $ r0}t          t          j        dt          |¦  «        › �¬¦  «        ‚d}~ww xY w)zDelete a backup file.rª   r{   r   zBackup deleted successfullyzFailed to delete backup: N)	r6   r7   r   r   r­   ÚunlinkrC   r‘   r%   )r   rR   rD   rN   s       r*   Údelete_backupr²     sË   è è € ð
Ý  8Ñ+ˆØ×!Ò!Ñ#Ô#ð 	ÝÝ"Ô5Ø.ðñ ô ð ð
 	×ÒÑÔÐØÐ8Ð9Ð9øÝð ð ð ØÝð 
ð 
ð 
ÝÝÔ=Ø7­s°1©v¬vÐ7Ð7ð
ñ 
ô 
ð 	
øøøøð
øøøs   „AA ÁBÁ)+BÂBz/upload.rŸ   c              ƒ   óø  K  — 	 t                                dd¬¦  «         | j                             d¦  «        st	          t
          j        d¬¦  «        ‚t           | j        z  }|                     d¦  «        5 }t          j	        | j
        |¦  «         ddd¦  «         n# 1 swxY w Y   d| j        d	œS # t          $ r ‚ t          $ r0}t	          t
          j        d
t          |¦  «        › �¬¦  «        ‚d}~ww xY w)zUpload a backup file.TrT   r[   zOnly .tar.gz files are allowedr{   ÚwbNzBackup uploaded successfully)r   r   zFailed to upload backup: )r6   r}   r   r<   r   r   ÚHTTP_400_BAD_REQUESTr9   ÚshutilÚcopyfileobjrŸ   rC   r‘   r%   )rŸ   rR   rD   ÚbufferrN   s        r*   Úupload_backupr¹   5  sd  è è € ð
å×Ò °ÐÑ5Ô5Ð5ð Œ}×%Ò% iÑ0Ô0ð 	ÝÝ"Ô7Ø7ðñ ô ð õ ! 4¤=Ñ0ˆØ×Ò˜dÑ#Ô#ð 	2 vÝÔ˜tœy¨&Ñ1Ô1Ð1ð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2ð 6Øœð
ð 
ð 	
øõ ð ð ð ØÝð 
ð 
ð 
ÝÝÔ=Ø7­s°1©v¬vÐ7Ð7ð
ñ 
ô 
ð 	
øøøøð
øøøs<   „A5B5 Á9B ÂB5 Â B$Â$B5 Â'B$Â(B5 Â5C9Ã	+C4Ã4C9z/restore/{filename}c              ƒ   ót  ‡ K  — 	 t          d‰ › �¦  «         t          ‰ z  }|                     ¦   «         s-t          d|› �¦  «         t          t          j        d¬¦  «        ‚t          5  t          d         rt          t          j        d¬¦  «        ‚dt          d<   t          j
        ¦   «                              ¦   «         t          d<   ‰ t          d	<   d
t          d<   dt          d<   dt          d<   ddd¦  «         n# 1 swxY w Y   t          d¦  «         t          dt          d         › �¦  «         ˆ fd„}t          j        |¬¦  «        }|                     ¦   «          d‰ t          d         dœS # t          $ r ‚ t          $ r0}t          t          j        dt#          |¦  «        › �¬¦  «        ‚d}~ww xY w)zRestore from a backup file.z[API] Restore requested for: z[API] Backup file not found: rª   r{   r   zRestore already in progressTr   r   zRestore in progressr   Nr   r   z6[API] Starting restore process in background thread...z[API] Restore started at: c                  ó–  •— 	 t           j                             ¦   «         } d| d<   t          j        dd¦  «        | d<   t          j        dd¦  «        | d<   t          j        dd¦  «        | d<   t          j        d	d
¦  «        | d	<   t          j        dd
¦  «        | d<   t          j        dd¦  «        | d<   t          j        dd¦  «        | d<   t          j        dd¦  «        | d<   t	          d¦  «         t          j        dd‰gddd| ¬¦  «        }t	          d|j        › �¦  «         t	          d|j        › �¦  «         |j	        rt	          d|j	        › �¦  «         t          5  dt          d<   t          j        ¦   «                              ¦   «         t          d<   |j        dk    t          d<   |j        dk    rdn	d |j	        › �t          d!<   d"d"d"¦  «         n# 1 swxY w Y   t	          d#t          d         › �¦  «         t	          d$t          d         › �¦  «         d"S # t          $ r�}t	          d%|› �¦  «         t          5  dt          d<   t          j        ¦   «                              ¦   «         t          d<   dt          d<   d t!          |¦  «        › �t          d!<   d"d"d"¦  «         n# 1 swxY w Y   Y d"}~d"S Y d"}~d"S d"}~ww xY w)&z(Run restore script in background thread.r.   r6   r^   r_   ÚPOSTGRES_PORTÚ5432rb   rc   r`   ra   rd   rk   rl   Ú
REDIS_PORTÚ6379rm   z![API] Executing restore script...Úpython3z/app/scripts/restore.pyTz/app)Úcapture_outputrX   Úcwdrg   z1[API] Restore script completed with return code: z[API] Restore stdout: z[API] Restore stderr: Fr   r   r   r   zRestore completed successfullyzRestore failed: r   Nz[API] Restore completed at: z[API] Restore success: z![API] Background restore failed: )r?   r…   r†   r   r=   r‡   rˆ   Ú
returncodeÚstdoutÚstderrÚrestore_lockÚrestore_statusr   rƒ   r�   rC   r%   )rg   r•   rN   r   s      €r*   Úrun_restorez#restore_backup.<locals>.run_restore{  sÈ  ø€ ð*LÝ”j—o’oÑ'Ô'�Ø$2��LÑ!Ý')¤y°À*Ñ'MÔ'M��OÑ$Ý')¤y°À&Ñ'IÔ'I��OÑ$Ý%'¤Y¨}¸mÑ%LÔ%L��MÑ"Ý')¤y°À)Ñ'LÔ'L��OÑ$Ý+-¬9Ð5HÈ)Ñ+TÔ+T�Ð'Ñ(Ý$&¤I¨l¸GÑ$DÔ$D��LÑ!Ý$&¤I¨l¸FÑ$CÔ$C��LÑ!Ý(*¬	Ð2BÀGÑ(LÔ(L�Ð$Ñ%åÐ:Ñ;Ô;Ð;Ý#œØÐ 9¸8ÐDØ#'ØØØðñ ô �õ Ð]È&ÔJ[Ð]Ð]Ñ^Ô^Ð^ÝÐ>¨v¬}Ð>Ð>Ñ?Ô?Ð?Ø”=ð DÝÐB°6´=ÐBÐBÑCÔCÐCõ "ð Sð SØ5:•N >Ñ2Ý5=´\±^´^×5MÒ5MÑ5OÔ5O•N >Ñ2Ø06Ô0AÀQÒ0F•N 9Ñ-ØTZÔTeÐijÒTjÐTjÐ0PÐ0Pð  qSð  DJô  DQð  qSð  qS•N 9Ñ-ð	Sð Sð Sñ Sô Sð Sð Sð Sð Sð Sð Søøøð Sð Sð Sð Sõ ÐUµ^ÀNÔ5SÐUÐUÑVÔVÐVÝÐKµ¸yÔ0IÐKÐKÑLÔLÐLÐLÐLøåð Lð Lð LÝÐ=¸!Ð=Ð=Ñ>Ô>Ð>Ý!ð Lð LØ5:•N >Ñ2Ý5=´\±^´^×5MÒ5MÑ5OÔ5O•N >Ñ2Ø05•N 9Ñ-Ø0KÅ3ÀqÁ6Ä6Ð0KÐ0K•N 9Ñ-ð	Lð Lð Lñ Lô Lð Lð Lð Lð Lð Lð Løøøð Lð Lð Lð Lð Lð Lð Lð Lð Lð Lð Lð Lð Lð Lð Lð LøøøøðLøøøsb   ƒE!H! Å$A*GÇH! ÇGÇH! Ç!GÇ"=H! È!
KÈ+KÉAJ,Ê KÊ,J0	Ê0KÊ3J0	Ê4KËK)ÚtargetzARestore started in background. System is now in maintenance mode.)r   r   r   zRestore failed to start: )r=   r6   r7   r   r   r­   rÆ   rÇ   ÚHTTP_409_CONFLICTr   rƒ   r�   Ú	threadingÚThreadÚstartrC   r‘   r%   )r   rR   rD   rÈ   ÚthreadrN   s   `     r*   Úrestore_backuprÏ   X  sE  øè è € ðY
ÝÐ8¨hÐ8Ð8Ñ9Ô9Ð9Ý  8Ñ+ˆØ×!Ò!Ñ#Ô#ð 	ÝÐ?°+Ð?Ð?Ñ@Ô@Ð@ÝÝ"Ô5Ø.ðñ ô ð õ ð 	-ð 	-Ý˜nÔ-ð Ý#Ý &Ô 8Ø8ðñ ô ð ð .2�N˜>Ñ*Ý+3¬<©>¬>×+CÒ+CÑ+EÔ+E�N˜<Ñ(Ø)1�N˜:Ñ&Ø(=�N˜9Ñ%Ø-1�N˜>Ñ*Ø(,�N˜9Ñ%ð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-õ 	ÐGÑHÔHÐHÝÐI­>¸,Ô+GÐIÐIÑJÔJÐJð,	Lð ,	Lð ,	Lð ,	Lð ,	Lõ\ Ô!¨Ð5Ñ5Ô5ˆØ�Š‰Œˆð [Ø Ý(¨Ô6ð
ð 
ð 	
øõ
 ð ð ð ØÝð 
ð 
ð 
ÝÝÔ=Ø7­s°1©v¬vÐ7Ð7ð
ñ 
ô 
ð 	
øøøøð
øøøs>   …A$E3 Á)BC=Ã1E3 Ã=DÄE3 ÄDÄA-E3 Å3F7Æ+F2Æ2F7z/restore/statusc              ƒ   óV   K  — t           5  t          cddd¦  «         S # 1 swxY w Y   dS )zGet current restore status.N)rÆ   rÇ   )rR   s    r*   Úget_restore_statusrÑ   º  su   è è € õ
 
ð ð Ýðð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s   Šž"¥")0Úfastapir   r   r   r   r   r   r	   Úpydanticr
   Útypingr   r   Úpathlibr   r?   r‡   rA   r4   r   r¶   rË   Úauthr   r   Úmodels.userÚ	UserModelÚrouterrÇ   ÚLockrÆ   r   r,   r6   r%   ÚdictrO   ÚpostÚHTTP_201_CREATEDr    r¦   r¨   r¯   Údeleter²   r¹   rÏ   rÑ   r(   r)   r*   ú<module>rß      s  ðØ `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø +Ð +Ð +Ð +Ð +Ð +à	ˆÐ-°X°JÐ	?Ñ	?Ô	?€ð ØØØØØðð €ð ˆyŒ~ÑÔ€ðð ð ð ð �Yñ ô ð ð"ð "ð "ð "ð "˜ñ "ô "ð "ð ˆT�.Ñ!Ô!€
ð( #ð (¨(°4¬.ð (ð (ð (ð (ðV ‡‚ˆY FÔ$;€Ñ<Ô<ð &˜gÐ&<Ñ=Ô=ðE
ð E
Ø%ðE
àðE
ð E
ð E
ñ =Ô<ðE
ðP ‡‚ˆBÐ1€Ñ2Ô2à%˜gÐ&<Ñ=Ô=ð
ð 
Øð
ð 
ð 
ñ 3Ô2ð
ð: ‡‚ˆMÑÔð &˜gÐ&<Ñ=Ô=ð
ð 
Øð
àð
ð 
ð 
ñ Ôð
ð8 ‡‚ˆ}ÑÔð &˜gÐ&<Ñ=Ô=ð
ð 
Øð
àð
ð 
ð 
ñ Ôð
ð0 ‡‚ˆYÑÔà�t˜C‘y”yØ%˜gÐ&<Ñ=Ô=ð
ð 
Ø
ð
àð
ð 
ð 
ñ Ôð
ðD ‡‚Ð"Ñ#Ô#ð &˜gÐ&<Ñ=Ô=ð^
ð ^
Øð^
àð^
ð ^
ð ^
ñ $Ô#ð^
ðB ‡‚ÐÑÔà%˜gÐ&<Ñ=Ô=ðð Øðð ð ñ Ôðð ð r)   