
    h1                     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"4t`bjj9UH9U`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1L  $D  $$&&##% LL?KYVQYYRX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_done2Peer.start_in_background.<locals>._start_task_done   s@    :%%%Z9O9O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!=LLUV''0#g&--'')&)MgY'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8O8O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;   4dnn6M6MtTWyZ]^;""<"8Z((}}#&&|&<&&|G_`c`m`m_nEo&p^,,""399-""+;-.s}}/E/E.Fb+P # R
 '0@0@0E0E0G0G  ..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$..2I2I4>>KhKhKj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HSM aPWPaPa a>Xc] >Y >S] >B
7Xc] 
7Y 
7[_ 
7-(2t8*< - -J 4 	Y# 	Y
 	Yt 	Yd Xi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+    LL	>> 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!     jjDHH---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     ****,JC!JCP W\U%:Z\_ilamotu - 99&t{{DKK@DIII''(8(89;;((((II))DKK4I4I)Jyy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    99 IIOO !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    /TZZAJJDLL/1A1A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    JJ	
$F  Ffll$: Y;;&($$T* ( 't{{F;JJd# %" DMMO r   c                 J    U R                    H  nUR                  5         M     g r#   )r   r   )r%   r   s     r   r   PeersRoutingRule.shutdownH  s    JJDMMO 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    #%E4 %	* 	(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   