
    vg|                        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n# e	$ r d dl
ZY nw xY w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j!                  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,dS ).    N)urllib)sha1)as_bytes)	as_string)asyncore_25)	http_date)http_server)	producers)filesys)default_handler)auth_handlerc                       e Zd ZdS )NOT_DONE_YETN)__name__
__module____qualname__     L/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/supervisor/http.pyr   r      s        Dr   r   c                        e Zd ZdZddZd ZdS )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                 0    || _         || _        d| _        d S N皙?)producerfootersdelay)selfr   r   s      r   __init__z#deferring_chunked_producer.__init__)   s     


r   c                     | j         r| j                                         }|t          u rt          S |r*dt          |          z  }t	          |          dz   |z   dz   S d | _         | j        r!d                    dg| j        z             dz   S dS dS )Nz%xs   
   0s   

s   0

r   )r   morer   lenr   r   join)r   datass      r   r"   zdeferring_chunked_producer.more.   s    = 	=%%''D|#### (3t99${{W,t3g== $< ("<<(=>>LL'<3r   Nr   r   r   __doc__r   r"   r   r   r   r   r      sA            
    r   r   c                       e Zd ZdZd Zd ZdS )deferring_composite_producerz$combine a fifo of producers into onec                 "    || _         d| _        d S r   )r
   r   )r   r
   s     r   r   z%deferring_composite_producer.__init__A   s    "


r   c                     t          | j                  rc| j        d         }|                                }|t          u rt          S |r|S | j                            d           t          | j                  cdS )Nr   r   )r#   r
   r"   r   pop)r   pds      r   r"   z!deferring_composite_producer.moreE   s|    $.!! 
	q!AAL  ## &""1%%% $.!! 
	 3r   Nr(   r   r   r   r+   r+   ?   s8        ..      r   r+   c                        e Zd ZdZddZd ZdS )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| _        d S )Nr   r   )r   bufferbuffer_sizer   )r   r   r6   s      r   r   z$deferring_globbing_producer.__init__Z   s#     &


r   c                    t          | j                  | j        k     r| j                                        }|t
          u rt
          S |rJ	 | j        |z   | _        n:# t          $ r, t          | j                  t          |          z   | _        Y nw xY wnt          | j                  | j        k     | j        }d| _        |S Nr   )r#   r5   r6   r   r"   r   	TypeErrorr   )r   r%   rs      r   r"   z deferring_globbing_producer.more`   s    $+!111=%%''D|#### I"&+"4DKK  I I I"*4;"7"7(4.."HDKKKI  $+!111 Ks   
A 3BBN)r3   r(   r   r   r   r2   r2   S   sA                r   r2   c                       e Zd ZdZd Zd ZdS )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| _        d S )Nr   r   )r   functionbytesr   )r   r   r>   s      r   r   z"deferring_hooked_producer.__init__x   s"      



r   c                     | j         rl| j                                         }|t          u rt          S |s"d | _         |                     | j                   n| xj        t          |          z  c_        |S dS r8   )r   r"   r   r>   r?   r#   )r   results     r   r"   zdeferring_hooked_producer.more~   sv    = 	]''))F%%## * $tz****

c&kk)

M3r   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dS )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                 H   t          j        t           j        | j                  }|                                }d}d}d}| j        dk    r|dk    rd| vrd}nQd| d<   nKd}nH| j        dk    r4|d	k    rd}n4d| vr&d
| v r| d
         dk    sd}n| j        r
