ó
    ¡7�j((  ã                   óà   • S SK r S SKrS SKrS SKJrJrJr  SSKJrJ	r	  SSK
JrJrJr  \R                  " \5      r " S S5      r " S S	5      r " S
 S\5      r " S S5      r " S S\5      rg)é    N)ÚDictÚListÚOptionalé   )Ú
JsonObjectÚ	JsonValue)ÚCockpitProblemÚCockpitProtocolErrorÚCockpitProtocolServerc                   ó*   • \ rS rSrSrS rS rS rSrg)ÚExecutionQueueé   a_  Temporarily delay calls to a given set of class methods.

Functions by replacing the named function at the instance __dict__
level, effectively providing an override for exactly one instance
of `method`'s object.
Queues the invocations.  Run them later with .run(), which also reverses
the redirection by deleting the named methods from the instance.
c                 óŒ   • [         R                  " 5       U l        Xl        U R                   H  nU R	                  U5        M     g ©N)ÚcollectionsÚdequeÚqueueÚmethodsÚ_wrap)Úselfr   Úmethods      Ú0/usr/lib/python3/dist-packages/cockpit/router.pyÚ__init__ÚExecutionQueue.__init__&   s1   € Ü ×&Ò&Ó(ˆŒ
ØŒà—l”lˆFØ�J‰J�vÖò #ó    c                 óh   ^ ^• [        TR                  TR                  R                  UU 4S j5        g )Nc                  ó>   >• TR                   R                  TU 45      $ r   )r   Úappend)Úargsr   r   s    €€r   Ú<lambda>Ú&ExecutionQueue._wrap.<locals>.<lambda>1   s   ø€ ÈÏÉ×IZÑIZÐ\bÐdhÐ[iÔIjr   )ÚsetattrÚ__self__Ú__func__Ú__name__)r   r   s   ``r   r   ÚExecutionQueue._wrap-   s    ù€ ô 	�—‘ §¡×!9Ñ!9Õ;jÕkr   c                 ó  • [         R                  S[        U R                  5      5        U R                   H
  u  pU" U6   M     U R                   H-  n[        UR                  UR                  R                  5        M/     g )Nz.ExecutionQueue: Running %d queued method calls)	ÚloggerÚdebugÚlenr   r   Údelattrr#   r$   r%   )r   r   r   s      r   ÚrunÚExecutionQueue.run3   sX   € Ü�‰ÐEÄsÈ4Ï:É:ÃÔWØ ŸJœJ‰LˆFÙ�D‹Mñ 'ð —l”lˆFÜ�F—O‘O V§_¡_×%=Ñ%=Ö>ò #r   )r   r   N)	r%   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   r,   Ú__static_attributes__© r   r   r   r      s   † ñòòlõ?r   r   c            
       óè   • \ rS rSr% S\S'   Sr\\   \S'   SS jrS r	S r
S	 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\SS4S jrS
\S\SSS\SS4
S jrSSSS\SS4S jjrSrg)ÚEndpointé<   ÚRouterÚrouterNÚ _Endpoint__endpoint_frozen_queuec                 ó2   • UR                  U 5        Xl        g r   )Úadd_endpointr8   ©r   r8   s     r   r   ÚEndpoint.__init__@   s   € Ø×Ñ˜DÔ!Ø�r   c                 ó°   • U R                   b   e[        R                  SU 5        [        U R                  U R
                  U R                  15      U l         g )NzFreezing endpoint %s)r9   r(   r)   r   Údo_channel_controlÚdo_channel_dataÚdo_kill©r   s    r   Úfreeze_endpointÚEndpoint.freeze_endpointD   sK   € Ø×+Ñ+Ñ3Ð3Ð3Ü�‰Ð+¨TÔ2Ü'5°t×7NÑ7NÐPT×PdÑPdÐfj×frÑfrÐ6sÓ'tˆÕ$r   c                 ó�   • U R                   c   e[        R                  SU 5        U R                   R                  5         S U l         g )NzThawing endpoint %s)r9   r(   r)   r,   rB   s    r   Úthaw_endpointÚEndpoint.thaw_endpointI   s=   € Ø×+Ñ+Ñ7Ð7Ð7Ü�‰Ð*¨DÔ1Ø×$Ñ$×(Ñ(Ô*Ø'+ˆÕ$r   c                 ó   • [         er   ©ÚNotImplementedErrorrB   s    r   Údo_closeÚEndpoint.do_closeP   ó   € Ü!Ð!r   ÚchannelÚcommandÚmessageÚreturnc                 ó   • [         er   rI   )r   rN   rO   rP   s       r   r?   ÚEndpoint.do_channel_controlS   rM   r   Údatac                 ó   • [         er   rI   ©r   rN   rT   s      r   r@   ÚEndpoint.do_channel_dataV   rM   r   Úhostú
str | NoneÚgroupc                 ó   • [         er   rI   )r   rX   rZ   rP   s       r   rA   ÚEndpoint.do_killY   rM   r   c                 ó:   • U R                   R                  X5        g r   )r8   Úwrite_channel_datarV   s      r   Úsend_channel_dataÚEndpoint.send_channel_data]   s   € Ø�‰×&Ñ& wÕ5r   ÚmsgúJsonObject | NoneÚkwargsc                 óÖ   • U R                   R                  " U4XS.UD6  US:X  aD  U R                   R                  U    R                  U5        U R                   R	                  U5        g g )N)rN   rO   Úclose)r8   Úwrite_controlÚ	endpointsÚremoveÚdrop_channel)r   rN   rO   ra   rc   s        r   Úsend_channel_controlÚEndpoint.send_channel_control`   s\   € ð 	�‰×!Ò! #ÐR¨wÑRÈ6ÒRØ�gÓØ�K‰K×!Ñ! $Ñ'×.Ñ.¨wÔ7Ø�K‰K×$Ñ$ WÕ-ð r   c                 ó>   • U R                   R                  " X40 UD6  g r   )r8   Úshutdown_endpoint)r   ra   rc   s      r   rm   ÚEndpoint.shutdown_endpointh   s   € Ø�‰×%Ò% dÑ:°6Ó:r   )Ú__endpoint_frozen_queuer8   ©r8   r7   r   )r%   r.   r/   r0   Ú__annotations__r9   r   r   r   rC   rF   rK   Ústrr   r?   Úbytesr@   rA   r_   r   rj   rm   r2   r3   r   r   r5   r5   <   só   ‡ ØÓØ8<Ð˜X nÑ5Ó<ôòuò
,ò"ð"¨#ð "¸ð "Àjð "ÐUYô "ð" sð "°%ð "¸Dô "ð"˜Lð "°ð "È
ð "ÐW[ô "ð6¨ð 6°Eð 6¸dô 6ð.Øð.Ø%(ð.Ø/Bð.ØNWð.à	ô.ñ;Ð%8ð ;È9ð ;ÐY]÷ ;ð ;r   r5   c                   ó   • \ rS rSrSrg)ÚRoutingErrorél   r3   N)r%   r.   r/   r0   r2   r3   r   r   ru   ru   l   s   † Úr   ru   c                   óH   • \ rS rSr% S\S'   SS jrS\S\\   4S jr	S r
S	rg
)ÚRoutingRuleép   r7   r8   c                 ó   • Xl         g r   ©r8   r<   s     r   r   ÚRoutingRule.__init__s   s   € Ø�r   ÚoptionsrQ   c                 ó   • [         e)a5  Check if a routing rule applies to a given 'open' message.

