o
    r¨Êh¾S  ã                   @   s   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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dd„ ZG dd„ deƒZG dd„ dƒZdd„ Z G dd„ dƒZ!G dd„ de"ƒZ#G dd„ dƒZ$d d!„ Z%d"d#„ Z&G d$d%„ d%eƒZ'd&d'„ Z(G d(d)„ d)e
j)ƒZ*G d*d+„ d+ej+ƒZ,d,d-„ Z-dS ).é    N)Ú	iterparse)Ú	xmlrpclib)ÚStringIO)Úurlparse)Úas_bytes)Ú	as_string)Úencodestring)Údecodestring)Úhttplib)ÚPY2)Ú
get_header)Úxmlrpc_handler)Ú	producers)ÚNOT_DONE_YETc                   @   sT   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdS )ÚFaultsé   é   é   é   é   é
   é   é   é   é   é(   é2   é<   éF   éP   éZ   é[   é\   N)Ú__name__Ú
__module__Ú__qualname__ÚUNKNOWN_METHODÚINCORRECT_PARAMETERSÚBAD_ARGUMENTSÚSIGNATURE_UNSUPPORTEDÚSHUTDOWN_STATEÚBAD_NAMEÚ
BAD_SIGNALÚNO_FILEÚNOT_EXECUTABLEÚFAILEDÚABNORMAL_TERMINATIONÚSPAWN_ERRORÚALREADY_STARTEDÚNOT_RUNNINGÚSUCCESSÚALREADY_ADDEDÚSTILL_RUNNINGÚCANT_REREAD© r8   r8   úC/var/www/html/env/lib/python3.10/site-packages/supervisor/xmlrpc.pyr      s&    r   c                 C   s&   t jD ]}tt |ƒ| kr|  S qdS )NÚUNKNOWN)r   Ú__dict__Úgetattr)ÚcodeÚ	faultnamer8   r8   r9   ÚgetFaultDescription.   s
   
ÿr?   c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚRPCErrorNc                 C   s0   || _ t|ƒ| _|d urd| j|f | _d S d S )Nz%s: %s)r=   r?   Útext)Úselfr=   Úextrar8   r8   r9   Ú__init__5   s
   
ÿzRPCError.__init__c                 C   s   d| j | jf S )Nzcode=%r, text=%r)r=   rA   ©rB   r8   r8   r9   Ú__str__;   s   zRPCError.__str__©N)r#   r$   r%   rD   rF   r8   r8   r8   r9   r@   4   s    
r@   c                   @   s6   e Zd ZdZe dej¡Zdd„ Zdd„ Z	dd„ Z
d	S )
ÚDeferredXMLRPCResponsezŠ 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)rB   rJ   rI   r8   r8   r9   rD   C   s   zDeferredXMLRPCResponse.__init__c              
   C   s²   | j rdS z6z|  ¡ }|tu rtW W S W n ty. } zt |j|j¡}W Y d }~nd }~ww t|ƒ}d| _ |  	|¡W S    t
 ¡ }| jjjj d|¡ d| _ | j d¡ Y d S )NÚ TzXML-RPC response callback erroréô  )rK   rI   r   r@   r   ÚFaultr=   rA   Úxmlrpc_marshalÚgetresponseÚ	tracebackÚ
format_excrJ   ÚchannelÚserverÚloggerÚlogÚerror)rB   ÚvalueÚerrÚbodyÚtbr8   r8   r9   ÚmoreI   s,   ÿ€ÿÿzDeferredXMLRPCResponse.morec                 C   s  d| j d< t|ƒ| j d< | j  |¡ t| j| j jƒ}d}| j jdkr/|dkr,d| j d< nd	}n| j jd
kr<|dkr;d	}n| j jd u rDd	}t | j  	¡ ¡}|rSd| 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útext/xmlúContent-TypeúContent-Lengthr   z1.0z
keep-alivez
Keep-AliveÚ
Connectionr   z1.1Úclose)rJ   ÚlenÚpushr   Ú
CONNECTIONÚheaderÚversionr   Úsimple_producerÚbuild_reply_headerÚoutgoingÚinsertÚcomposite_producerrU   Úpush_with_producerÚglobbing_producerÚhooked_producerrX   Úcurrent_requestÚclose_when_done)rB   r\   Ú
connectionÚclose_itÚoutgoing_headerÚoutgoing_producerr8   r8   r9   rR   b   sD   
€ÿ
þþþ
ÿz"DeferredXMLRPCResponse.getresponseN)r#   r$   r%   Ú__doc__ÚreÚcompileÚ
IGNORECASErf   rD   r^   rR   r8   r8   r8   r9   rH   >   s    rH   c                 C   sB   t | tjƒ }|rt | tƒs| f} tj| |d�}|S t | ¡}|S )N)Úmethodresponse)Ú
isinstancer   rP   ÚtupleÚdumps)rZ   Úismethodresponser\   r8   r8   r9   rQ   �   s   

