
    Ac|                        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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  G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d dej>                        Z  G d dejB                        Z" G d dej(                        Z# G d de#      Z$ G d d e#      Z% G d! d"      Z& G d# d$      Z' G d% d&      Z(d' Z) G d( d)      Z* G d* d+      Z+ G d, d-e      Z,y# e	$ r d dl
ZY w xY w).    N)urllib)sha1)as_bytes)	as_string)asyncore_25)	http_date)http_server)	producers)filesys)default_handler)auth_handlerc                       e Zd Zy)NOT_DONE_YETN)__name__
__module____qualname__     1/usr/lib/python3/dist-packages/supervisor/http.pyr   r      s    r   r   c                       e Zd ZdZddZd Zy)deferring_chunked_producera'  A producer that implements the 'chunked' transfer coding for HTTP/1.1.
    Here is a sample usage:
            request['Transfer-Encoding'] = 'chunked'
            request.push (
                    producers.chunked_producer (your_producer)
                    )
            request.done()
    Nc                 .    || _         || _        d| _        y N皙?)producerfootersdelay)selfr   r   s      r   __init__z#deferring_chunked_producer.__init__)   s     
r   c                     | j                   r| j                   j                         }|t        u rt        S |r"dt        |      z  }t	        |      dz   |z   dz   S d | _         | j
                  r"dj                  dg| j
                  z         dz   S yy)Nz%xs   
   0s   

s   0

r   )r   morer   lenr   r   join)r   datass      r   r"   zdeferring_chunked_producer.more.   s    ====%%'D|###3t9${W,t3g== $<<"<<(=>LL'r   Nr   r   r   __doc__r   r"   r   r   r   r   r      s    
r   r   c                       e Zd ZdZd Zd Zy)deferring_composite_producerz$combine a fifo of producers into onec                      || _         d| _        y r   )r
   r   )r   r
   s     r   r   z%deferring_composite_producer.__init__A   s    "
r   c                     t        | j                        rb| j                  d   }|j                         }|t        u rt        S |r|S | j                  j	                  d       t        | j                        rby)Nr   r   )r#   r
   r"   r   pop)r   pds      r   r"   z!deferring_composite_producer.moreE   sb    $..!q!AAL ##""1% $..! r   Nr(   r   r   r   r+   r+   ?   s    .r   r+   c                       e Zd ZdZddZd Zy)deferring_globbing_producerz
    'glob' the output from a producer into a particular buffer size.
    helps reduce the number of calls to send().  [this appears to
    gain about 30% performance on requests to a single channel]
    c                 <    || _         d| _        || _        d| _        y )Nr   r   )r   bufferbuffer_sizer   )r   r   r5   s      r   r   z$deferring_globbing_producer.__init__Z   s     &
r   c                    t        | j                        | j                  k  rd| j                  j	                         }|t
        u rt
        S |r	 | j                  |z   | _        nn#t        | j                        | j                  k  rd| j                  }d| _        |S # t        $ r) t        | j                        t        |      z   | _        Y iw xY wNr   )r#   r4   r5   r   r"   r   	TypeErrorr   )r   r%   rs      r   r"   z deferring_globbing_producer.more`   s    $++!1!11==%%'D|###I"&++"4DK  $++!1!11 KK ! I"*4;;"7(4."HDKIs   B /CCN)i   r(   r   r   r   r2   r2   S   s    r   r2   c                       e Zd ZdZd Zd Zy)deferring_hooked_producerz
    A producer that will call <function> when it empties,.
    with an argument of the number of bytes produced.  Useful
    for logging/instrumentation purposes.
    c                 <    || _         || _        d| _        d| _        y )Nr   r   )r   functionbytesr   )r   r   r=   s      r   r   z"deferring_hooked_producer.__init__x   s      

r   c                     | j                   rn| j                   j                         }|t        u rt        S |s$d | _         | j                  | j                         |S | xj                  t        |      z  c_        |S yr7   )r   r"   r   r=   r>   r#   )r   results     r   r"   zdeferring_hooked_producer.more~   sf    ==]]'')F%## $tzz* M 