This should inspect the options dictionary and do one of the following three things:

    - return an Endpoint to handle this channel
    - raise a RoutingError to indicate that the open should be rejected
    - return None to let the next rule run
rI   )r   r}   s     r   Ú
apply_ruleÚRoutingRule.apply_rulev   s
   € ô "Ð!r   c                 ó   • [         er   rI   rB   s    r   ÚshutdownÚRoutingRule.shutdown�   rM   r   r{   Nrp   )r%   r.   r/   r0   rq   r   r   r   r5   r   r‚   r2   r3   r   r   rx   rx   p   s*   ‡ ØÓôð	" *ð 	"°¸(Ñ1Cô 	"õ"r   rx   c            	       óˆ  • \ rS rSr% \\   \S'   \\\	4   \S'   S\S'   \
R                  \S'   Sr\\S'   S\\   4S	 jrS
\4S jrS\S
\	4S jrS\S
S4S jrS\	S
S4S jrS&S\	SSS\S
S4S jjrSSS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
\4S  jrSr\\
R:                     \S!'   S"\\   S
S4S# jrS'S$ jr S%r!g)(r7   é…   Úrouting_rulesÚopen_channelszdict[Endpoint, set[str]]rg   Úno_endpointsFÚ_eofc                 ó²   • U H	  nXl         M     Xl        0 U l        0 U l        [        R
                  " 5       U l        U R                  R                  5         g r   )r8   r†   r‡   rg   ÚasyncioÚEventrˆ   Úset)r   r†   Úrules      r   r   ÚRouter.__init__Œ   sF   € Û!ˆDØŽKñ "à*ÔØˆÔØˆŒÜ#ŸMšM›OˆÔØ×Ñ×ÑÕr   rQ   c                 ó   • 0 $ )z7Used by the 'info' channel.  Gets overridden in Bridge.r3   rB   s    r   ÚinfoÚRouter.info•   s   € àˆ	r   r}   c                 óð   • U R                    HG  n[        R                  SU5        UR                  U5      nUc  M/  [        R                  SU5        Us  $    [        R                  S5        [	        S5      e)Nz  applying rule %sz    resulting endpoint is %sz  No rules matchedznot-supported)r†   r(   r)   r   ru   )r   r}   rŽ   Úendpoints       r   Úcheck_rulesÚRouter.check_rules™   sc   € Ø×&Ô&ˆDÜ�L‰LÐ-¨tÔ4Ø—‘ wÓ/ˆHØÓ#Ü—‘Ð;¸XÔFØ’ñ 'ô �L‰LÐ-Ô.Ü˜Ó/Ð/r   rN   Nc                 óÈ   •  U R                   R                  U5        [        R                  SU5        g ! [         a#    [        R                  SXR                   5         g f = f)Nzrouter dropped channel %sz.trying to drop non-existent channel %s from %s)r‡   Úpopr(   r)   ÚKeyErrorÚerror)r   rN   s     r   ri   ÚRouter.drop_channel¤   sQ   € ð	hØ×Ñ×"Ñ" 7Ô+Ü�L‰LÐ4°gÕ>øÜó 	hÜ�L‰LÐIÈ7×TfÑTfÖgð	hús   ‚14 ´*A!Á A!r”   c                 óf   • [        5       U R                  U'   U R                  R                  5         g r   )r�   rg   rˆ   Úclear)r   r”   s     r   r;   ÚRouter.add_endpoint«   s$   € Ü#&£5ˆ�‰�xÑ Ø×Ñ×ÑÕ!r   ra   rb   rc   c                 ó(  • U R                   R                  U5      n[        R                  SXU5        U H*  nU R                  " U4SUS.UD6  U R                  U5        M,     U R                   (       d  U R                  R                  5         U R                  (       at  [        R                  SU R                   5        U R                   (       dB  U R                  (       a0  [        R                  S5        U R                  R                  5         g g g g )Nz'shutdown_endpoint(%s, %s) will close %sre   ©rO   rN   ú  endpoints remaining: %rz  close transport)rg   r˜   r(   r)   rf   ri   rˆ   r�   r‰   Ú	transportre   )r   r”   ra   rc   ÚchannelsrN   s         r   rm   ÚRouter.shutdown_endpoint¯   sÇ   € Ø—>‘>×%Ñ% hÓ/ˆÜ�‰Ð>ÀÐRZÔ[ÛˆGØ×Ò˜sÐO¨G¸WÑOÈÒOØ×Ñ˜gÖ&ñ  ð �~�~Ø×Ñ×!Ñ!Ô#ð �9�9Ü�L‰LÐ4°d·n±nÔEØ—>—> d§n§nÜ—‘Ð0Ô1Ø—‘×$Ñ$Õ&ð '5�>ð r   rX   rY   rZ   rP   c                 ó¤   • [        U R                  5      n[        R                  SX[	        U5      5        U H  nUR                  XU5        M     g )Nz+do_kill(%s, %s).  Considering %d endpoints.)r�   rg   r(   r)   r*   rA   )r   rX   rZ   rP   rg   r”   s         r   rA   ÚRouter.do_killÀ   sB   € Ü˜Ÿ™Ó'ˆ	Ü�‰ÐBÀDÔQTÐU^ÓQ_Ô`Û!ˆHØ×Ñ˜T¨'Ö2ò "r   rO   c                 óÜ  • US:X  a~  XR                   ;   a  [        S5      e [        R                  SXR	                  S5      5        U R                  U5      nX@R                   U'   U R                  U   R                  U5        O U R                   U   nUR                  XU5        g ! [         a)  nU R                  UR                  5       SUS9   S nAg S nAff = f! [         a     g f = f)NÚopenzchannel is already openz5Trying to find endpoint for new channel %s payload=%sÚpayloadre   r    )r‡   r
   r(   r)   Úgetr•   ru   rf   Ú	get_attrsrg   Úaddr™   r?   )r   rN   rO   rP   r”   Úexcs         r   Úchannel_control_receivedÚRouter.channel_control_receivedÆ   sæ   € ð �fÓØ×,Ñ,Ó,Ü*Ð+DÓEÐEðÜ—‘ÐTÐV]×_jÑ_jÐktÓ_uÔvØ×+Ñ+¨GÓ4�ð
 +3×Ñ˜wÑ'Ø�N‰N˜8Ñ$×(Ñ(¨Õ1ðØ×-Ñ-¨gÑ6�ð 	×#Ñ# G°gÕ>øô  ó Ø×"Ñ" 3§=¡=£?¸GÈWÐ"ÑUÜûðûô ó áðús)   ¢6B( ÂC Â(