ÿrQ   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚSystemNamespaceRPCInterfacec                 C   s,   i | _ |D ]	\}}|| j |< q| | j d< d S )NÚsystem)Ú
namespaces)rB   r‚   ÚnameÚinstr8   r8   r9   rD   ›   s   z$SystemNamespaceRPCInterface.__init__c                 C   sb   i }| j D ])}| j | }|jjD ]}t||ƒ}t|ƒr-| d¡s-d||f }t|jƒ||< qq|S )NÚ_z%s.%s)r‚   Ú	__class__r;   r<   ÚcallableÚ
startswithÚstrrw   )rB   ÚmethodsÚns_nameÚ	namespaceÚmethod_nameÚfuncÚsigr8   r8   r9   Ú_listMethods¡   s   



€ùz(SystemNamespaceRPCInterface._listMethodsc                 C   s    |   ¡ }t| ¡ ƒ}| ¡  |S )z‰ Return an array listing the available method names

        @return array result  An array of method names available (strings).
        )r�   ÚlistÚkeysÚsort)rB   rŠ   r’   r8   r8   r9   ÚlistMethods¯   s   z'SystemNamespaceRPCInterface.listMethodsc                 C   s4   |   ¡ }| ¡ D ]}||kr||   S qttjƒ‚)z· Return a string showing the method's documentation

        @param string name   The name of the method.
        @return string result The documentation for the method name.
        )r�   r’   r@   r   r)   )rB   rƒ   rŠ   Ú
methodnamer8   r8   r9   Ú
methodHelp¹   s   ÿ
z&SystemNamespaceRPCInterface.methodHelpc                 C   s’   |   ¡ }|D ]=}||krCd}g }t|| ƒ}|D ]}|d dkr%|d }q|d dkr2| |d ¡ q|du r<ttjƒ‚|g|   S qttjƒ‚)ab   Return an array describing the method signature in the
        form [rtype, ptype, ptype...] where rtype is the return data type
        of the method, and ptypes are the parameter data types that the
        method accepts in method argument order.

        @param string name  The name of the method.
        @return array result  The result.
        Nr   Úreturnr   Úparam)r�   ÚgettagsÚappendr@   r   r)   )rB   rƒ   rŠ   ÚmethodÚrtypeÚptypesÚparsedÚthingr8   r8   r9   ÚmethodSignatureÅ   s"   	
€
õ
z+SystemNamespaceRPCInterface.methodSignaturec                    sD   |dd… }g }g }|||f‡ fdd„	}d|_ |ƒ }|tu r |S |S )a  Process an array of calls, and return an array of
        results. Calls should be structs of the form {'methodName':
        string, 'params': array}. Each result will either be a
        single-item array containing the result value, or a struct of
        the form {'faultCode': int, 'faultString': string}. This is
        useful when you need to make lots of small calls without lots
        of round trips.

        @param array calls  An array of call requests
        @return array result  An array of results
        Nc              
      s   |rJz|d ƒ }W n2 t y" } z|j|jdœ}W Y d }~nd }~w   t ¡ }d|d |d f }tjd| dœ}Y |turJ| d¡ | 	|¡ |sÈ| rÈ|  d¡}| 