c&k)
Mr   Nr(   r   r   r   r;   r;   q   s    r   r;   c                   (    e Zd ZdZd Zd Zd Zd Zy)deferring_http_requesta   The medusa http_request class uses the default set of producers in
    medusa.producers.  We can't use these because they don't know anything
    about deferred responses, so we override various methods here.  This was
    added to support tail -f like behavior on the logtail handler c                 `   t        j                  t         j                  | j                        }|j	                         }d}d}d}| j
                  dk(  r|dk(  rd| vrd}nZd| d<   nTd}nQ| j
                  dk(  r4|d	k(  rd}n:d| vr6d
| v r| d
   dk(  s*d}n'| j                  r
d| d
<   d}d}nd}n| j
                  d}t        j                  | j                               }|rd	| d<   |r,t        t        | j                              }t        ||g      }n1| j                  j                  d|       t        | j                        }t        || j                        }|rt!        |      }| j"                  j%                  |       d| j"                  _        |r| j"                  j)                          yy)z I didn't want to override this, but there's no way around
        it in order to support deferreds - CM

        finalize this transaction - send output to the http channelr      z1.0z
keep-alivezContent-Lengthz
Keep-Alive
Connectionz1.1closezTransfer-EncodingchunkedN)r	   
get_header
CONNECTIONheaderlowerversionuse_chunkedr
   simple_producerbuild_reply_headerr   r+   outgoinginsertr;   logr2   channelpush_with_producercurrent_requestclose_when_done)	r   argkw
connectionclose_itwrap_in_chunkingglobbingoutgoing_headeroutgoing_producers	            r   donezdeferring_http_request.done   s    !++K,B,B4;;O
%%'
<<5 \)'4/ H)5D&\\U"W$%-&$. 34	A#$%%09D,-'($  !H H\\! H#33D4K4K4MN!(D :0?! != "34!
 MM  O4 <T]] K 66G6:hh@  ;<M N''(9:'+$LL((* r   c           	      x   | j                   j                  r3| j                   j                  d   }| j                   j                  d   }nd}d}| j                   j                  j                  j	                  |d|| j                  t        j                               | j                  | j                  |fz         y)z We need to override this because UNIX domain sockets return
        an empty string for the addr rather than a (host, port) combination r   rD   	localhostz%d - - [%s] "%s" %d %d
N)	rS   addrserverloggerrR   log_date_stringtimerequest
reply_code)r   r>   hostports       r   rR   zdeferring_http_request.log   s     <<<<$$Q'D<<$$Q'DDD""&&*,,diik:. 		r   c                 x   i }dddd}t        j                         }| j                         \  }}}}|r||z   }|r|d   dk(  r|dd  }|r	|d   dk(  rd|v rt        j                  |      }|r|dd  }| j
                  j                  }| j                  j                         |d	<   t        |j                        |d
<   |j                  |d<   |j                  |d<   d| j                  z   |d<   | j
                  j                  |d<   d|d<   d|z   |d<   t         j                  j!                  t         j                  j#                  ||d               |d<   |r||d<   d|d<   | j
                  j$                  r| j
                  j$                  d   |d<   nd|d<   | j&                  D ]  }	|	j)                  dd      \  }
}|
j+                         }
|j-                         }|
|v r|r|||j/                  |
      <   Sddj#                  |
j)                  d            j                         z  }
|s|
|vs|||
<    |S )NCONTENT_LENGTHCONTENT_TYPECONNECTION_TYPE)zcontent-lengthzcontent-typerY   r   /rD   %REQUEST_METHODSERVER_PORTSERVER_NAMESERVER_SOFTWAREzHTTP/SERVER_PROTOCOLzchannel.creation_time SCRIPT_NAME	PATH_INFOPATH_TRANSLATEDQUERY_STRINGzCGI/1.1GATEWAY_INTERFACEREMOTE_ADDRz	127.0.0.1:zHTTP_%s_-)osgetcwd	split_urir	   unquoterS   rc   commandupperstrrj   server_nameSERVER_IDENTrL   creation_timepathnormpathr$   rb   rJ   splitrK   stripget)r   env
header2envworkdirr   paramsqueryfragmentrc   rJ   keyvalues               r   cgi_environmentz&deferring_http_request.cgi_environment   sA    ,<+9+<>
 ))+*...*:'vuh&=DtAw#~8D tAw#~$;&&t,D!"IE$$ $ 2 2 4 -M#//M!'!4!4!(4<<!7'+||'A'A#$M:K!#!1!1"'',,[)3+ ","'C#, <<!%!2!21!5C!,Ckk 		#Fll3q)IC		C++-Ej U).JNN3'(#))S/!: A A CCS^"CH		# 
r   c                 j   ddd}| j                         }|j                  d      dv s|j                  d      dk(  rd}nd	}d
|v r,|d
   j                         }t        j                  |      \  }}n|d   j                         }|d   }|||   |k(  r|}n|dz   |z   }|d|}|dd dk(  r|dd }|S )z Functionality that medusa's http request doesn't have; set an
        attribute named 'server_url' on the request based on the Host: header
        80443)httphttpsHTTPS)onONSERVER_PORT_SECURE1r   r   	HTTP_HOSTrs   rr   Nr}   z://ro   )r   r   r   r   	splitport)r   default_portenvironprotocolri   hostnamerj   
server_urls           r   get_server_urlz%deferring_http_request.get_server_url/  s     #U3&&(KK L0KK,-4HH'!;'--/D#--d3NHd}-335H=)D<<1T9Dc>D(D"*D1
bc?C!#2Jr   N)r   r   r   r)   r_   rR   r   r   r   r   r   rB   rB      s    F
Q+f(3jr   rB   c                   ,    e Zd ZdZdZdZddZd Zd Zy)deferring_http_channeli   r   Nc                     |t        j                          }| j                  r,|| j                  z
  }|| j                  kD  s|dk  r|| _        yyt        j                  j                  |       S )Nr   TF)rf   r   last_writable_checkr	   http_channelwritable)r   nowelapseds      r   r   zdeferring_http_channel.writableU  s`    ;))+C::D444G$**$'A++.(''0066r   c                     	 t        | j                        r| j                  j                         }|7| j                  s*| j                  j	                          | j                          yt        |t              r0| j                  j	                          | xj                  |z  c_        y|j                         }|t        u r|j                  | _
        y|r| j                  |z   | _        d| _
        y| j                  j	                          ny)z Implement deferreds NF)r#   producer_fifofirstac_out_bufferr.   rF   
