
    it                    v   d Z ddlmZ ddlZddlZddlmZ ddlmZ erddlm	Z	 ddlm
Z
 ddlmZ 	 dd	lmZ dd
lmZ n# e$ r dd	lmZ dd
lmZ Y nw xY wddlmZ  G d de          ZdZd)dZd*dZd*dZd*dZd+dZdZdZdZdZ G d  d!          Z G d" d#          Zd,d'Z e!d(k    r e e"           dS dS )-zKexecnet IO initialization code.

Creates IO instances used for gateway IO.
    )annotationsN)TYPE_CHECKING)cast)Channel)	ExecModel)XSpec)Message)Popen2IO)partialc                  <     e Zd ZU ded<   d fdZdd	Zdd
Z xZS )Popen2IOMasterstrremoteaddress	execmodelr   returnNonec                    |j         j        }|j                             |||          x| _        }t	                                          |j        |j        |           d S )N)stdoutstdin)r   )
subprocessPIPEPopenpopensuper__init__r   r   )selfargsr   r   p	__class__s        Y/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/execnet/gateway_io.pyr   zPopen2IOMaster.__init__    s[    #("-33DT3RRR
Q!(i@@@@@    
int | Nonec                X    	 | j                                         S # t          $ r Y d S w xY wN)r   waitOSErrorr   s    r    r%   zPopen2IOMaster.wait%   s;    	:??$$$ 	 	 	44	s    
))c                    	 | j                                          d S # t          $ rK}t          j                            d|z             t          j                                         Y d }~d S d }~ww xY w)NzERROR killing: %s
)r   killr&   sysstderrwriteflush)r   es     r    r)   zPopen2IOMaster.kill+   s    	JOO 	 	 	J2Q6777J	s    
A2A A--A2)r   r   r   r   r   r"   r   r   )__name__
__module____qualname____annotations__r   r%   r)   __classcell__)r   s   @r    r   r      sy         A A A A A A
          r!   r   z+import sys;exec(eval(sys.stdin.readline()))pathr   r   	list[str]c                    t           j                            d          r|                     dd          } t	          j        |           S )z}
    Use shell lexer to split the given path into a list of components,
    taking care to handle Windows' '' correctly.
    win\/)r*   platform
startswithreplaceshlexsplit)r6   s    r    shell_split_pathrA   6   s?    
 |u%% '||D#&&;tr!   specr   c                    | j         rt          | j                   nt          j        g}|                    d           | j        r|                    d           |                    dt          g           |S )Nz-uz-Bz-c)pythonrA   r*   