dd ¡}| 
dg ¡}	z!|d u rjt tjdƒ‚|d	krtt tjd
ƒ‚tˆ jƒ}
t|
||	ƒ}W n2 t y™ } z|j|jdœ}W Y d }~nd }~w   t ¡ }d|d |d f }tjd| dœ}Y t|tjƒr¿| 	|¡ n| 	|¡ |sÈ| sN|sÌ| rÎtS |S )Nr   )Ú	faultCodeÚfaultStringú%s:%sr   zFAILED: Ú
methodNameÚparamszNo methodNamezsystem.multicallz$Recursive system.multicall forbidden)r@   r=   rA   ÚsysÚexc_infor   r/   r   Úpoprš   Úgetr'   ÚAttrDictr‚   Útraverser|   ÚtypesÚFunctionType)Úremaining_callsÚ	callbacksÚresultsrZ   ÚexcÚinfoÚerrmsgÚcallrƒ   r¥   ÚrootrE   r8   r9   Úmultiï   sd   ÿ€ÿ


ÿÿ
ÿ€ÿ
åz4SystemNamespaceRPCInterface.multicall.<locals>.multigš™™™™™©?)rM   r   )rB   Úcallsr®   r¯   r°   r¶   rZ   r8   rE   r9   Ú	multicallÞ   s   þ8z%SystemNamespaceRPCInterface.multicallN)	r#   r$   r%   rD   r�   r”   r–   r    r¸   r8   r8   r8   r9   r€   š   s    
r€   c                   @   ó   e Zd Zdd„ ZdS )rª   c                 C   s
   |   |¡S rG   )r©   )rB   rƒ   r8   r8   r9   Ú__getattr__3  s   
zAttrDict.__getattr__N)r#   r$   r%   rº   r8   r8   r8   r9   rª   1  s    rª   c                   @   r¹   )ÚRootRPCInterfacec                 C   s   |D ]
\}}t | ||ƒ qd S rG   )Úsetattr)rB   Úsubinterfacesrƒ   Úrpcinterfacer8   r8   r9   rD   7  s   ÿzRootRPCInterface.__init__N)r#   r$   r%   rD   r8   r8   r8   r9   r»   6  ó    r»   c                 C   s0   t | ƒ}|tjk rtj}|S |tjkrtj}|S rG   )Úintr   ÚMININTÚMAXINT)rZ   Úir8   r8   r9   Ú
capped_int;  s   

þrÄ   c                 C   s   t j t | d¡d d… Ž S )Nz%Y%m%dT%H:%M:%Sr   )ÚdatetimeÚtimeÚstrptime©rA   r8   r8   r9   Úmake_datetimeC  s   ÿrÉ   c                   @   s„   e Zd ZdZdZdd„ dd„ dd„ dd„ dd„ d	d„ d
d„ dd„ dd„ dd„ dd„ dœZdd„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dS )Úsupervisor_xmlrpc_handlerz/RPC2zSupervisor XML-RPC Handlerc                 C   ó
   t | jƒS rG   ©rÀ   rA   ©Úxr8   r8   r9   Ú<lambda>M  ó   
 z"supervisor_xmlrpc_handler.<lambda>c                 C   rË   rG   rÌ   rÍ   r8   r8   r9   rÏ   N  rÐ   c                 C   s
   | j dkS )NÚ1rÈ   rÍ   r8   r8   r9   rÏ   O  rÐ   c                 C   s
   | j pdS ©NrN   rÈ   rÍ   r8   r8   r9   rÏ   P  rÐ   c                 C   rË   rG   )rL   rA   rÍ   r8   r8   r9   rÏ   Q  rÐ   c                 C   rË   rG   )rÉ   rA   rÍ   r8   r8   r9   rÏ   R  rÐ   c                 C   ó
   | d j S ©Nr   rÈ   rÍ   r8   r8   r9   rÏ   S  rÐ   c                 C   s   dd„ | D ƒS )Nc                 S   ó   g | ]}|j ‘qS r8   rÈ   ©Ú.0Úvr8   r8   r9   Ú
<listcomp>T  ó    ú6supervisor_xmlrpc_handler.<lambda>.<locals>.<listcomp>r8   rÍ   r8   r8   r9   rÏ   T  s    c                 C   s   t dd„ | D ƒƒS )Nc                 S   s    g | ]\}}|j p
d |j f‘qS )rN   rÈ   )r×   ÚkrØ   r8   r8   r9   rÙ   U  s     rÛ   )ÚdictrÍ   r8   r8   r9   rÏ   U  rÚ   c                 C   s   t tt| jpdƒƒƒS rÒ   )r   r	   r   rA   rÍ   r8   r8   r9   rÏ   V  s    c                 C   rÓ   rÔ   rÈ   rÍ   r8   r8   r9   rÏ   W  rÐ   )rÀ   Úi4ÚbooleanÚstringÚdoublezdateTime.iso8601ÚarrayÚdataÚstructÚbase64r˜   c                 C   s   t |ƒ| _|| _d S rG   )r»   r¾   Úsupervisord)rB   ræ   r½   r8   r8   r9   rD   Z  s   