isinstancer>   r"   r   r   )r   r/   r%   s      r   refill_bufferz$deferring_http_channel.refill_bufferd  s    4%%&&&,,. 9--**..0

5)&&**,&&!+&vvx<'!"DJ)-););d)BD&!&DJ&&**,9 r   c                    | j                   r| j                   j                          yt        | j                        }d| _        |j	                  d      }|r|d   s|dd }|r|d   s|s| j                          y|d   }t        j                  |      \  }}}t        j                  |dd       }t        j                  |      \  }}d|v r3|rt        j                  |      dz   |z   }nt        j                  |      }t        | |||||      }	| j                  j                          | j                  j                  j                          |0| j!                  dt#        |      z  d	       |	j%                  d
       y| j                  j&                  D ].  }
|
j)                  |	      s	 |	| _         |
j+                  |	        y |	j%                  d       y#  | j                  j,                  j                          t/        j0                         \  \  }}}}}}| j                  j!                  d|d|d|d|d	       	 |	j%                  d       Y  y#  Y Y  yxY wxY w)z We only override this to use 'deferring_http_request' class
        instead of the normal http_request class; it sucks to need to override
        this r   z
r   rD   Nrp   ?zBad HTTP request: %serror  zServer Error: z, z: file: z line: i    )rU   found_terminatorr   	in_bufferr   rV   r	   crack_requestjoin_headers
splitqueryr   rB   request_counter	incrementrc   total_requestslog_inforeprr   handlersmatchhandle_request
exceptionsasyncorecompact_traceback)r   rJ   linesrg   r   urirL   rpathrqueryr9   hfilefunlinetvtbinfos                    r   r   z'deferring_http_channel.found_terminator  s;      113
 t~~.F DNLL(E a
 ab	 a $$&AhG$/$=$=w$G!GS' --uQRy9F (2237ME6e|%--e4s:VCC%--e4C&tWgsG'-/A  **,KK&&0025WEwO
 [[)) 77A;!/0, ((!, ', GGSM!..88:'99; 8)sD1a,,qd,#%!GGSM ! s%   -GA+I#II I# I#r'   )	r   r   r   ac_out_buffer_sizer   r   r   r   r   r   r   r   r   r   L  s&     E7@Nr   r   c                   (    e Zd ZeZdZd Zd ZddZy)supervisor_http_serverNc                 2   ddl m} |s|j                  t        j                        }|j                  |      }|| _        t        j                  j                  |        | j                  |       g | _
        |j                  d       | j                          y)zj Override __init__ to do logger setup earlier so it can
        go to our logger object instead of stdout r   rd   N)supervisor.medusard   file_loggersysstdoutunresolving_loggerr   
