o
    f^                     @   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   A/var/www/html/venv/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rd| jv r| jd dksd}n| jj
rd| jd< d}nd}n| jjd u rd}t| j }|rd| jd< |rtt| jj}	t||	g}	n-trt| jjdkr| jjd }t|trt|| 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rz|j W nS ty } zG|jtjkrdn,|jtjkrdn#|jtjkrdn|jtjkrdn|jtjkrd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rz|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< | }qn
|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
