B
    pj`                 @   s4  d Z ddlZddlZdZdd Ze ZdZerPeddZej	ej
fZe e_	e_
dd	 Zejd
krled ned dd Zdd ZdddZedkrddlZeejdkrejd ZndZddlmZ edZeeeZeedd nHedkr0e d ZejjZe ZeeeZe  Z!e"e! ee dS )z
    start socket based minimal readline exec server

    it can exeuted in 2 modes of operation

    1. as normal script, that listens for new connections

    2. via existing_gateway.remote_exec (as imported module)

    Nzsocket_readline_exec_server-1.2c              C   s*   ydd l } W n tk
r$   d } Y nX | S )Nr   )fcntlImportError)r    r   :lib/python3.7/site-packages/execnet/script/socketserver.py	get_fcntl   s
    
r   z/tmp/execnet-socket-pyout.logwc              G   s   t ddd | D  d S )N c             s   s   | ]}t |V  qd S )N)str).0argr   r   r   	<genexpr>(   s    zprint_.<locals>.<genexpr>)printjoin)argsr   r   r   print_'   s    r   )   r   z/def exec_(source, locs):
    exec(source, locs)z0def exec_(source, locs):
    exec source in locsc          	   C   s   t td|   |  \}}t td|  |d}t d |  }|  ||td}t	|}|rt
|d dd}t td	 zt|| W d t td
 X d S )NzEntering Accept loopzgot new connection from %s %srbzreading line)
clientsockaddress	execmodel
z<socket server>execzcompiled source, executingzfinished executing code)r   prognamegetsocknameZacceptZmakefilereadlinerstripcloser   evalcompileZexec_)
serversockr   r   Z
clientfilesourcegcor   r   r   exec_from_one_connection7   s    

r#   c             C   s   |j }t| tr*| d\}}|t|f} | |j|j}ttdrpt|	 tj
}t|	 tj|tjB  tjdkrtjdkr||j|jd ||  |d |S )N:
FD_CLOEXECposixcygwin      )socket
isinstancer	   splitintZAF_INETZSOCK_STREAMhasattrr   filenoZF_GETFDZF_SETFDr%   osnamesysplatformZ
setsockoptZ
SOL_SOCKETZSO_REUSEADDRZbindZlisten)hostportr   r*   Zhostportr   oldr   r   r   bind_and_listenM   s    



r7   Fc          	   C   s   t  }zxxryt|  W nP ttfk
r2    Y n8   trNdd l}|  nt	 }t
d|d  Y nX t | |sP qW W d t
d | d X d S )Nr   zgot exceptionr(   zleaving socketserver execloop   )r0   getcwdr#   KeyboardInterrupt
SystemExitdebug	traceback	print_excr2   exc_infor   chdirZshutdown)r   loopZexecute_pathr=   excinfor   r   r   startserver`   s$    


rC   __main__r(   z:8888)get_execmodelZthreadT)rA   Z__channelexec__Zchannel)F)#__doc__r0   r2   r   r   r   r<   openfstdoutstderrr6   r   version_infor   r#   r7   rC   __name__lenargvr4   Zexecnet.gateway_baserE   r   r   globalsZchanZgatewayZreceiveZbindnameZsockr   r5   sendr   r   r   r   <module>   sH   