CÂ2CÃCÃ
C+Ã*C+rT   c                 óf   •  U R                   U   nUR                  X5        g ! [         a     g f = fr   )r‡   r™   r@   )r   rN   rT   r”   s       r   Úchannel_data_receivedÚRouter.channel_data_receivedá   s;   € ð	Ø×)Ñ)¨'Ñ2ˆHð 	× Ñ  Õ/øô ó 	Ùð	ús   ‚# £
0¯0c                 ó  • [         R                  SU 5        [        U R                  5      nU H  nUR	                  5         M     SU l        [         R                  SU R                  5        [        U R                  5      $ )Nzeof_received(%r)Tr¡   )r(   r)   r�   rg   rK   r‰   Úbool)r   rg   r”   s      r   Úeof_receivedÚRouter.eof_receivedé   s`   € Ü�‰Ð'¨Ô.ä˜Ÿ™Ó'ˆ	Û!ˆHØ×ÑÖñ "ð ˆŒ	Ü�‰Ð0°$·.±.ÔAÜ�D—N‘NÓ#Ð#r   Ú_communication_doner­   c                 óÖ   • U R                   (       d  U R                  5         U R                  b;  Uc  U R                  R                  S 5        g U R                  R	                  U5        g g r   )r‰   rµ   r·   Ú
set_resultÚset_exception)r   r­   s     r   Ú	do_closedÚRouter.do_closedö   sS   € à�y�yØ×ÑÔà×#Ñ#Ñ/Ø‰{Ø×(Ñ(×3Ñ3°DÕ9à×(Ñ(×6Ñ6°sÕ;ð	 0r   c              ƒ   óˆ  #   • U R                   b   e[        R                  " 5       R                  5       U l          U R                   I Sh  v•N   SU l         U R                  R                  5       I Sh  v•N   g N.! [        [
        4 a     N>f = f N! SU l         U R                  R                  5       I Sh  v•N    f = f7f)zNWait until communication is complete on the router and all endpoints are done.N)r·   r‹   Úget_running_loopÚcreate_futureÚBrokenPipeErrorÚConnectionResetErrorrˆ   ÚwaitrB   s    r   ÚcommunicateÚRouter.communicate  s°   é € à×'Ñ'Ñ/Ð/Ð/Ü#*×#;Ò#;Ó#=×#KÑ#KÓ#MˆÔ ð		+Ø×*Ñ*×*Ð*ð (,ˆDÔ$ð ×#Ñ#×(Ñ(Ó*×*Ñ*ñ +øÜÔ!5Ð6ó 	Ùð	úñ +øð	 (,ˆDÔ$ð ×#Ñ#×(Ñ(Ó*×*Ò*üsd   ‚8C»A; Á
A9ÁA; Á$CÁ3BÁ4CÁ9A; Á;BÂB ÂBÂB ÂCÂ%B?Â8B;Â9B?Â?C)r·   r‰   rg   rˆ   r‡   r†   r   )rQ   N)"r%   r.   r/   r0   r   rx   rq   r   rr   r5   r‹   rŒ   r‰   r´   r   r   r‘   r•   ri   r;   r   rm   rA   r®   rs   r±   rµ   r·   r   ÚFutureÚ	Exceptionr»   rÃ   r2   r3   r   r   r7   r7   …   sP  ‡ Ø˜Ñ$Ó$Ø˜˜X˜Ñ&Ó&Ø)Ó)Ø—-‘-ÓØ€Dˆ$Óð  d¨;Ñ&7ô  ð�jô ð	0 :ð 	0°(ô 	0ðh Cð h¨Dô hð" Xð "°$ô "ñ'¨(ð 'Ð9Lð 'Ð_hð 'Ðmqõ 'ð"3˜Lð 3°ð 3È
ð 3ÐW[ô 3ð?°ð ?¸cð ?ÈJð ?Ð[_ô ?ð60¨Sð 0¸ð 0À$ô 0ð	$˜dô 	$ð 59Ð˜ '§.¡.Ñ1Ó8ð	<˜X iÑ0ð 	<°Tô 	<÷+r   r7   )r‹   r   ÚloggingÚtypingr   r   r   Újsonutilr   r   Úprotocolr	   r
   r   Ú	getLoggerr%   r(   r   r5   ru   rx   r7   r3   r   r   Ú<module>rÌ      si   ðó$ Û Û ß 'Ñ 'ç +ß QÑ Qà	×	Ò	˜8Ó	$€÷?ñ ?÷>-;ñ -;ô`	�>ô 	÷"ñ "ô*I+Ð"õ I+r   