d| d
<   d}d}nd}n	| j        d}t          j        | 	                                          }|rd	| d<   |r3t          t          | j                            }t          ||g          }n/| j                            d|           t          | j                  }t          || j                  }|rt!          |          }| j                            |           d| j        _        |r| j                                         dS dS )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,B4;OO
%%''
<5  \))'4// HH)5D&&\U""W$$%--&$.. 34	AA#$% !09D,-'($  !HH H\! H#3D4K4K4M4MNN 	)!(D 	L :0??! ! != "34! !
 M  O444 <T] K K 66G6:h@ @  	O ;<M N N''(9:::'+$ 	+L((*****	+ 	+r   c           	      &   | j         j        r%| j         j        d         }| j         j        d         }nd}d}| j         j        j                            |d||                     t          j                              | j        | j        |fz             dS )z We need to override this because UNIX domain sockets return
        an empty string for the addr rather than a (host, port) combination r   rE   	localhostz%d - - [%s] "%s" %d %d
N)	rT   addrserverloggerrS   log_date_stringtimerequest
reply_code)r   r?   hostports       r   rS   zdeferring_http_request.log   s     < 	<$Q'D<$Q'DDDD"&&*,,dikk::. 		 		 		 		 		r   c                 ^   i }dddd}t          j                    }|                                 \  }}}}|r||z   }|r$|d         dk    r|dd          }|r|d         dk    d|v rt          j        |          }|r
|dd          }| 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                            t           j                            ||d                             |d<   |r||d<   d|d<   | j        j        r| j        j        d         |d<   nd|d<   | j        D ]}	|	                    dd          \  }
}|
                                }
|                                }|
|v r|r|||                    |
          <   bdd                    |
                    d                                                    z  }
|r	|
|vr|||
<   |S )NCONTENT_LENGTHCONTENT_TYPECONNECTION_TYPE)zcontent-lengthzcontent-typerZ   r   /rE   %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	   unquoterT   rd   commandupperstrrk   server_nameSERVER_IDENTrM   creation_timepathnormpathr$   rc   rK   splitrL   stripget)r   env
header2envworkdirr   paramsqueryfragmentrd   rK   keyvalues               r   cgi_environmentz&deferring_http_request.cgi_environment   s    ,<+9+<> >
 )++*...*:*:'vuh 	!&=D 	tAw#~~8D  	tAw#~~$;;&t,,D 	!""IE$ $ 2 2 4 4 --M#/M!'!4!(4<!7'+|'A#$M:K!#!1!1"',,[)3+ 3+ ", ", 	("'C#, < 	-!%!21!5C!,Ck 		# 		#Fll3q))IC		C++--Ej  U ).JNN3''((#))S//!:!: A A C CC #S^^"CH
r   c                    ddd}|                                  }|                    d          dv s|                    d          dk    rd}nd	}d
|v r2|d
                                         }t          j        |          \  }}n"|d                                         }|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_HOSTrt   rs   Nr~   z://rp   )r   r   r   r   	splitport)r   default_portenvironprotocolrj   hostnamerk   
server_urls           r   get_server_urlz%deferring_http_request.get_server_url/  s    #U33&&((KK  L00KK,--44HHH'!!;'--//D#-d33NHdd}-3355H=)D<<1T99DDc>D(D"*((DD1
bcc?C!#2#Jr   N)r   r   r   r)   r`   rS   r   r   r   r   r   rC   rC      sa        F F
Q+ Q+ Q+f  (3 3 3j    r   rC   c                   .    e Zd ZdZdZdZddZd Zd ZdS )deferring_http_channeli   r   Nc                     |t          j                     }| j        r&|| j        z
  }|| j        k    s|dk     r	|| _        dS dS t          j                            |           S )Nr   TF)rg   r   last_writable_checkr	   http_channelwritable)r   nowelapseds      r   r   zdeferring_http_channel.writableU  sg    ;)++C: 	D44G$*$$'A+++.(tu'00666r   c                    	 t          | j                  r| j                                        }|6| j        s-| j                                         |                                  dS t          |t                    r+| j                                         | xj        |z  c_        dS |                                }|t          u r|j
        | _
        dS |r| j        |z   | _        d| _
        dS | j                                         ndS )z Implement deferreds rE   NF)r#   producer_fifofirstac_out_bufferr.   rG   
isinstancer?   r"   r   r   )r   r/   r%   s      r   refill_bufferz$deferring_http_channel.refill_bufferd  s   	4%&& &,,.. 9- %*..000

