o
    r¨Êhš  ã                   @   sŠ  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dlm
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlm Z  ej!G dd„ de"ƒƒZ#G dd„ de#ƒZ$ej!G dd„ de"ƒƒZ%G dd„ de%ƒZ&G dd„ de&ƒZ'G dd„ de%ƒZ(G dd„ de"ƒZ)e)ƒ Z)d d!„ Z*dS )"é    N)Úmaxint)Úas_bytes)Ú	as_string)ÚPY2)Úasyncore_25)ÚProcessStates)ÚSupervisorStates)ÚgetProcessStateDescription)ÚSTOPPED_STATES)Údecode_wait_status)Úsigname)ÚProcessExceptionÚ
BadCommand)ÚEventListenerStates)Úevents)ÚRestartUnconditionally)ÚSocketManagerc                   @   sn  e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZdZdZdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Zejejej ej!ej"ej#ej$ej%ej&ej'ej(ej)ej*ej+ej,ej-iZ.d:dd„Z/dd„ Z0dd„ Z1dd„ Z2dd„ Z3dd„ Z4dd„ Z5d d!„ Z6d"d#„ Z7d$d%„ Z8d&d'„ Z9d(d)„ Z:d*d+„ Z;d,d-„ Z<d.d/„ Z=d0d1„ Z>d2d3„ Z?d4d5„ Z@d6d7„ ZAd8d9„ ZBdS );Ú
SubprocesszA class to manage a subprocess.r   NFc                 C   s   || _ i | _i | _tj| _dS )zDConstructor.

        Argument is a ProcessConfig instance.
        N)ÚconfigÚdispatchersÚpipesr   ÚSTOPPEDÚstate©Úselfr   © r   úD/var/www/html/env/lib/python3.10/site-packages/supervisor/process.pyÚ__init__;   s   zSubprocess.__init__c                 C   ó&   | j  ¡ D ]}t|dƒr| ¡  qd S )NÚ
removelogs)r   ÚvaluesÚhasattrr   ©r   Ú
dispatcherr   r   r   r   E   ó
   
€þzSubprocess.removelogsc                 C   r   )NÚ
reopenlogs)r   r    r!   r%   r"   r   r   r   r%   J   r$   zSubprocess.reopenlogsc                 C   s4   | j  ¡ D ]}| ¡ r| ¡  | ¡ r| ¡  qd S ©N)r   r    ÚreadableÚhandle_read_eventÚwritableÚhandle_write_eventr"   r   r   r   ÚdrainO   s   €øzSubprocess.drainc                 C   sl   | j r| jrttjdƒ‚| jd }|d u rttjdƒ‚| j| }|jr)ttjdƒ‚| j|7  _| 	¡  d S )NzProcess already closedÚstdinzProcess has no stdin channelz Process' stdin channel is closed)
ÚpidÚkillingÚOSErrorÚerrnoÚEPIPEr   r   ÚclosedÚinput_bufferÚflush)r   ÚcharsÚstdin_fdr#   r   r   r   ÚwriteZ   s   

zSubprocess.writec           	   
   C   s  z	t  | jj¡}W n ty! } ztd| jjt|ƒf ƒ‚d}~ww |r)|d }ntdƒ‚d|v rH|}z	| jj |¡}W n< t	yG   d}Y n2w | j 
¡ }d}d}|D ]}tj ||¡}z	| jj |¡}W n	 t	yn   Y qSw  |du rw|}n|}| jj |||¡ ||fS )z”Internal: turn a program name into a file name, using $PATH,
        make sure it exists / is executable, raising a ProcessException
        if not zcan't parse command %r: %sNr   zcommand is emptyú/)ÚshlexÚsplitr   ÚcommandÚ
