ó
    ¡7�j¹1  ã                   ó4  • S SK r S SKrS SKrS SKJrJrJrJr  SSKJ	r	J
r
  SSKJr  SSKJrJrJr  SSKJrJrJr  SSKJrJr  \R0                  " \5      r " S	 S
\5      r " S S\5      r " S S\\\5      r " S S\5      r " S S\5      r  " S S\5      r!g)é    N)ÚCallableÚListÚOptionalÚSequenceé   )Ú
JsonObjectÚ	JsonValue)ÚBridgeConfig)ÚCockpitProblemÚCockpitProtocolÚCockpitProtocolError)ÚEndpointÚRouterÚRoutingRule)ÚSubprocessProtocolÚSubprocessTransportc                   ó   • \ rS rSrSrg)Ú	PeerErroré    © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r   ó    Ú./usr/lib/python3/dist-packages/cockpit/peer.pyr   r       s   † Úr   r   c                   ó"   • \ rS rSrS\4S jrSrg)Ú
PeerExitedé$   Ú	exit_codec                 ó   • Xl         g ©N©r!   )Úselfr!   s     r   Ú__init__ÚPeerExited.__init__%   s   € Ø"�r   r$   N)r   r   r   r   Úintr&   r   r   r   r   r   r   $   s   † ð# #÷ #r   r   c                   óò  ^ • \ rS rSr% \\/ S4      \S'   \\R                     \S'   S\
4U 4S jjrS'S jrS	\\   S
\\   S\R                  4S jrS(S\\   S\S\4S jjrS(S\\   S\SS4S jjrS\/ S4   SS4S jrS'S jrS\SS4S jrS\S\SS4S jrS\4S jrS\\   SS4S jrS'S jrS\S\S\SS4S jrS\S\SS4S jr S\S\S\SS4S jr!S\S\SS4S  jr"S!S"S#S"S\SS4S$ jr#S'S% jr$S&r%U =r&$ ))ÚPeeré)   NÚdone_callbacksÚinit_futureÚrouterc                 ó¢   >• [         TU ]  U5        U R                  5         [        R                  " 5       R                  5       U l        / U l        g r#   )Úsuperr&   Úfreeze_endpointÚasyncioÚget_running_loopÚcreate_futurer-   r,   )r%   r.   Ú	__class__s     €r   r&   ÚPeer.__init__-   s@   ø€ Ü‰Ñ˜Ô ð 	×ÑÔä"×3Ò3Ó5×CÑCÓEˆÔØ ˆÕr   Úreturnc              ƒ   ó   #   • [         e7fr#   )ÚNotImplementedError©r%   s    r   Údo_connect_transportÚPeer.do_connect_transport7   s   é € Ü!Ð!ùs   ‚	ÚargvÚenvc           	   ‹   ó¦   #   • [         R                  " 5       n[        S U 5       5      n[        X@U4S[        [        R
                  40 UD60UD6$ 7f)Nc              3   óD   #   • U  H  oR                  S S5      v •  M     g7f)Ú=r   N)Úsplit)Ú.0Úes     r   Ú	<genexpr>ÚPeer.spawn.<locals>.<genexpr>=   s   é € Ð5²¨AŸ™  QŸ˜²ùs   ‚ r>   )r2   r3   Údictr   ÚosÚenviron)r%   r=   r>   ÚkwargsÚloopÚuser_envs         r   ÚspawnÚ
Peer.spawn:   sI   é € ä×'Ò'Ó)ˆÜÑ5±Ó5Ó5ˆÜ" 4¨tÑ`¼¼b¿j¹jÑ9UÈHÑ9UÐ`ÐY_Ñ`Ð`ùs   ‚AAÚ	init_hostrJ   c              ‹   óz  ^ ^#   • T R                   c   eS[        R                  SS4UU 4S jjn[        R                  " T R	                  5       5      mTR                  U5         T R                   I Sh  v•N n ST l         TR                  5       (       d  TR                  5         Ub<  [        R                  SU5        T R                  " S	SSUS.UD6  T R                  5         U$  Nr! [        [        4 a    TI Sh  v•N    e f = f! ST l         TR                  5       (       d  TR                  5         f f = f7f)
a€  Request that the Peer is started and connected to the router.

Creates the transport, connects it to the protocol, and participates in
exchanging of init messages.  If anything goes wrong, the connection
will be closed and an exception will be raised.

The Peer starts out in a frozen state (ie: attempts to send messages to
it will initially be queued). If init_host is not None then an init
message is sent with the given 'host' field, plus any extra kwargs, and
the queue is thawed. Otherwise, the caller is responsible for sending
the init message and thawing the peer.

In any case, the return value is the init message from the peer.
NÚtaskr7   c                 ó°   >• U TL d   e U R                  5         g ! [        R                   a     g [         a  nTR	                  U5         S nAg S nAff = fr#   )Úresultr2   ÚCancelledErrorÚ	ExceptionÚclose)rQ   ÚexcÚconnect_taskr%   s     €€r   Ú_connect_task_doneÚ&Peer.start.<locals>._connect_task_doneQ   sM   ø€ Ø˜<Ò'Ð'Ð'ð Ø—‘•øÜ×)Ñ)ó ÙÜó  Ø—
‘
˜3—‘ûð ús   Š ›A±	AºAÁAz$  sending init message back, host %sÚinitr   )ÚcommandÚversionÚhostr#   )r-   r2   ÚTaskÚcreate_taskr;   Úadd_done_callbackr   ÚBrokenPipeErrorÚdoneÚcancelÚloggerÚdebugÚwrite_controlÚthaw_endpoint)r%   rO   rJ   rY   Úinit_messagerX   s   `    @r   ÚstartÚ
Peer.start@   s3  ùé € ð ×ÑÑ+Ð+Ð+ð	 ¤W§\¡\ð 	 °d÷ 	 ð 	 ô ×*Ò*¨4×+DÑ+DÓ+FÓGˆØ×&Ñ&Ð'9Ô:ð	&ð "&×!1Ñ!1×1‰Lð  $ˆDÔð  ×$Ñ$×&Ñ&Ø×#Ñ#Ô%àÑ Ü�L‰LÐ?ÀÔKà×ÒÐY¨V¸QÀYÑYÐRXÒYð ×ÑÔ àÐñ5 2øäœOÐ,ó 	ð
 ×Ñàð	ûð  $ˆDÔð  ×$Ñ$×&Ñ&Ø×#Ñ#Õ%ð 'üsI   „A D;Á%C) Á4C'Á5C) Á:A-D;Ã'C) Ã)DÃ>DÃ?DÄD	 Ä	/D8Ä8D;c                 óª   ^• S[         R                  SS 4U4S jjn[         R                  " U R                  " U40 UD65      mTR	                  U5        g )NrQ   r7   c                 óŠ   >• U TL d   e U R                  5         g ! [        [        [        [        R
                  4 a     g f = fr#   )rS   ÚOSErrorr   r   r2   rT   )rQ   Ú
start_tasks    €r   Ú_start_task_doneÚ2Peer.start_in_background.<locals>._start_task_done‚   s@   ø€ Ø˜:Ò%Ð%Ð%ðØ—‘•øÜœZ¬¼×9OÑ9OÐPó Ùðús   Š ›$AÁA)r2   r_   r`   rj   ra   )r%   rO   rJ   rp   ro   s       @r   Ústart_in_backgroundÚPeer.start_in_background�   sI   ø€ ð	¤7§<¡<ð 	°D÷ 	ô ×(Ò(¨¯ª°IÑ)HÀÑ)HÓIˆ
Ø×$Ñ$Ð%5Õ6r   Úcallbackc                 ó:   • U R                   R                  U5        g r#   )r,   Úappend)r%   rt   s     r   ra   ÚPeer.add_done_callbackŽ   s   € Ø×Ñ×"Ñ" 8Õ,r   c                 ó   • g r#   r   r:   s    r   Údo_superuser_init_doneÚPeer.do_superuser_init_done’   ó   € Ør   Úmessagec                 ó   • g r#   r   )r%   r|   s     r   Údo_authorizeÚPeer.do_authorize•   r{   r   r\   c                 ó  • US:X  a>  U R                   b1  [        R                  S5        U R                   R                  U5        g US:X  a  U R	                  U5        g US:X  a  U R                  5         g [        SU 35      e)Nr[   z:Got init message with active init_future.  Setting result.Ú	authorizezsuperuser-init-donez$Received unexpected control message )r-   re   rf   Ú
set_resultr~   ry   r   )r%   r\   r|   s      r   Útransport_control_receivedÚPeer.transport_control_received˜   st   € Ø�fÓ ×!1Ñ!1Ñ!=Ü�L‰LÐUÔVØ×Ñ×'Ñ'¨Õ0Ø˜Ó#Ø×Ñ˜gÕ&ØÐ-Ó-Ø×'Ñ'Õ)ä&Ð)MÈgÈYÐ'WÓXÐXr   c                 óX   • [         R                  SU R                  R                  5        g)NzPeer %s received unexpected EOFT)re   rf   r5   r   r:   s    r   Úeof_receivedÚPeer.eof_received£   s    € ô 	�‰Ð6¸¿¹×8OÑ8OÔPØr   rW   c                 óð  • [         R                  SU R                  R                  [	        U5      U5        Uc  U R                  SS9  O¯[        U[        5      (       a>  UR                  S:X  a  U R                  SS9  OzU R                  SSUR                   3S9  O\[        U[        5      (       a  U R                  UR                  5        O+U R                  SS	UR                  R                   S
U< 3S9  U R                  bX  U R                  R                  5       (       d9  Ub  U R                  R                  U5        OU R                  R                  5         U R                   H
  nU" 5         M     g )NzPeer %s connection lost %s %sÚ
terminated)Úproblemé   z
no-cockpitzPeer exited with status )rŠ   r|   zinternal-errorÚ[z] )re   rf   r5   r   ÚtypeÚshutdown_endpointÚ
isinstancer   r!   r   Úattrsr-   rc   Úset_exceptionrd   r,   )r%   rW   rt   s      r   Ú	do_closedÚPeer.do_closed­   s;  € Ü�‰Ð4°d·n±n×6MÑ6MÌtÐTWËyÐZ]Ô^à‰;Ø×"Ñ"¨<Ð"Ò8Ü˜œZ×(Ñ(à�}‰} Ó#Ø×&Ñ&¨|Ð&Ò<à×&Ñ&¨|ÐG_Ð`c×`mÑ`mÐ_nÐEoÐ&ÒpÜ˜œ^×,Ñ,Ø×"Ñ" 3§9¡9Õ-à×"Ñ"Ð+;Ø-.¨s¯}©}×/EÑ/EÐ.FÀbÈÉÐ+Pð #ñ Rð
 ×ÑÑ'°×0@Ñ0@×0EÑ0E×0GÑ0GØ‰Ø× Ñ ×.Ñ.¨sÕ3à× Ñ ×'Ñ'Ô)à×+Ô+ˆHÙŽJò ,r   c                 ób  • [        U R                  [        5      (       d   e[        R	                  SU R
                  R                  U R                  R                  5       5        U R                  R                  5       n[        U[        5      (       d   eU R                  [        U5      5        g )NzPeer %s exited, status %d)r�   Ú	transportr   re   rf   r5   r   Úget_returncoder(   rV   r   )r%   Ú
returncodes     r   Úprocess_exitedÚPeer.process_exitedÉ   sx   € Ü˜$Ÿ.™.Ô*=×>Ñ>Ð>Ð>Ü�‰Ð0°$·.±.×2IÑ2IÈ4Ï>É>×KhÑKhÓKjÔkØ—^‘^×2Ñ2Ó4ˆ
Ü˜*¤c×*Ñ*Ð*Ð*Ø�
‰
”:˜jÓ)Õ*r   Úchannelc                 óX   • U R                   b  [        S5      eU R                  XU5        g )Nz7Received unexpected channel control message before init)r-   r   Úsend_channel_control©r%   rš   r\   r|   s       r   Úchannel_control_receivedÚPeer.channel_control_receivedÑ   s*   € Ø×ÑÑ'Ü&Ð'`ÓaÐaØ×!Ñ! '°GÕ<r   Údatac                 óV   • U R                   b  [        S5      eU R                  X5        g )Nz,Received unexpected channel data before init)r-   r   Úsend_channel_data©r%   rš   r    s      r   Úchannel_data_receivedÚPeer.channel_data_receivedÖ   s(   € Ø×ÑÑ'Ü&Ð'UÓVÐVØ×Ñ˜wÕ-r   c                 óD   • U R                   b   eU R                  U5        g r#   ©r-   rg   r�   s       r   Údo_channel_controlÚPeer.do_channel_controlÜ   ó"   € Ø×ÑÑ'Ð'Ð'Ø×Ñ˜7Õ#r   c                 óD   • U R                   b   eU R                  X5        g r#   )r-   Úwrite_channel_datar£   s      r   Údo_channel_dataÚPeer.do_channel_dataà   s"   € Ø×ÑÑ'Ð'Ð'Ø×Ñ Õ.r   r^   z
str | NoneÚgroupc                 óD   • U R                   b   eU R                  U5        g r#   r§   )r%   r^   r¯   r|   s       r   Údo_killÚPeer.do_killä   rª   r   c                 ó$   • U R                  5         g r#   )rV   r:   s    r   Údo_closeÚPeer.do_closeè   s   € Ø�
‰
�r   )r,   r-   ©r7   Nr#   )'r   r   r   r   r   r   Ú__annotations__r   r2   ÚFuturer   r&   r;   r   ÚstrÚ	TransportrM   r	   r   rj   rr   ra   ry   r~   rƒ   Úboolr†   rU   r’   r˜   rž   Úbytesr¤   r¨   r­   r±   r´   r   Ú__classcell__©r5   s   @r   r*   r*   )   sÂ  ø‡ Ø˜ " d (Ñ+Ñ,Ó,Ø˜'Ÿ.™.Ñ)Ó)ð!˜v÷ !ô"ða ¨¡ð a°H¸S±Mð aÐPW×PaÑPaô añ> X¨c¡]ð >ÀYð >ÐS]õ >ñB
7¨X°c©]ð 
7ÈYð 
7Ð[_õ 
7ð-¨(°2°t°8Ñ*<ð -Àô -ôð Jð °4ô ð	Y°#ð 	YÀ
ð 	YÈtô 	Yð˜dô ð˜X iÑ0ð °Tô ô8+ð=°ð =¸cð =ÈJð =Ð[_ô =ð
.¨Sð .¸ð .À$ô .ð$¨#ð $¸ð $Àjð $ÐUYô $ð/ sð /°%ð /¸Dô /ð$˜Lð $°ð $È
ð $ÐW[ô $÷ò r   r*   c                   ój   ^ • \ rS rSr% \\S'   \\   \S'   \\   \S'   S\S\4U 4S jjr	S	S jr
SrU =r$ )
ÚConfiguredPeeréì   ÚconfigÚargsr>   r.   c                 ót   >• X l         UR                  U l        UR                  U l        [
        TU ]  U5        g r#   )rÂ   rM   rÃ   rI   r>   r0   r&   ©r%   r.   rÂ   r5   s      €r   r&   ÚConfiguredPeer.__init__ñ   s+   ø€ ØŒØ—L‘LˆŒ	Ø—>‘>ˆŒÜ‰Ñ˜Õ r   c              ƒ   ól   #   • U R                  U R                  U R                  5      I S h  v•N   g  N7fr#   )rM   rÃ   r>   r:   s    r   r;   Ú#ConfiguredPeer.do_connect_transport÷   s!   é € Ø�j‰j˜Ÿ™ D§H¡HÓ-×-Ó-ùs   ‚*4¬2­4)rÃ   rÂ   r>   r¶   )r   r   r   r   r
   r·   r   r¹   r   r&   r;   r   r½   r¾   s   @r   rÀ   rÀ   ì   s:   ø‡ ØÓØ
�3‰-ÓØ	�#‰Óð!˜vð !¨|÷ !÷.ò .r   rÀ   c                   ó~   ^ • \ rS rSr% \\S'   \\S'   \\   \S'   S\	S\4U 4S jjr
S\S\\   4S	 jrS
 rS rSrU =r$ )ÚPeerRoutingRuleéû   rÂ   ÚmatchÚpeerr.   c                 ó`   >• [         TU ]  U5        X l        UR                  U l        S U l        g r#   )r0   r&   rÂ   rÌ   rÍ   rÅ   s      €r   r&   ÚPeerRoutingRule.__init__   s'   ø€ Ü‰Ñ˜Ô ØŒØ—\‘\ˆŒ
