ó
    øÞ jœ_  ã                   ó^  • S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKrS SKrS SKJr  \R                   " 5       R"                  r\S:X  a  S rOS rS rSS jrSS jr " S	 S
\5      r " S S5      r " S S\5      r " S S\5      r " S S\5      rg)é    N)ÚserverversionÚWindowsc                 ó<   • U R                  S5      (       a  U $ U S-   $ )Nz.exe)Úendswith©Únames    ÚI/var/www/html/gaurav/venv/lib/python3.13/site-packages/asyncpg/cluster.pyÚplatform_exer
      s    € Ø�=‰=˜× Ñ ØˆKØ�f‰}Ðó    c                 ó   • U $ ©N© r   s    r	   r
   r
   #   s   € Øˆr   c                  ó<  • [         R                   " [         R                  [         R                  5      n  U R                  S5        U R	                  5       S   U R                  5         $ ! [         a     U R                  5         g f = f! U R                  5         f = f)N)ú	127.0.0.1r   é   )ÚsocketÚAF_INETÚSOCK_STREAMÚbindÚgetsocknameÚcloseÚ	Exception)Úsocks    r	   Úfind_available_portr   '   ss   € Ü�=Š=œŸ™¬×);Ñ);Ó<€DðØ�	‰	Ð"Ô#Ø×ÑÓ! !Ñ$ð 	�
‰
�øô ó Øà�
‰
�ðûð 	�
‰
�ús#   µ#A) Á)
BÁ3B	 ÂBÂB	 Â	Bc                 óL  • SR                  [        R                  " [        R                  SS95      nUc  [
        R                  " 5       nUc  [
        R                  " 5       nU c  Sn [        R                  R                  X!U-   U -   5      n[        R                  " US5        U$ )NÚ é   )Úkií  )ÚjoinÚrandomÚchoicesÚstringÚascii_lowercaseÚtempfileÚ
gettempdirÚgettempprefixÚosÚpathÚmkdir)ÚsuffixÚprefixÚdirr   Úfns        r	   Ú_world_readable_mkdtempr.   2   s   € Ø�7‰7”6—>’>¤&×"8Ñ"8¸AÑ>Ó?€DØ
�{Ü×!Ò!Ó#ˆØ�~Ü×'Ò'Ó)ˆØ�~ØˆÜ	�‰�‰�c D™=¨6Ñ1Ó	2€BÜ‡H‚HˆR�ÔØ€Ir   c                 ó¤   • [         S:X  a0  [        R                  R                  S5      (       a  [	        XU5      $ [
        R                  " XU5      $ )Nr   ÚGITHUB_ACTIONS)Ú_systemr'   ÚenvironÚgetr.   r$   Úmkdtemp©r*   r+   r,   s      r	   Ú_mkdtempr6   ?   s?   € Ü�)Ó¤§
¡
§¡Ð/?× @Ñ @ô ' v°sÓ;Ð;ä×Ò °Ó4Ð4r   c                   ó   • \ rS rSrSrg)ÚClusterErroréI   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r   r   r	   r8   r8   I   s   † Úr   r8   c                   óæ   • \ rS rSrSS.S jrS rS rS rS rS#S	 jr	S
 r
S$0 S.S jjrS rS$S jrS rS rS rS rSSS.S jrS rSSSS.S jrS rS rS rS rS$S jrS rS rS  rS! rS"rg)%ÚClusteréM   N©Úpg_config_pathc                óö   • Xl         X l        [        R                  R	                  S5      =(       d    [        R                  R	                  S5      U l        S U l        S U l        S U l        S U l	        S U l
        g )NÚPGINSTALLATIONÚPGBIN)Ú	_data_dirÚ_pg_config_pathr'   r2   r3   Ú_pg_bin_dirÚ_pg_ctlÚ_daemon_pidÚ_daemon_processÚ_connection_addrÚ_connection_spec_override)ÚselfÚdata_dirrC   s      r	   Ú__init__ÚCluster.__init__N   sd   € Ø!ŒØ-Ôä�J‰J�N‰NÐ+Ó,÷ 'Ü�z‰z�~‰~˜gÓ&ð 	Ôð ˆŒØˆÔØ#ˆÔØ $ˆÔØ)-ˆÕ&r   c                 ó   • U R                   $ r   )Ú_pg_version©rO   s    r	   Úget_pg_versionÚCluster.get_pg_version[   s   € Ø×ÑÐr   c                 ó   • g)NTr   rU   s    r	   Ú
