
    1c^                        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      Z$ G d d      Z% G d d      Z& G d de&      Z' G d d e&      Z( G d! d"      Z)d#e(d$d%e'd$de)d$d&Z* G d' d(      Z+y))    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                   \    e Zd ZdZ ej
                  dej                        Zd Zd Z	d Z
y)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                 b    || _         || _        d| _        t        |j                        | _        y )NF)callbackrequestfinishedfloatdelay)selfr   r   s      0/usr/lib/python3/dist-packages/supervisor/web.py__init__zDeferredWebProducer.__init__(   s'     8>>*
    c                 x   | j                   ry	 | j                         }|t        u rt        S d| _         | j                  |      S #  t	        j
                         }| j                  j                  j                  j                  j                  d|       d| _         | j                  j                  d       Y y xY w)N TzWeb interface errori  )r   r   r   sendresponse	traceback
format_excr   channelserverloggerlogerror)r!   responsetbs      r"   morezDeferredWebProducer.more.   s    ==	$}}H<'## DM$$X..	$%%'BLL  ''..223H"M DMLLs#s   A A A2B9c                    |j                  di       }|D ]  }||   | j                  |<    d| j                  vrd| j                  d<   |j                  d      r+d| j                  d<   | j                  j                  d       y |j                  dd	      }t        |      | j                  d<   | j                  j	                  |       t        | j                  | j                  j                        }d}d}| j                  j                  d
k(  r6|dk(  r.| j                  j                  d      sd}nd| j                  d<   nd}n| j                  j                  dk(  rd|dk(  rd}ntd| j                  vrfd| j                  v r| j                  d   dk(  sFd}nC| j                  j                  rd| j                  d<   d}nd}n| j                  j                  d}t        j                  | j                  j                               }|rd| j                  d<   |rTt        j                  t        j                  | j                  j                               }	t        j                  ||	g      }	nt"        rwt        | j                  j                         dkD  rU| j                  j                   d   }t%        |t&              r,t        j                  |      | j                  j                   d<   | j                  j                   j)                  d|       t        j                  | j                  j                         }	| j                  j*                  j-                  t        j.                  t        j0                  |	| j                  j2                                     d | j                  j*                  _        |r%| j                  j*                  j7                          y y )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/   r3   r?   r6   
connectionclose_itwrap_in_chunkingoutgoing_headeroutgoing_producers
             r"   r'   z DeferredWebProducer.sendresponse@   s-   ,,y"- 	3F#*6?DLL 	3 -+7DLL(;;z"-.DLL)*LLs#||FB'),T%&$1D1DE
<<5(\)||++,<= H1=DLL.\\!!U*W$!5&$,,6<<(;<	I#$\\--8ADLL!45'($ H\\!!)H#33LL++-/ )0DLL& ) : :00$,,2G2GH! !* < < "34!
 DLL112Q6||,,Q/dG,/8/H/H$/ODLL))!, LL!!((O< ) < <%%!' 	//++!11 1 $ 0 0"		 04,LL  002 r$   N)__name__
__module____qualname____doc__recompile
IGNORECASEr>   r#   r1   r'    r$   r"   r   r   #   s/    M/?J+$$X3r$   r   c                       e Zd Zd Zy)ViewContextc                 :    | j                   j                  |       y N)__dict__update)r!   kws     r"   r#   zViewContext.__init__   s    R r$   N)rT   rU   rV   r#   r[   r$   r"   r]   r]      s    !r$   r]   c                   ,    e Zd ZdZdZd Zd Zd Zd Zy)MeldViewztext/html;charset=utf-8g      ?c                 ~   || _         | j                   j                  }t        j                  j	                  |      s`t        j                  j                  t        j                  j                  t                    }t        j                  j                  ||      }t        j                  |      | _        d | _        y r_   )contexttemplateospathisabsabspathdirname__file__joinr   	parse_xmlrootr   )r!   rf   rg   heres       r"   r#   zMeldView.__init__   st    <<((ww}}X&77??277??8#<=Dww||D(3H((2	r$   c                     | j                         }|t        u rt        S | j                  j                  }|d   }| j                  |d<   d|d<   d|d<   t        j                  d      |d<   t        |      |d<   |S )	Nr3   r4   zno-cachePragmazCache-Controlr   Expiresr6   )renderr   rf   r/   content_typer   build_http_dater   )r!   r6   r/   r3   s       r"   __call__zMeldView.__call__   s    {{}<<<((9%"&"3"3&#- &66q9	#D>r$   c                      y r_   r[   r!   s    r"   ru   zMeldView.render   s    r$   c                 6    | j                   j                         S r_   )rp   clonerz   s    r"   r|   zMeldView.clone   s    yy  r$   N)	rT   rU   rV   rv   r    r#   rx   ru   r|   r[   r$   r"   rd   rd      s     ,LE!r$   rd   c                       e Zd Zd Zy)TailViewc                    | j                   j                  }| j                   j                  }d|vrd}d }ng|d   }d}|j                  dd      }t	        d|j                         rt        |      dz  nd      }|sd}nt        |      }	 |j                  |||      }| j                         }	|	j                  d
      }
