§
    VøÁiœ_  ã                   ól  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlmZ  ej        ¦   «         j        Zedk    rd„ Znd„ Zd„ Zdd„Zdd„Z G d	„ d
e¦  «        Z G d„ d¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        ZdS )é    N)ÚserverversionÚWindowsc                 ó:   — |                       d¦  «        r| S | dz   S )Nz.exe)Úendswith©Únames    úY/var/www/html/jarvis.com/web/backend/venv/lib/python3.11/site-packages/asyncpg/cluster.pyÚplatform_exer
      s%   € Ø�=Š=˜Ñ Ô ð 	ØˆKØ�f‰}Ðó    c                 ó   — | S ©N© r   s    r	   r
   r
   #   s   € Øˆr   c                  óX  — t          j         t           j        t           j        ¦  «        } 	 |                      d¦  «         |                      ¦   «         d         |                      ¦   «          S # t          $ r Y |                      ¦   «          d S w xY w# |                      ¦   «          w xY w)N)ú	127.0.0.1r   é   )ÚsocketÚAF_INETÚSOCK_STREAMÚbindÚgetsocknameÚcloseÚ	Exception)Úsocks    r	   Úfind_available_portr   '   s›   € ÝŒ=�œ­Ô);Ñ<Ô<€DðØ�	Š	Ð"Ñ#Ô#Ð#Ø×ÒÑ!Ô! !Ô$ð 	�
Š
‰Œˆˆøõ ð ð ð Øà�
Š
‰Œˆˆˆðøøøøð 	�
Š
‰Œˆˆøøøs#   «.A. Á.
BÁ8B ÂBÂB ÂB)c                 ó>  — d                      t          j        t          j        d¬¦  «        ¦  «        }|€t          j        ¦   «         }|€t          j        ¦   «         }| €d} t          j	                              |||z   | z   ¦  «        }t          j
        |d¦  «         |S )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¸AÐ>Ñ>Ô>Ñ?Ô?€DØ
€{ÝÔ!Ñ#Ô#ˆØ€~ÝÔ'Ñ)Ô)ˆØ€~ØˆÝ	Œ�Š�c˜6 D™=¨6Ñ1Ñ	2Ô	2€BÝ„HˆR�ÑÔÐØ€Ir   c                 ó¤   — t           dk    r0t          j                             d¦  «        rt	          | ||¦  «        S t          j        | ||¦  «        S )Nr   ÚGITHUB_ACTIONS)Ú_systemr'   ÚenvironÚgetr.   r$   Úmkdtemp©r*   r+   r,   s      r	   Ú_mkdtempr6   ?   sJ   € Ý�)ÒÐ¥¤
§¢Ð/?Ñ @Ô @Ðõ ' v¨v°sÑ;Ô;Ð;åÔ ¨°Ñ4Ô4Ð4r   c                   ó   — e Zd ZdS )ÚClusterErrorN)Ú__name__Ú
__module__Ú__qualname__r   r   r	   r8   r8   I   s   € € € € € Ø€Dr   r8   c                   óÐ   — e Zd Zddœd„Zd„ Zd„ Zd„ Zd„ Zd"d„Zd	„ Z	d#i dœd„Z
d„ Zd#d„Zd„ Zd„ Zd„ Zd„ Zdddœd„Zd„ Zddddœd„Zd„ Zd„ Zd„ Zd„ Zd#d„Zd„ Zd„ Zd „ Zd!„ ZdS )$ÚClusterN©Úpg_config_pathc                óî   — || _         || _        t          j                             d¦  «        pt          j                             d¦  «        | _        d | _        d | _        d | _        d | _	        d | _
        d S )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_dirr?   s      r	   Ú__init__zCluster.__init__N   sp   € Ø!ˆŒØ-ˆÔåŒJ�NŠNÐ+Ñ,Ô,ð 'ÝŒz�~Š~˜gÑ&Ô&ð 	Ôð ˆŒØˆÔØ#ˆÔØ $ˆÔØ)-ˆÔ&Ð&Ð&r   c                 ó   — | j         S r   )Ú_pg_version©rK   s    r	   Úget_pg_versionzCluster.get_pg_version[   s   € ØÔÐr   c                 ó   — dS )NTr   rP   s    r	   Ú
is_managedzCluster.is_managed^   s   € Øˆtr   c                 ó   — | j         S r   )rC   rP   s    r	   Úget_data_dirzCluster.get_data_dira   s
   € ØŒ~Ðr   c                 ó  — | j         €|                      ¦   «          t          j        | j         dd| j        gt          j        t          j        ¬¦  «        }|j        |j        }}|j        dk    s=t          j
                             | j        ¦  «        rt          j        | j        ¦  «        sdS |j        dk    rdS |j        dk    ršt          j        d	|                     ¦   «         ¦  «        }|s4t!          d
                     |                     ¦   «         ¦  «        ¦  «        ‚t%          |                     d¦  «        ¦  «        | _        |                      d¬¦  «        S t!          d                     |j        |¦  «        ¦  «        ‚)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}: {})rF   Ú	_init_envÚ
