
    AcS                        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      Zd Z G d de      Z G d d      Zd Z  G d d      Z! G d de"      Z# G d d      Z$d Z%d Z& G d  d!e      Z'd" Z( G d# d$e
jR                        Z* G d% d&ejV                        Z,d' Z-y)(    N)	iterparse)	xmlrpclib)StringIO)urlparse)as_bytes)	as_string)encodestring)decodestring)httplib)PY2)
get_header)xmlrpc_handler)	producers)NOT_DONE_YETc                   T    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y)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     3/usr/lib/python3/dist-packages/supervisor/xmlrpc.pyr   r      s_    NMNHJGNFKOKGMMKr;   r   c                 \    t         j                  D ]  }t        t         |      | k(  s|c S  y)NUNKNOWN)r   __dict__getattr)code	faultnames     r<   getFaultDescriptionrC   .   s/    __ 	69%- r;   c                       e Zd ZddZd Zy)RPCErrorNc                 d    || _         t        |      | _        || j                  d|| _        y y )Nz: )rA   rC   text)selfrA   extras      r<   __init__zRPCError.__init__5   s0    	'-	$(IIu5DI r;   c                 :    d| j                   d| j                  S )Nzcode=z, text=)rA   rG   rH   s    r<   __str__zRPCError.__str__;   s    %)YY		::r;   N)r%   r&   r'   rJ   rM   r:   r;   r<   rE   rE   4   s    6;r;   rE   c                   \    e Zd ZdZ ej
                  dej                        Zd Zd Z	d Z
y)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                 b    || _         || _        d| _        t        |j                        | _        y )NF)callbackrequestfinishedfloatdelay)rH   rS   rR   s      r<   rJ   zDeferredXMLRPCResponse.__init__C   s'     8>>*
r;   c                    | j                   ry	 	 | j                         }|t        u rt        S 	 t        |      }d| _         | j                  |      S # t        $ r4}t	        j
                  |j                  |j                        }Y d }~[d }~ww xY w#  t        j                         }| j                  j                  j                  j                  j!                  d|       d| _         | j                  j#                  d       Y y xY w)N TzXML-RPC response callback error  )rT   rR   r   rE   r   FaultrA   rG   xmlrpc_marshalgetresponse	traceback
format_excrS   channelserverloggerlogerror)rH   valueerrbodytbs        r<   morezDeferredXMLRPCResponse.moreI   s    ==	$<L('' )
 "%(D DM##D))  <!#((;<	$%%'BLL  ''..2212 !DMLLs#s/   A #B 	B*B
