o
    ·¨XjC  ã                   @  s
  U d dl 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mZ d dlmZ d dlmZmZ eeƒ ¡ jd Zed	 Zed
 ed ed dœZded< G dd„ dƒZeƒ Zddd„ZG dd„ deƒZddd„Zedkrƒe eƒ ƒ‚dS ) é    )ÚannotationsN)Údatetime)Ú
HTTPStatus)ÚBaseHTTPRequestHandlerÚThreadingHTTPServer)ÚPath)Úparse_qsÚurlparseé   Úwebz
index.htmlz
styles.csszapp.js)ú/z/assets/styles.cssz/assets/app.jszdict[str, Path]ÚSTATIC_ROUTESc                   @  s>   e Zd Zddd„Zddd„Zddd„Zddd„Zddd„ZdS )ÚRunStateÚreturnÚNonec                 C  s2   t  ¡ | _d| _d | _d | _d | _g | _g | _d S )NF)	Ú	threadingÚLockÚlockÚrunningÚ
started_atÚfinished_atÚ	exit_codeÚcommandÚlogs©Úself© r   úbin/web_ui.pyÚ__init__   s   

zRunState.__init__Údictc              	   C  sP   | j � | j| j| j| j| j| jdd … dœW  d   ƒ S 1 s!w   Y  d S )Nipþÿÿ)r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   Úsnapshot$   s   ú$ÿzRunState.snapshotÚcmdú	list[str]Úboolc                 C  sŒ   | j �9 | jr	 W d   ƒ dS d| _t ¡ jdd�| _d | _d | _|| _d| j› dd 	|¡› �g| _
	 W d   ƒ dS 1 s?w   Y  d S )NFTÚseconds©Útimespecú[z] Starting: ú )r   r   r   ÚnowÚ	isoformatr   r   r   r   Újoinr   )r   r!   r   r   r   Ústart/   s   þ$÷zRunState.startÚlineÚstrc                 C  sl   | j �) | j | d¡¡ t| jƒdkr$| jdd … | _W d   ƒ d S W d   ƒ d S 1 s/w   Y  d S )NÚ
iÐ  i0øÿÿ)r   r   ÚappendÚrstripÚlen)r   r-   r   r   r   Ú
append_log;   s   ý"þzRunState.append_logÚcodeÚintc                 C  sd   | j �% d| _|| _t ¡ jdd�| _| j d| j› d|› �¡ W d   ƒ d S 1 s+w   Y  d S )NFr$   r%   r'   z] Finished with exit_code=)	r   r   r   r   r)   r*   r   r   r0   )r   r4   r   r   r   ÚfinishA   s   "üzRunState.finishN©r   r   )r   r   )r!   r"   r   r#   )r-   r.   r   r   )r4   r5   r   r   )Ú__name__Ú
__module__Ú__qualname__r   r    r,   r3   r6   r   r   r   r   r      s    

	

r   r!   r"   r   r   c              	   C  sf   t j ¡ }tj| ttƒtjtjdd|d�}|j	d usJ ‚|j	D ]}t
 |¡ q| ¡  t
 |j¡ d S )NTr
   )ÚcwdÚstdoutÚstderrÚtextÚbufsizeÚenv)ÚosÚenvironÚcopyÚ
subprocessÚPopenr.   ÚROOTÚPIPEÚSTDOUTr<   ÚSTATEr3   Úwaitr6   Ú
returncode)r!   r@   Úprocessr-   r   r   r   Ú_runnerL   s   
ù	
rM   c                   @  sL   e Zd Zdddd	„Zdddd„Zddd„Zd dd„Zd dd„Zd!dd„ZdS )"ÚHandleréÈ   Úpayloadr   Ústatusr5   r   r   c                 C  sR   t  |¡ d¡}|  |¡ |  dd¡ |  dtt|ƒƒ¡ |  ¡  | j 	|¡ d S )Nzutf-8úContent-Typezapplication/jsonúContent-Length)
ÚjsonÚdumpsÚencodeÚsend_responseÚsend_headerr.   r2   Úend_headersÚwfileÚwrite)r   rP   rQ   Úbodyr   r   r   Ú
_send_json_   s   
zHandler._send_jsonr\   ÚbytesÚcontent_typer.   c                 C  sB   |   |¡ |  d|¡ |  dtt|ƒƒ¡ |  ¡  | j |¡ d S )NrR   rS   )rW   rX   r.   r2   rY   rZ   r[   )r   r\   r_   rQ   r   r   r   Ú_send_bytesg   s
   
zHandler._send_bytesÚpathr#   c                 C  s^   t  |¡}|d u s| ¡ sdS | ¡ }|dkrd}nt t|ƒ¡\}}|p&d}|  ||¡ dS )NFr   ztext/html; charset=utf-8zapplication/octet-streamT)r   ÚgetÚis_fileÚ
read_bytesÚ	mimetypesÚ
guess_typer.   r`   )r   ra   Ú	file_pathr\   r_   ÚguessedÚ_r   r   r   Ú_serve_staticn   s   
zHandler._serve_staticc                 C  sJ   t | jƒj}|dkr|  t ¡ ¡ d S |  |¡rd S |  dditj¡ d S )Nz/api/statusÚerrorú	Not found)r	   ra   r]   rI   r    rj   r   Ú	NOT_FOUND)r   ra   r   r   r   Údo_GET}   s   
zHandler.do_GETc                 C  sÚ   t | jƒ}|jdkr|  dditj¡ d S t|jƒ}| ddg¡d dv }| dd	g¡d  ¡ }t	j
d
g}|r<| d¡ |rE| d|g¡ t |¡sU|  dddœd¡ d S tjt|fdd�}| ¡  |  dd|dœ¡ d S )Nz
/api/startrk   rl   Údry_runÚ0r   >   Ú1ÚyesÚtrueÚ
batch_sizeÚ zbin/run_pipeline.pyz	--dry-runz--batch-sizeFzA run is already in progress)ÚokÚmessagei™  T)ÚtargetÚargsÚdaemonzRun started)rv   rw   r   )r	   ra   r]   r   rm   r   Úqueryrb   ÚstripÚsysÚ
executabler0   ÚextendrI   r,   r   ÚThreadrM   )r   ÚparsedÚqro   rt   r!   Útr   r   r   Údo_POST†   s$   





zHandler.do_POSTÚfmtc                 G  s   d S )Nr   )r   r…   ry   r   r   r   Úlog_messagež   s   zHandler.log_messageN)rO   )rP   r   rQ   r5   r   r   )r\   r^   r_   r.   rQ   r5   r   r   )ra   r.   r   r#   r7   )r…   r.   r   r   )	r8   r9   r:   r]   r`   rj   rn   r„   r†   r   r   r   r   rN   ^   s    


	rN   r5   c                  C  sV   t  ¡ stdt › �tjd� dS d} d}t| |ftƒ}td| › d|› �ƒ | ¡  dS )	NzMissing web directory: )Úfiler
   z	127.0.0.1i˜  z#Synapse launcher running at http://ú:r   )ÚWEB_DIRÚis_dirÚprintr}   r=   r   rN   Úserve_forever)ÚhostÚportÚserverr   r   r   Úmain¢   s   r�   Ú__main__)r!   r"   r   r   )r   r5   )!Ú
__future__r   rT   re   rA   rD   r}   r   r   Úhttpr   Úhttp.serverr   r   Úpathlibr   Úurllib.parser   r	   Ú__file__ÚresolveÚparentsrF   r‰   r   Ú__annotations__r   rI   rM   rN   r�   r8   Ú
SystemExitr   r   r   r   Ú<module>   s4   ý/

D
ÿ