a
    &ñ»j_  ã                   @  s¨  U d Z ddlmZ ddlZddlZddlmZ zddlZW n eyP   dZY n0 ernddl	m
Z
 ddl	mZ dZdZerœedd	ƒZejejfZe e_e_d
dœdd„Zedƒ d
dœdd„Zdddœdd„Zd&dd
dœdd„Zedk�r@ddlZeejƒdk�rejd ZndZddl	mZ edƒZeeeƒZeed d!� nded"k�r¤eƒ d# Z d$e!d%< e j"jZe  #¡ Z$e%e$e&e'fƒ�s€J ‚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)

é    )ÚannotationsN)ÚTYPE_CHECKING)ÚChannel)Ú	ExecModelzsocket_readline_exec_server-1.2z/tmp/execnet-socket-pyout.logÚwÚNone)Úreturnc                  G  s   t d dd„ | D ƒ¡ƒ d S )Nú c                 s  s   | ]}t |ƒV  qd S )N)Ústr)Ú.0Úarg© r   úAE:\soccer\ml_env\Lib\site-packages\execnet/script/socketserver.pyÚ	<genexpr>*   ó    zprint_.<locals>.<genexpr>)ÚprintÚjoin)Úargsr   r   r   Úprint_)   s    r   z/def exec_(source, locs):
    exec(source, locs)c              	   C  s®   t td|  ¡ ƒ |  ¡ \}}t tdj|Ž ƒ | d¡}t dƒ | ¡  ¡ }| ¡  ||t	dœ}t
|ƒ}|rªt|d ddƒ}t td	ƒ zt||ƒ W t td
ƒ nt td
ƒ 0 d S )NzEntering Accept loopzgot new connection from {} {}Úrbzreading line)Ú
clientsockÚaddressÚ	execmodelÚ
z<socket server>Úexeczcompiled source, executingzfinished executing code)r   ÚprognameÚgetsocknameÚacceptÚformatÚmakefileÚreadlineÚrstripÚcloser   ÚevalÚcompileÚexec_)Ú
serversockr   r   Z
clientfileÚsourceÚgÚcor   r   r   Úexec_from_one_connection3   s    

r*   zstr | tuple[str, int]r   )Úhostportr   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r–tjdkr–| |j|jd¡ | | ¡ | d¡ |S )Nú:Ú
FD_CLOEXECÚposixÚcygwiné   é   )ÚsocketÚ
isinstancer
   ÚsplitÚintÚAF_INETÚSOCK_STREAMÚhasattrÚfcntlÚfilenoZF_GETFDZF_SETFDr-   ÚosÚnameÚsysÚplatformÚ
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRÚbindÚlisten)r+   r   r2   ÚhostÚportr&   Úoldr   r   r   Úbind_and_listenI   s    



rG   FÚbool)Úloopr   c              
   C  s²   t  ¡ }z�zt| ƒ W nZ ttfy.   ‚ Y nD typ } z,trRdd l}| ¡  n
t	d|ƒ W Y d }~n
d }~0 0 t  
|¡ |s
q„q
W t	dƒ |  d¡ nt	dƒ |  d¡ 0 d S )Nr   zgot exceptionzleaving socketserver execloopé   )r;   Úgetcwdr*   ÚKeyboardInterruptÚ
SystemExitÚBaseExceptionÚdebugÚ	tracebackÚ	print_excr   ÚchdirÚshutdown)r&   rI   Zexecute_pathÚexcrP   r   r   r   Ústartserver\   s$    
 
ÿrU   Ú__main__r0   z:8888)Úget_execmodelÚthreadT)rI   Z__channelexec__Zchannelr   Úchan)F),Ú__doc__Ú
__future__r   r;   r=   Útypingr   r9   ÚImportErrorZexecnet.gateway_baser   r   r   rO   ÚopenÚfÚstdoutÚstderrrF   r   r   r*   rG   rU   Ú__name__ÚlenÚargvr+   rW   r   r&   ÚglobalsrY   Ú__annotations__ZgatewayZreceiveZbindnamer3   r
   ÚtupleÚsockr   rE   Úsendr   r   r   r   Ú<module>   sT   

ÿ