B 
BB A2Dc                    d| j                   d<   t        |      | j                   d<   | j                   j                  |       t        | j                  | j                   j
                        }d}| j                   j                  dk(  r|dk(  rd| j                   d<   n<d	}n9| j                   j                  d
k(  r|dk(  rd	}n| j                   j                  d	}t        j                  | j                   j                               }|rd| j                   d<   | j                   j                  j                  d|       t        j                  | j                   j                        }| j                   j                  j                  t        j                  t        j                   || j                   j"                                     d | j                   j                  _        |r%| j                   j                  j'                          y y )Ntext/xmlContent-TypeContent-Lengthr   z1.0z
keep-alivez
Keep-Alive
Connectionr   z1.1close)rS   lenpushr   
CONNECTIONheaderversionr   simple_producerbuild_reply_headeroutgoinginsertcomposite_producerr_   push_with_producerglobbing_producerhooked_producerrb   current_requestclose_when_done)rH   rf   
connectionclose_itoutgoing_headeroutgoing_producers         r<   r\   z"DeferredXMLRPCResponse.getresponseb   s   '1^$),T%&$1D1DE
<<5(\)-9\*\\!!U*W$\\!!)H#33LL++-/ )0DLL& 	$$Q8%889N9NO 	//++!11 1 $ 0 0"		 04,LL  002 r;   N)r%   r&   r'   __doc__recompile
IGNORECASErq   rJ   rh   r\   r:   r;   r<   rP   rP   >   s.    M/?J+$2,3r;   rP   c                     t        | t        j                         }|r,t        | t              s| f} t        j                  | |      }|S t        j                  |       }|S )N)methodresponse)
isinstancer   rZ   tupledumps)rd   ismethodresponserf   s      r<   r[   r[      sW    %eY__==%'HEu5EF K u%Kr;   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)SystemNamespaceRPCInterfacec                 b    i | _         |D ]  \  }}|| j                   |<    | | j                   d<   y )Nsystem)
namespaces)rH   r   nameinsts       r<   rJ   z$SystemNamespaceRPCInterface.__init__   s8    $ 	)JD$$(DOOD!	)$(!r;   c                    i }| j                   D ]u  }| j                   |   }|j                  j                  D ]K  }t        ||      }t	        |      s|j                  d      r-|d|}t        |j                        ||<   M w |S )N_.)r   	__class__r?   r@   callable
startswithstrr   )rH   methodsns_name	namespacemethod_namefuncsigs          r<   _listMethodsz(SystemNamespaceRPCInterface._listMethods   s     		9G0I(22;; 9 y+6D>&11#6)0+>'*4<<'89		9 r;   c                 x    | j                         }t        |j                               }|j                          |S )z Return an array listing the available method names

        @return array result  An array of method names available (strings).
        )r   listkeyssort)rH   r   r   s      r<   listMethodsz'SystemNamespaceRPCInterface.listMethods   s0    
 ##%GLLN#		r;   c                     | j                         }|j                         D ]  }||k(  s	||   c S  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   rE   r   r+   )rH   r   r   
methodnames       r<   
methodHelpz&SystemNamespaceRPCInterface.methodHelp   sM     ##%!,,. 	+JT!z**	+ v3344r;   c                 :   | j                         }|D ]n  }||k(  s	d}g }t        ||         }|D ]-  }|d   dk(  r|d   }|d   dk(  s|j                  |d          / |t        t        j
                        |g|z   c S  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appendrE   r   r+   )rH   r   r   methodrtypeptypesparsedthings           r<   methodSignaturez+SystemNamespaceRPCInterface.methodSignature   s     ##% 	(F~ 1# 0EQx8+ %aqW,eAh/	0
 ="6#?#?@@w''	( v3344r;   c                 \     |dd }g }g }|||f f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                    |r5	  |d          }|t        ur"|j                  d       |j                  |       |s| r| j                  d      }|j                  dd       }|j                  dg       }		 |t        t
        j                  d      |d	k(  rt        t
        j                  d
      t        j                        }
t        |
||	      }t        |t         j"                        r|j                  |       n|j                  |       |s| r|s| rt        S |S # t         $ r$}|j                  |j                  d}Y d }~7d }~w t        j                         }|d   d|d   }t
        j                  d|z   d}Y vxY w# t         $ r#}|j                  |j                  d}Y d }~d }~w t        j                         }|d   d|d   }t
        j                  d|z   d}Y xY w)Nr   )	faultCodefaultString:r   zFAILED: 
methodNameparamszNo methodNamezsystem.multicallz$Recursive system.multicall forbidden)rE   rA   rG   sysexc_infor   r1   r   popr   getr)   AttrDictr   traverser   typesFunctionType)remaining_calls	callbacksresultsrd   excinfoerrmsgcallr   r   rootrH   s              r<   multiz4SystemNamespaceRPCInterface.multicall.<locals>.multi   s   
 	A(IaLNE ,MM!$NN5) !o&**1-xxd3(B/A|&v'B'B+- -11&v'B'BBD D $DOO4D$T48E eU%7%78$$U+NN5)7 !o< O##_   6*-((,/HH6EA<<>D(,Qa9F*0--,6,?AE.   6*-((,/HH6EA<<>D(,Qa9F*0--,6,?AEs0   
