o
    "ÂifŒ  ã                   @  s†   d dl mZ d dlZ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 d dlmZ G d	d
„ d
ƒZ	dddd„Zddd„ZdS )é    )ÚannotationsN)Úcast)ÚGateway)Ú	ExecModel)ÚHostNotFound)ÚGroup)ÚXSpecc                   @  s\   e Zd ZU ded< ddd„Zddd„Zddd„Zddd„Zddd„Zddd„Z	ddd„Z
dS )ÚSocketIOÚstrÚremoteaddressÚ	execmodelr   ÚreturnÚNonec              	   C  sb   || _ || _|j}z| |j|jd¡ | |j|jd¡ W d S  tt	fy0   t
j d¡ Y d S w )Né   é   z WARNING: cannot set socketoption)Úsockr   ÚsocketÚ
setsockoptÚSOL_IPÚIP_TOSÚSOL_TCPÚTCP_NODELAYÚAttributeErrorÚOSErrorÚsysÚstderrÚwrite)Úselfr   r   r   © r   úO/var/www/html/corbot_env/lib/python3.10/site-packages/execnet/gateway_socket.pyÚ__init__   s   ÿzSocketIO.__init__ÚnumbytesÚintÚbytesc                 C  sD   d}t |ƒ|k r | j |t |ƒ ¡}|st‚||7 }t |ƒ|k s|S )z+Read exactly 'bytes' bytes from the socket.ó    )Úlenr   ÚrecvÚEOFError)r   r!   ÚbufÚtr   r   r   Úread   s   üzSocketIO.readÚdatac                 C  s   | j  |¡ d S ©N)r   Úsendall)r   r+   r   r   r   r   %   s   zSocketIO.writec                 C  ó.   z	| j  d¡ W d S  | jjjy   Y d S w )Nr   ©r   Úshutdownr   r   Úerror©r   r   r   r   Ú
close_read(   ó
   ÿzSocketIO.close_readc                 C  r.   )Nr   r/   r2   r   r   r   Úclose_write.   r4   zSocketIO.close_writec                 C  ó   d S r,   r   r2   r   r   r   Úwait4   ó   zSocketIO.waitc                 C  r6   r,   r   r2   r   r   r   Úkill7   r8   zSocketIO.killN)r   r   r   r   )r!   r"   r   r#   )r+   r#   r   r   )r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r    r*   r   r3   r5   r7   r9   r   r   r   r   r	      s   
 






r	   Úgatewayr   Úhostportútuple[str, int] | Noner   útuple[str, int]c                 C  sh   |du r	d\}}n|\}}ddl m} |  |¡}| ||f¡ td| ¡ ƒ\}}|r.|dkr0d}||fS )zVInstantiate a socketserver on the given gateway.

    Returns a host, port tuple.
    N)Ú	localhostr   r   )ÚsocketserverrA   z0.0.0.0rB   )Úexecnet.scriptrC   Úremote_execÚsendr   Úreceive)r>   r?   ÚhostÚportrC   ÚchannelÚrealhostÚrealportr   r   r   Ú	start_via;   s   

rM   Úspecr   Úgroupr   r   r   c              
   C  s¸   | j d usJ ‚| jrJ dƒ‚| j}|rt|| ƒ\}}n| j  d¡\}}t|ƒ}|j }|  |j|j¡}t||ƒ}	d||f |	_	z
| 
||f¡ W |	S  |j jy[ }
 ztƒ |
‚d }
~
ww )Nz7socket: specifying python executables not yet supportedú:z%s:%d)r   ÚpythonÚ
installviarM   Úsplitr"   ÚAF_INETÚSOCK_STREAMr	   r   ÚconnectÚgaierrorr   )rN   rO   r   Ú
gateway_idrH   rI   Úport_strr   r   ÚioÚer   r   r   Ú	create_ioT   s$   
þ€ÿr\   r,   )r>   r   r?   r@   r   rA   )rN   r   rO   r   r   r   r   r	   )Ú
__future__r   r   Útypingr   Úexecnet.gatewayr   Úexecnet.gateway_baser   Úexecnet.gateway_bootstrapr   Úexecnet.multir   Úexecnet.xspecr   r	   rM   r\   r   r   r   r   Ú<module>   s    /ÿ