o
    r¨Êhþ^  ã                   @   s¬  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 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 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# G dd„ dƒZ$G dd„ dƒZ%G dd„ dƒZ&G dd„ de&ƒZ'G dd „ d e&ƒZ(G d!d"„ d"ƒZ)d#e(d$œd%e'd$œde)d$œd&œZ*G d'd(„ d(ƒZ+dS ))é    N)Ú
templating)Úurllib)Úurlparse)Úas_bytes)Ú	as_string)ÚPY2)Úunicode)Ú	producers)Ú	http_date)Ú
get_header)Ú	collector)ÚProcessStates©ÚNOT_DONE_YET)ÚVERSION)Úmake_namespec)Úsplit_namespec)ÚSystemNamespaceRPCInterface)ÚRootRPCInterface)ÚFaults)ÚRPCError)ÚSupervisorNamespaceRPCInterfacec                   @   s6   e Zd ZdZe dej¡Zdd„ Zdd„ Z	dd„ Z
d	S )
ÚDeferredWebProducerzŠ A medusa producer that implements a deferred callback; requires
    a subclass of asynchat.async_chat that handles NOT_DONE_YET sentinel zConnection: (.*)c                 C   s"   || _ || _d| _t|jƒ| _d S )NF)ÚcallbackÚrequestÚfinishedÚfloatÚdelay)Úselfr   r   © r   ú@/var/www/html/env/lib/python3.10/site-packages/supervisor/web.pyÚ__init__(   s   zDeferredWebProducer.__init__c                 C   sn   | j rdS z|  ¡ }|tu rtW S d| _ |  |¡W S    t ¡ }| jjjj	 
d|¡ d| _ | j d¡ Y d S )NÚ TzWeb interface erroriô  )r   r   r   ÚsendresponseÚ	tracebackÚ
format_excr   ÚchannelÚserverÚloggerÚlogÚerror)r   ÚresponseÚtbr   r   r    Úmore.   s   zDeferredWebProducer.morec           
      C   s&  |  di ¡}|D ]	}|| | j|< qd| jvrd| jd< |  d¡r.d| jd< | j d¡ d S |  dd	¡}t|ƒ| jd< | j |¡ t| j| jjƒ}d}d}| jjd