|
j!                  d|z         |	j                  d      }|j!                  |       |	j                  d      }|Q|j#                  dt%        j&                  |      dt%        j&                  t)        t+                                 n|j-                          t/        |	j1                               S # t        $ rI}|j                  t        j                  k(  rd|z  }nd	|j                  |j                  fz  }Y d }~1d }~ww xY w)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=z&limit=href)rf   supervisordformr;   minisdigitintr   readProcessStdoutLogr   coder   NO_FILEtextr|   findmeldcontent
attributesr   quotestrabsdeparentr   write_xhtmlstring)r!   r   r   tailr   offsetr   rpcinterfaceerp   r   r   r   s                r"   ru   zTailView.render   s   ll..||  $*DK}-KFHHWf-Es5z"}UKE.>{K,'<<[=BFLD zz|g&5CD==,'78"%%LL-v||CE
O/L &  ##%//1221   ,vv//+=DFFAFFH,  ,	,s   
F 	G
>GGN)rT   rU   rV   ru   r[   r$   r"   r~   r~      s    +3r$   r~   c                   $    e Zd Zd Zd Zd Zd Zy)
StatusViewc                    |j                         }t        j                  t        |j                  j
                  j                  |j
                  j                              }dd|z  d d}dd|z  d d}dd|z  d d}dd	|z  d d}d
d|z  dd}dd|z  dd}	|t        j                  k(  r	|||||	g}
|
S |t        j                  t        j                  t        j                  fv r	|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stater   startrestartstopclearlogtailf_stdouttailf_stderractionss              r"   actions_for_processzStatusView.actions_for_process   sM   !!#ll=1E1E1J1J181D1D$F G @;N
 B[P
 ?+M
  CkQ
 % ;.
 %'+5

 M)))hlKG  },,m.B.B$**, ,dHlLIG  T8\<HGr$   c                 r    |t         j                  k(  ry|t         j                  t         j                  fv ryy)Nstatusrunningstatuserrorstatusnominal)r   r   r   BACKOFF)r!   r   s     r"   css_class_for_statezStatusView.css_class_for_state  s2    M)))"}**M,A,ABB "r$   c                 "   | j                   j                  }dt        |      f}dt        |g      f}t	        ||g      }|r|dk(  rd }d|_        |S |dk(  r(|j                  j                         fd}d|_        |S |dk(  r/|j                  j                  d	d
id	dig      fd}	d|	_        |	S rmfd}
d|
_        t              \  }}|j                  j                  |      }||
S |j                  j                  |      }||
S |dk(  rD	 |j                  j                        t1              rfd}d|_        |S fd}d|_        |S |dk(  rD	 |j                  j3                        t1              rfd}d|_        |S fd}d|_        |S |dk(  rO|j                  j                  dgddgdg      }t1        |      r|fd }d|_        |S fd!}d|_        |S |d"k(  r*	 |j                  j5                        fd$}d|_        |S t7        |      # t        $ r}|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z  fd}d|_        |cY d }~S d }~ww xY w# t        $ r3}d|j                   |j.                  fz  fd}d|_        |cY d }~S d }~ww xY w# t        $ r3}d|j                   |j.                  fz  fd#}d|_        |cY d }~S d }~ww xY w)%N
supervisorsystemrefreshc                  4    dt        j                         z  } | S )NzPage refreshed at %s)timectime)messages    r"   	donothingz+StatusView.make_callback.<locals>.donothing/  s    4tzz|CG"Nr$   g?stopallc                  X             t         u rt         S dt        j                         z  S )NzAll stopped at %sr   r   r   )r   s   r"   r   z)StatusView.make_callback.<locals>.stopall7  s$    z\1++2TZZ\AAr$   
restartall
methodNamezsupervisor.stopAllProcesseszsupervisor.startAllProcessesc                  \            } | t         u rt         S dt        j                         z  S )NzAll restarted at %sr   )resultr   s    r"   r   z,StatusView.make_callback.<locals>.restartallC  s)    %ZF-++04::<??r$   c                      d z  S )NzNo such process named %sr[   namespecs   r"   wrongz'StatusView.make_callback.<locals>.wrongL  s    5@@r$   r   zno such filezfile not executablezalready startedspawn errorabnormal terminationunexpected rpc fault [%d] %sc                      dd S )NERROR: Process : r[   )msgr   s   r"   starterrz*StatusView.make_callback.<locals>.starterrj  s    >F#LLr$   c                  ,   	         } | t        u rt        S dz  S # t         $ rm}|j                  t        j                  k(  rd}n;|j                  t        j                  k(  rd}nd|j                  |j
                  fz  }dd|cY d }~S d }~ww xY w)Nr   r   r   r   r   Process %s started)r   r   r   SPAWN_ERRORABNORMAL_TERMINATIONr   r   )r   r   r   bool_or_callbackr   s      r"   startprocessz.StatusView.make_callback.<locals>.startprocessp  s    
