B
    F.\t                 @   s   d dl mZmZmZ d dlZd dlZd dlZd dlZd dl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 d d	lmZ ed
ZG dd deZe efddZejdddZdS )    )print_functiondivisionabsolute_importN)gen)IOLoop)rpc)unicode)Server)Security)get_ipzdistributed.remotec                   sp   e Zd Zdejddddf fdd	ZejdddZdd	d
Z	ejdddZ
dddZejdd Z  ZS )RemoteClientNzclient-)prefixc                sz   |pt  | _|pt | _|| _| j| jd}|p6t | _	t
| j	tsJt| j	d| _tt| j|fd| ji| d S )N)upload_fileexecuteZ	schedulerZio_loop)r   ipr   currentloop	local_dirr   r   r
   security
isinstanceAssertionErrorZget_listen_argslisten_argssuperr   __init__)selfr   r   r   r   kwargsZhandlers)	__class__ 1lib/python3.7/site-packages/distributed/submit.pyr      s    zRemoteClient.__init__r   c             C   s   | j || jd d S )N)r   )Zlistenr   )r   portr   r   r   _start&   s    zRemoteClient._startc             C   s(   | j | j| td| j| d S )Nz#Remote Client is running at {0}:{1})r   Zadd_callbackr    loggerinfoformatr   )r   r   r   r   r   start*   s    zRemoteClient.startc       	      C   s\   t j| j|}dtj|}tj|dtj	tj	d}|
 \}}|j}t|||dd S )Nz{0} {1}T)shellstdoutstderr)r&   r'   
returncode)ospathjoinr   r#   sys
executable
subprocessPopenPIPEZcommunicater(   r   Return)	r   streamfilenameZscript_pathcmdZprocessouterrZreturn_coder   r   r   r   .   s    
zRemoteClient.executec          	   C   sP   t j| j|}t|tr"| }t|d}|| W d Q R X dt	|dS )NwbZOK)Zstatusnbytes)
r)   r*   r+   r   r   r   encodeopenwritelen)r   r2   r3   file_payloadZout_filenamefr   r   r   r   :   s    
zRemoteClient.upload_filec             C   s   |    d S )N)stop)r   r   r   r   _closeB   s    zRemoteClient._close)r   )r   )NN)NN)__name__
__module____qualname__tempfileZmkdtempr   r   	coroutiner    r$   r   r   r@   __classcell__r   r   )r   r   r      s   

r   c             C   s~   | pt  } d| kr2|dkr2| dd\} }t|}t| }|||d}|j|d |  |  |  t	d| | d S )N:iT"     )r   r   )r   zEnd remote client at %s:%d)
r   rsplitintsocketZgethostbynamer$   closer?   r!   r"   )Zhostr   r   Zclientr   Zremote_clientr   r   r   _remoteG   s    

rM   c          	   c   sn   t | |d}tj|}t|d}| }W d Q R X |j||dV  |j|dV }t	|d |d fd S )N)connection_argsrb)r3   r=   )r3   r&   r'   )
r   r)   r*   basenamer:   readr   r   r   r1   )Zremote_client_addressfilepathrN   ZrcZremote_filer>   Z
bytes_readresultr   r   r   _submitU   s    rT   )N)Z
__future__r   r   r   Zloggingr)   rK   r.   rD   r,   Ztornador   Ztornado.ioloopr   Zdistributedr   Zdistributed.compatibilityr   Zdistributed.corer	   Zdistributed.securityr
   Zdistributed.utilsr   Z	getLoggerr!   r   r   rM   rE   rT   r   r   r   r   <module>   s$   
/