D 3AF 	F'E<F	G.F//<G.g?)rV   r   )rH   callsr   r   r   r   rd   s   `      r<   	multicallz%SystemNamespaceRPCInterface.multicall   sM      (	 #2%!7	p  L LLr;   N)	r%   r&   r'   rJ   r   r   r   r   r   r:   r;   r<   r   r      s!    )
552Qr;   r   c                       e Zd Zd Zy)r   c                 $    | j                  |      S rN   )r   )rH   r   s     r<   __getattr__zAttrDict.__getattr__3  s    xx~r;   N)r%   r&   r'   r   r:   r;   r<   r   r   1  s    r;   r   c                       e Zd Zd Zy)RootRPCInterfacec                 2    |D ]  \  }}t        | ||        y rN   )setattr)rH   subinterfacesr   rpcinterfaces       r<   rJ   zRootRPCInterface.__init__7  s"    "/ 	.D,D$-	.r;   N)r%   r&   r'   rJ   r:   r;   r<   r   r   6  s    .r;   r   c                     t        |       }|t        j                  k  rt        j                  }|S |t        j                  kD  rt        j                  }|S rN   )intr   MININTMAXINT)rd   is     r<   
capped_intr   ;  sK    E
A9 H 
Y	Hr;   c                 T    t        j                   t        j                  | d      d d  S )Nz%Y%m%dT%H:%M:%Sr   )datetimetimestrptimerG   s    r<   make_datetimer   C  s+    	t.	/	3 r;   c                   d    e Zd ZdZdZd d d d d d d	 d
 d d d dZd Zd Zd Zd Z	d Z
y)supervisor_xmlrpc_handlerz/RPC2zSupervisor XML-RPC Handlerc                 ,    t        | j                        S rN   r   rG   xs    r<   <lambda>z"supervisor_xmlrpc_handler.<lambda>M  s    QVV r;   c                 ,    t        | j                        S rN   r   r   s    r<   r   z"supervisor_xmlrpc_handler.<lambda>N  s    AFF r;   c                      | j                   dk(  S )N1r   r   s    r<   r   z"supervisor_xmlrpc_handler.<lambda>O  s    QVVs] r;   c                 "    | j                   xs dS NrX   r   r   s    r<   r   z"supervisor_xmlrpc_handler.<lambda>P  s    AFFLb r;   c                 ,    t        | j                        S rN   )rU   rG   r   s    r<   r   z"supervisor_xmlrpc_handler.<lambda>Q  s    E!&&M r;   c                 ,    t        | j                        S rN   )r   rG   r   s    r<   r   z"supervisor_xmlrpc_handler.<lambda>R  s    mAFF&; r;   c                      | d   j                   S Nr   r   r   s    r<   r   z"supervisor_xmlrpc_handler.<lambda>S      1Q499 r;   c                 @    | D cg c]  }|j                    c}S c c}w rN   r   )r   vs     r<   r   z"supervisor_xmlrpc_handler.<lambda>T  s    1-a166- -s   c                 ~    t        | D cg c]!  \  }}|j                  xs d|j                  f# c}}      S c c}}w r   )dictrG   )r   kr   s      r<   r   z"supervisor_xmlrpc_handler.<lambda>U  s.    DQ!GTQ166<R"8!GH !Gs   &9
c                 X    t        t        t        | j                  xs d                  S r   )r   r
   r   rG   r   s    r<   r   z"supervisor_xmlrpc_handler.<lambda>V  s    Il8AFFLb3I&JK r;   c                      | d   j                   S r   r   r   s    r<   r   z"supervisor_xmlrpc_handler.<lambda>W  r   r;   )r   i4booleanstringdoublezdateTime.iso8601arraydatastructbase64r   c                 2    t        |      | _        || _        y rN   )r   r   supervisord)rH   r  r   s      r<   rJ   z"supervisor_xmlrpc_handler.__init__Z  s    ,];&r;   c                 ,   d x}}t        t        |            D ]  \  }}| j                  j                  |j                        }|r  ||      }|j                          ||_        M|j                  dk(  r(	 |d   j                  }|j                          ||_        |j                  dk(  r|j                  }|j                  dk(  st        |D cg c]  }|j                   c}      } ||fS # t        $ r |j                  xs d}Y w xY wc c}w )Nrd   r   rX   r   r   )	r   r   unmarshallersr   tagclearrG   
