o
    fS                     @   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   D/var/www/html/venv/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| rt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}zz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