a
    &ñ»jt  ã                   @  sl  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 zdd	lmZ dd
lmZ W n* ey¦   dd	lmZ dd
lmZ Y n0 ddlmZ G dd„ deƒZdZdddœdd„Zdddœdd„Zdddœdd„Zdddœdd„Zddddœdd„Zd Zd!Zd"Zd#ZG d$d%„ d%ƒZG d&d'„ d'ƒZd(d)d*œd+d,„Z e!d-k�rhe e"ƒ dS ).zKexecnet IO initialization code.

Creates IO instances used for gateway IO.
é    )ÚannotationsN)ÚTYPE_CHECKING)Úcast)ÚChannel)Ú	ExecModel)ÚXSpec)ÚMessage)ÚPopen2IO)Úpartialc                      sJ   e Zd ZU ded< dddœ‡ fdd„Zdd	œd
d„Zdd	œdd„Z‡  ZS )ÚPopen2IOMasterÚstrÚremoteaddressr   ÚNone)Ú	execmodelÚreturnc                   s:   |j j}|j j|||d� | _}tƒ j|j|j|d� d S )N)ÚstdoutÚstdin)r   )Ú
subprocessÚPIPEÚPopenÚpopenÚsuperÚ__init__r   r   )ÚselfÚargsr   r   Úp©Ú	__class__© ú8E:\soccer\ml_env\Lib\site-packages\execnet/gateway_io.pyr       s    zPopen2IOMaster.__init__ú
int | None©r   c                 C  s&   z| j  ¡ W S  ty    Y d S 0 d S ©N)r   ÚwaitÚOSError©r   r   r   r   r#   %   s    zPopen2IOMaster.waitc              
   C  sR   z| j  ¡  W n> tyL } z&tj d| ¡ tj ¡  W Y d }~n
d }~0 0 d S )NzERROR killing: %s
)r   Úkillr$   ÚsysÚstderrÚwriteÚflush)r   Úer   r   r   r&   +   s
    zPopen2IOMaster.kill)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   r#   r&   Ú__classcell__r   r   r   r   r      s   
r   z+import sys;exec(eval(sys.stdin.readline()))r   z	list[str])Úpathr   c                 C  s"   t j d¡r|  dd¡} t | ¡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)r1   r   r   r   Úshell_split_path6   s    r:   r   )Úspecr   c                 C  sD   | j rt| j ƒntjg}| d¡ | jr2| d¡ | dtg¡ |S )Nz-uz-Bz-c)Úpythonr:   r'   Ú
executableÚappendÚdont_write_bytecodeÚextendÚpopen_bootstrapline)r;   r   r   r   r   Ú
popen_argsA   s    

rB   c                 C  sl   | j pd}ddg}| jd ur0| dt| jƒg¡ | jd us>J ‚| | j ¡ ¡ |› dt› d�}| |¡ |S )Nr<   Ússhú-Cú-Fú -c "ú")r<   Ú
ssh_configr@   r   rC   r9   rA   r>   ©r;   Zremotepythonr   Z	remotecmdr   r   r   Ússh_argsJ   s    


rJ   c                 C  sf   | j d usJ ‚| jpd}dd| j ddg}| jd urF| dt| jƒg¡ |› dt› d�}| |g¡ |S )	Nr<   ZvagrantrC   z--rD   rE   rF   rG   )Úvagrant_sshr<   rH   r@   r   rA   rI   r   r   r   Úvagrant_ssh_argsZ   s    