dispatcherr   
set_socketr   setblockingset_reuse_addr)r   socklogger_objectrd   s       r   prebindzsupervisor_http_server.prebind  sv     	-"..szz:M11-@#$$d+r   c                 d   ddl m} ddlm} | j	                  d        |       | _         |       | _         |       | _         |       | _         |       | _	        | j                  d|dt        j                  t        j                               d| j                  d| j                  d		       y )
Nr   )counter)VERSION_STRING   z	Medusa (Vz) started at z
	Hostname: z
	Port:
)supervisor.medusa.counterr   supervisor.medusa.http_serverr   listentotal_clientsr   r   	bytes_outbytes_inr   rf   ctimer   rj   )r   r   r   s      r   postbindzsupervisor_http_server.postbind  s{    5@D$Y%i!)  
 '

499;/((		
	r   c                 r    d}t        | dd       | j                  }| j                  j                  ||       y )Nrv   ip)getattrr   rd   rR   )r   messagetyper   s       r   r   zsupervisor_http_server.log_info  s1    4t$0BG$r   )info)	r   r   r   r   channel_classr   r   r   r   r   r   r   r   r     s    *M	B&0%r   r   c                       e Zd ZdZd Zy)supervisor_af_inet_http_serverz+ AF_INET version of supervisor HTTP server c                 T   || _         || _        t        j                  t        j                  t        j                        }| j                  ||       | j                  ||f       |s<| j                  dd       t        j                         }	 t        j                  |      }	 t        j                  |      d   | _        | j                          y # t        j                  $ r t        d|z        w xY w# t        j                  $ r | j                  dd       || _        Y dw xY w)NzComputing default hostnamewarningzCould not determine IP address for hostname %s, please try setting an explicit IP address in the "port" setting of your [inet_http_server] section.  For example, instead of "port = 9001", try "port = 127.0.0.1:9001."r   zCannot do reverse lookup)r   rj   socketAF_INETSOCK_STREAMr   bindr   gethostnamegethostbynamer   
ValueErrorgethostbyaddrr   r   )r   r   rj   r   r   r   s         r   r   z'supervisor_af_inet_http_server.__init__  s   	}}V^^V-?-?@T=)		2t*MM6	B))+H ))(3	"%33R8;D
 	 <<   M 	     || 	"MM4i@!D	"s   C %C8 "C58,D'&D'N)r   r   r   r)   r   r   r   r   r   r   	  s
    5r   r   c                       e Zd ZdZd Zd Zy)supervisor_af_unix_http_serverz+ AF_UNIX version of supervisor HTTP server c           
      @   || _         || _        d|t        j                         fz  }	 t        j                  |       	 t        j                  t        j                  t        j                        }	 |j                  |       t        j                  ||       	 t        j                  ||       	 t        j                  ||d   |d          | j+                  ||       	 	 t        j                  |       d| _        | jA                          y # t
        $ r Y w xY w# t
        $ rj}|j                  d   t        j                  k(  rDd}t!        ||t#        |      t%        j&                  t        j(                               d   fz         d }~ww xY w# t
        $ r Y w xY w# t
        $ r | j-                  |      }	|	r#t        j.                  t        j0                        d|z  }t2        j4                  j7                  |       	 t        j                  |       n#  Y nxY w|j9                          t;        j<                  d       Y 	 t        j                  |       $# t
        $ r Y 0w xY ww xY w# 	 t        j                  |       w # t
        $ r Y w w xY wxY w)Nz%s.%drD   r   zNot permitted to chown %s to uid/gid %s; adjust "sockchown" value in config file or on command line to values that the current user (%s) can successfully chownzUnlinking stale socket %s