is_managedÚCluster.is_managed^   s   € Ør   c                 ó   • U R                   $ r   ©rG   rU   s    r	   Úget_data_dirÚCluster.get_data_dira   s   € Ø�~‰~Ðr   c                 óV  • U R                   c  U R                  5         [        R                  " U R                   SSU R                  /[        R
                  [        R
                  S9nUR                  UR                  p2UR                  S:X  dS  [        R                  R                  U R                  5      (       a%  [        R                  " U R                  5      (       d  gUR                  S:X  a  gUR                  S:X  a‚  [        R                  " S	UR                  5       5      nU(       d(  [!        S
R#                  UR                  5       5      5      e[%        UR'                  S5      5      U l        U R+                  SS9$ [!        SR#                  UR                  U5      5      e)NÚstatusú-D©ÚstdoutÚstderré   únot-initializedé   Ústoppedr   z.*PID\s?:\s+(\d+).*z(could not parse pg_ctl status output: {}r   ©Útimeoutz)pg_ctl status exited with status {:d}: {})rJ   Ú	_init_envÚ
subprocessÚrunrG   ÚPIPErc   rd   Ú
returncoder'   r(   ÚexistsÚlistdirÚreÚmatchÚdecoder8   ÚformatÚintÚgrouprK   Ú_test_connection)rO   Úprocessrc   rd   Úrs        r	   Ú
get_statusÚCluster.get_statusd   s=  € Ø�<‰<ÑØ�N‰NÔä—.’.Ø�\‰\˜8 T¨4¯>©>Ð:Ü—?‘?¬:¯?©?ñ<ˆð !Ÿ™¨¯©�à×Ñ !Ó#¬2¯7©7¯>©>¸$¿.¹.×+IÑ+IÜ—J’J˜tŸ~™~×.Ñ.Ø$Ø×Ñ 1Ó$ØØ×Ñ 1Ó$Ü—’Ð/°·±³ÓAˆAÞÜ"Ø>×EÑEØŸ™›ó)ó*ð *ô  # 1§7¡7¨1£:›ˆDÔØ×(Ñ(°Ð(Ð3Ð3äØ;×BÑBØ×&Ñ&¨ó0ó1ð 1r   c              ‹   ó�   #   • U R                  5       nUR                  U5        [        R                  " SSU0UD6I S h  v•N $  N7f)NÚloopr   )Úget_connection_specÚupdateÚasyncpgÚconnect)rO   r~   ÚkwargsÚ	conn_infos       r	   r‚   ÚCluster.connect   s>   é € Ø×,Ñ,Ó.ˆ	Ø×Ñ˜Ô Ü—_’_Ñ<¨$Ð<°)Ñ<×<Ð<Ñ<ùs   ‚=A¿AÁ Ac                 óú  • U R                  5       S:w  a$  [        SR                  U R                  5      5      e[	        U5      nSU;  a  SUS'   U(       aI  UR                  5        VVs/ sH  u  p#SR                  X#5      PM     nnnS/SR                  U5      /-   nO/ n[        R                  " U R                  SS	9  [        R                  " U R                  S
SU R                  /U-   [        R                  [        R                  U R                  S9nUR                  nUR                  S:w  a3  [        SR                  UR                  UR!                  5       5      5      eUR!                  5       $ s  snnf )úInitialize cluster.rf   ú,cluster in {!r} has already been initializedÚencodingzUTF-8ú--{}={}ú-oÚ T)Úexist_okÚinitra   ©rc   rd   Úcwdr   z'pg_ctl init exited with status {:d}:
{})r{   r8   ru   rG   ÚdictÚitemsr   r'   Úmakedirsrl   rm   rJ   rn   ÚSTDOUTrc   ro   rt   )rO   Úsettingsr   ÚvÚsettings_argsÚ
extra_argsry   Úoutputs           r	   rŽ   ÚCluster.init„   sM  € à�?‰?ÓÐ 1Ó1ÜØ>×EÑEØ—N‘Nó$ó%ð %ô ˜“>ˆØ˜XÓ%Ø#*ˆH�ZÑ æà)1¯©Ô)9ô;Ù)9¡ ð '×-Ñ-¨aÖ3Ù)9ð ñ ;à˜ 3§8¡8¨MÓ#:Ð";Ñ;‰JàˆJä
�Š�D—N‘N¨TÒ2Ü—.’.Ø�\‰\˜6 4¨¯©Ð8¸:ÑEÜ—?‘?Ü×$Ñ$Ø—‘ñ	
ˆð —‘ˆà×Ñ Ó"ÜØ:×AÑAØ×&Ñ&¨¯©«ó9ó:ð :ð �}‰}‹Ðùó+;s   Á)E7©Úserver_settingsc                óè  • U R                  5       nUS:X  a  gUS:X  a$  [        SR                  U R                  5      5      eUR	                  SS5      nUS:X  a
  [        5       nUR                  5        VVs/ sH  u  pgSR                  Xg5      PM     nnnUR                  SR                  U5      5        UR                  S	5      n	U	c  UR                  S
5      n	U	c  [        S:w  a  [        R                  " 5       n	UR                  S5      n
U
(       ak  [        R                  R                  U R                  S5      n[        R                   " X«5        [        R"                  " US5        UR!                  5       nX²S'   U	b  U R$                  S:  a  S
nOS	nX’U'   UR                  5        H'  u  pgUR'                  SSR                  Xg5      /5        M)     [        S:X  GaX  [        R(                  " S5      (       ab  [*        R,                  n[/        SSR                  U R0                  SSU R                  SSR                  U5      /5      [*        R2                  S9  O[4        R6                  n[4        R8                  " U R0                  SSU R                  SSR                  U5      /U[4        R:                  U R                  S9nUR<                  S:w  ab  UR2                  (       a*  SR                  UR2                  R?                  5       5      nOSn[        SR                  UR<                  U5      5      eO¤[        R(                  " S5      (       a  [*        R,                  nO[4        R6                  n[4        R@                  " U RB                  SU R                  /UQU[4        R:                  U R                  S9U l"        U RD                  RF                  U l$        U RK                  US9  gs  snnf )zStart the cluster.ÚrunningNrf   z(cluster in {!r} has not been initializedÚportÚdynamicrŠ   z	--port={}Úunix_socket_directoriesÚunix_socket_directoryr   Ússl_key_filez
srvkey.pemi€  )é	   rg   z-cú{}={}ÚASYNCPG_DEBUG_SERVERzasyncpg.cluster: RunningrŒ   Ústartra   r‹   ©Úfiler�   r   z:
{}r   z&pg_ctl start exited with status {:d}{}ri   )&r{   r8   ru   rG   Úpopr   r’   Úappendr3   r1   r$   r%   r'   r(   r   ÚshutilÚcopyÚchmodrT   ÚextendÚgetenvÚsysrc   ÚprintrJ   rd   rl   ÚDEVNULLrm   r”   ro   rt   ÚPopenÚ	_postgresrL   ÚpidrK   rx   )rO   Úwaitrœ   Úoptsr`   rŸ   r   r–   r˜   ÚsockdirÚssl_keyÚkeyfileÚsockdir_optrc   ry   rd   s                   r	   r§   ÚCluster.start§   sL  € à—‘Ó"ˆØ�YÓØØÐ(Ó(ÜØ:×AÑAØ—N‘Nó$ó%ð %ð �x‰x˜ Ó%ˆØ�9ÓÜ&Ó(ˆDà9=¿¹¼ÔF¹±°�i×&Ñ& qÖ,¹ˆ
ÑFØ×Ñ˜+×,Ñ,¨TÓ2Ô3à!×%Ñ%Ð&?Ó@ˆØ‰?Ø%×)Ñ)Ð*AÓBˆGØ‰?œw¨)Ó3Ü×)Ò)Ó+ˆGà!×%Ñ% nÓ5ˆÞä—g‘g—l‘l 4§>¡>°<Ó@ˆGÜ�KŠK˜Ô)Ü�HŠH�W˜eÔ$Ø-×2Ñ2Ó4ˆOØ.5˜NÑ+àÑØ×Ñ &Ó(Ø5‘à7�à+2˜KÑ(à#×)Ñ)Ö+‰DˆAØ×Ñ˜t W§^¡^°AÓ%9Ð:Ö;ñ ,ô �iÔô
 �yŠyÐ/×0Ñ0ÜŸ™�ÜØ.Ø—H‘HØŸ™ g¨t°T·^±^Ø˜cŸh™h zÓ2ðó ô Ÿ™óô $×+Ñ+�ä —n’nØ—‘˜w¨¨d¯n©nØ�s—x‘x 
Ó+ð-àÜ!×(Ñ(Ø—N‘NñˆGð ×!Ñ! QÓ&Ø—>—>Ø$Ÿ^™^¨G¯N©N×,AÑ,AÓ,CÓD‘Fà�FÜ"Ø<×CÑCØ×*Ñ*¨Fó4ó5ð 5ð 'ô �yŠyÐ/×0Ñ0ÜŸ™‘ä#×+Ñ+�ô × Ò Ø—^‘^ T¨4¯>©>ÐG¸JÐGØ!Ü%×,Ñ,ØŸ™ñ	ð Ô ð  $×3Ñ3×7Ñ7ˆDÔà×Ñ dÐÒ+ùó_ Gs   Á7O.c                 óŽ  • U R                  5       nUS:w  a  [        S5      e[        R                  " U R                  SSU R
                  /[        R                  [        R                  U R
                  S9nUR                  nUR                  S:w  a3  [        SR                  UR                  UR                  5       5      5      eg)	zReload server configuration.rž   z%cannot reload: cluster is not runningÚreloadra   r�   r   ú'pg_ctl stop exited with status {:d}: {}N)r{   r8   rl   rm   rJ   rG   rn   rd   ro   ru   rt   )rO   r`   ry   rd   s       r	   r¿   ÚCluster.reload  s£   € à—‘Ó"ˆØ�YÓÜÐFÓGÐGä—.’.Ø�\‰\˜8 T¨4¯>©>Ð:Ü—?‘?Ü—?‘?Ø—‘ñ	
ˆð —‘ˆà×Ñ Ó"ÜØ9×@Ñ@Ø×&Ñ&¨¯©«ó9ó:ð :ð #r   c           
      óæ  • [         R                  " U R                  SSU R                  S[	        U5      SS/[         R
                  [         R
                  U R                  S9nUR                  nUR                  S:w  a3  [        SR                  UR                  UR                  5       5      5      eU R                  b3  U R                  R                  c  U R                  R                  5         g g g )	NÚstopra   z-tz-mÚfastr�   r   rÀ   )rl   rm   rJ   rG   Ústrrn   rd   ro   r8   ru   rt   rL   Úkill)rO   r·   ry   rd   s       r	   rÃ   ÚCluster.stop  sÉ   € Ü—.’.Ø�\‰\˜6 4¨¯©¸¼sÀ4»yØ�6ðä—?‘?Ü—?‘?Ø—‘ñ
ˆð —‘ˆà×Ñ Ó"ÜØ9×@Ñ@Ø×&Ñ&¨¯©«ó9ó:ð :ð × Ñ Ñ,Ø×$Ñ$×/Ñ/Ñ7Ø× Ñ ×%Ñ%Õ'ð 8ð -r   c                 ó°   • U R                  5       nUS:X  d  US:X  a!  [        R                  " U R                  5        g [	        SR                  U5      5      e)Nrh   rf   zcannot destroy {} cluster)r{   r¬   ÚrmtreerG   r8   ru   ©rO   r`   s     r	   ÚdestroyÚCluster.destroy.  sE   € Ø—‘Ó"ˆØ�YÓ &Ð,=Ó"=Ü�MŠM˜$Ÿ.™.Õ)äÐ:×AÑAÀ&ÓIÓJÐJr   c                 ó
  • U R                   c  U R                  5       U l         U R                   bT  U R                  (       a7  U R                   R                  5       nUR	                  U R                  5        U$ U R                   $ g r   )rM   Ú_connection_addr_from_pidfilerN   r­   r€   )rO   Úargss     r	   Ú_get_connection_specÚCluster._get_connection_spec5  sp   € Ø× Ñ Ñ(Ø$(×$FÑ$FÓ$HˆDÔ!à× Ñ Ñ,Ø×-×-Ø×,Ñ,×1Ñ1Ó3�Ø—‘˜D×:Ñ:Ô;Ø�à×,Ñ,Ð,ð -r   c                 ód   • U R                  5       nUS:w  a  [        S5      eU R                  5       $ )Nrž   zcluster is not running)r{   r8   rÐ   rÊ   s     r	   r   ÚCluster.get_connection_specA  s1   € Ø—‘Ó"ˆØ�YÓÜÐ7Ó8Ð8à×(Ñ(Ó*Ð*r   c                 ó   • Xl         g r   )rN   ©rO   rƒ   s     r	   Úoverride_connection_specÚ Cluster.override_connection_specH  s   € Ø)/Õ&r   )ÚoidÚxidc                óž  • U R                  5       nUS:X  a  [        S5      eUS:X  a  [        S5      e/ nUb  UR                  S[        U5      /5        Ub  UR                  S[        U5      /5        U(       d  g UR	                  U R
                  5         U R                  S5      n[        R                  " U/U-   [        R                  [        R                  S	9nUR                  nUR                  S
:w  a3  [        SR                  UR                  UR                  5       5      5      eg ! [         a    U R                  S5      n N£f = f)Nrf   z4cannot modify WAL status: cluster is not initializedrž   z,cannot modify WAL status: cluster is runningr‹   z-xÚpg_resetwalÚpg_resetxlogrb   r   z'pg_resetwal exited with status {:d}: {})r{   r8   r¯   rÅ   r«   rG   Ú_find_pg_binaryrl   rm   rn   rd   ro   ru   rt   )rO   rØ   rÙ   r`   r¸   Ú	reset_walry   rd   s           r	   rÞ   ÚCluster.reset_walK  s=  € Ø—‘Ó"ˆØÐ&Ó&ÜØFóHð Hð �YÓÜØ>ó@ð @ð ˆØ‰?Ø�K‰K˜œs 3›xÐ(Ô)Ø‰?Ø�K‰K˜œs 3›xÐ(Ô)ÞØà�‰�D—N‘NÔ#ð	=Ø×,Ñ,¨]Ó;ˆIô —.’.ØˆK˜$ÑÜ—?‘?¬:¯?©?ñ<ˆð —‘ˆà×Ñ Ó"ÜØ9×@Ñ@Ø×&Ñ&¨¯©«ó9ó:ð :ð #øô ó 	=Ø×,Ñ,¨^Ó<ŠIð	=ús   ÂD. Ä.EÅEc                 óD  • U R                  5       nUS:X  a  [        S5      e[        R                  R	                  U R
                  S5      n [        US5          SSS5        g! , (       d  f       g= f! [         a   n[        SR                  U5      5      UeSnAff = f)z$Remove all records from pg_hba.conf.rf   ú5cannot modify HBA records: cluster is not initializedúpg_hba.confÚwNúcannot modify HBA records: {})	r{   r8   r'   r(   r   rG   ÚopenÚIOErrorru   )rO   r`   Úpg_hbaÚes       r	   Ú	reset_hbaÚCluster.reset_hbao  s’   € à—‘Ó"ˆØÐ&Ó&ÜØGóIð Iô —‘—‘˜dŸn™n¨mÓ<ˆð	BÜ�f˜cÕ"Ø÷ #×"Ö"ûäó 	BÜØ/×6Ñ6°qÓ9ó;Ø@AðBûð	Bús6   ÁA5 ÁA$ÁA5 Á$
A2Á.A5 Á2A5 Á5
BÁ?BÂBÚhost©ÚtypeÚaddressÚauth_optionsc                ó�  • U R                  5       nUS:X  a  [        S5      eUS;  a  [        SR                  U5      5      e[        R
                  R                  U R                  S5      nSR                  XU5      n	US:w  a1  Uc  [        S	R                  U5      5      eU	S
R                  U5      -  n	U	S
R                  U5      -  n	Ub  U	SSR                  S U 5       5      -   -  n	 [        US5       n
[        XšS9  SSS5        g! , (       d  f       g= f! [         a   n[        SR                  U5      5      UeSnAff = f)zAdd a record to pg_hba.conf.rf   rá   >   rë   ÚlocalÚhostsslÚ	hostnosslzinvalid HBA record type: {!r}râ   z{} {} {}rñ   Nz#{!r} entry requires a valid addressz {}rŒ   c              3   óF   #   • U H  u  pS R                  X5      v •  M     g7f)r¥   N)ru   )Ú.0r   r–   s      r	   Ú	<genexpr>Ú(Cluster.add_hba_entry.<locals>.<genexpr>˜  s!   é € ð %?Ù1=©¨�—‘˜q×$Ð$²ùs   ‚!Úar¨   rä   )r{   r8   Ú
ValueErrorru   r'   r(   r   rG   rå   r²   ræ   )rO   rí   ÚdatabaseÚuserrî   Úauth_methodrï   r`   rç   ÚrecordÚfrè   s               r	   Úadd_hba_entryÚCluster.add_hba_entry  sM  € ð —‘Ó"ˆØÐ&Ó&ÜØGóIð Ið Ð@Ó@ÜÐ<×CÑCÀDÓIÓJÐJä—‘—‘˜dŸn™n¨mÓ<ˆà×"Ñ" 4°4Ó8ˆà�7‹?Ø‰Ü Ø9×@Ñ@ÀÓFóHð Hð ˜%Ÿ,™, wÓ/Ñ/�à�%—,‘,˜{Ó+Ñ+ˆàÑ#Ø�c˜CŸH™Hñ %?Ù1=ó%?ó ?ñ ?ñ ?ˆFð	BÜ�f˜cÔ" aÜ�fÒ%÷ #×"Ö"ûäó 	BÜØ/×6Ñ6°qÓ9ó;Ø@AðBûð	Bús6   Ã+D Ã7
D
ÄD Ä

DÄD ÄD Ä
EÄ%E Å Ec                 óö   • U R                  5         [        S:w  a  U R                  SSSSS9  U R                  SSSSSS9  U R                  SS	SSSS9  U R                  5       nUS
:X  a  U R	                  5         g g )Nr   rñ   ÚallÚtrust©rí   rú   rû   rü   rë   ú127.0.0.1/32©rí   rî   rú   rû   rü   ú::1/128rž   )ré   r1   rÿ   r{   r¿   rÊ   s     r	   Útrust_local_connectionsÚCluster.trust_local_connections¢  s•   € Ø�‰Ôä�iÓØ×Ñ G°eØ$)°wð ñ @à×Ñ °Ø$)°Ø'.ð 	ñ 	0ð 	×Ñ °	Ø$)°Ø'.ð 	ñ 	0ð —‘Ó"ˆØ�YÓØ�K‰K�Mð r   c                 óÖ   • [         S:w  a  U R                  SSUSS9  U R                  SSSUSS9  U R                  SS	SUSS9  U R                  5       nUS
:X  a  U R                  5         g g )Nr   rñ   Úreplicationr  r  rë   r  r  r  rž   )r1   rÿ   r{   r¿   )rO   rû   r`   s      r	   Útrust_local_replication_byÚ"Cluster.trust_local_replication_by²  sŠ   € Ü�iÓØ×Ñ G°mØ$(°gð ñ ?à×Ñ °Ø$1¸Ø'.ð 	ñ 	0ð 	×Ñ °	Ø$1¸Ø'.ð 	ñ 	0ð —‘Ó"ˆØ�YÓØ�K‰K�Mð r   c                 ód  • U R                   (       d^  U R                  U R                  5      nU R                  U5      nUR	                  S5      U l         U R                   (       d  [        S5      eU R                  S5      U l        U R                  S5      U l        U R                  5       U l
        g )NÚbindirz1pg_config output did not provide the BINDIR valueÚpg_ctlÚpostgres)rI   Ú_find_pg_configrH   Ú_run_pg_configr3   r8   rÝ   rJ   rµ   Ú_get_pg_versionrT   )rO   Ú	pg_configÚpg_config_datas      r	   rk   ÚCluster._init_envÀ  s–   € Ø××Ø×,Ñ,¨T×-AÑ-AÓBˆIØ!×0Ñ0°Ó;ˆNà-×1Ñ1°(Ó;ˆDÔØ×#×#Ü"ØGóIð Ið ×+Ñ+¨HÓ5ˆŒØ×-Ñ-¨jÓ9ˆŒØ×/Ñ/Ó1ˆÕr   c                 ó–  • [         R                  R                  U R                  S5      n [	        US5       nUR                  5       nS S S 5        WR                  5       n[        U5      S:  a  g [        US   5      nU R                  (       a  XPR                  :w  a  g US   nUS   nUS   nU(       aS  US   S:w  aG  [         R                  R                  [         R                  R                  U R                  U5      5      nUn	OUn	U	S	:X  a  S
n	OU	S:X  a  Sn	OU	S:X  a  Sn	U	US.$ ! , (       d  f       Nç= f! [         a     g f = f)Nzpostmaster.pidÚrté   r   rg   re   é   Ú/Ú*Ú	localhostz0.0.0.0r   z::z::1)rë   rŸ   )r'   r(   r   rG   rå   ÚreadÚFileNotFoundErrorÚ
splitlinesÚlenrv   rK   Únormpath)
rO   Úpidfilerþ   ÚpiddataÚlinesÚpmpidÚportnumr¹   ÚhostaddrÚhost_strs
             r	   rÎ   Ú%Cluster._connection_addr_from_pidfileÎ  s1  € Ü—'‘'—,‘,˜tŸ~™~Ð/?Ó@ˆð	Ü�g˜tÔ$¨ØŸ&™&›(�÷ %ð
 ×"Ñ"Ó$ˆäˆu‹:˜‹>àä�E˜!‘H“ˆØ×× ×)9Ñ)9Ó 9ð à˜‘(ˆØ˜‘(ˆØ˜‘8ˆæØ�q‰z˜SÓ äŸ'™'×*Ñ*Ü—G‘G—L‘L §¡°Ó9ó;�à‰HàˆHà�s‹?Ø"‰HØ˜Ó"Ø"‰HØ˜ÓØˆHð Øñ
ð 	
÷K %Õ$ûä ó 	Ùð	ús.   ¬D; ¸D*Á	D; Ä*
D8Ä4D; Ä8D; Ä;
EÅEc                 óœ  • S U l         [        R                  " 5       n [        U5       H�  nU R                   c+  U R	                  5       nUc  [
        R                  " S5        M;   UR                  [        R                  " SSSSUS.U R                   D65      nUR                  UR                  5       5          O   UR                  5         g! [        [        R                  [        R                  [        R                  4 a    [
        R                  " S5         Mõ  [        R                   a       My  f = f! UR                  5         f = f)Nr   r  r  )rú   rû   rj   r~   rž   r   )rM   ÚasyncioÚnew_event_loopÚrangerÐ   ÚtimeÚsleepÚrun_until_completer�   r‚   r   ÚOSErrorÚTimeoutErrorÚCannotConnectNowErrorÚPostgresConnectionErrorÚPostgresError)rO   rj   r~   ÚiÚ	conn_specÚcons         r	   rx   ÚCluster._test_connectionü  s#  € Ø $ˆÔä×%Ò%Ó'ˆð	Ü˜7–^�Ø×(Ñ(Ñ0Ø $× 9Ñ 9Ó ;�IØ Ñ(ÜŸ
š
 1œÙ ðØ×1Ñ1ÜŸšð A°Ø-7Ø01¸ñAð +/×*?Ñ*?ñAóB�Cð  ×+Ñ+¨C¯I©I«KÔ8Ùñ3 $ð6 �J‰JŒLàøô!  ¤×!5Ñ!5Ü×5Ñ5Ü×7Ñ7ð9ó ô —J’J˜q”MÚÜ×,Ñ,ó ó ð	ûð �J‰J�Lús=   žAD9 Á%4CÂ#D9 ÃAD6ÄD9 ÄD6Ä1D9 Ä5D6Ä6D9 Ä9Ec                 óè  • [         R                  " U[         R                  [         R                  S9nUR                  UR                  pCUR
                  S:w  a%  [        SR                  UR
                  U5      5      e0 nUR                  5        H]  nUR                  S5      R                  S5      u  pxn	U(       d  M/  U	R                  5       XWR                  5       R                  5       '   M_     U$ )Nrb   r   z%pg_config exited with status {:d}: {}úutf-8Ú=)rl   rm   rn   rc   rd   ro   r8   ru   r!  rt   Ú	partitionÚstripÚlower)
rO   rC   ry   rc   rd   ÚconfigÚliner   Úeqr–   s
             r	   r  ÚCluster._run_pg_config!  sÁ   € Ü—.’.Ø¤:§?¡?¼:¿?¹?ñLˆà Ÿ™¨¯©�à×Ñ Ó"ÜÐF×MÑMØ×"Ñ" Fó ,ó -ð -ð ˆFà×)Ñ)Ö+�ØŸ;™; wÓ/×9Ñ9¸#Ó>‘��qß�2Ø01·±³	�FŸ7™7›9Ÿ?™?Ó,Ó-ñ ,ð
 ˆMr   c                 óÆ  • UGc  [         R                  R                  S5      =(       d    [         R                  R                  S5      nU(       a*  [        [         R                  R                  US5      5      nO–[         R                  R                  S5      R                  [         R                  5      nU HR  n[        [         R                  R                  US5      5      n[         R                  R                  U5      (       d  MR    O   S nU(       d  [        S5      e[         R                  R                  U5      (       d  [        SR                  U5      5      eU$ )NrE   rF   r  ÚPATHz#could not find pg_config executablez{!r} is not an executable)r'   r2   r3   r
   r(   r   ÚsplitÚpathseprp   r8   Úisfileru   )rO   rC   Ú
pg_installÚpathenvr(   s        r	   r  ÚCluster._find_pg_config3  s  € ØÒ!ä—
‘
—‘Ð/Ó0÷ +Ü—:‘:—>‘> 'Ó*ð ö Ü!-Ü—G‘G—L‘L ¨[Ó9ó";‘ô Ÿ*™*Ÿ.™.¨Ó0×6Ñ6´r·z±zÓB�Û#�DÜ%1ÜŸ™Ÿ™ T¨;Ó7ó&9�Nä—w‘w—~‘~ n×5Ó5Ùñ	 $ð &*�NæÜÐDÓEÐEä�w‰w�~‰~˜n×-Ñ-ÜÐ:×AÑAØó  ó !ð !ð Ðr   c                 ó  • [        [        R                  R                  U R                  U5      5      n[        R                  R                  U5      (       d,  [        SR                  U5      SR                  U5      -   5      eU$ )Nzcould not find {} executable: z${!r} does not exist or is not a file)r
   r'   r(   r   rI   rJ  r8   ru   )rO   ÚbinaryÚbpaths      r	   rÝ   ÚCluster._find_pg_binaryO  sl   € ÜœRŸW™WŸ\™\¨$×*:Ñ*:¸FÓCÓDˆä�w‰w�~‰~˜e×$Ñ$ÜØ0×7Ñ7¸Ó?Ø6×=Ñ=¸eÓDñEóFð Fð ˆr   c                 ó  • [         R                  " U R                  S/[         R                  [         R                  S9nUR                  UR
                  p2UR                  S:w  a%  [        SR                  UR                  U5      5      eUR                  S5      R                  S5      nSnUR                  U5      (       d  [        SR                  U5      5      eU[        U5      S  n[        R                  " U5      $ )	Nz	--versionrb   r   z.postgres --version exited with status {:d}: {}r=  z 
zpostgres (PostgreSQL) z,could not determine server version from {!r})rl   rm   rµ   rn   rc   rd   ro   r8   ru   rt   r@  Ú
startswithr"  r   Úsplit_server_version_string)rO   ry   rc   rd   Úversion_stringr+   s         r	   r  ÚCluster._get_pg_versionY  sà   € Ü—.’.Ø�^‰^˜[Ð)Ü—?‘?¬:¯?©?ñ<ˆð !Ÿ™¨¯©�à×Ñ Ó"ÜØ@×GÑGØ×&Ñ&¨ó0ó1ð 1ð  Ÿ™ wÓ/×5Ñ5°eÓ<ˆØ)ˆØ×(Ñ(¨×0Ñ0ÜØ>×EÑEØ"ó$ó%ð %ð (¬¨F«¨Ð5ˆä×8Ò8¸ÓHÐHr   )
rM   rN   rK   rL   rG   rI   rH   rJ   rT   rµ   r   ©é<   )r:   r;   r<   r=   rQ   rV   rY   r]   r{   r‚   rŽ   r§   r¿   rÃ   rË   rÐ   r   rÖ   rÞ   ré   rÿ   r  r  rk   rÎ   rx   r  r  rÝ   r  r>   r   r   r	   r@   r@   M   s«   † Ø37õ .ò òòò1ô6=ò
!ðF],°ö ],ò~:ô((ò(Kò
-ò+ò0ð  $¨õ ":òHBð  %+ÀDØ04õ!BòFò ò2ò,
ô\#òJò$ò8õIr   r@   c                   ó6   ^ • \ rS rSrSSSSS.U 4S jjrSrU =r$ )ÚTempClusterio  N©Údata_dir_suffixÚdata_dir_prefixÚdata_dir_parentrC   c                óV   >• [        UUUS9U l        [        TU ]  U R                  US9  g )Nr5   rB   )r6   rG   ÚsuperrQ   )rO   r\  r]  r^  rC   Ú	__class__s        €r	   rQ   ÚTempCluster.__init__p  s1   ø€ ô "¨Ø)8Ø&5ñ7ˆŒô 	‰Ñ˜Ÿ™¸ÐÒGr   r\   )r:   r;   r<   r=   rQ   r>   Ú__classcell__©ra  s   @r	   rZ  rZ  o  s   ø† à!%°tØ!%°d÷Hö Hr   rZ  c                   ó`   ^ • \ rS rSrSSSSS.U 4S jjrU 4S jrS rS
0 S.U 4S jjjrS	rU =r	$ )ÚHotStandbyClusteriy  Nr[  c                ó>   >• Xl         X l        [        TU ]  UUUUS9  g )Nr[  )Ú_masterÚ
_repl_userr`  rQ   )rO   ÚmasterÚreplication_userr\  r]  r^  rC   ra  s          €r	   rQ   ÚHotStandbyCluster.__init__z  s-   ø€ ð ŒØ*ŒÜ‰ÑØ+Ø+Ø+Ø)ð	 	ò 	+r   c                 óN   >• [         TU ]  5         U R                  S5      U l        g )NÚpg_basebackup)r`  rk   rÝ   Ú_pg_basebackup)rO   ra  s    €r	   rk   ÚHotStandbyCluster._init_env†  s!   ø€ Ü‰ÑÔØ"×2Ñ2°?ÓCˆÕr   c                 óH  • U R                  5       S:w  a$  [        SR                  U R                  5      5      e[        R
                  " U R                  SU R                  S   SU R                  S   SU R                  SU R                  /	[        R                  [        R                  S	9nUR                  nUR                  S
:w  a3  [        SR                  UR                  UR                  5       5      5      eU R                  S:  a¥  [        [         R"                  R%                  U R                  S5      S5       nUR'                  [(        R*                  " SR                  U R                  S   U R                  S   U R                  S95      5        SSS5        UR                  5       $ [        [         R"                  R%                  U R                  S5      S5      nUR-                  5         UR                  5       $ ! , (       d  f       UR                  5       $ = f)r‡   rf   rˆ   z-hrë   z-prŸ   ra   z-Urb   r   z.pg_basebackup init exited with status {:d}:
{}©é   r   zrecovery.confrã   z…                    standby_mode = 'on'
                    primary_conninfo = 'host={host} port={port} user={user}'
                ©rë   rŸ   rû   Nzstandby.signal)r{   r8   ru   rG   rl   rm   ro  rh  ri  rn   r”   rc   ro   rt   rT   rå   r'   r(   r   ÚwriteÚtextwrapÚdedentr   )rO   r•   ry   r™   rþ   s        r	   rŽ   ÚHotStandbyCluster.initŠ  s²  € à�?‰?ÓÐ 1Ó1ÜØ>×EÑEØ—N‘Nó$ó%ð %ô —.’.Ø× Ñ  $¨¯©°VÑ(<Ø�4—<‘< Ñ'¨¨t¯~©~Ø�4—?‘?ð$ô —?‘?¬:×+<Ñ+<ñ	>ˆð —‘ˆà×Ñ Ó"ÜØA×HÑHØ×&Ñ&¨¯©«ó9ó:ð :ð ×Ñ˜gÓ%Ü”b—g‘g—l‘l 4§>¡>°?ÓCÀSÔIÈQØ—‘œŸšð )÷ ‘FØŸ™ fÑ-ØŸ™ fÑ-ØŸ™ð ð *ó+ô ,÷ Jð �}‰}‹Ðô ”R—W‘W—\‘\ $§.¡.Ð2BÓCÀSÓIˆAØ�G‰GŒIà�}‰}‹Ð÷ JÔIð �}‰}‹Ðús   Ä?AHÈ
H!r›   c                óÚ   >• U R                   S:¼  aH  UR                  5       nSR                  U R                  S   U R                  S   U R                  S9US'   [
        TU ]  " SXS.UD6  g )	Nrr  z%"host={host} port={port} user={user}"rë   rŸ   rt  Úprimary_conninfo)r·   rœ   r   )rT   r­   ru   rh  ri  r`  r§   )rO   r·   rœ   r¸   ra  s       €r	   r§   ÚHotStandbyCluster.start­  sr   ø€ Ø×Ñ˜wÓ&Ø-×2Ñ2Ó4ˆOà7×>Ñ>ØŸ™ fÑ-ØŸ™ fÑ-ØŸ™ð ?ð ð Ð.Ñ/ô 	‰ŠÐI˜4ÑIÀDÓIr   )rh  ro  ri  rW  )
r:   r;   r<   r=   rQ   rk   rŽ   r§   r>   rc  rd  s   @r	   rf  rf  y  s9   ø† ð "&°tØ!%°d÷
+ð 
+õDò!ðFJ°÷ J÷ Jr   rf  c                   ód   • \ rS rSrS rS rS rS rS rSS jr	SS jr
S	 rS
 rSSSS.S jrSrg)ÚRunningClusteri»  c                 ó   • Xl         g r   ©r9  rÕ   s     r	   rQ   ÚRunningCluster.__init__¼  s   € Ø�r   c                 ó   • g)NFr   rU   s    r	   rY   ÚRunningCluster.is_managed¿  s   € Ør   c                 ó,   • [        U R                  5      $ r   )r‘   r9  rU   s    r	   r   Ú"RunningCluster.get_connection_specÂ  s   € Ü�D—N‘NÓ#Ð#r   c                 ó   • g)Nrž   r   rU   s    r	   r{   ÚRunningCluster.get_statusÅ  s   € Ør   c                 ó   • g r   r   )rO   r•   s     r	   rŽ   ÚRunningCluster.initÈ  ó   € Ør   c                 ó   • g r   r   )rO   r·   r•   s      r	   r§   ÚRunningCluster.startË  r‰  r   c                 ó   • g r   r   )rO   r·   s     r	   rÃ   ÚRunningCluster.stopÎ  r‰  r   c                 ó   • g r   r   rU   s    r	   rË   ÚRunningCluster.destroyÑ  r‰  r   c                 ó   • [        S5      e©Nz.cannot modify HBA records of unmanaged cluster©r8   rU   s    r	   ré   ÚRunningCluster.reset_hbaÔ  s   € ÜÐKÓLÐLr   rë   Nrì   c                ó   • [        S5      er‘  r’  )rO   rí   rú   rû   rî   rü   rï   s          r	   rÿ   ÚRunningCluster.add_hba_entry×  s   € äÐKÓLÐLr   r  rW  )r:   r;   r<   r=   rQ   rY   r   r{   rŽ   r§   rÃ   rË   ré   rÿ   r>   r   r   r	   r}  r}  »  sF   † ò òò$òòôôòòMð %+ÀDØ04÷Mð Mr   r}  )NNN)r-  r'   Úos.pathÚplatformr    rr   r¬   r   r"   rl   r±   r$   rv  r0  r�   r   ÚunameÚsystemr1   r
   r   r.   r6   r   r8   r@   rZ  rf  r}  r   r   r	   Ú<module>rš     s²   ðó Û 	Û Û Û Û 	Û Û Û Û Û 
Û Û Û ã Ý !ð �.Š.Ó
×
!Ñ
!€à
ˆiÓóò
òô
ô5ô	�9ô 	÷_Iñ _IôDH�'ô Hô?J˜ô ?JôDM�Wõ Mr   