F5)) &**,,,&&!+&&Fvvxx<''!"DJF -)-);d)BD&!&DJF&**,,,,9	r   c                    | j         r| j                                          dS t          | j                  }d| _        |                    d          }|r|d         s|dd         }|r|d         |s|                                  dS |d         }t          j        |          \  }}}t          j        |dd                   }t          j	        |          \  }}d|v r1|rt          j
        |          dz   |z   }nt          j
        |          }t          | |||||          }	| j                                         | j        j                                         |=|                     dt#          |          z  d	           |	                    d
           dS | j        j        D ]}
|
                    |	          r	 |	| _         |
                    |	           n#  | j        j                                         t/          j                    \  \  }}}}}}| j                            d|d|d|d|d	           	 |	                    d           n#  Y nxY wY nxY w dS |	                    d           dS )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   rE   Nrq   ?zBad HTTP request: %serror  zServer Error: z, z: file: z line: i    )rV   found_terminatorr   	in_bufferr   rW   r	   crack_requestjoin_headers
splitqueryr   rC   request_counter	incrementrd   total_requestslog_inforeprr   handlersmatchhandle_request
exceptionsasyncorecompact_traceback)r   rK   linesrh   r   urirM   rpathrqueryr:   hfilefunlinetvtbinfos                    r   r   z'deferring_http_channel.found_terminator  s     J	 1133333
 t~..F DNLL((E  "a "
 abb	  "a "  $$&&&AhG$/$=w$G$G!GS' -uQRRy99F (2377ME6e|| 5%-e44s:VCCC%-e44C&tWgsG'-/ /A **,,,K&002225WEwOOO
 [)  77A;; !/0, ((!,,,,!.88:::'9;; 8)sD1a,,,QQqqqdd,#% % %!GGSMMMM! DFF%* GGSMMMMMs%   ?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 7 7 7  @N N N N Nr   r   c                   *    e Zd ZeZdZd Zd ZddZdS )supervisor_http_serverNc                 T   ddl m} |s|                    t          j                  }|                    |          }|| _        t          j                            |            | 	                    |           g | _
        |                    d           |                                  dS )zj Override __init__ to do logger setup earlier so it can
        go to our logger object instead of stdout r   re   N)supervisor.medusare   file_loggersysstdoutunresolving_loggerr   
dispatcherr   
set_socketr   setblockingset_reuse_addr)r   socklogger_objectre   s       r   prebindzsupervisor_http_server.prebind  s     	-,,,,, 	;"..sz::M11-@@#$$d+++r   c                 |   ddl m} ddlm} |                     d            |            | _         |            | _         |            | _         |            | _         |            | _	        | 
                    d|dt          j        t          j                              d| j        d| j        d		           d S )
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   rg   ctimer   rk   )r   r   r   s      r   postbindzsupervisor_http_server.postbind  s    555555@@@@@@D$WYY%gii!'))  
 '
49;;////(((			
	 
	 
	 
	 
	r   infoc                 p    d}t          | dd           | j        }| j                            ||           d S )Nrw   ip)getattrr   re   rS   )r   messagetyper   s       r   r   zsupervisor_http_server.log_info  s<    4t$$0BG$$$$$r   )r   )	r   r   r   r   channel_classr   r   r   r   r   r   r   r   r     sP        *M	B  &  0% % % % % %r   r   c                       e Zd ZdZd ZdS )supervisor_af_inet_http_serverz+ AF_INET version of supervisor HTTP server c                 h   || _         || _        t          j        t          j        t          j                  }|                     ||           |                     ||f           |sd|                     dd           t          j                    }	 t          j	        |          }n%# t          j
        $ r t          d|z            w xY w	 t          j        |          d         | _        n2# t          j
        $ r  |                     dd           || _        Y nw xY w|                                  d S )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   rk   socketAF_INETSOCK_STREAMr   bindr   gethostnamegethostbynamer   