z"supervisor_xmlrpc_handler.__init__c              	   C   sÄ   d  }}t t|ƒƒD ]S\}}| j |j¡}|r#||ƒ}| ¡  ||_q
|jdkrFz|d j}W n ty=   |jp:d}Y nw | ¡  ||_q
|jdkrO|j}q
|jdkr]tdd„ |D ƒƒ}q
||fS )NrZ   r   rN   r¤   r¥   c                 S   rÕ   r8   rÈ   rÖ   r8   r8   r9   rÙ   p  rÚ   z3supervisor_xmlrpc_handler.loads.<locals>.<listcomp>)	r   r   Úunmarshallersr©   ÚtagÚclearrA   Ú
IndexErrorr}   )rB   rã   r¥   r›   ÚactionÚelemÚ
unmarshallr8   r8   r9   Úloads^  s*   
ÿ

€zsupervisor_xmlrpc_handler.loadsc                 C   s   |j  | j¡S rG   )Úurirˆ   Úpath)rB   rJ   r8   r8   r9   Úmatchs  ó   zsupervisor_xmlrpc_handler.matchc              
   C   s’  | j jj}z«ztr| dd¡}|  |¡\}}W n   | d|f ¡ | d¡ Y W d S |s>| d|f ¡ | d¡ W d S |d u rDd}z| d| ¡ |  ||¡}| d| ¡ W n& t	y€ } zt
 |j|j¡}| d	||j|jf ¡ W Y d }~nd }~ww t|tjƒr•|jj}|t||ƒƒ W d S tt|ƒƒ}	d
|d< t|	ƒ|d< | |	¡ | ¡  W d S    t ¡ }
| d||
f ¡ | d¡ Y d S )NÚasciiÚxmlcharrefreplacez2XML-RPC request data %r is invalid: unmarshallablei�  z2XML-RPC request data %r is invalid: no method namer8   zXML-RPC method called: %s()z)XML-RPC method %s() returned successfullyz+XML-RPC method %s() returned fault: [%d] %sr_   r`   ra   zHHandling XML-RPC request with data %r raised an unexpected exception: %srO   )ræ   ÚoptionsrW   r   Úencoderî   rY   Útracer´   r@   r   rP   r=   rA   r|   r¬   r­   rU   rn   rH   r   rQ   rd   re   ÚdonerS   rT   Úcritical)rB   rã   rJ   rW   r¥   r›   rZ   r[   Úpushproducerr\   r]   r8   r8   r9   Úcontinue_requestv  sl   
ÿÿ
ÿÿ

ÿþ€ý
ÿÿz*supervisor_xmlrpc_handler.continue_requestc                 C   s   t | j||ƒS rG   )r«   r¾   )rB   r›   r¥   r8   r8   r9   r´   ½  rò   zsupervisor_xmlrpc_handler.callN)r#   r$   r%   rð   ÚIDENTrç   rD   rî   rñ   rû   r´   r8   r8   r8   r9   rÊ   H  s(    õGrÊ   c                 C   s    |  d¡}t|ƒdkrttjƒ‚|\}}| d¡rttjƒ‚t| |d ƒ}|d u r-ttjƒ‚t||d ƒ}t|tj	ƒs>ttjƒ‚z||Ž W S  t
yO   ttjƒ‚w )NÚ.r   r…   )Úsplitrd   r@   r   r&   rˆ   r<   r|   r¬   Ú
MethodTypeÚ	TypeErrorr'   )Úobr›   r¥   Údotted_partsrŒ   r¾   rŽ   r8   r8   r9   r«   À  s"   







ÿr«   c                   @   s0   e Zd ZdZdZd
dd„Zdd„ Zddd	„ZdS )ÚSupervisorTransportz¾
    Provides a Transport for xmlrpclib that uses
    httplib.HTTPConnection in order to support persistent
    connections.  Also support basic auth and UNIX domain socket
    servers.
    Nc                 C   s–   t j | ¡ || _|| _d| _|| _| d¡r5t |¡}|j	|j
}}|d u r)d}||fdd„}|| _d S | d¡rE|fdd„}|| _d S td| ƒ‚)	NFzhttp://r   c                 S   s   t  | |¡S rG   )r
   ÚHTTPConnection)ÚhostÚportr8   r8   r9   Úget_connectioní  s   z4SupervisorTransport.__init__.<locals>.get_connectionzunix://c                 S   s   t dƒ}| dd … |_|S )NÚ	localhosté   )ÚUnixStreamHTTPConnectionÚ
socketfile)Ú	serverurlÚconnr8   r8   r9   r  ñ  s   z!Unknown protocol for serverurl %s)r   Ú	TransportrD   ÚusernameÚpasswordÚverboser  rˆ   r   Úhostnamer  Ú_get_connectionÚ
ValueError)rB   r  r  r  rž   r  r  r  r8   r8   r9   rD   â  s    




zSupervisorTransport.__init__c                 C   s   | j r| j  ¡  d | _ d S d S rG   )rs   rc   rE   r8   r8   r9   rc   û  s   

þzSupervisorTransport.closer   c                 C   s&  t |ƒ}| jsA|  ¡ | _| jdddœ| _| jd urA| jd urAd| j| jf }ttt |ƒƒƒ}| 	dd¡}| 	dd¡}d| | jd< t
t|ƒƒ| jd< | j d	||| j¡ | j ¡ }|jd
krr| j ¡  d | _t || |j|jd¡‚| ¡ }t|ƒ}| dd¡}|  ¡ \}	}
|	 |¡ |	 ¡  |
 ¡ S )Nr_   )z
User-Agentr`   ÚAcceptr£   Ú
rN   zBasic %sÚAuthorizationra   ÚPOSTéÈ   ró   rô   )r   rs   r  Ú
user_agentÚheadersr  r  r   r   Úreplacer‰   rd   rJ   rR   Ústatusrc   r   ÚProtocolErrorÚreasonÚreadrö   Ú	getparserÚfeed)rB   r  ÚhandlerÚrequest_bodyr  Ú	unencodedÚencodedÚrrã   ÚpÚur8   r8   r9   rJ      s>   
ý