ValueErrorr   ÚstrÚoptionsÚstatr/   Úget_pathÚosÚpathÚjoinÚcheck_execv_args)	r   ÚcommandargsÚeÚprogramÚfilenameÚstrB   ÚfoundÚdirr   r   r   Úget_execv_argsi   sD   ÿ€ÿ
ÿ
ÿzSubprocess.get_execv_argsTc                 C   sv   | j }||u r	dS || _ |tjkr"t ¡ }|  jd7  _|| j | _| j |¡}|d ur9|| ||ƒ}t 	|¡ d S d S )NFé   )
r   r   ÚBACKOFFÚtimeÚbackoffÚdelayÚ	event_mapÚgetr   Únotify)r   Ú	new_stateÚexpectedÚ	old_stateÚnowÚevent_classÚeventr   r   r   Úchange_state¢   s   
þzSubprocess.change_statec                 G   sF   | j |vr!t| j ƒ}d tt|ƒ¡}t| jjƒ}td|||f ƒ‚d S )Nú z%Assertion failed for %s: %s not in %s)r   r	   rC   Úmapr   r   ÚnameÚAssertionError)r   ÚstatesÚcurrent_stateÚallowable_statesÚprocessnamer   r   r   Ú_assertInState³   s   

ÿüzSubprocess._assertInStatec                 C   s   || _ | jjj d| ¡ d S )Nzspawnerr: %s)Úspawnerrr   r>   ÚloggerÚinfo©r   Úmsgr   r   r   Úrecord_spawnerr»   s   zSubprocess.record_spawnerrc           
   
   C   s<  | j j}t| j jƒ}| jrd| }|j |¡ dS d| _d| _d| _	d| _
d| _t ¡ | _|  tjtjtjtj¡ |  tj¡ z|  ¡ \}}W n' tyn } z|  |jd ¡ |  tj¡ |  tj¡ W Y d}~dS d}~ww z| j  | ¡\| _| _W n@ ttfy» } z2|jd }|tj kr”d| }nd|tj! "||¡f }|  |¡ |  tj¡ |  tj¡ W Y d}~dS d}~ww z| #¡ }	W nK t�y } z>|jd }|tj$krÚd| }nd|tj! "||¡f }|  |¡ |  tj¡ |  tj¡ | %| j¡ | &| j¡ W Y d}~dS d}~ww |	dk�r|  '|	¡S |  (||¡S )	z‡Start the subprocess.  It must not be running already.

        Return the process id.  If the fork() call fails, return None.
        zprocess '%s' already runningNFr   z!too many open files to spawn '%s'z-unknown error making dispatchers for '%s': %sz1Too many processes in process table to spawn '%s'z&unknown error during fork for '%s': %s))r   r>   r   r^   r-   rf   Úwarnr.   re   Ú
exitstatusÚsystem_stopÚadministrative_stoprO   Ú	laststartrd   r   ÚEXITEDÚFATALrN   r   r[   ÚSTARTINGrL   r   rj   ÚargsÚmake_dispatchersr   r   r/   ÚIOErrorr0   ÚEMFILEÚ	errorcoderS   ÚforkÚEAGAINÚclose_parent_pipesÚclose_child_pipesÚ_spawn_as_parentÚ_spawn_as_child)
r   r>   rc   ri   rH   ÚargvÚwhatÚwhyÚcoder-   r   r   r   Úspawn¿   s|   
ÿ€ü


ÿ
€õ

ÿÿ
€ò

zSubprocess.spawnc                 C   s\   || _ | jj}| | j¡ |j dt| jjƒ|f ¡ d | _	t
 
¡ | jj | _| |j|< |S )Nzspawned: '%s' with pid %s)r-   r   r>   r{   r   rf   rg   r   r^   re   rO   Ú	startsecsrQ   Ú
pidhistory)r   r-   r>   r   r   r   r|     s   
zSubprocess._spawn_as_parentc                 C   sz   | j j}| | jd d¡ | | jd d¡ | j jr$| | jd d¡ n	| | jd d¡ td|jƒD ]}| |¡ q3d S )NÚchild_stdinr   Úchild_stdoutrM   é   Úchild_stderré   )r   r>   Údup2r   Úredirect_stderrÚrangeÚminfdsÚclose_fd)r   r>   Úir   r   r   Ú_prepare_child_fds  s   ÿzSubprocess._prepare_child_fdsc              
   C   s®  | j j}�zE| ¡  |  ¡  |  ¡ }|r4| j j}d||f }| dd| ¡ W | dd¡ | d¡ d S tj	 