g333333?z<unix domain socket>)!r   rj   r   getpidunlinkOSErrorr  AF_UNIXr  r  chmodlinkchownargserrnoEPERMr  r   pwdgetpwuidgeteuidr   	checkusedr   
EADDRINUSEr   stderrwriterF   rf   sleepr   r   )
r   
socketname	sockchmod	sockchownr   tempnamer   whymsguseds
             r   r   z'supervisor_af_unix_http_server.__init__*  sI   	 j"))+66	IIh ==1C1CDD/		(#9-&GGHj1&"Yq\9Q<H LL}5IIh' 2o  		> # "88A;%++5$NC #-SJ48O47LL8:

5FFG5I46 .6 #/ / ""(  Q  >>*5D$ll5+;+;<< 8*DCJJ$$S)		*-JJLJJrN,IIh' QLIIh' s   D 2'I6 F# 1D I6 "F 	DD	F'A%FFI6 	F F #A#I3HI3H!*I3	I6 I" "	I/.I/2I33I6 6J8JJ	JJJJc                 4   t        j                   t         j                  t         j                        }	 |j                  |       |j	                  t        d             |j                  d       |j                          y# t         j                  $ r Y yw xY w)NzGET / HTTP/1.0

rD   TF)	r  r  r  connectsendr   recvrF   r   )r   r  r&   s      r   r  z(supervisor_af_unix_http_server.checkusedq  sp    MM&..&*<*<=	IIj!FF8456FF1IGGI  || 		s   AB BBN)r   r   r   r)   r   r  r   r   r   r  r  '  s    5EN
r   r  c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	tail_f_producerc                     t        j                  |      | _        || _        d| _        | j                          | j                         }||k\  r||z
  | _        y y r   )weakrefrefrg   filenamer   _open_fsizesz)r   rg   r/  headr2  s        r   r   ztail_f_producer.__init__~  sK    {{7+ 


[[]:4iDG r   c                 $    | j                          y r'   )_closer   s    r   __del__ztail_f_producer.__del__  s    r   c                 >   | j                          	 | j                         }|| j                  z
  }|dk  rd| _        y|dkD  rA| j
                  j                  | d       | j
                  j                  |      }|| _        |S t        S # t        t        f$ r Y yw xY w)Nr   r   z==> File truncated <==
   )	_followr1  r  r  r2  r   seekreadr   )r   newszbytes_addedr>   s       r   r"   ztail_f_producer.more  s    	KKME dggo?DG-?IINNK<+IINN;/EDGL $ 		s   B
 
BBc                     t        | j                  d      | _        t        j                  | j                  j                               t        j                     | _        d| _	        y )Nrbr   )
openr/  r   r   fstatfilenostatST_INOinor2  r6  s    r   r0  ztail_f_producer._open  sA    -	88DII,,./<r   c                 8    | j                   j                          y r'   )r   rF   r6  s    r   r5  ztail_f_producer._close  s    		r   c                     	 t        j                  | j                        t        j                     }| j                  |k7  r!| j                          | j                          y y # t        t
        f$ r Y y w xY wr'   )	r   rD  r/  rE  r  r  rF  r5  r0  )r   rF  s     r   r:  ztail_f_producer._follow  s_    	''$--(5C
 88s?KKMJJL 	 $ 		s   0A# #A54A5c                 ~    t        j                  | j                  j                               t        j
                     S r'   )r   rB  r   rC  rD  ST_SIZEr6  s    r   r1  ztail_f_producer._fsize  s'    xx		((*+DLL99r   N)
r   r   r   r   r7  r"   r0  r5  r:  r1  r   r   r   r+  r+  }  s%     $
	:r   r+  c                   &    e Zd ZdZdZd Zd Zd Zy)logtail_handlerzLogtail HTTP Request Handlerz/logtailc                     || _         y r'   supervisordr   rO  s     r   r   zlogtail_handler.__init__  
    &r   c                 L    |j                   j                  | j                        S r'   r   