subprocessÚrunrC   ÚPIPErZ   r[   Ú
returncoder'   r(   ÚexistsÚlistdirÚreÚmatchÚdecoder8   ÚformatÚintÚgrouprG   Ú_test_connection)rK   ÚprocessrZ   r[   Úrs        r	   Ú
get_statuszCluster.get_statusd   sf  € ØŒ<ÐØ�NŠNÑÔÐå”.ØŒ\˜8 T¨4¬>Ð:Ý”?­:¬?ð<ñ <ô <ˆð !œ¨¬�ˆàÔ !Ò#Ð#­2¬7¯>ª>¸$¼.Ñ+IÔ+IÐ#Ý”J˜tœ~Ñ.Ô.ð $à$Ð$ØÔ 1Ò$Ð$Ø�9ØÔ 1Ò$Ð$Ý”Ð/°·²±´ÑAÔAˆAØð *Ý"Ø>×EÒEØŸš™œñ)ô )ñ*ô *ð *õ  # 1§7¢7¨1¡:¤:™œˆDÔØ×(Ò(°Ð(Ñ3Ô3Ð3åØ;×BÒBØÔ&¨ñ0ô 0ñ1ô 1ð 1r   c              ‹   óŠ   K  — |                       ¦   «         }|                     |¦  «         t          j        dd|i|¤Žƒ d {V —†S )NÚloopr   )Úget_connection_specÚupdateÚasyncpgÚconnect)rK   rt   ÚkwargsÚ	conn_infos       r	   rx   zCluster.connect   sX   è è € Ø×,Ò,Ñ.Ô.ˆ	Ø×Ò˜Ñ Ô Ð Ý”_Ð<Ð<¨$Ð<°)Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<r   c                 ó¤  — |                       ¦   «         dk    r't          d                     | j        ¦  «        ¦  «        ‚t	          |¦  «        }d|vrd|d<   |r9d„ |                     ¦   «         D ¦   «         }dgd                     |¦  «        gz   }ng }t          j        | j        d¬	¦  «         t          j
        | j        d
d| j        g|z   t          j        t          j        | j        ¬¦  «        }|j        }|j        dk    r:t          d                     |j        |                     ¦   «         ¦  «        ¦  «        ‚|                     ¦   «         S )úInitialize cluster.r]   ú,cluster in {!r} has already been initializedÚencodingzUTF-8c                 ó@   — g | ]\  }}d                       ||¦  «        ‘ŒS ©z--{}={}©rl   ©Ú.0r   Úvs      r	   ú
<listcomp>z Cluster.init.<locals>.<listcomp>�   s<   € ð ;ð ;ð ;Ù!%  Að '×-Ò-¨a°Ñ3Ô3ð ;ð ;ð ;r   ú-oú T)Úexist_okÚinitrX   ©rZ   r[   Úcwdr   z'pg_ctl init exited with status {:d}:
{})rr   r8   rl   rC   ÚdictÚitemsr   r'   Úmakedirsrc   rd   rF   re   ÚSTDOUTrZ   rf   rk   )rK   ÚsettingsÚsettings_argsÚ
extra_argsrp   Úoutputs         r	   r‰   zCluster.init„   sd  € à�?Š?ÑÔÐ 1Ò1Ð1ÝØ>×EÒEØ”Nñ$ô $ñ%ô %ð %õ ˜‘>”>ˆØ˜XÐ%Ð%Ø#*ˆH�ZÑ àð 	ð;ð ;Ø)1¯ªÑ)9Ô)9ð;ñ ;ô ;ˆMà˜ 3§8¢8¨MÑ#:Ô#:Ð";Ñ;ˆJˆJàˆJå
Œ�D”N¨TÐ2Ñ2Ô2Ð2Ý”.ØŒ\˜6 4¨¬Ð8¸:ÑEÝ”?ÝÔ$Ø”ð	
ñ 
ô 
ˆð ”ˆàÔ Ò"Ð"ÝØ:×AÒAØÔ&¨¯ª©¬ñ9ô 9ñ:ô :ð :ð �}Š}‰ŒÐr   é<   ©Úserver_settingsc                ób  — |                       ¦   «         }|dk    rdS |dk    r't          d                     | j        ¦  «        ¦  «        ‚|                     dd¦  «        }|dk    rt          ¦   «         }d„ |                     ¦   «         D ¦   «         }|                     d                     |¦  «        ¦  «         |                     d	¦  «        }|€|                     d
¦  «        }|€t          dk    rt          j        ¦   «         }|                     d¦  «        }|rht          j                             | j        d¦  «        }	t          j        ||	¦  «         t          j        |	d¦  «         |                     ¦   «         }|	|d<   |�| j        dk     rd
}
nd	}
|||
<   |                     ¦   «         D ]0\  }}|                     dd                     ||¦  «        g¦  «         Œ1t          dk    �r3t          j        d¦  «        r_t*          j        }t/          dd                     | j        dd| j        dd                     |¦  «        g¦  «        t*          j        ¬¦  «         nt4          j        }t5          j        | j        dd| j        dd                     |¦  «        g|t4          j        | j        ¬¦  «        }|j        dk    r^|j        r-d                     |j                             ¦   «         ¦  «        }nd}t          d                     |j        |¦  «        ¦  «        ‚nyt          j        d¦  «        rt*          j        }nt4          j        }t5          j         | j!        d| j        g|¢|t4          j        | j        ¬¦  «        | _"        | j"        j#        | _$        |  %                    |¬¦  «         dS )zStart the cluster.ÚrunningNr]   z(cluster in {!r} has not been initializedÚportÚdynamicc                 ó@   — g | ]\  }}d                       ||¦  «        ‘ŒS r€   r�   r‚   s      r	   r…   z!Cluster.start.<locals>.<listcomp>µ   s,   € ÐFÐFÐF±°°A�i×&Ò& q¨!Ñ,Ô,ÐFÐFÐFr   z	--port={}Úunix_socket_directoriesÚunix_socket_directoryr   Ússl_key_filez
srvkey.pemi€  )é	   r^   z-cú{}={}ÚASYNCPG_DEBUG_SERVERzasyncpg.cluster: Runningr‡   ÚstartrX   r†   ©ÚfilerŠ   r   z:
{}r   z&pg_ctl start exited with status {:d}{}r`   )&rr   r8   rl   rC   Úpopr   r�   Úappendr3   r1   r$   r%   r'   r(   r   ÚshutilÚcopyÚchmodrO   ÚextendÚgetenvÚsysrZ   ÚprintrF   r[   rc   ÚDEVNULLrd   r�   rf   rk   ÚPopenÚ	_postgresrH   ÚpidrG   ro   )rK   Úwaitr–   ÚoptsrW   r™   r’   ÚsockdirÚssl_keyÚkeyfileÚsockdir_optr   r„   rZ   rp   r[   s                   r	   r¢   zCluster.start§   sÄ  € à—’Ñ"Ô"ˆØ�YÒÐØˆFØÐ(Ò(Ð(ÝØ:×AÒAØ”Nñ$ô $ñ%ô %ð %ð �xŠx˜ Ñ%Ô%ˆØ�9ÒÐÝ&Ñ(Ô(ˆDàFÐF¸¿º¹¼ÐFÑFÔFˆ
Ø×Ò˜+×,Ò,¨TÑ2Ô2Ñ3Ô3Ð3à!×%Ò%Ð&?Ñ@Ô@ˆØˆ?Ø%×)Ò)Ð*AÑBÔBˆGØˆ?�w¨)Ò3Ð3ÝÔ)Ñ+Ô+ˆGà!×%Ò% nÑ5Ô5ˆØð 	6å”g—l’l 4¤>°<Ñ@Ô@ˆGÝŒK˜ Ñ)Ô)Ð)ÝŒH�W˜eÑ$Ô$Ð$Ø-×2Ò2Ñ4Ô4ˆOØ.5ˆO˜NÑ+àÐØÔ &Ò(Ð(Ø5��à7�à+2ˆO˜KÑ(à#×)Ò)Ñ+Ô+ð 	<ð 	<‰DˆAˆqØ×Ò˜t W§^¢^°A°qÑ%9Ô%9Ð:Ñ;Ô;Ð;Ð;å�iÒÑõ
 ŒyÐ/Ñ0Ô0ð ,Ýœ�ÝØ.Ø—H’HØœ g¨t°T´^Ø˜cŸhšh zÑ2Ô2ðñ ô õ œðñ ô ð ð õ $Ô+�å ”nØ”˜w¨¨d¬nØ�s—x’x 
Ñ+Ô+ð-àÝ!Ô(Ø”Nðñ ô ˆGð Ô! QÒ&Ð&Ø”>ð  Ø$Ÿ^š^¨G¬N×,AÒ,AÑ,CÔ,CÑDÔD�F�Fà�FÝ"Ø<×CÒCØÔ*¨Fñ4ô 4ñ5ô 5ð 5ð 'õ ŒyÐ/Ñ0Ô0ð ,Ýœ��å#Ô+�õ Ô Ø”^ T¨4¬>ÐG¸JÐGØ!Ý%Ô,Øœð	ñ ô ð Ô ð  $Ô3Ô7ˆDÔà×Ò dÐÑ+Ô+Ð+Ð+Ð+r   c                 ón  — |                       ¦   «         }|dk    rt          d¦  «        ‚t          j        | j        dd| j        gt          j        t          j        | j        ¬¦  «        }|j        }|j        dk    r:t          d 	                    |j        | 
                    ¦   «         ¦  «        ¦  «        ‚dS )	zReload server configuration.r˜   z%cannot reload: cluster is not runningÚreloadrX   rŠ   r   ú'pg_ctl stop exited with status {:d}: {}N)rr   r8   rc   rd   rF   rC   re   r[   rf   rl   rk   )rK   rW   rp   r[   s       r	   r¹   zCluster.reload  s´   € à—’Ñ"Ô"ˆØ�YÒÐÝÐFÑGÔGÐGå”.ØŒ\˜8 T¨4¬>Ð:Ý”?Ý”?Ø”ð	
ñ 
ô 
ˆð ”ˆàÔ Ò"Ð"ÝØ9×@Ò@ØÔ&¨¯ª©¬ñ9ô 9ñ:ô :ð :ð #Ð"r   c           
      óž  — t          j        | j        dd| j        dt	          |¦  «        ddgt           j        t           j        | j        ¬¦  «        }|j        }|j        dk    r:t          d 	                    |j        | 
                    ¦   «         ¦  «        ¦  «        ‚| j        �'| j        j        €| j                             ¦   «          d S d S d S )	NÚstoprX   z-tz-mÚfastrŠ   r   rº   )rc   rd   rF   rC   Ústrre   r[   rf   r8   rl   rk   rH   Úkill)rK   r²   rp   r[   s       r	   r¼   zCluster.stop  sÔ   € Ý”.ØŒ\˜6 4¨¬¸½sÀ4¹y¼yØ�6ðå”?Ý”?Ø”ð
ñ 
ô 
ˆð ”ˆàÔ Ò"Ð"ÝØ9×@Ò@ØÔ&¨¯ª©¬ñ9ô 9ñ:ô :ð :ð Ô Ð,ØÔ$Ô/Ð7ØÔ ×%Ò%Ñ'Ô'Ð'Ð'Ð'ð -Ð,Ø7Ð7r   c                 ó¼   — |                       ¦   «         }|dk    s|dk    rt          j        | j        ¦  «         d S t	          d                     |¦  «        ¦  «        ‚)Nr_   r]   zcannot destroy {} cluster)rr   r§   ÚrmtreerC   r8   rl   ©rK   rW   s     r	   ÚdestroyzCluster.destroy.  s\   € Ø—’Ñ"Ô"ˆØ�YÒÐ &Ð,=Ò"=Ð"=ÝŒM˜$œ.Ñ)Ô)Ð)Ð)Ð)åÐ:×AÒAÀ&ÑIÔIÑJÔJÐJr   c                 óÚ   — | j         €|                      ¦   «         | _         | j         �C| j        r5| j                              ¦   «         }|                     | j        ¦  «         |S | j         S d S r   )rI   Ú_connection_addr_from_pidfilerJ   r¨   rv   )rK   Úargss     r	   Ú_get_connection_speczCluster._get_connection_spec5  sr   € ØÔ Ð(Ø$(×$FÒ$FÑ$HÔ$HˆDÔ!àÔ Ð,ØÔ-ð -ØÔ,×1Ò1Ñ3Ô3�Ø—’˜DÔ:Ñ;Ô;Ð;Ø�àÔ,Ð,ð -Ð,r   c                 ó|   — |                       ¦   «         }|dk    rt          d¦  «        ‚|                      ¦   «         S )Nr˜   zcluster is not running)rr   r8   rÇ   rÂ   s     r	   ru   zCluster.get_connection_specA  s=   € Ø—’Ñ"Ô"ˆØ�YÒÐÝÐ7Ñ8Ô8Ð8à×(Ò(Ñ*Ô*Ð*r   c                 ó   — || _         d S r   )rJ   ©rK   ry   s     r	   Úoverride_connection_specz Cluster.override_connection_specH  s   € Ø)/ˆÔ&Ð&Ð&r   )ÚoidÚxidc                óÈ  — |                       ¦   «         }|dk    rt          d¦  «        ‚|dk    rt          d¦  «        ‚g }|�$|                     dt          |¦  «        g¦  «         |�$|                     dt          |¦  «        g¦  «         |sd S |                     | j        ¦  «         	 |                      d¦  «        }n%# t          $ r |                      d¦  «        }Y nw xY wt          j        |g|z   t          j	        t          j	        ¬	¦  «        }|j
        }|j        d
k    r:t          d                     |j        |                     ¦   «         ¦  «        ¦  «        ‚d S )Nr]   z4cannot modify WAL status: cluster is not initializedr˜   z,cannot modify WAL status: cluster is runningr†   z-xÚpg_resetwalÚpg_resetxlogrY   r   z'pg_resetwal exited with status {:d}: {})rr   r8   rª   r¾   r¦   rC   Ú_find_pg_binaryrc   rd   re   r[   rf   rl   rk   )rK   rÌ   rÍ   rW   r³   Ú	reset_walrp   r[   s           r	   rÒ   zCluster.reset_walK  s‘  € Ø—’Ñ"Ô"ˆØÐ&Ò&Ð&ÝØFñHô Hð Hð �YÒÐÝØ>ñ@ô @ð @ð ˆØˆ?Ø�KŠK˜�s 3™xœxÐ(Ñ)Ô)Ð)Øˆ?Ø�KŠK˜�s 3™xœxÐ(Ñ)Ô)Ð)Øð 	ØˆFà�Š�D”NÑ#Ô#Ð#ð	=Ø×,Ò,¨]Ñ;Ô;ˆIˆIøÝð 	=ð 	=ð 	=Ø×,Ò,¨^Ñ<Ô<ˆIˆIˆIð	=øøøõ ”.ØˆK˜$ÑÝ”?­:¬?ð<ñ <ô <ˆð ”ˆàÔ Ò"Ð"ÝØ9×@Ò@ØÔ&¨¯ª©¬ñ9ô 9ñ:ô :ð :ð #Ð"s   Â,C ÃC$Ã#C$c                 ób  — |                       ¦   «         }|dk    rt          d¦  «        ‚t          j                             | j        d¦  «        }	 t          |d¦  «        5  	 ddd¦  «         dS # 1 swxY w Y   dS # t          $ r(}t          d                     |¦  «        ¦  «        |‚d}~ww xY w)z$Remove all records from pg_hba.conf.r]   ú5cannot modify HBA records: cluster is not initializedúpg_hba.confÚwNúcannot modify HBA records: {})	rr   r8   r'   r(   r   rC   ÚopenÚIOErrorrl   )rK   rW   Úpg_hbaÚes       r	   Ú	reset_hbazCluster.reset_hbao  s  € à—’Ñ"Ô"ˆØÐ&Ò&Ð&ÝØGñIô Ið Iõ ”—’˜dœn¨mÑ<Ô<ˆð	BÝ�f˜cÑ"Ô"ð ð Øðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð øåð 	Bð 	Bð 	BÝØ/×6Ò6°qÑ9Ô9ñ;ô ;Ø@AðBøøøøð	Bøøøs<   ÁA< Á A/Á"A< Á/A3Á3A< Á6A3Á7A< Á<
B.Â#B)Â)B.Úhost©ÚtypeÚaddressÚauth_optionsc                óþ  — |                       ¦   «         }|dk    rt          d¦  «        ‚|dvr"t          d                     |¦  «        ¦  «        ‚t          j                             | j        d¦  «        }d                     |||¦  «        }	|dk    r<|€"t          d	                     |¦  «        ¦  «        ‚|	d
                     |¦  «        z  }	|	d
                     |¦  «        z  }	|�%|	dd                     d„ |D ¦   «         ¦  «        z   z  }		 t          |d¦  «        5 }
t          |	|
¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS # t          $ r(}t          d                     |¦  «        ¦  «        |‚d}~ww xY w)zAdd a record to pg_hba.conf.r]   rÔ   >   rÝ   ÚlocalÚhostsslÚ	hostnosslzinvalid HBA record type: {!r}rÕ   z{} {} {}rã   Nz#{!r} entry requires a valid addressz {}r‡   c              3   óH   K  — | ]\  }}d                       ||¦  «        V — ŒdS )r    Nr�   r‚   s      r	   ú	<genexpr>z(Cluster.add_hba_entry.<locals>.<genexpr>˜  sE   è è € ð %?ð %?Ù)-¨¨A�—’˜q !Ñ$Ô$ð%?ð %?ð %?ð %?ð %?ð %?r   Úar£   r×   )rr   r8   Ú
ValueErrorrl   r'   r(   r   rC   rØ   r­   rÙ   )rK   rß   ÚdatabaseÚuserrà   Úauth_methodrá   rW   rÚ   ÚrecordÚfrÛ   s               r	   Úadd_hba_entryzCluster.add_hba_entry  s	  € ð —’Ñ"Ô"ˆØÐ&Ò&Ð&ÝØGñIô Ið Ið Ð@Ð@Ð@ÝÐ<×CÒCÀDÑIÔIÑJÔJÐJå”—’˜dœn¨mÑ<Ô<ˆà×"Ò" 4¨°4Ñ8Ô8ˆà�7Š?ˆ?ØˆÝ Ø9×@Ò@ÀÑFÔFñHô Hð Hð ˜%Ÿ,š, wÑ/Ô/Ñ/�à�%—,’,˜{Ñ+Ô+Ñ+ˆàÐ#Ø�c˜CŸHšHð %?ð %?Ø1=ð%?ñ %?ô %?ñ ?ô ?ñ ?ñ ?ˆFð	BÝ�f˜cÑ"Ô"ð & aÝ�f 1Ð%Ñ%Ô%Ð%ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð &ð &øåð 	Bð 	Bð 	BÝØ/×6Ò6°qÑ9Ô9ñ;ô ;Ø@AðBøøøøð	Bøøøs<   ÄE
 ÄD=Ä0E
 Ä=EÅE
 ÅEÅE
 Å

E<Å#E7Å7E<c                 ó>  — |                       ¦   «          t          dk    r|                      dddd¬¦  «         |                      ddddd¬¦  «         |                      dd	ddd¬¦  «         |                      ¦   «         }|d
k    r|                      ¦   «          d S d S )Nr   rã   ÚallÚtrust©rß   rê   rë   rì   rÝ   ú127.0.0.1/32©rß   rà   rê   rë   rì   ú::1/128r˜   )rÜ   r1   rï   rr   r¹   rÂ   s     r	   Útrust_local_connectionszCluster.trust_local_connections¢  sÏ   € Ø�ŠÑÔÐå�iÒÐØ×Ò G°eØ$)°wð ñ @ô @ð @à×Ò °Ø$)°Ø'.ð 	ñ 	0ô 	0ð 	0ð 	×Ò °	Ø$)°Ø'.ð 	ñ 	0ô 	0ð 	0ð —’Ñ"Ô"ˆØ�YÒÐØ�KŠK‰MŒMˆMˆMˆMð Ðr   c                 ó  — t           dk    r|                      dd|d¬¦  «         |                      ddd|d¬¦  «         |                      dd	d|d¬¦  «         |                      ¦   «         }|d
k    r|                      ¦   «          d S d S )Nr   rã   Úreplicationrò   ró   rÝ   rô   rõ   rö   r˜   )r1   rï   rr   r¹   )rK   rë   rW   s      r	   Útrust_local_replication_byz"Cluster.trust_local_replication_by²  s¼   € Ý�iÒÐØ×Ò G°mØ$(°gð ñ ?ô ?ð ?à×Ò °Ø$1¸Ø'.ð 	ñ 	0ô 	0ð 	0ð 	×Ò °	Ø$1¸Ø'.ð 	ñ 	0ô 	0ð 	0ð —’Ñ"Ô"ˆØ�YÒÐØ�KŠK‰MŒMˆMˆMˆMð Ðr   c                 ól  — | j         s_|                      | j        ¦  «        }|                      |¦  «        }|                     d¦  «        | _         | j         st          d¦  «        ‚|                      d¦  «        | _        |                      d¦  «        | _        |  	                    ¦   «         | _
        d S )NÚbindirz1pg_config output did not provide the BINDIR valueÚpg_ctlÚpostgres)rE   Ú_find_pg_configrD   Ú_run_pg_configr3   r8   rÑ   rF   r°   Ú_get_pg_versionrO   )rK   Ú	pg_configÚpg_config_datas      r	   rb   zCluster._init_envÀ  s·   € ØÔð 	IØ×,Ò,¨TÔ-AÑBÔBˆIØ!×0Ò0°Ñ;Ô;ˆNà-×1Ò1°(Ñ;Ô;ˆDÔØÔ#ð IÝ"ØGñIô Ið Ið ×+Ò+¨HÑ5Ô5ˆŒØ×-Ò-¨jÑ9Ô9ˆŒØ×/Ò/Ñ1Ô1ˆÔÐÐr   c                 ó¦  — t           j                             | j        d¦  «        }	 t	          |d¦  «        5 }|                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   n# t          $ r Y d S w xY w|                     ¦   «         }t          |¦  «        dk     rd S t          |d         ¦  «        }| j
        r|| j
        k    rd S |d         }|d         }|d         }|rQ|d         dk    rBt           j                             t           j                             | j        |¦  «        ¦  «        }|}	n|}	|	d	k    rd
}	n|	dk    rd}	n|	dk    rd}	|	|dœS )Nzpostmaster.pidÚrté   r   r^   r\   é   ú/Ú*Ú	localhostz0.0.0.0r   z::z::1)rÝ   r™   )r'   r(   r   rC   rØ   ÚreadÚFileNotFoundErrorÚ
splitlinesÚlenrm   rG   Únormpath)
rK   Úpidfilerî   ÚpiddataÚlinesÚpmpidÚportnumr´   ÚhostaddrÚhost_strs
             r	   rÅ   z%Cluster._connection_addr_from_pidfileÎ  s¹  € Ý”'—,’,˜tœ~Ð/?Ñ@Ô@ˆð	Ý�g˜tÑ$Ô$ð #¨ØŸ&š&™(œ(�ð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #øøå ð 	ð 	ð 	Ø�4�4ð	øøøð ×"Ò"Ñ$Ô$ˆåˆu‰:Œ:˜Š>ˆ>à�4å�E˜!”H‘”ˆØÔð 	 ¨Ô)9Ò 9Ð 9ð �4à˜”(ˆØ˜”(ˆØ˜”8ˆàð 	 Ø�qŒz˜SÒ Ð åœ'×*Ò*Ý”G—L’L ¤°Ñ9Ô9ñ;ô ;�àˆHˆHàˆHà�sŠ?ˆ?Ø"ˆHˆHØ˜Ò"Ð"Ø"ˆHˆHØ˜ÒÐØˆHð Øð
ð 
ð 	
s4   §A$ ·AÁA$ ÁAÁA$ ÁAÁ A$ Á$
A2Á1A2c                 ó|  — d | _         t          j        ¦   «         }	 t          |¦  «        D ]â}| j         €+|                      ¦   «         }|€t          j        d¦  «         Œ4	 |                     t          j	        dddd|dœ| j         ¤Ž¦  «        }|                     | 
                    ¦   «         ¦  «          nW# t          t          j        t          j        t          j        f$ r t          j        d¦  «         Y ŒÎt          j        $ r Y  nw xY w| 
                    ¦   «          n# | 
                    ¦   «          w xY wdS )Nr   rþ   r  )rê   rë   ra   rt   r˜   r   )rI   ÚasyncioÚnew_event_loopÚrangerÇ   ÚtimeÚsleepÚrun_until_completerw   rx   r   ÚOSErrorÚTimeoutErrorÚCannotConnectNowErrorÚPostgresConnectionErrorÚPostgresError)rK   ra   rt   ÚiÚ	conn_specÚcons         r	   ro   zCluster._test_connectionü  sc  € Ø $ˆÔåÔ%Ñ'Ô'ˆð	Ý˜7‘^”^ð ð �ØÔ(Ð0Ø $× 9Ò 9Ñ ;Ô ;�IØ Ð(Ýœ
 1™œ˜Ø ðØ×1Ò1Ýœð A°Ø-7Ø01¸ðAð Að +/Ô*?ðAð AñBô B�Cð  ×+Ò+¨C¯IªI©K¬KÑ8Ô8Ð8Ø�Eøõ  ¥Ô!5ÝÔ5ÝÔ7ð9ð ð ð õ ”J˜q‘M”M�MØ�HÝÔ,ð ð ð ð �E�Eð	øøøð �JŠJ‰LŒLˆLˆLøˆD�JŠJ‰LŒLˆLˆLøøøàˆys=   œAD# Á .B7Â)D# Â7A DÃ7D# Ã9DÄD# Ä
DÄD# Ä#D9c                 óâ  — t          j        |t           j        t           j        ¬¦  «        }|j        |j        }}|j        dk    r(t          d                     |j        |¦  «        ¦  «        ‚i }|                     ¦   «         D ]k}| 	                    d¦  «         
                    d¦  «        \  }}}	|r;|	                     ¦   «         ||                     ¦   «                              ¦   «         <   Œl|S )NrY   r   z%pg_config exited with status {:d}: {}úutf-8ú=)rc   rd   re   rZ   r[   rf   r8   rl   r  rk   Ú	partitionÚstripÚlower)
rK   r?   rp   rZ   r[   ÚconfigÚliner   Úeqr„   s
             r	   r   zCluster._run_pg_config!  sç   € Ý”.Ø¥:¤?½:¼?ðLñ Lô Lˆà œ¨¬�ˆàÔ Ò"Ð"ÝÐF×MÒMØÔ" Fñ ,ô  ,ñ -ô -ð -ð ˆFà×)Ò)Ñ+Ô+ð :ð :�ØŸ;š; wÑ/Ô/×9Ò9¸#Ñ>Ô>‘��2�qØð :Ø01·²±	´	�F˜1Ÿ7š7™9œ9Ÿ?š?Ñ,Ô,Ñ-øàˆMr   c                 ó¬  — |€ÿt           j                             d¦  «        pt           j                             d¦  «        }|r.t          t           j                             |d¦  «        ¦  «        }n‘t           j                             d¦  «                             t           j        ¦  «        }|D ]P}t          t           j                             |d¦  «        ¦  «        }t           j                             |¦  «        r nŒQd }|st          d¦  «        ‚t           j         
                    |¦  «        s"t          d                     |¦  «        ¦  «        ‚|S )NrA   rB   r  ÚPATHz#could not find pg_config executablez{!r} is not an executable)r'   r2   r3   r
   r(   r   ÚsplitÚpathseprg   r8   Úisfilerl   )rK   r?   Ú
pg_installÚpathenvr(   s        r	   rÿ   zCluster._find_pg_config3  s>  € ØÐ!å”
—’Ð/Ñ0Ô0ð +Ý”:—>’> 'Ñ*Ô*ð ð ð *Ý!-Ý”G—L’L ¨[Ñ9Ô9ñ";ô ";��õ œ*Ÿ.š.¨Ñ0Ô0×6Ò6µr´zÑBÔB�Ø#ð *ð *�DÝ%1ÝœŸš T¨;Ñ7Ô7ñ&9ô &9�Nå”w—~’~ nÑ5Ô5ð Ø˜ðð &*�Nàð 	FÝÐDÑEÔEÐEåŒw�~Š~˜nÑ-Ô-ð 	!ÝÐ:×AÒAØñ  ô   ñ !ô !ð !ð Ðr   c                 ó  — t          t          j                             | j        |¦  «        ¦  «        }t          j                             |¦  «        s8t          d                     |¦  «        d                     |¦  «        z   ¦  «        ‚|S )Nzcould not find {} executable: z${!r} does not exist or is not a file)r
   r'   r(   r   rE   r3  r8   rl   )rK   ÚbinaryÚbpaths      r	   rÑ   zCluster._find_pg_binaryO  s}   € Ý�RœWŸ\š\¨$Ô*:¸FÑCÔCÑDÔDˆåŒw�~Š~˜eÑ$Ô$ð 	FÝØ0×7Ò7¸Ñ?Ô?Ø6×=Ò=¸eÑDÔDñEñFô Fð Fð ˆr   c                 ó   — t          j        | j        dgt           j        t           j        ¬¦  «        }|j        |j        }}|j        dk    r(t          d                     |j        |¦  «        ¦  «        ‚| 	                    d¦  «         
                    d¦  «        }d}|                     |¦  «        s"t          d                     |¦  «        ¦  «        ‚|t          |¦  «        d …         }t          j        |¦  «        S )	Nz	--versionrY   r   z.postgres --version exited with status {:d}: {}r'  z 
zpostgres (PostgreSQL) z,could not determine server version from {!r})rc   rd   r°   re   rZ   r[   rf   r8   rl   rk   r*  Ú
startswithr  r   Úsplit_server_version_string)rK   rp   rZ   r[   Úversion_stringr+   s         r	   r  zCluster._get_pg_versionY  s   € Ý”.ØŒ^˜[Ð)Ý”?­:¬?ð<ñ <ô <ˆð !œ¨¬�ˆàÔ Ò"Ð"ÝØ@×GÒGØÔ&¨ñ0ô 0ñ1ô 1ð 1ð  Ÿš wÑ/Ô/×5Ò5°eÑ<Ô<ˆØ)ˆØ×(Ò(¨Ñ0Ô0ð 	%ÝØ>×EÒEØ"ñ$ô $ñ%ô %ð %ð (­¨F©¬¨¨Ô5ˆåÔ8¸ÑHÔHÐHr   r   ©r”   )r9   r:   r;   rM   rQ   rS   rU   rr   rx   r‰   r¢   r¹   r¼   rÃ   rÇ   ru   rË   rÒ   rÜ   rï   r÷   rú   rb   rÅ   ro   r   rÿ   rÑ   r  r   r   r	   r=   r=   M   s  € € € € € Ø37ð .ð .ð .ð .ð .ð ð  ð  ðð ð ðð ð ð1ð 1ð 1ð6=ð =ð =ð =ð
!ð !ð !ðF],°ð ],ð ],ð ],ð ],ð ],ð~:ð :ð :ð((ð (ð (ð (ð(Kð Kð Kð
-ð 
-ð 
-ð+ð +ð +ð0ð 0ð 0ð  $¨ð ":ð ":ð ":ð ":ð ":ðHBð Bð Bð  %+ÀDØ04ð!Bð !Bð !Bð !Bð !BðFð ð ð ð ð ð2ð 2ð 2ð,
ð ,
ð ,
ð\#ð #ð #ð #ðJð ð ð$ð ð ð8ð ð ðIð Ið Ið Ið Ir   r=   c                   ó*   ‡ — e Zd Zdddddœˆ fd„
Zˆ xZS )ÚTempClusterN©Údata_dir_suffixÚdata_dir_prefixÚdata_dir_parentr?   c                ó†   •— t          |||¬¦  «        | _        t          ¦   «                              | j        |¬¦  «         d S )Nr5   r>   )r6   rC   ÚsuperrM   )rK   rA  rB  rC  r?   Ú	__class__s        €r	   rM   zTempCluster.__init__p  sJ   ø€ õ "¨Ø)8Ø&5ð7ñ 7ô 7ˆŒõ 	‰Œ×Ò˜œ¸ÐÑGÔGÐGÐGÐGr   )r9   r:   r;   rM   Ú__classcell__©rF  s   @r	   r?  r?  o  sW   ø€ € € € € à!%°tØ!%°dðHð Hð Hð Hð Hð Hð Hð Hð Hð Hð Hr   r?  c                   óL   ‡ — e Zd Zdddddœˆ fd„
Zˆ fd„Zd„ Zd	i dœˆ fd„Zˆ xZS )
ÚHotStandbyClusterNr@  c                ón   •— || _         || _        t          ¦   «                              ||||¬¦  «         d S )Nr@  )Ú_masterÚ
_repl_userrE  rM   )rK   ÚmasterÚreplication_userrA  rB  rC  r?   rF  s          €r	   rM   zHotStandbyCluster.__init__z  sJ   ø€ ð ˆŒØ*ˆŒÝ‰Œ×ÒØ+Ø+Ø+Ø)ð	 	ñ 	+ô 	+ð 	+ð 	+ð 	+r   c                 ó|   •— t          ¦   «                              ¦   «          |                      d¦  «        | _        d S )NÚpg_basebackup)rE  rb   rÑ   Ú_pg_basebackup)rK   rF  s    €r	   rb   zHotStandbyCluster._init_env†  s5   ø€ Ý‰Œ×ÒÑÔÐØ"×2Ò2°?ÑCÔCˆÔÐÐr   c                 óÞ  — |                       ¦   «         dk    r't          d                     | j        ¦  «        ¦  «        ‚t	          j        | j        d| j        d         d| j        d         d| j        d| j        g	t          j	        t          j
        ¬	¦  «        }|j        }|j        d
k    r:t          d                     |j        |                     ¦   «         ¦  «        ¦  «        ‚| j        dk     r¤t          t           j                             | j        d¦  «        d¦  «        5 }|                     t)          j        d                     | j        d         | j        d         | j        ¬¦  «        ¦  «        ¦  «         ddd¦  «         n# 1 swxY w Y   nGt          t           j                             | j        d¦  «        d¦  «        }|                     ¦   «          |                     ¦   «         S )r|   r]   r}   z-hrÝ   z-pr™   rX   z-UrY   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)rr   r8   rl   rC   rc   rd   rR  rL  rM  re   r�   rZ   rf   rk   rO   rØ   r'   r(   r   ÚwriteÚtextwrapÚdedentr   )rK   r�   rp   r“   rî   s        r	   r‰   zHotStandbyCluster.initŠ  sý  € à�?Š?ÑÔÐ 1Ò1Ð1ÝØ>×EÒEØ”Nñ$ô $ñ%ô %ð %õ ”.ØÔ  $¨¬°VÔ(<Ø�4”< Ô'¨¨t¬~Ø�4”?ð$õ ”?­:Ô+<ð	>ñ >ô >ˆð ”ˆàÔ Ò"Ð"ÝØA×HÒHØÔ&¨¯ª©¬ñ9ô 9ñ:ô :ð :ð Ô˜gÒ%Ð%Ý•b”g—l’l 4¤>°?ÑCÔCÀSÑIÔIð ,ÈQØ—’�œð )÷ ’FØœ fÔ-Øœ fÔ-Øœð ñ *ô *ñ+ô +ñ ,ô ,ð ,ð,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,øõ •R”W—\’\ $¤.Ð2BÑCÔCÀSÑIÔIˆAØ�GŠG‰IŒIˆIà�}Š}‰ŒÐs   Ä#AFÆFÆFr”   r•   c                óê   •— | j         dk    rJ|                     ¦   «         }d                     | j        d         | j        d         | j        ¬¦  «        |d<    t          ¦   «         j        d||dœ|¤Ž d S )	NrT  z%"host={host} port={port} user={user}"rÝ   r™   rV  Úprimary_conninfo)r²   r–   r   )rO   r¨   rl   rL  rM  rE  r¢   )rK   r²   r–   r³   rF  s       €r	   r¢   zHotStandbyCluster.start­  s‰   ø€ ØÔ˜wÒ&Ð&Ø-×2Ò2Ñ4Ô4ˆOà7×>Ò>Øœ fÔ-Øœ fÔ-Øœð ?ñ ô ð Ð.Ñ/ð 	�‰ŒŒÐI˜4°ÐIÐIÀDÐIÐIÐIÐIÐIr   r=  )r9   r:   r;   rM   rb   r‰   r¢   rG  rH  s   @r	   rJ  rJ  y  s²   ø€ € € € € ð "&°tØ!%°dð
+ð 
+ð 
+ð 
+ð 
+ð 
+ð 
+ðDð Dð Dð Dð Dð!ð !ð !ðFJ°ð Jð Jð Jð Jð Jð Jð Jð Jð Jð Jð Jr   rJ  c                   óX   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zdd„Z	d	„ Z
d
„ Zddddœd„ZdS )ÚRunningClusterc                 ó   — || _         d S r   )r$  rÊ   s     r	   rM   zRunningCluster.__init__¼  s   € ØˆŒˆˆr   c                 ó   — dS )NFr   rP   s    r	   rS   zRunningCluster.is_managed¿  s   € Øˆur   c                 ó*   — t          | j        ¦  «        S r   )rŒ   r$  rP   s    r	   ru   z"RunningCluster.get_connection_specÂ  s   € Ý�D”NÑ#Ô#Ð#r   c                 ó   — dS )Nr˜   r   rP   s    r	   rr   zRunningCluster.get_statusÅ  s   € Øˆyr   c                 ó   — d S r   r   )rK   r�   s     r	   r‰   zRunningCluster.initÈ  ó   € Øˆr   r”   c                 ó   — d S r   r   )rK   r²   r�   s      r	   r¢   zRunningCluster.startË  rc  r   c                 ó   — d S r   r   )rK   r²   s     r	   r¼   zRunningCluster.stopÎ  rc  r   c                 ó   — d S r   r   rP   s    r	   rÃ   zRunningCluster.destroyÑ  rc  r   c                 ó    — t          d¦  «        ‚©Nz.cannot modify HBA records of unmanaged cluster©r8   rP   s    r	   rÜ   zRunningCluster.reset_hbaÔ  s   € ÝÐKÑLÔLÐLr   rÝ   NrÞ   c                ó    — t          d¦  «        ‚rh  ri  )rK   rß   rê   rë   rà   rì   rá   s          r	   rï   zRunningCluster.add_hba_entry×  s   € åÐKÑLÔLÐLr   r=  )r9   r:   r;   rM   rS   ru   rr   r‰   r¢   r¼   rÃ   rÜ   rï   r   r   r	   r]  r]  »  sÒ   € € € € € ð ð  ð  ðð ð ð$ð $ð $ðð ð ðð ð ðð ð ð ðð ð ð ðð ð ðMð Mð Mð %+ÀDØ04ðMð Mð Mð Mð Mð Mð Mr   r]  )NNN)r  r'   Úos.pathÚplatformr    ri   r§   r   r"   rc   r¬   r$   rX  r  rw   r   ÚunameÚsystemr1   r
   r   r.   r6   r   r8   r=   r?  rJ  r]  r   r   r	   ú<module>ro     s"  ðð €€€Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø €€€Ø €€€Ø €€€à €€€Ø !Ð !Ð !Ð !Ð !Ð !ð ˆ(Œ.Ñ
Ô
Ô
!€à
ˆiÒÐðð ð ð ð
ð ð ðð ð ð
ð 
ð 
ð 
ð5ð 5ð 5ð 5ð	ð 	ð 	ð 	ð 	�9ñ 	ô 	ð 	ð_Ið _Ið _Ið _Ið _Iñ _Iô _Ið _IðDHð Hð Hð Hð H�'ñ Hô Hð Hð?Jð ?Jð ?Jð ?Jð ?J˜ñ ?Jô ?Jð ?JðDMð Mð Mð Mð M�Wñ Mô Mð Mð Mð Mr   