ý
zSupervisorTransport.request)NNN)r   )r#   r$   r%   rw   rs   rD   rc   rJ   r8   r8   r8   r9   r  Ù  s    
r  c                   @   r¹   )r
  c                 C   s$   t   t jt j¡| _| j | j¡ d S rG   )ÚsocketÚAF_UNIXÚSOCK_STREAMÚsockÚconnectr  rE   r8   r8   r9   r.  *  s   z UnixStreamHTTPConnection.connectN)r#   r$   r%   r.  r8   r8   r8   r9   r
  )  r¿   r
  c           
   
   C   s2  g }d}d}d}d }}g }|   d¡D ]v}| ¡ }| d¡r~| ||||d |¡f¡ |  dd¡}	t|	ƒdkr>d}d}g }n5t|	ƒdkrM|	d }d}g }n&t|	ƒdkr^|	d }|	d }g }nt|	ƒd	krs|	d }|	d }|	d  ¡ g}|	d dd… }|}n|r…| |¡ |d7 }q| ||||d |¡f¡ |S )
z6 Parse documentation strings into JavaDoc-like tokens Nr   r  ú@r   r   rN   r   r   )rþ   Ústriprˆ   rš   Újoinrd   Úlstrip)
ÚcommentÚtagsrè   Údatatyperƒ   Ú
tag_linenoÚlinenoÚtag_textÚlineÚpartsr8   r8   r9   r™   /  sD   


r™   ).rÅ   rx   r*  r¦   rÆ   rS   r¬   Úxml.etree.ElementTreer   Úsupervisor.compatr   r   r   r   r   r   r	   r
   r   Úsupervisor.medusa.http_serverr   Ú supervisor.medusa.xmlrpc_handlerr   Úsupervisor.medusar   Úsupervisor.httpr   r   r?   Ú	Exceptionr@   rH   rQ   r€   rÝ   rª   r»   rÄ   rÉ   rÊ   r«   r  r  r  r
  r™   r8   r8   r8   r9   Ú<module>   sJ    
R
 xP