kri|dkrf| j 	d¡s`d}nAd| jd< n;d}n8| jjdkr™|dkrvd}n+d| jvr˜d| jv rŠ| jd dks‰d}n| jj
r–d| jd< d}nd}n| jjd u r¡d}t | j ¡ ¡}|r°d| jd< |rÄt t | jj¡¡}	t ||	g¡}	n-trât| jjƒdkrâ| jjd }t|tƒrât |¡| jjd< | jj d|¡ t | jj¡}	| jj t t |	| jj¡¡¡ d | jj_|�r| jj ¡  d S d S )NÚheadersúContent-Typez
text/plainÚLocationr   zContent-Lengthi-  Úbodyr"   z1.0z
keep-aliveé   z
Keep-AliveÚ
Connectionz1.1ÚclosezTransfer-EncodingÚchunked)Úgetr   r*   ÚlenÚpushr   Ú
CONNECTIONÚheaderÚversionÚhas_keyÚuse_chunkedr	   Úsimple_producerÚbuild_reply_headerÚchunked_producerÚcomposite_producerÚoutgoingr   Ú
isinstancer   Úinsertr&   Úpush_with_producerÚglobbing_producerÚhooked_producerr)   Úcurrent_requestÚclose_when_done)
r   r+   r.   r:   r1   Ú
connectionÚclose_itÚwrap_in_chunkingÚoutgoing_headerÚoutgoing_producerr   r   r    r#   @   sˆ   





€
€ÿ
ÿÿ
ÿþþþ
ÿz DeferredWebProducer.sendresponseN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚreÚcompileÚ
IGNORECASEr9   r!   r-   r#   r   r   r   r    r   #   s    r   c                   @   ó   e Zd Zdd„ ZdS )ÚViewContextc                 K   s   | j  |¡ d S ©N)Ú__dict__Úupdate)r   Úkwr   r   r    r!   ›   s   zViewContext.__init__N)rO   rP   rQ   r!   r   r   r   r    rW   š   ó    rW   c                   @   s4   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚMeldViewztext/html;charset=utf-8g      à?c                 C   sR   || _ | j j}tj |¡stj tj t¡¡}tj ||¡}t	 
|¡| _d | _d S rX   )ÚcontextÚtemplateÚosÚpathÚisabsÚabspathÚdirnameÚ__file__Újoinr   Ú	parse_xmlÚrootr   )r   r^   r_   Úherer   r   r    r!   £   s   
zMeldView.__init__c                 C   s\   |   ¡ }|tu r
tS | jj}|d }| j|d< d|d< d|d< t d¡|d< t|ƒ|d< |S )	Nr.   r/   zno-cacheÚPragmazCache-Controlr   ÚExpiresr1   )Úrenderr   r^   r+   Úcontent_typer
   Úbuild_http_dater   )r   r1   r+   r.   r   r   r    Ú__call__¬   s   
zMeldView.__call__c                 C   s   d S rX   r   ©r   r   r   r    rl   º   ó   zMeldView.renderc                 C   s
   | j  ¡ S rX   )rh   Úclonerp   r   r   r    rr   ½   ó   
zMeldView.cloneN)	rO   rP   rQ   rm   r   r!   ro   rl   rr   r   r   r   r    r]   ž   s    	r]   c                   @   rV   )ÚTailViewc              
   C   sL  | j j}| j j}d|vrd}d }nS|d }d}| dd¡}td| ¡ r)t|ƒd ndƒ}|s1d}n3t|ƒ}z	| |||¡}W n% t	yc } z|j
tjkrQd| }nd	|j
|jf }W Y d }~nd }~ww |  ¡ }	|	 d
¡}
|
 d| ¡ |	 d¡}| |¡ |	 d¡}|d urœ|jdt |¡t tt|ƒƒ¡f d� n| ¡  t|	 ¡ ƒS )NÚprocessnamezNo process name foundr   ÚlimitÚ1024i üÿÿéÿÿÿÿzNo file for %sz#ERROR: unexpected rpc fault [%d] %sÚtitlezSupervisor tail of process %sÚtailbodyÚrefresh_anchorz!tail.html?processname=%s&limit=%s©Úhref)r^   ÚsupervisordÚformr6   ÚminÚisdigitÚintr   ÚreadProcessStdoutLogr   Úcoder   ÚNO_FILEÚtextrr   ÚfindmeldÚcontentÚ
attributesr   ÚquoteÚstrÚabsÚdeparentr   Úwrite_xhtmlstring)r   r~   r   Útailru   Úoffsetrv   ÚrpcinterfaceÚerh   ry   rz   r{   r   r   r    rl   Á   sL   ÿ
ÿ€ü



ÿÿzTailView.renderN)rO   rP   rQ   rl   r   r   r   r    rt   À   r\   rt   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú
StatusViewc                 C   sÖ   |  ¡ }t t|jjj|jjƒ¡}dd| d dœ}dd| d dœ}dd| d dœ}dd	| d dœ}d
d| ddœ}dd| ddœ}	|tjkrO|||||	g}
|
S |tj	tj
tjfv rb|d |||	g}
|
S d d |||	g}
|
S )NÚStartz*index.html?processname=%s&amp;action=start)Únamer}   ÚtargetÚRestartz,index.html?processname=%s&amp;action=restartÚStopz)index.html?processname=%s&amp;action=stopz	Clear Logz-index.html?processname=%s&amp;action=clearlogzTail -f Stdoutz
logtail/%sÚ_blankzTail -f Stderrzlogtail/%s/stderr)Ú	get_stater   rŠ   r   ÚgroupÚconfigr•   r   ÚRUNNINGÚSTOPPEDÚEXITEDÚFATAL)r   ÚprocessÚstateru   ÚstartÚrestartÚstopÚclearlogÚtailf_stdoutÚtailf_stderrÚactionsr   r   r    Úactions_for_processï   sL   ÿýýýýýý

ûÿÿzStatusView.actions_for_processc                 C   s&   |t jkrdS |t jt jfv rdS dS )NÚstatusrunningÚstatuserrorÚstatusnominal)r   r�   r    ÚBACKOFF)r   r¢   r   r   r    Úcss_class_for_state  s
   
zStatusView.css_class_for_statec              
      s‚  | j j}dt|ƒf}dt|gƒf}t||gƒ}|�r½|dkr'dd„ }d|_|S |dkr;|j ¡ ‰‡fdd	„}d|_|S |d
krV|j 	ddiddig¡‰‡fdd„}	d|	_|	S ˆ�r½‡fdd„}
d|
_t
ˆƒ\}}|j |¡}|d u rt|
S |j |¡}|d u r€|
S |dkrûz|j ˆ¡‰ W nS tyß } zG|jtjkr�d‰n,|jtjkr¦d‰n#|jtjkr¯d‰n|jtjkr¸d‰n|jtjkrÁd‰nd|j|jf ‰‡‡fdd„}d|_|W  Y d }~S d }~ww tˆ ƒrð‡ ‡fdd„}d|_|S ‡fdd„}d|_|S |dk�rKz|j ˆ¡‰ W n& t�y. } zd|j|jf ‰‡fd d!„}d|_|W  Y d }~S d }~ww tˆ ƒ�r@‡ ‡fd"d#„}d|_|S ‡fd$d%„}d|_|S |d&k�r~|j 	d'ˆgd(œd)ˆgd(œg¡}t|ƒ�rs|‰‡‡fd*d+„}d|_|S ‡fd,d-„}d|_|S |d.k�r½z|j ˆ¡‰W n& t�y± } zd|j|jf ‰‡fd/d0„}d|_|W  Y d }~S d }~ww ‡fd1d2„}d|_|S t|ƒ‚)3NÚ
supervisorÚsystemÚrefreshc                  S   s   dt  ¡  } | S )NzPage refreshed at %s)ÚtimeÚctime)Úmessager   r   r    Ú	donothing/  s   z+StatusView.make_callback.<locals>.donothinggš™™™™™©?Ústopallc                      s   ˆ ƒ t u rt S dt ¡  S )NzAll stopped at %s©r   r³   r´   r   ©r   r   r    r·   7  s   
z)StatusView.make_callback.<locals>.stopallÚ
restartallÚ
methodNamezsupervisor.stopAllProcesseszsupervisor.startAllProcessesc                     s   ˆ ƒ } | t u r	t S dt ¡  S )NzAll restarted at %sr¸   )Úresultr¹   r   r    rº   C  s   z,StatusView.make_callback.<locals>.restartallc                      ó   dˆ  S )NzNo such process named %sr   r   ©Únamespecr   r    ÚwrongL  ó   z'StatusView.make_callback.<locals>.wrongr£   zno such filezfile not executablezalready startedúspawn errorúabnormal terminationúunexpected rpc fault [%d] %sc                      s   dˆˆ f S )NúERROR: Process %s: %sr   r   )Úmsgr¿   r   r    Ústarterrj  s   z*StatusView.make_callback.<locals>.starterrc               
      s„   zˆ ƒ } W n2 t y7 } z&|jtjkrd}n|jtjkrd}nd|j|jf }dˆ|f W  Y d }~S d }~ww | tu r>tS dˆ S )NrÂ   rÃ   rÄ   rÅ   úProcess %s started)r   r„   r   ÚSPAWN_ERRORÚABNORMAL_TERMINATIONr†   r   )r¼   r’   rÆ   ©Úbool_or_callbackr¿   r   r    Ústartprocessp  s    
ÿ€ø
z.StatusView.make_callback.<locals>.startprocessc                      r½   )NrÈ   r   r   r¾   r   r    Ú	startdoneƒ  rÁ   z+StatusView.make_callback.<locals>.startdoner¥   c                      ó   ˆ S rX   r   r   ©rÆ   r   r    Ústoperr�  rq   z)StatusView.make_callback.<locals>.stoperrc               
      sT   zˆ ƒ } W n t y } zd|j|jf W  Y d }~S d }~ww | tu r&tS dˆ S )NrÄ   úProcess %s stopped)r   r„   r†   r   )r¼   r’   rË   r   r    Ústopprocess•  s   
ÿ€ÿz-StatusView.make_callback.<locals>.stopprocessc                      r½   )NrÒ   r   r   r¾   r   r    Ústopdone¡  rÁ   z*StatusView.make_callback.<locals>.stopdoner¤   zsupervisor.stopProcess)r»   Úparamszsupervisor.startProcessc                     s   ˆ ƒ } | t u r	t S dˆ S ©NzProcess %s restartedr   )Úresults)r   r¿   r   r    Úrestartprocess°  s   z0StatusView.make_callback.<locals>.restartprocessc                      r½   rÖ   r   r   r¾   r   r    Úrestartdone¸  rÁ   z-StatusView.make_callback.<locals>.restartdoner¦   c                      rÏ   rX   r   r   rÐ   r   r    ÚclearerrÃ  rq   z*StatusView.make_callback.<locals>.clearerrc                      r½   )NzLog for %s clearedr   r   r¾   r   r    r¦   È  rÁ   z*StatusView.make_callback.<locals>.clearlog)r^   r~   r   r   r   r   r°   ÚstopAllProcessesr±   Ú	multicallr   Úprocess_groupsr6   Ú	processesÚstartProcessr   r„   r   r…   ÚNOT_EXECUTABLEÚALREADY_STARTEDrÉ   rÊ   r†   ÚcallableÚstopProcessÚclearProcessLogsÚ
ValueError)r   r¿   Úactionr~   Úmainr±   r‘   r¶   r·   rº   rÀ   Ú
group_nameÚprocess_namer›   r¡   r’   rÇ   rÍ   rÎ   rÑ   rÓ   rÔ   Úresults_or_callbackrØ   rÙ   rÚ   r¦   r   )rÌ   r   rÆ   r¿   r    Úmake_callback"  sæ   
ÿÿ
ÿÿ€ï

ÿ€û
	
ÿÿþÿ

ÿ€ûzStatusView.make_callbackc               
   C   s  | j j}| j j}| d¡}| d¡}| d¡}|rH| js%|  ||¡| _tS |  ¡ }|tu r/tS |d urH|d }|d dt |¡  }||d d< | j j	}t
d	t|ƒfgƒ}	g }
|j ¡ D ]}|j ¡ D ]}|
 |jj|f¡ qcq\|
 ¡  g }|
D ],\}}|  |j| j| ¡}t||ƒ}|	j |¡}| |d
 ||||d |d dœ¡ qx|  ¡ }|d ur¼| d¡}d|jd< | |¡ |�rb| d¡ |¡}d}|D ]•\}}| d¡}| |d  ¡ ¡ |  |d ¡|jd< | d¡}| |d ¡ | d¡}t|d |d ƒ}|jdt |¡ d� | |¡ |d }| d¡}| |¡D ]5\}}| d¡}|d u �r4d|jd< �q|j|d |d d � | |d ¡ |d! �rS|j|d! d"� �q|�r]d#|jd< | }qËn
| d$¡}|  d%¡ | d&¡ t!¡ t"t#j$ %¡ j&ƒ}| d'¡ |¡ t'| (¡ ƒS )(Nru   ræ   rµ   Ú
SERVER_URLú/z?message=%sr.   r0   r°   Ú	statenamer¢   Údescription)Ústatusr•   r›   r©   r¢   rï   ÚstatusmessageÚ
status_msgÚclassÚtrFÚstatus_textrð   Ú	info_textÚname_anchorr›   r•   ztail.html?processname=%sr|   r©   Úactionitem_tdÚactionitem_anchorÚhiddenr}   )r}   r•   r–   )r–   ÚshadeÚstatustablezNo programs to manageÚsupervisor_versionÚcopyright_date))r^   r   r+   r6   r   rë   r   r   rŠ   r~   r   r   rÝ   ÚvaluesrÞ   ÚkeysÚappendrœ   r•   Úsortrª   r   r°   ÚgetProcessInforr   r‡   Úattribrˆ   ÚrepeatÚlowerr¯   r‰   Úreplacer   r‹   ÚdatetimeÚdateÚtodayÚyearr   rŽ   ) r   r   r+   ru   ræ   rµ   Ú
server_urlÚlocationr~   r‘   Úprocessnamesr›   Ú	gprocnameÚdataÚ	groupnamer©   Ú	sent_nameÚinforh   Ú
statusareaÚiteratorÚ	shaded_trÚ
tr_elementÚitemrõ   rö   Úanchorrø   Ú
li_elementÚ
actionitemÚtableÚcopyright_yearr   r   r    rl   Ï  s´   


ÿÿÿÿÿ

ú	




ÿ

ÿ




ÿ
€
â
 
zStatusView.renderN)rO   rP   rQ   rª   r¯   rë   rl   r   r   r   r    r“   î   s    + .r“   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚOKViewr   c                 C   ó
   || _ d S rX   )r^   )r   r^   r   r   r    r!   7  rs   zOKView.__init__c                 C   s   ddiS )Nr1   ÚOKr   rp   r   r   r    ro   :  rÁ   zOKView.__call__N)rO   rP   rQ   r   r!   ro   r   r   r   r    r  5  s    r  zui/status.html)r_   Úviewzui/tail.html)ú
index.htmlz	tail.htmlzok.htmlc                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Úsupervisor_ui_handlerz&Supervisor Web UI HTTP Request Handlerc                 C   r  rX   )r~   )r   r~   r   r   r    r!   P  rs   zsupervisor_ui_handler.__init__c                 C   sf   |j dvrdS | ¡ \}}}}| d¡r|dd … }| d¡s|s#d}t ¡ D ]	}||kr0 dS q'd S )N)ÚPOSTÚGETFrí   r2   r"  T)ÚcommandÚ	split_uriÚ
startswithÚVIEWSr   )r   r   ra   rÕ   ÚqueryÚfragmentÚviewnamer   r   r    ÚmatchS  s   


ÿÿÿzsupervisor_ui_handler.matchc                 C   s*   |j dkrt| |ƒ|_d S |  d|¡ d S )Nr$  r"   )r&  r   Úcontinue_request)r   r   r   r   r    Úhandle_requestc  s   
z$supervisor_ui_handler.handle_requestc                 C   s"  i }|  ¡ }| |¡ d|vrd|d< |d }t |¡}t |¡}| ¡ D ]
\}}	|	d ||< q%|D ]\}}	|	||< q2| ¡ |d< |d }
|
r[|
d dkr[|
dd … }
|
r[|
d dksM|
s_d}
t |
¡}|d u rjd S d	i i}|d
 }|d }t	||||| j
d�}||ƒ}|jj}|t||ƒƒ d S )NÚQUERY_STRINGr"   r   rì   Ú	PATH_INFOrí   r2   r"  r.   r!  r_   )r_   r   r   r+   r~   )Úcgi_environmentrZ   r   Ú	parse_qslÚparse_qsÚitemsÚget_server_urlr)  r6   rW   r~   r&   rE   r   )r   r  r   r   Úcgi_envr*  Úform_urlencodedÚ
query_dataÚkÚvra   Úviewinfor+   Ú	viewclassÚviewtemplater^   r!  Úpushproducerr   r   r    r.  i  sD   



ÿ
üz&supervisor_ui_handler.continue_requestN)rO   rP   rQ   ÚIDENTr!   r-  r/  r.  r   r   r   r    r#  M  s    r#  ),r`   rS   r³   r$   r  r°   r   Úsupervisor.compatr   r   r   r   r   r   Úsupervisor.medusar	   Úsupervisor.medusa.http_serverr
   r   Ú supervisor.medusa.xmlrpc_handlerr   Úsupervisor.processr   Úsupervisor.httpr   Úsupervisor.optionsr   r   r   Úsupervisor.xmlrpcr   r   r   r   Úsupervisor.rpcinterfacer   r   rW   r]   rt   r“   r  r)  r#  r   r   r   r    Ú<module>   sZ    w".  I
þþþ÷