IndexErrorr   )rH   r   r   r   actionelem
unmarshallr   s           r<   loadszsupervisor_xmlrpc_handler.loads^  s    %htn5 	7LFD++//9J!$'

 	W$+7<<D 

 	\)X%5156!	7" v~ " +99?D+  6s   6C2D
2DDc                 L    |j                   j                  | j                        S rN   )urir   path)rH   rS   s     r<   matchzsupervisor_xmlrpc_handler.matchs  s    {{%%dii00r;   c                 >   | j                   j                  j                  }	 	 t        r|j	                  dd      }| j                  |      \  }}|s'|j                  d|d       |j                  d       y |d}	 |j                  d|z         | j                  ||      }|j                  d	|z         t        |t        j                         r)|j"                  j$                  } |t'        ||             y t)        t+        |            }	d|d<   t-        |	      |d<   |j/                  |	       |j1                          y #  |j                  d|d       |j                  d       Y y xY w# t        $ r`}t        j                  |j                  |j                        }|j                  d
||j                  |j                  fz         Y d }~d }~ww xY w#  t3        j4                         }
|j7                  d|d|
       |j                  d       Y y xY w)NasciixmlcharrefreplacezXML-RPC request data z is invalid: unmarshallablei  z is invalid: no method namer:   zXML-RPC method called: %s()z)XML-RPC method %s() returned successfullyz+XML-RPC method %s() returned fault: [%d] %srj   rk   rl   z#Handling XML-RPC request with data z! raised an unexpected exception: rY   )r  optionsra   r   encoder  rc   tracer   rE   r   rZ   rA   rG   r   r   r   r_   ry   rP   r   r[   ro   rp   doner]   r^   critical)rH   r   rS   ra   r   r   rd   re   pushproducerrf   rg   s              r<   continue_requestz*supervisor_xmlrpc_handler.continue_requestv  s   !!))00B	
 ;;w0CDD!%D!1  c" ~
):VCD		&&1H#$ % %!3!34  'AA3GUCD  u 56*4',/I()T"a c"*  )!#((;JHHchhN( ( ) )).	%%'BOO#'-
 MM#s\   ,E (G 8G =:E0 7AG :AG (E-+G -G 0	G9AGG GG >Hc                 0    t        | j                  ||      S rN   )r   r   )rH   r   r   s      r<   r   zsupervisor_xmlrpc_handler.call  s    ))66::r;   N)r%   r&   r'   r  IDENTr  rJ   r  r  r  r   r:   r;   r<   r   r   H  sQ    D(E %#*();$-HK$
M'*1EN;r;   r   c                    |j                  d      }t        |      dk7  rt        t        j                        |\  }}|j                  d      rt        t        j                        t        | |d       }|t        t        j                        t        ||d       }t        |t        j                        st        t        j                        	  || S # t        $ r t        t        j                        w xY w)Nr   r   r   )splitro   rE   r   r(   r   r@   r   r   
MethodType	TypeErrorr)   )obr   r   dotted_partsr   r   r   s          r<   r   r     s    <<$L
<Av,,--$Iv v,,--2y$/Lv,,--<.DdE,,-v,,--4V} 4v22334s   C #C9c                   *    e Zd ZdZdZddZd ZddZy)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                 p   t         j                  j                  |        || _        || _        d| _        || _        |j                  d      r?t        j                  |      }|j                  |j                  }}|d}||fd}|| _        y |j                  d      r|fd}|| _        y t        d|z        )NFzhttp://r!   c                 .    t        j                  | |      S rN   )r   HTTPConnection)hostports     r<   get_connectionz4SupervisorTransport.__init__.<locals>.get_connection  s    --dD99r;   zunix://c                 0    t        d      }| dd  |_        |S )N	localhost   )UnixStreamHTTPConnection
socketfile)	serverurlconns     r<   r+  z4SupervisorTransport.__init__.<locals>.get_connection  s      0<"+AB-r;   z!Unknown protocol for serverurl %s)r   	TransportrJ   usernamepasswordverboser1  r   r   hostnamer*  _get_connection
ValueError)rH   r4  r5  r1  r   r)  r*  r+  s           r<   rJ   zSupervisorTransport.__init__  s    $$T*  "	*&&y1F&++$D|$(t :#1D !!),)2  $2D @9LMMr;   c                 `    | j                   r"| j                   j                          d | _         y y rN   )r~   rn   rL   s    r<   rn   zSupervisorTransport.close  s%    ??OO!!#"DO r;   c                    t        |      }| j                  s| j                         | _        | j                  ddd| _        | j
                  z| j                  n| j
                  d| j                  }t        t        t        |                  }|j                  dd      }|j                  dd      }d|z  | j                  d<   t        t        |            | j                  d<   | j                  j                  d	||| j                         | j                  j                         }|j                  d