ValueErrorgethostbyaddrr   r   )r   r   rk   r   r   r   s         r   r   z'supervisor_af_inet_http_server.__init__  sD   	}V^V-?@@T=)))		2t* 	 MM6	BBB)++H )(33<       M 	      	"%3R88;D| 	" 	" 	"MM4i@@@!D	" 	s   B& &"CC, ,,DDN)r   r   r   r)   r   r   r   r   r   r   	  s)        55    r   r   c                       e Zd ZdZd Zd ZdS )supervisor_af_unix_http_serverz+ AF_UNIX version of supervisor HTTP server c           
      d   || _         || _        d|t          j                    fz  }	 t          j        |           n# t
          $ r Y nw xY w	 t          j        t          j        t          j                  }	 |	                    |           t          j
        ||           	 t          j        ||           	 t          j        ||d         |d                    n{# t
          $ rn}|j        d         t          j        k    rMd}t!          ||t#          |          t%          j        t          j                              d         fz             d }~ww xY w|                     ||           	 	 t          j        |           n# t
          $ r Y nw xY w# t
          $ r |                     |          }	|	rt          j        t          j                  d|z  }t2          j                            |           	 t          j        |           n#  Y nxY w|                                 t;          j        d           Y 	 t          j        |           	# t
          $ r Y w xY ww xY w# 	 t          j        |           w # t
          $ r Y w w xY wxY wd| _        |                                   d S )Nz%s.%drE   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   rk   r   getpidunlinkOSErrorr  AF_UNIXr  r  chmodlinkchownargserrnoEPERMr	  r   pwdgetpwuidgeteuidr   	checkusedr   
EADDRINUSEr   stderrwriterG   rg   sleepr   r   )
r   
socketname	sockchmod	sockchownr   tempnamer   whymsguseds
             r   r   z'supervisor_af_unix_http_server.__init__*  s   	 j")++66	Ih 	 	 	D	1	=1CDDD/		(###9---&GHj111&"Yq\9Q<HHHH" " " "8A;%+55$NC #-SJ48OO47L8:
5F 5FFG5I46 .6 #/ #/ / "" LL}555Ih''''   DQ    >>*55D =$l5+;<<< 8*DCJ$$S)))	*----JJLLLJrNNN,Ih''''   DQLIh''''   D 2s   = 
A
	A
8*I+ #F 9"C I+ 
E&A)EEI+ /F 
FFA#I(:HI(H-I(>I+  I 
I$#I$'I((I+ +J-JJ
JJJJc                 F   t          j         t           j        t           j                  }	 |                    |           |                    t          d                     |                    d           |                                 dS # t           j        $ r Y dS w xY w)NzGET / HTTP/1.0

rE   TF)	r  r  r  connectsendr   recvrG   r   )r   r   r&   s      r   r  z(supervisor_af_unix_http_server.checkusedq  s    M&.&*<==	IIj!!!FF8455666FF1IIIGGIII 4 | 	 	 	55	s   A B B B N)r   r   r   r)   r   r  r   r   r   r  r  '  s<        55E E EN
 
 
 
 
r   r  c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	tail_f_producerc                     t          j        |          | _        || _        d| _        |                                  |                                 }||k    r||z
  | _        d S d S r   )weakrefrefrh   filenamer   _open_fsizesz)r   rh   r0  headr3  s        r   r   ztail_f_producer.__init__~  sZ    {7++ 


[[]]::4iDGGG :r   c                 .    |                                   d S r'   )_closer   s    r   __del__ztail_f_producer.__del__  s    r   c                 P   |                                   	 |                                 }n# t          t          f$ r Y dS w xY w|| j        z
  }|dk     r	d| _        dS |dk    r?| j                            | d           | j                            |          }|| _        |S t          S )Nr   r   z==> File truncated <==
   )	_followr2  r  r	  r3  r   seekreadr   )r   newszbytes_addedr?   s       r   r"   ztail_f_producer.more  s    	KKMMEE$ 	 	 	33	 dgo??DG--??INNK<+++INN;//EDGLs   + A A c                     t          | j        d          | _        t          j        | j                                                  t          j                 | _        d| _	        d S )Nrbr   )