¡ }d|d< | j j}|d u rJ| j jj}|rP||d< | j j|d	< | jr`| jj j|d
< | j jd urm| | j j¡ | j j}	z|	d ur{| |	¡ W n: ty¶ }
 z.tj |
jd |
jd ¡}d|	|f }| dd| ¡ W Y d }
~
W | dd¡ | d¡ d S d }
~
ww z| j jd urÅ| | j j¡ | |||¡ W na tyü }
 z#tj |
jd |
jd ¡}d|d |f }| dd| ¡ W Y d }
~
nEd }
~
w   t ¡ \\}}}}}}d||||f }d||f }| dd| ¡ Y W | dd¡ | d¡ d S W | dd¡ | d¡ d S W | dd¡ | d¡ d S | dd¡ | d¡ w )Nzcouldn't setuid to %s: %s
r‡   zsupervisor: z*supervisor: child process was not spawned
é   Ú1ÚSUPERVISOR_ENABLEDÚSUPERVISOR_SERVER_URLÚSUPERVISOR_PROCESS_NAMEÚSUPERVISOR_GROUP_NAMEr   zcouldn't chdir to %s: %s
zcouldn't exec %s: %s
z%s, %s: file: %s line: %s)r   r>   Úsetpgrpr�   Úset_uidÚuidr7   Ú_exitrA   ÚenvironÚcopyÚ	serverurlr^   ÚgroupÚenvironmentÚupdateÚ	directoryÚchdirr/   r0   rw   rS   rs   ÚumaskÚsetumaskÚexecveÚasyncoreÚcompact_traceback)r   rH   r~   r>   Ú
setuid_msgr™   ri   Úenvr�   Úcwdr€   r�   ÚfileÚfunÚlineÚtÚvÚtbinfoÚerrorr   r   r   r}     s|   	.
Ô

€€æ€ðôÿzSubprocess._spawn_as_childc                 C   s(  | j tjkr)|| jk r|| _| jdkr%|| j| jj k r'|| jj | _dS dS dS | j tjkrJ|| jkrF|| j| jj k rH|| jj | _dS dS dS | j tjkrs|| j	k rX|| _	| jdkro|| j| jj
 k rq|| jj
 | _dS dS dS | j tjkrŽ| jdkr�|| j| j k r’|| j | _dS dS dS dS )z‚
        Check if system clock has rolled backward beyond test_time. If so, set
        affected timestamps to test_time.
        r   N)r   r   rr   ro   rQ   r   rƒ   ÚRUNNINGÚSTOPPINGÚlaststopreportÚstopwaitsecsrN   rP   )r   Ú	test_timer   r   r   Ú+_check_and_adjust_for_system_clock_rollbacke  s*   
ÿÿ
ÿþz6Subprocess._check_and_adjust_for_system_clock_rollbackc                 C   s   d| _ d| _|  | jj¡S )z Administrative stop Tr   )rn   r´   Úkillr   Ú
stopsignal©r   r   r   r   Ústop{  s   zSubprocess.stopc                 C   sZ   | j tjkr)t ¡ }|  |¡ || jd kr+| jjj 	dt
| jjƒ ¡ || _dS dS dS )z8 Log a 'waiting for x to stop' message with throttling. r‡   zwaiting for %s to stopN)r   r   r³   rO   r·   r´   r   r>   rf   rg   r   r^   )r   rX   r   r   r   Ústop_report�  s   

ÿ
øzSubprocess.stop_reportc                 C   s.   d| _ d| _d| _|  tj¡ |  tj¡ d S )Nr   T)rQ   rP   rm   rd   r   rN   r[   rq   rº   r   r   r   Úgive_up�  s
   zSubprocess.give_upc              
   C   s¸  t   ¡ }| jj}t| jjƒ}| jtjkr&d| }|j 	|¡ |  
tj¡ dS | js9d|t|ƒf }|j 	|¡ |S | jtjkrD| jj}n| jj}d}|rNd}|j 	d|| j|t|ƒf ¡ d| _|| jj | _|  tjtjtj¡ |  
tj¡ | j}|r€| j }z6z
| ||¡ W W dS  ty¶ }	 z|	jtjkr±d|| jt|	ƒf }|j 	|¡ W Y d}	~	W dS ‚ d}	~	ww    t ¡ }
d	|| j|
f }|j |¡ |  
tj¡ d
| _d| _| Y S )a  Send a signal to the subprocess with the intention to kill
        it (to make it exit).  This may or may not actually kill it.

        Return None if the signal was sent, or an error message string
        if an error occurred or if the subprocess is not running.
        z0Attempted to kill %s, which is in BACKOFF state.Nz6attempted to kill %s with sig %s but it wasn't runningÚ zprocess group z$killing %s (pid %s) %swith signal %sTzDunable to signal %s (pid %s), it probably just exited on its own: %sz"unknown problem killing %s (%s):%sFr   ) rO   r   r>   r   r^   r   r   rN   rf   Údebugr[   r   r-   r   r³   ÚkillasgroupÚstopasgroupr.   rµ   rQ   rd   r²   rr   r¸   r/   r0   ÚESRCHr=   Ú	tracebackÚ
format_excÚcriticalÚUNKNOWN)r   ÚsigrX   r>   rc   ri   rÀ   Úas_groupr-   ÚexcÚtbr   r   r   r¸   ”  s~   ÿ
ÿ
ýÿþíÿ€ø	ÿzSubprocess.killc              
   C   s  | j j}t| j jƒ}| jsd|t|ƒf }|j |¡ |S |j d|| jt|ƒf ¡ |  t	j
t	jt	j¡ z7z| | j|¡ W W dS  tyl } z|jtjkrgd|| jt|ƒf }|j |¡ W Y d}~W dS ‚ d}~ww    t ¡ }d|| j|f }|j |¡ |  t	j¡ | Y S )zÑSend a signal to the subprocess, without intending to kill it.

        Return None if the signal was sent, or an error message string
        if an error occurred or if the subprocess is not running.
        z1attempted to send %s sig %s but it wasn't runningzsending %s (pid %s) sig %szHunable to signal %s (pid %s), it probably just now exited on its own: %sNz&unknown problem sending sig %s (%s):%s)r   r>   r   r^   r-   r   rf   r¿   rd   r   r²   rr   r³   r¸   r/   r0   rÂ   r=   rÃ   rÄ   rÅ   r[   rÆ   )r   rÇ   r>   rc   ri   rÉ   rÊ   r   r   r   Úsignalé  sT   
ÿþÿþîÿÿ€÷
ÿzSubprocess.signalc           	      C   s$  |   ¡  t|ƒ\}}t ¡ }|  |¡ || _t| jjƒ}|| jkr+|| j | jj	k }nd}| jj
j d|| jf ¡ || jjv }| jrrd| _d| _|| _d||f }|  tj¡ |  tj¡ |ri| jj
j |¡ n�| jj
j |¡ nx|r—d| _d| _d||d f }|  tj¡ |  tj¡ | jj
j |¡ nSd| _d| _|| _| jtjkr¬|  tj¡ |  tj¡ |rÍd||d	 f }| jtjd
d� | jj
j |¡ nd| | _d||d f }| jtjdd� | jj
j |¡ d| _| jj
 | j ¡ i | _ i | _!| j"du�rt# $t# %| | j"¡¡ d| _"dS dS )zK The process was reaped and we need to report and manage its state
        Fz‚process '%s' (%s) laststart time is in the future, don't know how long process was running so assuming it did not exit too quicklyr   zstopped: %s (%s)Nz1Exited too quickly (process log may have details)zexited: %s (%s)z; not expectedz
; expectedT)rV   zBad exit code %s)&r+   r   rO   r·   Úlaststopr   r   r^   ro   rƒ   r>   rf   rk   r-   Ú	exitcodesr.   rQ   rl   rd   r   r³   r[   r   rg   re   rr   rN   rP   r   r²   rp   rz   r   r   rZ   r   rT   ÚEventRejectedEvent)	r   r-   ÚstsÚesri   rX   rc   Útoo_quicklyÚexit_expectedr   r   r   Úfinish  sl   


þÿ

üzSubprocess.finishc                 C   s&   | j jd u rd S | j j | j j¡}|S r&   )r   r™   r>   Údrop_privilegesrh   r   r   r   r˜   u  s   zSubprocess.set_uidc                 C   ó   | j j|j jk S r&   ©r   Úpriority©r   Úotherr   r   r   Ú__lt__{  ó   zSubprocess.__lt__c                 C   ó   | j j|j jkS r&   rÖ   rØ   r   r   r   Ú__eq__~  s   zSubprocess.__eq__c                 C   s4   | j j}trt|ƒ d¡}dt| ƒ|t|  ¡ ƒf S )Núunicode-escapez+<Subprocess at %s with name %s in state %s>)r   r^   r   r   ÚencodeÚidr	   Ú	get_state©r   r^   r   r   r   Ú__repr__‚  s   
ýzSubprocess.__repr__c                 C   s   | j S r&   )r   rº   r   r   r   rá   �  s   zSubprocess.get_statec                 C   s´  t   ¡ }| j}|  |¡ | jjj}| jjjtjkr_|t	j
kr9| jjr8| jjtu r-|  ¡  n2| j| jjvr8|  ¡  n&|t	jkrJ| jsJ| jjrI|  ¡  n|t	jkr_| j| jjkr_|| jkr_|  ¡  t| jjƒ}|t	jkr”|| j | jjkr”d| _d| _|  t	j¡ |  t	j¡ d| jj }| d||f ¡ |t	jkr³| j| jjkr±|  ¡  d}| d||f ¡ d S d S |t	j krÖ| j| }|dkrØ| jjj !d|| j"f ¡ |  #t$j%¡ d S d S d S )Nr   zNentered RUNNING state, process has stayed up for > than %s seconds (startsecs)zsuccess: %s %sz7entered FATAL state, too many start retries too quicklyzgave up: %s %szkilling '%s' (%s) with SIGKILL)&rO   r   r·   r   r>   rf   Úmoodr   Ú
RESTARTINGr   rp   Úautorestartr   r‚   rl   rÍ   r   ro   Ú	autostartrN   rP   ÚstartretriesrQ   r   r^   rr   rƒ   rd   r[   r²   rg   r½   r³   rk   r-   r¸   rË   ÚSIGKILL)r   rX   r   rf   rc   ri   Ú	time_leftr   r   r   Ú
transition�  sb   



€€


ÿÿ
ú


ÿÿ÷zSubprocess.transition)T)CÚ__name__Ú
__module__Ú__qualname__Ú__doc__r-   r   r   Úlistener_staterZ   ro   rÌ   r´   rQ   rn   rm   r.   rP   r   r   rl   re   rž   r   r   r%   r+   r7   rL   r   rN   r   ÚProcessStateBackoffEventrq   ÚProcessStateFatalEventrÆ   ÚProcessStateUnknownEventr   ÚProcessStateStoppedEventrp   ÚProcessStateExitedEventr²   ÚProcessStateRunningEventrr   ÚProcessStateStartingEventr³   ÚProcessStateStoppingEventrR   r[   rd   rj   r‚   r|   r�   r}   r·   r»   r¼   r½   r¸   rË   rÓ   r˜   rÚ   rÝ   rã   rá   rë   r   r   r   r   r   !   sn    
/ø
IGU/]r   c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚFastCGISubprocessz7Extends Subprocess class to handle FastCGI subprocessesc                 C   s   t  | |¡ d | _d S r&   )r   r   Ú	fcgi_sockr   r   r   r   r   Ó  s   
zFastCGISubprocess.__init__c                 C   sH   | j du r	tdƒ‚t| j dƒstd| j t| j ƒf ƒ‚| j j ¡ | _dS )zU
        The FastCGI socket needs to be created by the parent before we fork
        Nz"No group set for FastCGISubprocessÚsocket_managerzNo SocketManager set for %s:%s)rž   ÚNotImplementedErrorr!   rK   rû   Ú
get_socketrú   rº   r   r   r   Úbefore_spawn×  s   
ÿzFastCGISubprocess.before_spawnc                 C   s$   |   ¡  t | ¡}|du rd| _|S )zR
        Overrides Subprocess.spawn() so we can hook in before it happens
        N)rþ   r   r‚   rú   )r   r-   r   r   r   r‚   â  s
   
zFastCGISubprocess.spawnc                 C   s
   d| _ dS )zM
        Releases reference to FastCGI socket when process is reaped
        N)rú   rº   r   r   r   Úafter_finishí  s   
zFastCGISubprocess.after_finishc                 C   s   t  | ||¡}|  ¡  |S )zR
        Overrides Subprocess.finish() so we can hook in after it happens
        )r   rÓ   rÿ   )r   r-   rÏ   Úretvalr   r   r   rÓ   ô  s   zFastCGISubprocess.finishc                 C   s~   | j  ¡ }| jj}| |d¡ | | jd d¡ | jjr&| | jd d¡ n	| | jd d¡ td|jƒD ]}| 	|¡ q5dS )zˆ
        Overrides Subprocess._prepare_child_fds()
        The FastCGI socket needs to be set to file descriptor 0 in the child
        r   r†   rM   r‡   rˆ   r‰   N)
rú   Úfilenor   r>   rŠ   r   r‹   rŒ   r�   rŽ   )r   Úsock_fdr>   r�   r   r   r   r�   ü  s   
ÿz$FastCGISubprocess._prepare_child_fdsN)
rì   rí   rî   rï   r   rþ   r‚   rÿ   rÓ   r�   r   r   r   r   rù   Ð  s    rù   c                   @   s\   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚProcessGroupBasec                 C   s0   || _ i | _| j jD ]}| | ¡| j|j< q
d S r&   )r   Ú	processesÚprocess_configsÚmake_processr^   )r   r   Úpconfigr   r   r   r     s
   ÿzProcessGroupBase.__init__c                 C   rÕ   r&   rÖ   rØ   r   r   r   rÚ     rÛ   zProcessGroupBase.__lt__c                 C   rÜ   r&   rÖ   rØ   r   r   r   rÝ     rÛ   zProcessGroupBase.__eq__c                 C   s.   | j j}trt|ƒ d¡}d| jt| ƒ|f S )NrÞ   z<%s instance at %s named %s>)r   r^   r   r   rß   Ú	__class__rà   râ   r   r   r   rã     s   ÿzProcessGroupBase.__repr__c                 C   ó   | j  ¡ D ]}| ¡  qd S r&   )r  r    r   ©r   Úprocessr   r   r   r   %  ó   
ÿzProcessGroupBase.removelogsc                 C   r	  r&   )r  r    r%   r
  r   r   r   r%   )  r  zProcessGroupBase.reopenlogsc                 C   sn   t | j ¡ ƒ}| ¡  | ¡  |D ]#}| ¡ }|tjkr!| ¡  q|tj	kr+| ¡  q|tj
kr4| ¡  qd S r&   )Úlistr  r    ÚsortÚreverserá   r   r²   r»   rr   rN   r½   )r   r  Úprocr   r   r   r   Ústop_all-  s   




€özProcessGroupBase.stop_allc                 C   s   dd„ | j  ¡ D ƒS )z@ Processes which aren't in a state that is considered 'stopped' c                 S   s   g | ]
}|  ¡ tvr|‘qS r   )rá   r
   )Ú.0Úxr   r   r   Ú
<listcomp>@  s    ÿz<ProcessGroupBase.get_unstopped_processes.<locals>.<listcomp>)r  r    rº   r   r   r   Úget_unstopped_processes>  s   z(ProcessGroupBase.get_unstopped_processesc                 C   s$   i }| j  ¡ D ]}| |j¡ q|S r&   )r  r    r    r   )r   r   r  r   r   r   Úget_dispatchersC  s   z ProcessGroupBase.get_dispatchersc                 C   s   d S r&   r   rº   r   r   r   Úbefore_removeI  s   zProcessGroupBase.before_removeN)rì   rí   rî   r   rÚ   rÝ   rã   r   r%   r  r  r  r  r   r   r   r   r    s    	r  c                   @   ó   e Zd Zdd„ ZdS )ÚProcessGroupc                 C   r	  r&   )r  r    rë   )r   r  r   r   r   rë   M  r  zProcessGroup.transitionN)rì   rí   rî   rë   r   r   r   r   r  L  ó    r  c                   @   r  )ÚFastCGIProcessGroupc              
   K   sl   t  | |¡ | dt¡}||j|jjd�| _z| j ¡  W d S  t	y5 } zt
d| j ¡ |f ƒ‚d }~ww )NÚsocketManager)rf   z&Could not create FastCGI socket %s: %s)r  r   rS   r   Úsocket_configr>   rf   rû   rý   Ú	Exceptionr<   r   )r   r   ÚkwargsÚsockManagerKlassrF   r   r   r   r   S  s   ÿ
ÿÿ€ÿzFastCGIProcessGroup.__init__N©rì   rí   rî   r   r   r   r   r   r  Q  s    r  c                   @   s^   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zddd„Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚEventListenerPoolc                 C   s0   t  | |¡ g | _d| _d| _d| _|  ¡  d S )Néÿÿÿÿr   )r  r   Úevent_bufferÚserialÚlast_dispatchÚdispatch_throttleÚ
_subscriber   r   r   r   r   c  s   zEventListenerPool.__init__c                 C   s0   |j }| j ¡ }||v r| j|jdd� d S d S )NT©Úhead)r  r  r    Ú_acceptEventrZ   )r   rZ   r  Úprocsr   r   r   Úhandle_rejectedk  s
   
þz!EventListenerPool.handle_rejectedc                 C   s‚   | j  ¡ }d}|D ]}| ¡  |jtjkr|jtjkrd}q	|r?| j	r9t
 
¡ }|| jk r/|| _|| j | j	k r9d S |  ¡  d S d S )NFT)r  r    rë   r   r   r²   rð   r   ÚREADYr'  rO   r&  Údispatch)r   r  Údispatch_capabler  rX   r   r   r   rë   r  s"   
€
õzEventListenerPool.transitionc                 C   s   |   ¡  d S r&   )Ú_unsubscriberº   r   r   r   r  ‰  s   zEventListenerPool.before_removec                 C   sD   | j r| j  d¡}|  |¡}|s| j|dd� n| j st ¡ | _d S )Nr   Tr)  )r$  ÚpopÚ_dispatchEventr+  rO   r&  )r   rZ   Úokr   r   r   r/  Œ  s   
ø	zEventListenerPool.dispatchFc                 C   sÞ   t | jjƒ}t|dƒsttƒ|_t|dƒsi |_| jj|jvr)t| ƒ|j| jj< n| jjj	 
d|j|t| jƒ| jjf ¡ t| jƒ| jjkr\| jr\| j d¡}| jjj	 d||jf ¡ |rg| j d|¡ d S | j |¡ d S )Nr%  Úpool_serialsz6rebuffering event %s for pool %s (buf size=%d, max=%d)r   z4pool %s event buffer overflowed, discarding event %s)r   r   r^   r!   Ú
new_serialÚGlobalSerialr%  r5  r>   rf   r¿   Úlenr$  Úbuffer_sizer2  r±   ÚinsertÚappend)r   rZ   r*  rc   Údiscarded_eventr   r   r   r+  ˜  s2   



ÿÿÿ
ÿÿzEventListenerPool._acceptEventc           
      C   sþ   |j | jj }| j ¡ D ]p}|jtjkrq|jt	j
kr|t|jjƒ}| ¡ }z|j}|j}|  ||||¡}| t|ƒ¡ W n( tyd }	 z|	jd tjkrM‚ | jjj d|j|f ¡ W Y d }	~	qd }	~	ww t	j|_||_| jjj d|j|f ¡  dS qdS )Nr   zNepipe occurred while sending event %s to listener %s, listener state unchangedzevent %s sent to listener %sTF)r5  r   r^   r  r    r   r   r²   rð   r   r.  r   Úpayloadr  r%  Ú_eventEnveloper7   r   r/   rs   r0   r1   r>   rf   r¿   ÚBUSYrZ   )
r   rZ   Úpool_serialr  rc   r=  Ú
event_typer%  Úenveloper€   r   r   r   r3  µ  sH   ÿ
ÿÿÿ€ø

ÿÿèz EventListenerPool._dispatchEventc              	   C   s:   t  |¡}t|ƒ}d| jjj|| jj||||dœ}d| S )Nz3.0)ÚverÚsidr%  Ú	pool_namer@  Ú
event_namer8  r=  z‹ver:%(ver)s server:%(sid)s serial:%(serial)s pool:%(pool_name)s poolserial:%(pool_serial)s eventname:%(event_name)s len:%(len)s
%(payload)s)r   ÚgetEventNameByTyper8  r   r>   Ú
identifierr^   )r   rA  r%  r@  r=  rF  Úpayload_lenÚDr   r   r   r>  ×  s   
ø
þz EventListenerPool._eventEnvelopec                 C   ó0   | j jD ]	}t || j¡ qt tj| j¡ d S r&   )r   Úpool_eventsr   Ú	subscriber+  rÎ   r-  ©r   rA  r   r   r   r(  è  ó   zEventListenerPool._subscribec                 C   rK  r&   )r   rL  r   Úunsubscriber+  rÎ   r-  rN  r   r   r   r1  í  rO  zEventListenerPool._unsubscribeN)F)rì   rí   rî   r   r-  rë   r  r/  r+  r3  r>  r(  r1  r   r   r   r   r"  b  s    
"r"  c                   @   r  )r7  c                 C   s
   d| _ d S )Nr#  )r%  rº   r   r   r   r   ô  s   
zGlobalSerial.__init__Nr!  r   r   r   r   r7  ó  r  r7  c                 C   s$   | j tkrd| _ |  j d7  _ | j S )Nr#  rM   )r%  r   )Úinstr   r   r   r6  ù  s   
r6  )+r0   Ú	functoolsrA   rË   r9   rO   rÃ   Úsupervisor.compatr   r   r   r   Úsupervisor.medusar   r¦   Úsupervisor.statesr   r   r	   r
   Úsupervisor.optionsr   r   r   r   Úsupervisor.dispatchersr   Ú
supervisorr   Úsupervisor.datatypesr   Úsupervisor.socket_managerr   Útotal_orderingÚobjectr   rù   r  r  r  r"  r7  r6  r   r   r   r   Ú<module>   sP         3=> 