Q)9);  &5'3 3#7(#BB $, Q#$66V-?-?#?*7C%&VVv/J/J%J*@C*H()L8 +8CBJC'P PQs    	BA"BBBc                      d z  S )Nr   r[   r   s   r"   	startdonez+StatusView.make_callback.<locals>.startdone      #7(#BBr$   r   c                       S r_   r[   r   s   r"   stoperrz)StatusView.make_callback.<locals>.stoperr      #&Jr$   c                      	         } | t        u rt        S dz  S # t         $ r%}d|j                  |j                  fz  cY d }~S d }~ww xY w)Nr   Process %s stopped)r   r   r   r   )r   r   r   r   s     r"   stopprocessz-StatusView.make_callback.<locals>.stopprocess  s]    4)9);  &5'3 3#7(#BB $, 4'E$%FFAFFI4 (4 !44s    	AA AAc                      d z  S )Nr   r[   r   s   r"   stopdonez*StatusView.make_callback.<locals>.stopdone  r   r$   r   zsupervisor.stopProcess)r   paramszsupervisor.startProcessc                  8            } | t         u rt         S dz  S NzProcess %s restartedr   )resultsr   r   s    r"   restartprocessz0StatusView.make_callback.<locals>.restartprocess  s#    &.jG&,6'3 3#9H#DDr$   c                      d z  S r   r[   r   s   r"   restartdonez-StatusView.make_callback.<locals>.restartdone  s    #9H#DDr$   r   c                       S r_   r[   r   s   r"   clearerrz*StatusView.make_callback.<locals>.clearerr  r   r$   c                      d z  S )NzLog for %s clearedr[   r   s   r"   r   z*StatusView.make_callback.<locals>.clearlog  s    3h>>r$   )rf   r   r   r   r   r    r   stopAllProcessesr   	multicallr   process_groupsr;   	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   s    `                         @@@r"   make_callbackzStatusView.make_callback"  s   ll..  ? LM7?@'v7"# #'	  9$'22CCEB
 !%<''..88#$AB#$BCFH@
 $(
 !!A"+9(+C(
L#2266zB= L//--l;? LW$((33@@J ),   01C  .2*++C*.	((v%	'(33??I )   01C -1)**C)-'y(*6*=*=*G*G(@&.Z1(A&.Z1+'   34#6E
 04,--E,0)**z)(#/#:#:#K#K$$&?%)HN#O  c $ (66V^^3"0CVVv'<'<<"7CVVv'='=="3CVVv'9'99"/CVVv'B'BB"8C"@ !D0 #0CM)-'#(b $ '<?OO'(,&'h $ (<?OO')-'(s[   H3 "L ?M 3	L<C	LLL	M(M
M
M	N(N	N	Nc           
      B	   | j                   j                  }| j                   j                  }|j                  d      }|j                  d      }|j                  d      }|rt| j                  s| j                  ||      | _        t        S | j	                         }|t        u rt        S |+|d   }|dz   dt        j                  |      z  z   }||d   d<   | j                   j                  }t        d	t        |      fg      }	g }
|j                  j                         D ]H  }|j                  j                         D ])  }|
j!                  |j"                  j$                  |f       + J |
j'                          g }|
D ]x  \  }}| j)                  |j                  |   j                  |         }t+        ||      }|	j,                  j/                  |      }|j!                  |d
   ||||d   |d   d       z | j1                         }|1|j3                  d      }d|j4                  d<   |j7                  |       |r|j3                  d      j9                  |      }d}|D ]  \  }}|j3                  d      }|j7                  |d   j;                                | j=                  |d         |j4                  d<   |j3                  d      }|j7                  |d          |j3                  d      }t+        |d   |d         }|j?                  dt        j                  |      z         |j7                  |       |d   }|j3                  d      }|j9                  |      D ]p  \  }}|j3                  d      }|d|j4                  d<   )|j?                  |d   |d           |j7                  |d          |d!   s\|j?                  |d!   "       r |rd#|j4                  d<   | } n"|j3                  d$      }|jA                  d%       |j3                  d&      j7                  tB               tE        tF        jH                  jK                         jL                        }|j3                  d'      j7                  |       tO        |jQ                               S )(Nr   r  r   