openr0  r   r   fstatfilenostatST_INOinor3  r7  s    r   r1  ztail_f_producer._open  sF    --	8DI,,..//<r   c                 8    | j                                          d S r'   )r   rG   r7  s    r   r6  ztail_f_producer._close  s    	r   c                     	 t          j        | j                  t          j                 }n# t          t
          f$ r Y d S w xY w| j        |k    r*|                                  |                                  d S d S r'   )	r   rE  r0  rF  r  r	  rG  r6  r1  )r   rG  s     r   r;  ztail_f_producer._follow  sz    	'$-((5CC$ 	 	 	FF	 8s??KKMMMJJLLLLL ?s   ), A Ac                 x    t          j        | j                                                  t          j                 S r'   )r   rC  r   rD  rE  ST_SIZEr7  s    r   r2  ztail_f_producer._fsize  s'    x	((**++DL99r   N)
r   r   r   r   r8  r"   r1  r6  r;  r2  r   r   r   r,  r,  }  s}                 $  
  	 	 	: : : : :r   r,  c                   (    e Zd ZdZdZd Zd Zd ZdS )logtail_handlerzLogtail HTTP Request Handlerz/logtailc                     || _         d S r'   supervisordr   rP  s     r   r   zlogtail_handler.__init__      &r   c                 @    |j                             | j                  S r'   r   
startswithr   r   rh   s     r   r   zlogtail_handler.match      {%%di000r   c                 "   |j         dk    r|                    d           d S |                                \  }}}}d|v rt          j        |          }|r$|d         dk    r|dd          }|r|d         dk    |                    dd          \  }}	 |                    dd          \  }}n# t          $ r |}d}Y nw xY wddlm}	  |	|          \  }
}| j	        j
                            |
          }||                    d	           d S |j                            |          }||                    d	           d S t          |j        d
|z  d           }|t          j                            |          s|                    d	           d S t          j        |          t$          j                 }t)          j        |          |d<   d|d<   d|d<   |                    t/          ||d                     |                                 d S )NGETr   rq   r   rp   rE   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.optionsrZ  rP  process_groupsr   	processesr   configr   r   existsrE  ST_MTIMEr   build_http_datepushr,  r`   )r   rh   r   r   r   r   process_name_and_channelprocess_namerT   rZ  
group_namegroupprocesslogfilemtimes                  r   r   zlogtail_handler.handle_request  s@   ?e##MM3F(/(9(9(;(;%feX$;;&t,,D  	tAw#~~8D  	tAw#~~ *.C););&&	$<$B$B3$J$J!L'' 	 	 	3LGGG	
 	655555#1>,#?#? 
L /33J??=MM#F/%%l33?MM#F'.,*@$GG?"'.."9"9?
 MM#F  /#,#<U#C#C "< (,#$ 	_Wgt<<===s   B. .B?>B?Nr   r   r   IDENTr   r   r   r   r   r   r   rM  rM    sK        *ED' ' '1 1 19 9 9 9 9r   rM  c                   (    e Zd ZdZdZd Zd Zd ZdS )mainlogtail_handlerz!Main Logtail HTTP Request Handlerz/mainlogtailc                     || _         d S r'   rO  rQ  s     r   r   zmainlogtail_handler.__init__  rR  r   c                 @    |j                             | j                  S r'   rT  rV  s     r   r   zmainlogtail_handler.match  rW  r   c                    |j         dk    r|                    d           d S | j        j        j        }|t
          j                            |          s|                    d           d S t          j        |          t          j	                 }t          j        |          |d<   d|d<   |                    t          ||d                     |                                 d S )NrY  r   r   r[  r\  r]  r   )r   r   rP  optionsrl  r   r   rc  rE  rd  r   re  rf  r,  r`   )r   rh   rl  rm  s       r   r   z"mainlogtail_handler.handle_request  s    ?e##MM3F"*2?"'.."9"9? MM#F  /#,#<U#C#C "< 	_Wgt<<===r   Nrn  r   r   r   rq  rq    sK        /ED' ' '1 1 1    r   rq  c                 v   g }t          | j                  }| j        D ]}|d         }|t          j        k    r#|d         |d         }}t          |||          }nN|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 ]\  }}}	  ||fi |}nD#  t          j                    }| j                            |           t          d|z            xY w|                    ||f           | j                            d|z             |                    d ||          f            |||          }t)          |          }t+          |          } ||          }t,          j                            t,          j                            t4                              }t,          j                            |d          }t9          j        |          }t=          j        |          }|d         }|d         }|rU||i}t?          ||          }t?          ||          }t?          ||          }t?          ||          }t?          ||          }n#| j                             d|d         z             |!                    |           |!                    |           |!                    |           |!                    |           |!                    |           |                    ||f           |S )Nfamilyrj   rk   )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)"