Øˆ�	r   Úoptionsr7   c                 ó.  • U R                   R                  5        HK  u  p#X!;  a  [        R                  SU5          g Uc  M'  X   U:w  d  M1  [        R                  SX!U   U5          g    U R                  c”  [        U R                  U R                  5      U l        U R                  R                  U R                  5        U R                  R                  (       d   eU R                  R                  U R                  R                  S9  U R                  $ )Nz+        rejecting because key %s is missingz;        rejecting because key %s has wrong value %s (vs %s))rO   )rÌ   Úitemsre   rf   rÍ   rÀ   r.   rÂ   ra   Úpeer_closedrO   rr   )r%   rÐ   ÚkeyÚvalues       r   Ú
apply_ruleÚPeerRoutingRule.apply_rule  sÖ   € ð Ÿ*™*×*Ñ*Ö,‰JˆCØÓ!Ü—‘ÐJÈCÔPÙØÓ  W¡\°UÕ%:Ü—‘ÐZÐ\_ÐilÑamÐotÔuÙñ -ð �9‰9ÑÜ& t§{¡{°D·K±KÓ@ˆDŒIØ�I‰I×'Ñ'¨×(8Ñ(8Ô9Ø—;‘;×(×(Ð(Ð(Ø�I‰I×)Ñ)°D·K±K×4IÑ4IÐ)ÑJà�y‰yÐr   c                 ó   • S U l         g r#   )rÍ   r:   s    r   rÓ   ÚPeerRoutingRule.peer_closed  s	   € Øˆ�	r   c                 óT   • U R                   b  U R                   R                  5         g g r#   )rÍ   rV   r:   s    r   ÚshutdownÚPeerRoutingRule.shutdown  s   € Ø�9‰9Ñ Ø�I‰I�O‰OÕð !r   )rÂ   rÌ   rÍ   )r   r   r   r   r
   r·   r   r   r*   r   r&   rÖ   rÓ   rÛ   r   r½   r¾   s   @r   rÊ   rÊ   û   sR   ø‡ ØÓØÓØ
�4‰.Óð˜vð ¨|÷ ð *ð °¸$±ô ò(÷ð r   rÊ   c                   ó`   • \ rS rSr% / r\\   \S'   S\S\	\
   4S jrS\\   SS4S jrS	 rS
rg)ÚPeersRoutingRulei"  ÚrulesrÐ   r7   c                 óT  • [         R                  S[        U R                  5      5        U R                   HZ  n[         R                  SUR                  R
                  5        UR                  U5      nUc  MC  [         R                  S5        Us  $    [         R                  S5        g )Nz    considering %d rulesz      considering %sz        selectedz      no peer rules matched)re   rf   Úlenrß   rÂ   ÚnamerÖ   )r%   rÐ   ÚruleÚendpoints       r   rÖ   ÚPeersRoutingRule.apply_rule%  sx   € Ü�‰Ð/´°T·Z±Z³ÔAØ—J”JˆDÜ�L‰LÐ/°·±×1AÑ1AÔBØ—‘ wÓ/ˆHØÓ#Ü—‘Ð/Ô0Ø’ñ ô 	�‰Ð2Ô3Ør   Úbridge_configsNc                 ó€  • U R                   n/ U l         U HŒ  nUR                  (       d  SUR                  ;   a  M&  [        U5       H&  nUR                  U:X  d  M  UR                  U5          O   [        U R                  U5      nU R                   R                  U5        MŽ     U H  nUR                  5         M     g )Nr^   )
rß   Ú
privilegedrÌ   ÚlistrÂ   ÚremoverÊ   r.   rv   rÛ   )r%   ræ   Ú	old_rulesrÂ   rã   s        r   Úset_configsÚPeersRoutingRule.set_configs0  s™   € Ø—J‘Jˆ	ØˆŒ
ã$ˆFà× ×  F¨f¯l©lÓ$:Ùô ˜Yž�Ø—;‘; &Õ(Ø×$Ñ$ TÔ*Ùñ (ô ' t§{¡{°FÓ;�à�J‰J×Ñ˜dÖ#ñ %ó" ˆDØ�M‰MŽOò r   c                 óJ   • U R                    H  nUR                  5         M     g r#   )rß   rÛ   )r%   rã   s     r   rÛ   ÚPeersRoutingRule.shutdownH  s   € Ø—J”JˆDØ�M‰MŽOò r   )rß   )r   r   r   r   rß   r   rÊ   r·   r   r   r   rÖ   r   r
   rì   rÛ   r   r   r   r   rÞ   rÞ   "  sF   ‡ Ø#%€Eˆ4�Ñ Ó%ð	 *ð 	°¸(Ñ1Cô 	ð¨(°<Ñ*@ð ÀTô õ0r   rÞ   )"r2   ÚloggingrH   Útypingr   r   r   r   Újsonutilr   r	   Úpackagesr
   Úprotocolr   r   r   r.   r   r   r   Ú
transportsr   r   Ú	getLoggerr   re   r   rU   r   r*   rÀ   rÊ   rÞ   r   r   r   Ú<module>r÷      sŒ   ðó$ Û Û 	ß 5Ó 5ç +Ý "ß KÑ Kß 1Ñ 1ß ?à	×	Ò	˜8Ó	$€ô	�ô 	ô#�ô #ô
@ˆ?Ð.°ô @ôF.�Tô .ô$�kô $ôN(�{õ (r   