SERVER_URL/z?message=%sr3   r5   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))rf   r   r/   r;   r   r  r   r   r   r   r   r   r   valuesr   keysappendr   r   sortr   r   r   getProcessInfor|   r   attribr   repeatlowerr   r   replacer   r   datetimedatetodayyearr   r   ) r!   r   r/   r   r  r   
server_urllocationr   r   processnamesr   	gprocnamedata	groupnamer   	sent_nameinforp   
statusareaiterator	shaded_tr
tr_elementitemr  r  anchorr  
li_element
actionitemtablecopyright_years                                    r"   ru   zStatusView.render  s   ||  <<((hh}-(#((9%== $ 2 2; G##  ==?l*''&!%l!3J)C/-&,,C! 3!  !H6>HY'
3ll..'-k:< =
  //668 	DE"__113 D	##U\\%6%6	$BCD	D 	&2 	"I{..**95??LNG%i=I**99)DDKKk*"!!W"=1 	 zz|7J)5Jg&w'}}T*11$7HI$, * 
D(11-@##DN$8$8$:;.2.F.FM/#""7+ '//<	!!$}"56#,,];+DM4<H!!'A"(,,{";(<! ={+y/ * 3 3O D.;.B.B7.K 	K*J
'001DEF!)19g.))z&/A/9&/A * Cz&'9:%h/"--Z5I-J	K 18J%%g. )M	=*@ MM-0EMM12*+33G<X]]002778&'//?//122r$   N)rT   rU   rV   r   r   r  ru   r[   r$   r"   r   r      s    )V#k!Zd3r$   r   c                       e Zd ZdZd Zd Zy)OKViewr   c                     || _         y r_   )rf   )r!   rf   s     r"   r#   zOKView.__init__7  s	    r$   c                 
    ddiS )Nr6   OKr[   rz   s    r"   rx   zOKView.__call__:  s    t}r$   N)rT   rU   rV   r    r#   rx   r[   r$   r"   r;  r;  5  s    Er$   r;  zui/status.html)rg   viewzui/tail.html)
index.htmlz	tail.htmlzok.htmlc                   (    e Zd ZdZd Zd Zd Zd Zy)supervisor_ui_handlerz&Supervisor Web UI HTTP Request Handlerc                     || _         y r_   )r   )r!   r   s     r"   r#   zsupervisor_ui_handler.__init__P  s
    &r$   c                     |j                   dvry|j                         \  }}}}|j                  d      r|dd  }|j                  d      r|sd}t        j	                         D ]	  }||k(  s	 y y )N)POSTGETFr	  r7   r@  T)command	split_uri
startswithVIEWSr  )r!   r   ri   r   queryfragmentviewnames          r"   matchzsupervisor_ui_handler.matchS  sw    ??/1(/(9(9(;%feXooc"8D ooc" D

 	H4	r$   c                 j    |j                   dk(  rt        | |      |_        y | j                  d|       y )NrE  r&   )rG  r   continue_request)r!   r   s     r"   handle_requestz$supervisor_ui_handler.handle_requestc  s-    ??f$ )$ 8G!!"g.r$   c                 d   i }|j                         }|j                  |       d|vrd|d<   |d   }t        j                  |      }t        j                  |      }|j                         D ]  \  }}	|	d   ||<    |D ]
  \  }}	|	||<    |j                         |d<   |d   }
|
r|
d   dk(  r|
dd  }
|
r	|
d   dk(  r|
sd}
t        j                  |
      }|y d	i i}|d
   }|d   }t        ||||| j                        } ||      }|j                  j                  } |t        ||             y )NQUERY_STRINGr&   r   r  	PATH_INFOr	  r7   r@  r3   r?  rg   )rg   r   r   r/   r   )cgi_environmentra   r   	parse_qslparse_qsitemsget_server_urlrJ  r;   r]   r   r*   rJ   r   )r!   r,  r   r   cgi_envrK  form_urlencoded
query_datakvri   viewinfor/   	viewclassviewtemplaterf   r?  pushproducers                     r"   rP  z&supervisor_ui_handler.continue_requesti  sp   ))+G%#%D ^$ #,,T2&&u-
$$& 	DAqdDG	 $ 	DAqDG	 %335\K tAw#~8D tAw#~D99T?r?V$	
+|(/%))1*.*:*:	<
 !99($78r$   N)rT   rU   rV   IDENTr#   rN  rQ  rP  r[   r$   r"   rB  rB  M  s    4E' /.9r$   rB  ),rh   rX   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   r]   rd   r~   r   r;  rJ  rB  r[   r$   r"   <module>rm     s    	 	    ! $ & & ' ! % ' 3 4 6 , ( & , - 9 . $ & Cu3 u3n! ! !  !D,3x ,3\E3 E3N
  &
 %
 	 J9 J9r$   