LogWrapperre   server_configsr  r  r   r  r  r	  supervisor.xmlrpcrx  ry  supervisor.webrz  rpcinterface_factories	traceback
format_excwarnappendr   rM  rq  r   r   abspathdirname__file__r$   r   os_filesystemr   supervisor_auth_handlercriticalinstall_handler) ru  rP  serverswrapperrb  rw  rj   rk   hsr   r!  r"  rx  ry  rz  subinterfacesnamefactoryr0   insttbxmlrpchandlertailhandlermaintailhandler	uihandlerheretemplatedir
filesystemdefaulthandlerr}  r~  userss                                    r   make_http_serversr    s   G((G( A% A%!V^##$D/d>EG G GBBv~%%JwIwI/
9i>EG G GBB >GHHH??????AAAAAA888888 ' > 	G 	GD'1Kw{00a00K)++##B''' !BT!IJJJ  $...N > EFFFFh99-HHJ 	K 	K 	K11+}MM%k22-k::))+66	wrwx8899gll4..*;77
(8DD*%*% 	? h'E3E=IIM1%EEK5e_MMO/yAAI4UNKKNNN##*,29,=>? ? ?
 	>***
9%%%
?+++
;'''
=)))|$$$$Ns   	CADc                       e Zd ZdZd Zd ZdS )r  z\Receives log messages from the Medusa servers and forwards
    them to the Supervisor loggerc                     || _         d S r'   r   )r   re   s     r   r   zLogWrapper.__init__f  s    r   c                     |                     d          r
|dd         }d|                                v r| j                            |           dS | j                            |           dS )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   )endswithrL   re   r   trace)r   r%  s     r   rS   zLogWrapper.logi  sp     << 	crc(Cciikk!!Kc"""""Kc"""""r   N)r   r   r   r)   r   rS   r   r   r   r  r  c  s<        % %  	# 	# 	# 	# 	#r   r  c                       e Zd Zd Zd ZdS )encrypted_dictionary_authorizerc                     || _         d S r'   )dict)r   r  s     r   r   z(encrypted_dictionary_authorizer.__init__u  s    			r   c                     |\  }}|| j         v rd| j         |         }|                    d          r<t          t          |                                                    }|dd          |k    S ||k    S dS )Nz{SHA}   F)r  rU  r   r   	hexdigest)r   	auth_infor}  r~  stored_passwordpassword_hashs         r   	authorizez)encrypted_dictionary_authorizer.authorizex  s    &(ty  "i1O))'22 3 $Xh%7%7 8 8 B B D D&qrr*m;;&(225r   N)r   r   r   r   r  r   r   r   r  r  t  s2          
 
 
 
 
r   r  c                       e Zd ZddZdS )r  defaultc                 \    t          j        | |||           t          |          | _        d S r'   )r   r   r  
authorizer)r   r  handlerrealms       r   r   z supervisor_auth_handler.__init__  s,    dD'59999$??r   N)r  )r   r   r   r   r   r   r   r  r    s.        @ @ @ @ @ @r   r  )-r   rE  rg   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_requestrC   r   r   r   r   r  r,  rM  rq  r  r  r  r  r   r   r   <module>r     s;   				   



       JJJJ    % $ $ $ $ $ " " " " " " & & & & & & ' ' ' ' ' ' 5 5 5 5 5 5 ' ' ' ' ' ' ) ) ) ) ) ) ' ' ' ' ' ' % % % % % % - - - - - - 7 7 7 7 7 7	 	 	 	 	 	 	 	       @       (       <       8} } } } }[5 } } }~F F F F F[5 F F FP3% 3% 3% 3% 3%[4 3% 3% 3%j    %;   <T T T T T%; T T Tl4: 4: 4: 4: 4: 4: 4: 4:lC C C C C C C CJ               DG G GR# # # # # # # #"        @ @ @ @ @l @ @ @ @ @s   ' 	33