executableappenddont_write_bytecodeextendpopen_bootstrapline)rB   r   s     r    
popen_argsrJ   A   so    ,0KMDK(((cn=MDKK DKK*+,,,Kr!   c                .   | j         pd}ddg}| j        )|                    dt          | j                  g           | j        J |                    | j                                                   | dt           d}|                    |           |S )NrD   ssh-C-F -c "")rD   
ssh_configrH   r   rL   r@   rI   rF   rB   remotepythonr   	remotecmds       r    ssh_argsrU   J   s     ;*(L4=D"T3t//01118KK  !!!<<&9<<<IKK	Kr!   c                    | j         J | j        pd}dd| j         ddg}| j        )|                    dt	          | j                  g           | dt
           d}|                    |g           |S )	NrD   vagrantrL   z--rM   rN   rO   rP   )vagrant_sshrD   rQ   rH   r   rI   rR   s       r    vagrant_ssh_argsrY   Z   s     ''';*(Lud.d;D"T3t//0111<<&9<<<IKKKr!   r   r   c                "   | j         rt          |           }t          ||          S | j        r-t	          |           }t          ||          }| j        |_        |S | j        r-t          |           }t          ||          }| j        |_        |S J r$   )r   rJ   r   rL   rU   r   rX   rY   )rB   r   r   ios       r    	create_ior\   k   s    z /$dI...x ~~D),,8	 %%D),,+	5r!               c                  r    e Zd ZdZddZddZddZddZddZddZ	ddZ
d dZed!d            Zd!dZdS )"ProxyIOaL  A Proxy IO object allows to instantiate a Gateway
    through another "via" gateway.

    A master:ProxyIO object provides an IO object effectively connected to the
    sub via the forwarder. To achieve this, master:ProxyIO interacts with
    forwarder:serve_proxy_io() which itself instantiates and interacts with the
    sub.
    proxy_channelr   r   r   r   r   c                    |j                                         | _        |                    | j                   || _        | j                            d          | _        || _        d S )Nr)gateway
newchannelcontrolchansendiochanmakefileiochan_filer   )r   rc   r   s      r    r   zProxyIO.__init__   s\     )0;;==4+,,,#;//44"r!   nbytesintbytesc                6    | j                             |          S r$   )rl   read)r   rm   s     r    rq   zProxyIO.read   s     $$V,,,r!   datac                :    | j                             |           d S r$   )rj   ri   )r   rr   s     r    r,   zProxyIO.write   s    r!   eventobjectc                h    | j                             |           | j                                         S r$   )rh   ri   receive)r   rt   s     r    	_controllzProxyIO._controll   s.    e$$$'')))r!   c                :    |                      t                     d S r$   )rx   RIO_CLOSE_WRITEr'   s    r    close_writezProxyIO.close_write   s    '''''r!   c                    t                      r$   )NotImplementedErrorr'   s    r    
close_readzProxyIO.close_read   s    !###r!   c                :    |                      t                     d S r$   )rx   RIO_KILLr'   s    r    r)   zProxyIO.kill   s    x     r!   r"   c                l    |                      t                    }|t          |t                    sJ |S r$   )rx   RIO_WAIT
isinstancern   r   responses     r    r%   zProxyIO.wait   s3    >>(++:h#<#<<r!   r   c                h    |                      t                    }t          |t                    sJ |S r$   )rx   RIO_REMOTEADDRESSr   r   r   s     r    r   zProxyIO.remoteaddress   s/    >>"344(C(((((r!   c                ,    d| j         j        j         dS )Nz<RemoteIO via >)rj   rf   idr'   s    r    __repr__zProxyIO.__repr__   s    9 3 69999r!   N)rc   r   r   r   r   r   )rm   rn   r   ro   rr   ro   r   r   )rt   rn   r   ru   r0   r/   )r   r   )r1   r2   r3   __doc__r   rq   r,   rx   r{   r~   r)   r%   propertyr   r    r!   r    rb   rb      s         # # # #- - - -
   * * * *( ( ( ($ $ $ $! ! ! !   
    X
: : : : : :r!   rb   c                      e Zd ZddZd	dZdS )

PseudoSpecr   r   c                :    | j                             |           d S r$   )__dict__update)r   varss     r    r   zPseudoSpec.__init__   s    T"""""r!   namer   c                    d S r$   r   )r   r   s     r    __getattr__zPseudoSpec.__getattr__   s    tr!   Nr0   )r   r   r   r   )r1   r2   r3   r   r   r   r!   r    r   r      s<        # # # #     r!   r   proxy_channelXr   r   c                .  	
 | j         j        }t          | j         j        d| j        z            	t          dt          |                                                     }t          ||          
t          d|                                            	d           d	
fd	}| 	                    |           d
fd}	                    |           | 
                    d          } 	d|j                   
                    d          }|dk    s
J |             	d|j                   |                    |           	 	 t          j        
          }n"# t          $ r  	d|j                   Y d S w xY w|                    |           N)Nzserve_proxy_io:%sr   r   zgot control chanrr   ro   r   r   c                h     dt          |           z                                 |            d S )Nzforward data to sub, size %s)lenr,   )rr   logsub_ios    r    forward_to_subz&serve_proxy_io.<locals>.forward_to_sub   s7    *SYY6777Tr!   rn   c                   | t           k    r)                                                               d S | t          k    r+                                                     d            d S | t
          k    r                    j                   d S | t          k    r+                                                     d            d S d S r$   )	r   ri   r%   r   r)   r   r   rz   r{   )rr   control_chanr   s    r    controlzserve_proxy_io.<locals>.control   s    8fkkmm,,,,,XKKMMMd#####&&&f233333_$$   d##### %$r!   wzreading bootstrap byte from subr]      1z"forwarding bootstrap byte from subTz'EOF from sub, terminating proxying loopr   )rr   rn   r   r   )rf   r   r   _tracer   r   r   rw   r\   setcallbackrk   rq   r,   r	   from_ioEOFErrorto_io)r   r   rB   r   r   forward_to_master_fileinitialmessager   r   r   s           @@@r    serve_proxy_ior      s   &0I
%':^=N'N C N$:$:$<$<==>>DtY''F	>#9#9#;#;<<LCL)))       ~...
$ 
$ 
$ 
$ 
$ 
$ 
$ W%%% ,44S99 C)47333kk!nnGd???G???C,dg666  ))).	of--GG 	 	 	C947CCCEE	 	,---.s   
E E>=E>__channelexec__)r6   r   r   r7   )rB   r   r   r7   )rB   r   r   r   r   r   )r   r   r   r   )#r   
__future__r   r?   r*   typingr   r   execnet.gateway_baser   r   execnet.xspecr   r	   r
   ImportError__main__	functoolsr   r   rI   rA   rJ   rU   rY   r\   r   r   r   rz   rb   r   r   r1   channelr   r!   r    <module>r      s\   
 # " " " " "  



                   $,,,,,,......######",,,,,,------- " " "      !!!!!!!!"          X   . D              "   0  4: 4: 4: 4: 4: 4: 4: 4:n       2. 2. 2. 2.l    N7 ! s   ? AA