k7  rP| j                  j                          d | _        t!        j"                  ||z   |j                  |j$                  d      |j'                         }t        |      }|j)                  dd      }| j+                         \  }	}
|	j-                  |       |	j                          |
j                         S )Nrj   )z
User-Agentrk   Acceptr   
rX   zBasic %sAuthorizationrl   POST   r  r  )r   r~   r8  
user_agentheadersr4  r5  r   r	   replacer   ro   rS   r\   statusrn   r   ProtocolErrorreasonreadr  	getparserfeed)rH   r)  handlerrequest_bodyr6  	unencodedencodedrr   pus              r<   rS   zSupervisorTransport.request   s   -"224DO#!+$DL }}(T]]-F'+}}dmmD	#L)1D$EF!//$3!//&"50:W0D_-),S->)?%&t||LOO'')88s?OO!!#"DO))$.*+((*+((*,/ / vvx {{7$78~~1	t		wwyr;   )NNN)r   )r%   r&   r'   r   r~   rJ   rn   rS   r:   r;   r<   r%  r%    s     JN2#
'r;   r%  c                       e Zd Zd Zy)r/  c                     t        j                   t         j                  t         j                        | _        | j                  j	                  | j
                         y rN   )socketAF_UNIXSOCK_STREAMsockconnectr0  rL   s    r<   rW  z UnixStreamHTTPConnection.connect*  s4    MM&..&2D2DE			$//*r;   N)r%   r&   r'   rW  r:   r;   r<   r/  r/  )  s    +r;   r/  c           
      v   g }d}d}d}dx}}g }| j                  d      D ]  }|j                         }|j                  d      r|j                  ||||dj	                  |      f       |j                  dd      }	t        |	      dk(  rd}d}g }n_t        |	      dk(  r
|	d   }d}g }nGt        |	      dk(  r|	d   }|	d   }g }n,t        |	      d	k(  r|	d   }|	d   }|	d   j                         g}|	d   dd }|}n|r|j                  |       |dz  } |j                  ||||dj	                  |      f       |S )
z6 Parse documentation strings into JavaDoc-like tokens Nr   r=  @r   r   rX   r   r   )r  stripr   r   joinro   lstrip)
commenttagsr  datatyper   
tag_linenolinenotag_textlinepartss
             r<   r   r   /  sc    D
CHDJHd# zz|??3KKS(D$))H:MNOJJtQ'E5zQUq 8Uq 8QxUq 8Qx!!HOO-.(12,CJ%!58 	KKS(D$))H2EFGKr;   ).r   r   rS  r   r   r]   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   rC   	ExceptionrE   rP   r[   r   r   r   r   r   r   r   r   r3  r%  r(  r/  r   r:   r;   r<   <module>rl     s     	  
    + ' & & & ' * * % ! 4 ; ' ( (;y ;P3 P3dU Unt 
. .

v; v;p42N)-- N`+w55 +)r;   