B
    pj`q                 @   s   d Z ddlZddlZddlZyddlmZmZ W n$ ek
rT   ddlmZmZ Y nX ddl	m
Z
 G dd deZdd Zd	d
 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 deZG dd dZdd Zed kree dS )!zJ
execnet io initialization code

creates io instances used for gateway io
    N)Popen2IOMessage)partialc               @   s$   e Zd Zdd Zdd Zdd ZdS )Popen2IOMasterc             C   s*   | | | _}tj| |j|j|d d S )N)	execmodel)Z
PopenPipedpopenr   __init__stdinstdout)selfargsr   p r   1lib/python3.7/site-packages/execnet/gateway_io.pyr      s    zPopen2IOMaster.__init__c             C   s$   y
| j  S  tk
r   Y nX d S )N)r   waitOSError)r   r   r   r   r      s    
zPopen2IOMaster.waitc             C   s   t | j d S )N)	killpopenr   )r   r   r   r   kill   s    zPopen2IOMaster.killN)__name__
__module____qualname__r   r   r   r   r   r   r   r      s   r   c             C   s^   y"t | dr|   n
t| j W n6 tk
rX   tjdt d   tj	  Y nX d S )Nr   zERROR killing: %s
   )
hasattrr   killpidpidEnvironmentErrorsysstderrwriteexc_infoflush)r   r   r   r   r   "   s    

r   c             C   s   t tdrt| d nftjdks2ttdd dkrpdd l}d}|jj	|d| }|jj
|d	 |jj| ntd
| d S )Nr      win32_namentr   r   Fzno method to kill {})r   osr   r   platformgetattrctypesZwindllZkernel32ZOpenProcessZTerminateProcessZCloseHandler   format)r   r)   ZPROCESS_TERMINATEZhandler   r   r   r   -   s    
r   z+import sys;exec(eval(sys.stdin.readline()))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   r'   
startswithreplaceshlexsplit)pathr   r   r   shell_split_path>   s    r3   c             C   sL   | j rt| j ntjg}|d | d k	r:| jr:|d |dtg |S )Nz-uz-Bz-c)pythonr3   r   
executableappenddont_write_bytecodeextendpopen_bootstrapline)specr   r   r   r   
popen_argsI   s    

r;   c             C   sZ   | j pd}ddg}| jd k	r0|dt| jg || j  d|t}|| |S )Nr4   sshz-Cz-Fz
{} -c "{}")	r4   
ssh_configr8   strr<   r1   r*   r9   r6   )r:   remotepythonr   	remotecmdr   r   r   ssh_argsT   s    


rA   c             C   sT   | j pd}dd| jddg}| jd k	r8|dt| jg d|t}||g |S )Nr4   Zvagrantr<   z--z-Cz-Fz
{} -c "{}")r4   vagrant_sshr=   r8   r>   r*   r9   )r:   r?   r   r@   r   r   r   vagrant_ssh_argsc   s    

rC   c             C   sd   | j rt| }t||S | jr<t| }t||}| j|_|S | jr`t| }t||}| j|_|S d S )N)r   r;   r   r<   rA   remoteaddressrB   rC   )r:   r   r   ior   r   r   	create_ios   s    


rF   r            c               @   s\   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
edd Zdd ZdS )ProxyIOaM  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.
    c             C   s6   |j  | _|| j || _| jd| _|| _d S )Nr)gatewayZ
newchannelcontrolchansendiochanmakefileiochan_filer   )r   Zproxy_channelr   r   r   r   r      s
    zProxyIO.__init__c             C   s   | j |S )N)rQ   read)r   nbytesr   r   r   rR      s    zProxyIO.readc             C   s   | j |S )N)rO   rN   )r   datar   r   r   r      s    zProxyIO.writec             C   s   | j | | j  S )N)rM   rN   receive)r   Zeventr   r   r   	_controll   s    zProxyIO._controllc             C   s   |  t d S )N)rV   RIO_CLOSE_WRITE)r   r   r   r   close_write   s    zProxyIO.close_writec             C   s   |  t d S )N)rV   RIO_KILL)r   r   r   r   r      s    zProxyIO.killc             C   s
   |  tS )N)rV   RIO_WAIT)r   r   r   r   r      s    zProxyIO.waitc             C   s
   |  tS )N)rV   RIO_REMOTEADDRESS)r   r   r   r   rD      s    zProxyIO.remoteaddressc             C   s   d | jjjS )Nz<RemoteIO via {}>)r*   rO   rL   id)r   r   r   r   __repr__   s    zProxyIO.__repr__N)r   r   r   __doc__r   rR   r   rV   rX   r   r   propertyrD   r]   r   r   r   r   rJ      s   	rJ   c               @   s   e Zd Zdd Zdd ZdS )
PseudoSpecc             C   s   | j | d S )N)__dict__update)r   varsr   r   r   r      s    zPseudoSpec.__init__c             C   s   d S )Nr   )r   namer   r   r   __getattr__   s    zPseudoSpec.__getattr__N)r   r   r   r   re   r   r   r   r   r`      s   r`   c                s  | j j}t| j jd| j t|  }t|||   d  fdd}| |  fdd} | | 	d}d|j 
d	}|d
dkst|d|j || x@yt}W n" tk
r   d|j P Y nX || qW d S )Nzserve_proxy_io:%szgot control chanc                s    dt |   |  d S )Nzforward data to sub, size %s)lenr   )rT   )logsub_ior   r   forward_to_sub   s    z&serve_proxy_io.<locals>.forward_to_subc                s`   | t kr   nD| tkr0   n,| tkrF j n| tkr\   d S )N)	rZ   rN   r   rY   r   r[   rD   rW   rX   )rT   )control_chanrh   r   r   controll   s    z serve_proxy_io.<locals>.controllwzreading bootstrap byte from subr   1asciiz"forwarding bootstrap byte from subz'EOF from sub, terminating proxying loop)rL   r   r   Z_tracer\   r`   rU   rF   ZsetcallbackrP   rR   encodeAssertionErrorr   r   Zfrom_ioEOFErrorZto_io)Zproxy_channelXr   r:   ri   rk   Zforward_to_master_fileinitialmessager   )rj   rg   rh   r   serve_proxy_io   s0    







rt   Z__channelexec__)r^   r&   r0   r   Zexecnet.gateway_baser   r   ImportError__main__	functoolsr   r   r   r   r9   r3   r;   rA   rC   rF   rY   rZ   r[   rW   objectrJ   r`   rt   r   Zchannelr   r   r   r   <module>   s4   -4