startswithr   r   rg   s     r   r   zlogtail_handler.match      {{%%dii00r   c                    |j                   dk7  r|j                  d       y |j                         \  }}}}d|v rt        j                  |      }|r|d   dk(  r|dd  }|r	|d   dk(  r|j                  dd      \  }}	 |j                  dd      \  }}ddlm}	  |	|      \  }
}| j                  j                  j                  |
      }||j                  d	       y |j                  j                  |      }||j                  d	       y t        |j                  d
|z  d       }|t        j                   j#                  |      s|j                  d	       y t        j$                  |      t$        j&                     }t)        j*                  |      |d<   d|d<   d|d<   |j-                  t/        ||d             |j1                          y # t        $ r |}d}Y Kw xY w)NGETr   rp   r   ro   rD   r   )split_namespecr   z
%s_logfileLast-Modifiedtext/plain;charset=utf-8Content-TypenozX-Accel-Bufferingr   )r   r   r   r	   r   r   r  supervisor.optionsrY  rO  process_groupsr   	processesr   configr   r   existsrD  ST_MTIMEr   build_http_datepushr+  r_   )r   rg   r   r   r   r   process_name_and_channelprocess_namerS   rY  
group_namegroupprocesslogfilemtimes                  r   r   zlogtail_handler.handle_request  s   ??e#MM3(/(9(9(;%feX$;&&t,D tAw#~8D tAw#~ *.C);&&	$<$B$B3$J!L' 	6#1,#? 
L  //33J?=MM#//%%l3?MM#'..,*@$G?"''.."9
 MM# /#,#<#<U#C "< (,#$ 	_Wgt<=O  	3LG	s    G G! G!Nr   r   r   IDENTr   r   r   r   r   r   r   rL  rL    s    *ED'19r   rL  c                   &    e Zd ZdZdZd Zd Zd Zy)mainlogtail_handlerz!Main Logtail HTTP Request Handlerz/mainlogtailc                     || _         y r'   rN  rP  s     r   r   zmainlogtail_handler.__init__  rQ  r   c                 L    |j                   j                  | j                        S r'   rS  rU  s     r   r   zmainlogtail_handler.match  rV  r   c                    |j                   dk7  r|j                  d       y | j                  j                  j                  }|t
        j                  j                  |      s|j                  d       y t        j                  |      t        j                     }t        j                  |      |d<   d|d<   |j                  t        ||d             |j                          y )NrX  r   r   rZ  r[  r\  r   )r   r   rO  optionsrk  r   r   rb  rD  rc  r   rd  re  r+  r_   )r   rg   rk  rl  s       r   r   z"mainlogtail_handler.handle_request  s    ??e#MM3""**22?"''.."9 MM# /#,#<#<U#C "< 	_Wgt<=r   Nrm  r   r   r   rp  rp    s    /ED'1r   rp  c                    g }t        | j                        }| j                  D ]x  }|d   }|t        j                  k(  r|d   |d   }}t        |||      }n@|t        j                  k(  r|d   }	|d   }