rL   r   )r;   r   r   c                 C  sl   | j rt| ƒ}t||ƒS | jr<t| ƒ}t||ƒ}| j|_|S | jr`t| ƒ}t||ƒ}| j|_|S dshJ ‚d S )NF)r   rB   r   rC   rJ   r   rK   rL   )r;   r   r   Úior   r   r   Ú	create_iok   s    


rN   é   é   é   é   c                   @  sª   e Zd ZdZddddœdd„Zdd	d
œdd„Zd	ddœdd„Zdddœdd„Zddœdd„Zddœdd„Z	ddœdd„Z
ddœdd„Zeddœdd „ƒZddœ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.
    r   r   r   )Úproxy_channelr   r   c                 C  s6   |j  ¡ | _| | j¡ || _| j d¡| _|| _d S )NÚr)ÚgatewayZ
newchannelÚcontrolchanÚsendÚiochanÚmakefileÚiochan_filer   )r   rT   r   r   r   r   r   “   s
    zProxyIO.__init__ÚintÚbytes)Únbytesr   c                 C  s   | j  |¡S r"   )r[   Úread)r   r^   r   r   r   r_   œ   s    zProxyIO.read©Údatar   c                 C  s   | j  |¡ d S r"   )rY   rX   )r   ra   r   r   r   r)   ¡   s    zProxyIO.writeÚobject)Úeventr   c                 C  s   | j  |¡ | j  ¡ S r"   )rW   rX   Úreceive)r   rc   r   r   r   Ú	_controll¤   s    zProxyIO._controllr!   c                 C  s   |   t¡ d S r"   )re   ÚRIO_CLOSE_WRITEr%   r   r   r   Úclose_write¨   s    zProxyIO.close_writec                 C  s
   t ƒ ‚d S r"   )ÚNotImplementedErrorr%   r   r   r   Ú
close_read«   s    zProxyIO.close_readc                 C  s   |   t¡ d S r"   )re   ÚRIO_KILLr%   r   r   r   r&   ®   s    zProxyIO.killr    c                 C  s$   |   t¡}|d u s t|tƒs J ‚|S r"   )re   ÚRIO_WAITÚ
isinstancer\   ©r   Úresponser   r   r   r#   ±   s    
zProxyIO.waitr   c                 C  s   |   t¡}t|tƒsJ ‚|S r"   )re   ÚRIO_REMOTEADDRESSrl   r   rm   r   r   r   r   ¶   s    
zProxyIO.remoteaddressc                 C  s   d| j jj› d�S )Nz<RemoteIO via ú>)rY   rV   Úidr%   r   r   r   Ú__repr__¼   s    zProxyIO.__repr__N)r,   r-   r.   Ú__doc__r   r_   r)   re   rg   ri   r&   r#   Úpropertyr   rr   r   r   r   r   rS   ‰   s   		rS   c                   @  s*   e Zd Zddœdd„Zdddœdd„Zd	S )
Ú
PseudoSpecr   r!   c                 C  s   | j  |¡ d S r"   )Ú__dict__Úupdate)r   Úvarsr   r   r   r   Á   s    zPseudoSpec.__init__r   )Únamer   c                 C  s   d S r"   r   )r   ry   r   r   r   Ú__getattr__Ä   s    zPseudoSpec.__getattr__N)r,   r-   r.   r   rz   r   r   r   r   ru   À   s   ru   r   r   )Úproxy_channelXr   c                   s  | j j}t| j jd| j ƒ‰tdt|  ¡ ƒƒ}t||ƒ‰td|  ¡ ƒ‰ ˆdˆ ƒ dddœ‡‡fdd	„}|  	|¡ d
ddœ‡ ‡fdd„}ˆ  	|¡ |  
d¡}ˆd|jƒ ˆ d¡}|dksÀJ |ƒ‚ˆd|jƒ | |¡ zt ˆ¡}W n& t�y
   ˆd|jƒ Y �qY n0 | |¡ qÖd S )Nzserve_proxy_io:%sr   r   zgot control chanr]   r   r`   c                   s   ˆ dt | ƒ ƒ ˆ | ¡ d S )Nzforward data to sub, size %s)Úlenr)   ©ra   )ÚlogÚsub_ior   r   Úforward_to_subÕ   s    z&serve_proxy_io.<locals>.forward_to_subr\   c                   sh   | t krˆ  ˆ ¡ ¡ nL| tkr4ˆ ¡  ˆ  d ¡ n0| tkrJˆ  ˆj¡ n| tkrdˆ ¡  ˆ  d ¡ d S r"   )	rk   rX   r#   rj   r&   ro   r   rf   rg   r}   )Úcontrol_chanr   r   r   ÚcontrolÛ   s    zserve_proxy_io.<locals>.controlÚwzreading bootstrap byte from subrO   ó   1z"forwarding bootstrap byte from subz'EOF from sub, terminating proxying loop)rV   r   r
   Z_tracerq   r   ru   rd   rN   ZsetcallbackrZ   r_   r)   r   Zfrom_ioÚEOFErrorZto_io)r{   r   r;   r€   r‚   Zforward_to_master_fileÚinitialÚmessager   )r�   r~   r   r   Úserve_proxy_ioÈ   s0    ÿ






rˆ   Z__channelexec__)#rs   Ú
__future__r   r8   r'   Útypingr   r   Zexecnet.gateway_baser   r   Zexecnet.xspecr   r   r	   ÚImportErrorÚ__main__Ú	functoolsr
   r   rA   r:   rB   rJ   rL   rN   rj   rk   ro   rf   rS   ru   rˆ   r,   Zchannelr   r   r   r   Ú<module>   s@   	76