|d   }t        |	|
||      }nt        d|z        d	d
l	m
} d	dl	m} d	dlm} g }| j                  D ]A  \  }}}	  ||fi |}|j%                  ||f       | j                  j'                  d|z         C |j%                  d ||      f        |||      }t)        |      }t+        |      } ||      }t,        j.                  j1                  t,        j.                  j3                  t4                    }t,        j.                  j7                  |d      }t9        j:                  |      }t=        j<                  |      }|d   }|d   }|rA||i}t?        ||      }t?        ||      }t?        ||      }t?        ||      }t?        ||      }n!| j                  jA                  d|d   z         |jC                  |       |jC                  |       |jC                  |       |jC                  |       |jC                  |       |j%                  ||f       { |S #  t        j                          }| j                  j#                  |       t        d|z        xY w)Nfamilyri   rj   )r   r   r  r  zCannot determine socket type %rr   )supervisor_xmlrpc_handler)SystemNamespaceRPCInterface)supervisor_ui_handlerzCould not make %s rpc interfacezRPC interface %r initializedsystemuiusernamepasswordz:Server %r running without any HTTP authentication checkingsection)"
LogWrapperrd   server_configsr  r  r   r  r  r  supervisor.xmlrpcrw  rx  supervisor.webry  rpcinterface_factories	traceback
format_excwarnappendr   rL  rp  r   r   abspathdirname__file__r$   r   os_filesystemr   supervisor_auth_handlercriticalinstall_handler) rt  rO  serverswrapperra  rv  ri   rj   hsr  r   r!  rw  rx  ry  subinterfacesnamefactoryr0   insttbxmlrpchandlertailhandlermaintailhandler	uihandlerheretemplatedir
filesystemdefaulthandlerr|  r}  userss                                    r   make_http_serversr    s   G(G(( A%!V^^#$D/d>EGBv~~%JwIwI/
9i>EGB >GHH?A8 ' > > 	GD'1K{0a0
   $.NN > EF	G 	h9-HJ 	K1+}M%k2-k:)+6	wwrwwx89ggll4.**;7
(88D*%*% h'E3E=IM1%EK5e_MO/yAI4UNKNNN##*,29,=>?
 	>*
9%
?+
;'
=)|$CA%F NWK))+##B' !BT!IJJs   	J""?K!c                       e Zd ZdZd Zd Zy)r  z\Receives log messages from the Medusa servers and forwards
    them to the Supervisor loggerc                     || _         y r'   r   )r   rd   s     r   r   zLogWrapper.__init__f  s	    r   c                     |j                  d      r|dd }d|j                         v r| j                  j                  |       y| j                  j	                  |       y)zMedusa servers call this method.  There is no log level so
        we have to sniff the message.  We want "Server Error" messages
        from medusa.http_server logged as errors at least.r   Nr   r   )endswithrK   rd   r   trace)r   r$  s     r   rR   zLogWrapper.logi  sM     <<cr(Cciik!KKc"KKc"r   N)r   r   r   r)   r   rR   r   r   r   r  r  c  s    %	#r   r  c                       e Zd Zd Zd Zy)encrypted_dictionary_authorizerc                     || _         y r'   )dict)r   r  s     r   r   z(encrypted_dictionary_authorizer.__init__u  s	    	r   c                     |\  }}|| j                   v rO| j                   |   }|j                  d      r*t        t        |            j	                         }|dd  |k(  S ||k(  S y)Nz{SHA}   F)r  rT  r   r   	hexdigest)r   	auth_infor|  r}  stored_passwordpassword_hashs         r   	authorizez)encrypted_dictionary_authorizer.authorizex  sl    &(tyy "ii1O))'2 $Xh%7 8 B B D&qr*m;;&(22r   N)r   r   r   r   r  r   r   r   r  r  t  s    
r   r  c                       e Zd ZddZy)r  c                 T    t        j                  | |||       t        |      | _        y r'   )r   r   r  
authorizer)r   r  handlerrealms       r   r   z supervisor_auth_handler.__init__  s"    dD'599$?r   N)default)r   r   r   r   r   r   r   r  r    s    @r   r  )-r   rD  rf   r   r  r  r-  r  r  ImportErrorgetpasssupervisor.compatr   r   r   r   r   r   r   r   r	   r
   r   r   supervisor.medusa.auth_handlerr   r   r   r+   r2   r;   http_requestrB   r   r   r   r   r  r+  rL  rp  r  r  r  r  r   r   r   <module>r     s6   	   
     % " & ' 5 ' ) ' % - 7	 	 @ ( < 8}[55 }~F[55 FP3%[44 3%j%; <T%; Tl4: 4:lC CJ   DGR# #"  @l @q  s   D0 0	D=<D=