
    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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e"                      Z# G d de#          Z$ej!         G d de"                      Z% G d de%          Z& G d de&          Z' G d de%          Z( G d de"          Z) e)            Z)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                      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 Zd Zd Zd Zd	 Z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Z/d Z0d Z1d Z2d Z3d Z4d Z5d Z6d Z7d Z8d Z9d Z:d Z;d Z<d Z=d Z>d Z?d Z@d ZAd ZBdS )!
SubprocesszA class to manage a subprocess.r   NFc                 R    || _         i | _        i | _        t          j        | _        dS )zDConstructor.

        Argument is a ProcessConfig instance.
        N)configdispatcherspipesr   STOPPEDstateselfr   s     O/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/supervisor/process.py__init__zSubprocess.__init__;   s(    
 
"*


    c                     | j                                         D ]&}t          |d          r|                                 'd S )N
removelogs)r   valueshasattrr"   r   
dispatchers     r   r"   zSubprocess.removelogsE   O    *1133 	( 	(Jz<00 (%%'''	( 	(r    c                     | j                                         D ]&}t          |d          r|                                 'd S )N
reopenlogs)r   r#   r$   r)   r%   s     r   r)   zSubprocess.reopenlogsJ   r'   r    c                     | j                                         D ]R}|                                r|                                 |                                r|                                 Sd S N)r   r#   readablehandle_read_eventwritablehandle_write_eventr%   s     r   drainzSubprocess.drainO   sy    *1133 	0 	0J
 ""$$ /,,...""$$ 0--///	0 	0r    c                 L   | j         r| j        rt          t          j        d          | j        d         }|t          t          j        d          | j        |         }|j        rt          t          j        d          |xj        |z  c_        |	                                 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&   s       r   writezSubprocess.writeZ   s    x 	A4< 	A%+'?@@@:g&%+'EFFF%h/
 	K%+'IJJJ5(r    c           	         	 t          j        | j        j                  }n># t          $ r1}t          d| j        j        dt          |                    d}~ww xY w|r	|d         }nt          d          d|v r5|}	 | j        j                            |          }n# t          $ r d}Y n~w xY w| j        
                                }d}d}|D ]S}t          j                            ||          }	 | j        j                            |          } n# t          $ r Y Pw xY w||}n|}| j        j                            |||           ||fS )zInternal: 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 : Nr   zcommand is empty/)shlexsplitr   command
ValueErrorr   stroptionsstatr5   get_pathospathjoincheck_execv_args)	r   commandargseprogramfilenamestrJ   founddirs	            r   get_execv_argszSubprocess.get_execv_argsi   s   	/+dk&9::KK 	/ 	/ 	/*$$$c!fff. / / /	/  	1!!nGG/000'>>H[(--h77    ;''))DEB  S'22,11%88B E    D z" 
 	,,X{BGGG$$s8   ! 
A,AA B   B/.B/4D
D"!D"Tc                 0   | j         }||u rdS || _         |t          j        k    r2t          j                    }| xj        dz  c_        || j        z   | _        | j                            |          }|# || ||          }t          j	        |           d S d S )NF   )
r   r   BACKOFFtimebackoffdelay	event_mapgetr   notify)r   	new_stateexpected	old_statenowevent_classevents          r   change_statezSubprocess.change_state   s    J		!!5
---)++CLLALLt|+DJn((33"Ki::EM%      #"r    c                     | j         |vrmt          | j                   }d                    t          t          |                    }t	          | j        j                  }t          d|d|d|          d S )N zAssertion failed for r?   z not in )r   r
   rK   mapr   r   nameAssertionError)r   statescurrent_stateallowable_statesprocessnames        r   _assertInStatezSubprocess._assertInState   s    :V##6tzBBM"xx,F(O(OPP#DK$455K .]]],<,<"> ? ? ?	 $#r    c                 b    || _         | j        j        j                            d|z             d S )Nzspawnerr: %s)spawnerrr   rF   loggerinfor   msgs     r   record_spawnerrzSubprocess.record_spawnerr   s0    "''(<=====r    c                    | j         j        }t          | j         j                  }| j        r!d|z  }|j                            |           dS d| _        d| _        d| _	        d| _
        d| _        t          j                    | _        |                     t          j        t          j        t          j        t          j                   |                     t          j                   	 |                                 \  }}nv# t.          $ ri}|                     |j        d                    |                     t          j                   |                     t          j                   Y d}~dS d}~ww xY w	 | j                             |           \  | _        | _        n# t:          t<          f$ r}|j        d         }|t>          j         k    rd|z  }n&d|dt>          j!        "                    ||          }|                     |           |                     t          j                   |                     t          j                   Y d}~dS d}~ww xY w	 |#                                }	n# t:          $ r}|j        d         }|t>          j$        k    rd|z  }n&d	|dt>          j!        "                    ||          }|                     |           |                     t          j                   |                     t          j                   |%                    | j                   |&                    | j                   Y d}~dS d}~ww xY w|	dk    r| '                    |	          S | (                    ||          S )
zStart 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 'z': z1Too many processes in process table to spawn '%s'zunknown error during fork for '))r   rF   r   rh   r3   rq   warnr4   rp   
exitstatussystem_stopadministrative_stoprX   	laststartrn   r   EXITEDFATALrW   r   rd   STARTINGrT   r   ru   argsmake_dispatchersr   r   r5   IOErrorr6   EMFILE	errorcoder\   forkEAGAINclose_parent_pipesclose_child_pipes_spawn_as_parent_spawn_as_child)
r   rF   rm   rt   rP   argvwhatwhycoder3   s
             r   spawnzSubprocess.spawn   s}   
 +% 0118 	2[@CN$$$F #( M0-2E)1=3H	J 	J 	J 	-0111	!0022NHdd 	 	 	  1... 6777m3444FFFFF			+/;+G+G+M+M(Ddjj! 	 	 	8A;Du|##;kI $
 "kk5?#6#6tT#B#B#BD  %%% 6777m3444FFFFF		,,..CC 	 	 	8A;Du|##M#$ $ "kk5?#6#6tT#B#B#BD  %%% 6777m3444&&tz222%%dj111FFFFF	  !88((--- ''$777sK   )D 
E4AE//E48'F   I1BIII1 1
M;CMMc                 :   || _         | j        j        }|                    | j                   |j                            dt          | j        j                  d|           d | _	        t          j
                    | j        j        z   | _        | |j        |<   |S )Nz
spawned: 'z' with pid )r3   r   rF   r   r   rq   rr   r   rh   rp   rX   	startsecsrZ   
pidhistory)r   r3   rF   s      r   r   zSubprocess._spawn_as_parent  s    +%!!$*---Yt{GW=X=X=X=XZ]Z]^___Y[[4;#88
"&3
r    c                    | j         j        }|                    | j        d         d           |                    | j        d         d           | j         j        r"|                    | j        d         d           n!|                    | j        d         d           t          d|j                  D ]}|                    |           d S )Nchild_stdinr   child_stdoutrV      child_stderr   )r   rF   dup2r   redirect_stderrrangeminfdsclose_fd)r   rF   is      r   _prepare_child_fdszSubprocess._prepare_child_fds  s    +%TZ.222TZ/333;& 	8LLN3Q7777LLN3Q777q'.)) 	  	 AQ	  	 r    c                    | j         j        }	 |                                 |                                  |                                 }|r\| j         j        }d|d|d}|                    dd|z              	 |                    dd           |                    d           d S t          j	        
                                }d|d	<   | j         j        }|| j         j        j        }|r||d
<   | j         j        |d<   | j        r| j        j         j        |d<   | j         j        |                    | j         j                   | j         j        }		 |	|                    |	           n# t$          $ r}
t&          j                            |
j        d         |
j        d                   }d|	d|d}|                    dd|z              Y d }
~
|                    dd           |                    d           d S d }
~
ww xY w	 | j         j        |                    | j         j                   |                    |||           n# t$          $ rh}
t&          j                            |
j        d         |
j        d                   }d|d         d|d}|                    dd|z              Y d }
~
nUd }
~
w t5          j                    \  \  }}}}}}|d|d|d|}d|d|d}|                    dd|z              Y nxY w|                    dd           |                    d           d S # |                    dd           |                    d           w xY w)Nzcouldn't setuid to r?   
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 zcouldn't exec z, z: file: z line: )r   rF   setpgrpr   set_uiduidr=   _exitrI   environcopy	serverurlrh   groupenvironmentupdate	directorychdirr5   r6   r   r\   r   umasksetumaskexecveasyncorecompact_traceback)r   rP   r   rF   
setuid_msgr   rt   envr   cwdr   r   filefunlinetvtbinfoerrors                      r   r   zSubprocess._spawn_as_child  s   +%C	 OO##%%% J ko7:ssJJJGa#!5666\ MM!JKKKMM#Y *//##C(+C$%-I  K/9	 9/8+,-1[-=C)*z F/3z/@/E+,{&2

4;2333 +'C?MM#&&&   **38A;DD69cc444@a#!5666* MM!JKKKMM#57;$0$$T[%6777xs3333 7 7 7**38A;DD26q'''444@a#!5666666667080J0L0L-!sD1Qv78qq!!!TTT44H2:((EEEBa#!566666 MM!JKKKMM# MM!JKKKMM#sk   A,L9 (B*L9 E+ *L9 +
H5AG>L9 >HL9 AI
 	L9 

L	AJ72L9 7AL	L9 9-M&c                    | j         t          j        k    rO|| j        k     r|| _        | j        dk    r.|| j        | j        j        z
  k     r|| j        j        z   | _        dS dS dS | j         t          j        k    r=|| j        k    r.|| j        | j        j        z   k     r|| j        j        z
  | _        dS dS dS | j         t          j        k    rO|| j	        k     r|| _	        | j        dk    r.|| j        | j        j
        z
  k     r|| j        j
        z   | _        dS dS dS | j         t          j        k    r/| j        dk    r&|| j        | j        z
  k     r|| j        z   | _        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   r~   r{   rZ   r   r   RUNNINGSTOPPINGlaststopreportstopwaitsecsrW   rY   )r   	test_times     r   +_check_and_adjust_for_system_clock_rollbackz6Subprocess._check_and_adjust_for_system_clock_rollbacke  s}   
 :///4>))!*zA~~)tzDK<Q/Q"R"R&)>>


 ~"R"RZ=0004>))i4>DKLa;a.b.b!*T[-B!B *).b.bZ=1114...&/#zA~~)tzDK<T/T"U"U&)AA


 ~"U"UZ=000zA~~)tzDL/H"I"I&5


 10~"I"Ir    c                 \    d| _         d| _        |                     | j        j                  S )z Administrative stop Tr   )rz   r   killr   
stopsignalr   s    r   stopzSubprocess.stop{  s)    #' yy/000r    c                 .   | j         t          j        k    r}t          j                    }|                     |           || j        dz   k    rI| j        j        j        	                    dt          | j        j                  z             || _        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   rX   r   r   r   rF   rq   rr   r   rh   )r   ra   s     r   stop_reportzSubprocess.stop_report  s    :///)++C<<SAAAd)A-..#*//,y9I/J/JJL L L&)### 0/
 /.r    c                     d| _         d| _        d| _        |                     t          j                   |                     t          j                   d S )Nr   T)rZ   rY   ry   rn   r   rW   rd   r}   r   s    r   give_upzSubprocess.give_up  sL    
M1222--.....r    c                 N   t          j                     }| j        j        }t          | j        j                  }| j        t          j        k    r@d|z  }|j        	                    |           | 
                    t          j                   dS | j        s2d|dt          |          d}|j        	                    |           |S | j        t          j        k    r| j        j        }n| j        j        }d}|rd}|j        	                    d|d	| j        d
|dt          |                     d| _        || j        j        z   | _        |                     t          j        t          j        t          j                   | 
                    t          j                   | j        }|r| j         }	 	 |                    ||           ne# t0          $ rX}	|	j        t2          j        k    r=d|d	| j        dt7          |	          }|j        	                    |           Y d}	~	dS  d}	~	ww xY wns#  t9          j                    }
d|d| j        d|
}|j                            |           | 
                    t          j                   d| _        d| _        |cY S xY wd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.Nzattempted to kill z
 with sig  but it wasn't running zprocess group zkilling  (pid z) zwith signal Tunable to signal z'), it probably just exited on its own: zunknown problem killing  ():Fr   ) rX   r   rF   r   rh   r   r   rW   rq   debugrd   r   r3   r   r   killasgroupstopasgroupr4   r   rZ   rn   r   r~   r   r5   r6   ESRCHrE   	traceback
format_exccriticalUNKNOWN)r   sigra   rF   rm   rt   r   as_groupr3   exctbs              r   r   zSubprocess.kill  s    ikk+% 011
 :...ECN  %%%m34444x 	 	KK/CN  %%%J :///+1KK+1K 	('H + $ ( '	. 	 	 	 4;33
 	M1)2)2	4 	4 	4 	-0111h 	8)C	
S#&&&&   9+++/:{{DHHHc#hhhPCN((---  44444 '	%''BB:E++:>(((BBHCN##C(((m3444 DLDJJJJts8   5G H2 
H.AH)"H2 (H))H..H2 2A.J"c           
      h   | j         j        }t          | j         j                  }| j        s2d|dt          |          d}|j                            |           |S |j                            d|d| j        dt          |                     |                     t          j
        t          j        t          j                   	 	 |                    | j        |           ne# t          $ rX}|j        t          j        k    r=d|d| j        dt#          |          }|j                            |           Y d	}~d	S  d	}~ww xY wne#  t%          j                    }d
|d| j        d|}|j                            |           |                     t          j                   |cY S xY wd	S )zSend 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.
        zattempted to send z sig r   zsending r   z) sig r   z+), it probably just now exited on its own: Nzunknown problem sending sig r   r   )r   rF   r   rh   r3   r   rq   r   rn   r   r   r~   r   r   r5   r6   r   rE   r   r   r   rd   r   )r   r   rF   rm   rt   r   r   s          r   signalzSubprocess.signal  s    +% 011x 	 	KK/CN  %%%J + $ '. 	 	 	 	M1)2)2	4 	4 	4	TXs++++ 	 	 	9+++/:{{DHHHs888%C N((---  44444	 ,	%''BB +TXXXrr;CN##C(((m3444JJJts8   C' &E '
E	1AE=E EE		E A F/c                 $   |                                   t          |          \  }}t          j                    }|                     |           || _        t          | j        j                  }|| j        k    r|| j        z
  | j        j	        k     }n2d}| j        j
        j                            d|d| j        d           || j        j        v }| j        rd| _        d| _        || _        d|d|d}|                     t&          j                   |                     t&          j                   |r&| j        j
        j                            |           n| j        j
        j                            |           n|r~d	| _        d
| _        d|d|dz   d}|                     t&          j                   |                     t&          j                   | j        j
        j                            |           nd| _        d| _        || _        | j        t&          j        k    r|                     t&          j                   |                     t&          j                   |rRd|d|dz   d}|                     t&          j        d           | j        j
        j                            |           n[d|z  | _        d|d|dz   d}|                     t&          j        d           | j        j
        j                            |           d| _        | j        j
                            | j                    i | _         i | _!        | j"        5tG          j$        tG          j%        | | j"                             d	| _"        d	S d	S )zK The process was reaped and we need to report and manage its state
        Fz	process '' (zr) laststart time is in the future, don't know how long process was running so assuming it did not exit too quicklyr   z	stopped: r   )Nz1Exited too quickly (process log may have details)zexited: z; not expectedz
; expectedT)r_   zBad exit code %s)&r0   r   rX   r   laststopr   r   rh   r{   r   rF   rq   rw   r3   	exitcodesr4   rZ   rx   rn   r   r   rd   r   rr   rp   r~   rW   rY   r   r   r|   r   r   r   rc   r   r]   EventRejectedEvent)	r   r3   stsesrt   ra   rm   too_quicklyexit_expecteds	            r   finishzSubprocess.finish  s    	

$S))Cikk88=== 011.1FFKKKK&+++ +6++txxxAB B B
 dk33< 4	5 !DLDJ DOO(3SSS9C 6777m3444 5#*//4444#*//4444  $	5 #DOODMM'2{{C:J4J4J4JKC 6777m3444K&++C0000 DJDL DO
 z]333!!-"7888 5666 
5 
5+6;;l8J8J8JK!!-"6!FFF#*//4444 !3R 7+6;;>N8N8N8NO!!-"6!GGG#*//444..tz:::

 :! M&3D$*EEFFFDJJJ	 "!r    c                 t    | j         j        d S | j         j                            | j         j                  }|S r+   )r   r   rF   drop_privilegesrs   s     r   r   zSubprocess.set_uidu  s2    ;?"Fk!11$+/BB
r    c                 6    | j         j        |j         j        k     S r+   r   priorityr   others     r   __lt__zSubprocess.__lt__{      {#el&;;;r    c                 6    | j         j        |j         j        k    S r+   r   r   s     r   __eq__zSubprocess.__eq__~  s    {#u|'<<<r    c           	          | j         j        }t          r"t          |                              d          }dt          |           d|dt          |                                           dS )Nunicode-escapez<Subprocess at z with name z
 in state >)r   rh   r   r   encodeidr
   	get_stater   rh   s     r   __repr__zSubprocess.__repr__  sj     { 	<T??))*:;;DtHHHHDD&t~~'7'78888: 	:r    c                     | j         S r+   )r   r   s    r   r  zSubprocess.get_state  s
    zr    c                    t          j                     }| j        }|                     |           | j        j        j        }| j        j        j        t          j        k    r|t          j
        k    r\| j        j        rO| j        j        t          u r|                                  n| j        | j        j        vr|                                  n||t          j        k    r(| j        s!| j        j        r|                                  nD|t          j        k    r4| j        | j        j        k    r|| j        k    r|                                  t/          | j        j                  }|t          j        k    r|| j        z
  | j        j        k    rvd| _        d| _        |                     t          j                   |                     t          j                   d| j        j        z  }|                    d|d|           |t          j        k    rJ| j        | j        j        k    r3|                                  d}|                    d|d|           d S d S |t          j         k    ra| j        |z
  }|dk    rS| j        j        j        !                    d|d| j"        d	           | #                    tH          j%                   d S d S d S )
Nr   zNentered RUNNING state, process has stayed up for > than %s seconds (startsecs)z	success: rf   z7entered FATAL state, too many start retries too quicklyz	gave up: z	killing 'r   z) with SIGKILL)&rX   r   r   r   rF   rq   moodr	   
RESTARTINGr   r|   autorestartr   r   rx   r   r   r{   	autostartrW   rY   startretriesrZ   r   rh   r~   r   rn   rd   r   rr   r   r   rw   r3   r   r   SIGKILL)r   ra   r   rq   rm   rt   	time_lefts          r   
transitionzSubprocess.transition  s   ikk
88===$+;#&6&AAA,,,;* ){.2HHH

?$+2GGG JJLLL-////;( !JJLLL-///<4;#;;;TZ''

 011M***T^#dk&;;; 
 ##M$:;;;!!-"788846:k6KL  SSABBBM)))|dk666 !SSABBBBB 76 m,,,
S(IA~~ #*///:E++:>(((DE E E 		&.))))) -,~r    )T)C__name__
__module____qualname____doc__r3   r   r   listener_staterc   r{   r   r   rZ   rz   ry   r4   rY   r   r   rx   rp   r   r   r"   r)   r0   r=   rT   r   rW   r   ProcessStateBackoffEventr}   ProcessStateFatalEventr   ProcessStateUnknownEventr   ProcessStateStoppedEventr|   ProcessStateExitedEventr   ProcessStateRunningEventr~   ProcessStateStartingEventr   ProcessStateStoppingEventr[   rd   rn   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r    r   r   r   !   sw        *) CFENEIHNEKGGKEJHE+ + +( ( (
( ( (
	0 	0 	0  ,% ,% ,%^ 	v>v<v>v>v=v> @ @	
I! ! ! !"? ? ?> > >G8 G8 G8R	 	 		  	  	 E E EN6 6 6,1 1 1
* 
* 
*/ / /S S Sj- - -^[ [ [z  < < <= = =	: 	: 	:  >* >* >* >* >*r    r   c                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	FastCGISubprocessz7Extends Subprocess class to handle FastCGI subprocessesc                 J    t                               | |           d | _        d S r+   )r   r   	fcgi_sockr   s     r   r   zFastCGISubprocess.__init__  s#    D&)))r    c                     | j         t          d          t          | j         d          s,t          d| j         dt          | j                             | 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 :)r   NotImplementedErrorr$   rS   r"  
get_socketr   r   s    r   before_spawnzFastCGISubprocess.before_spawn  s     :%&JKKKtz#344 	O%%15S___'N O O O2==??r    c                 t    |                                   t                              |           }|d| _        |S )zR
        Overrides Subprocess.spawn() so we can hook in before it happens
        N)r&  r   r   r   )r   r3   s     r   r   zFastCGISubprocess.spawn  s:     	t$$;!DN
r    c                     d| _         dS )zM
        Releases reference to FastCGI socket when process is reaped
        N)r   r   s    r   after_finishzFastCGISubprocess.after_finish  s    
 r    c                 f    t                               | ||          }|                                  |S )zR
        Overrides Subprocess.finish() so we can hook in after it happens
        )r   r   r)  )r   r3   r   retvals       r   r   zFastCGISubprocess.finish  s2     ""4c22r    c                    | j                                         }| j        j        }|                    |d           |                    | j        d         d           | j        j        r"|                    | j        d         d           n!|                    | j        d         d           t          d|j                  D ]}|	                    |           dS )z
        Overrides Subprocess._prepare_child_fds()
        The FastCGI socket needs to be set to file descriptor 0 in the child
        r   r   rV   r   r   r   N)
r   filenor   rF   r   r   r   r   r   r   )r   sock_fdrF   r   s       r   r   z$FastCGISubprocess._prepare_child_fds  s    
 .''))+%Wa   TZ/333;& 	8LLN3Q7777LLN3Q777q'.)) 	  	 AQ	  	 r    N)
r  r  r  r  r   r&  r   r)  r   r   r  r    r   r  r    sw        AA  	@ 	@ 	@	 	 	             r    r  c                   J    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S )ProcessGroupBasec                     || _         i | _        | j         j        D ]$}|                    |           | j        |j        <   %d S r+   )r   	processesprocess_configsmake_processrh   )r   r   pconfigs      r   r   zProcessGroupBase.__init__  sQ    {2 	F 	FG+2+?+?+E+EDN7<((	F 	Fr    c                 6    | j         j        |j         j        k     S r+   r   r   s     r   r   zProcessGroupBase.__lt__  r   r    c                 6    | j         j        |j         j        k    S r+   r   r   s     r   r   zProcessGroupBase.__eq__  s    {#u|'<<<r    c                     | j         j        }t          r"t          |                              d          }d| j        dt          |           d|dS )Nr   <z instance at z named r   )r   rh   r   r   r   	__class__r  r  s     r   r  zProcessGroupBase.__repr__  sW     { 	<T??))*:;;D15D157 	7r    c                 f    | j                                         D ]}|                                 d S r+   )r2  r#   r"   r   processs     r   r"   zProcessGroupBase.removelogs%  >    ~,,.. 	! 	!G    	! 	!r    c                 f    | j                                         D ]}|                                 d S r+   )r2  r#   r)   r<  s     r   r)   zProcessGroupBase.reopenlogs)  r>  r    c                    t          | j                                                  }|                                 |                                 |D ]}|                                }|t          j        k    r|                                 ;|t          j	        k    r|                                 `|t          j
        k    r|                                 d S r+   )listr2  r#   sortreverser  r   r   r   r~   rW   r   )r   r2  procr   s       r   stop_allzProcessGroupBase.stop_all-  s    ..0011	 
	 
	DNN$$E---		-000		-///
	 
	r    c                 H    d | j                                         D             S )z@ Processes which aren't in a state that is considered 'stopped' c                 H    g | ]}|                                 t          v| S r  )r  r   ).0xs     r   
<listcomp>z<ProcessGroupBase.get_unstopped_processes.<locals>.<listcomp>@  s;     " " "qq{{}}8  8  8  8  8 r    )r2  r#   r   s    r   get_unstopped_processesz(ProcessGroupBase.get_unstopped_processes>  s0    " "DN1133 " " " 	"r    c                 v    i }| j                                         D ]}|                    |j                   |S r+   )r2  r#   r   r   )r   r   r=  s      r   get_dispatchersz ProcessGroupBase.get_dispatchersC  sD    ~,,.. 	4 	4Gw23333r    c                     d S r+   r  r   s    r   before_removezProcessGroupBase.before_removeI  s    r    N)r  r  r  r   r   r   r  r"   r)   rE  rK  rM  rO  r  r    r   r0  r0    s        F F F< < <= = =7 7 7! ! !! ! !  "" " "
      r    r0  c                       e Zd Zd ZdS )ProcessGroupc                 f    | j                                         D ]}|                                 d S r+   )r2  r#   r  )r   rD  s     r   r  zProcessGroup.transitionM  s<    N))++ 	 	DOO	 	r    N)r  r  r  r  r  r    r   rQ  rQ  L  s#            r    rQ  c                       e Zd Zd ZdS )FastCGIProcessGroupc                 d   t                               | |           |                    dt                    } ||j        |j        j                  | _        	 | j                                         d S # t          $ r1}t          d| j                                        d|          d }~ww xY w)NsocketManager)rq   z Could not create FastCGI socket r?   )rQ  r   r\   r   socket_configrF   rq   r"  r%  	ExceptionrD   r   )r   r   kwargssockManagerKlassrN   s        r   r   zFastCGIProcessGroup.__init__S  s    dF+++!::o}EE..v/C6<n6KM M M	**,,,,, 	 	 	*'..0000!!5  	s   A4 4
B/>,B**B/Nr  r  r  r   r  r    r   rT  rT  Q  s#            r    rT  c                   L    e Zd Zd Zd Zd Zd Zd ZddZd Z	d	 Z
d
 Zd ZdS )EventListenerPoolc                     t                               | |           g | _        d| _        d| _        d| _        |                                  d S )Nr   )r0  r   event_bufferseriallast_dispatchdispatch_throttle
_subscriber   s     r   r   zEventListenerPool.__init__c  sM    !!$///!"r    c                     |j         }| j                                        }||v r|                     |j        d           d S d S )NThead)r=  r2  r#   _acceptEventrc   )r   rc   r=  procss       r   handle_rejectedz!EventListenerPool.handle_rejectedk  sP    -%%''eek55555 r    c                 x   | j                                         }d}|D ]B}|                                 |j        t          j        k    r|j        t          j        k    rd}C|rW| j	        r:t          j
                    }|| j        k     r|| _        || j        z
  | j	        k     rd S |                                  d S d S )NFT)r2  r#   r  r   r   r   r  r   READYrc  rX   rb  dispatch)r   r2  dispatch_capabler=  ra   s        r   r  zEventListenerPool.transitionr  s    N))++	   	, 	,G    } 555)-@-FFF'+$ 	% 	ikk+++ *-D&++d.DDDFMMOOOOO	 	r    c                 .    |                                   d S r+   )_unsubscriber   s    r   rO  zEventListenerPool.before_remove  s    r    c                     | j         rP| j                             d          }|                     |          }|s|                     |d           n| j         Pt	          j                    | _        d S )Nr   Trf  )r`  pop_dispatchEventrh  rX   rb  )r   rc   oks      r   rm  zEventListenerPool.dispatch  s     	%))!,,E$$U++B  !!%d!333  	 "Y[[r    Fc                    t          | j        j                  }t          |d          st	          t
                    |_        t          |d          si |_        | j        j        |j        vr"t	          |           |j        | j        j        <   nL| j        j        j	        
                    d|j        |t          | j                  | j        j        fz             t          | j                  | j        j        k    rP| j        rI| j                            d          }| j        j        j	                            d|d|j                   |r| j                            d|           d S | j                            |           d S )Nra  pool_serialsz6rebuffering event %s for pool %s (buf size=%d, max=%d)r   zpool z+ event buffer overflowed, discarding event )r   r   rh   r$   
new_serialGlobalSerialra  rv  rF   rq   r   lenr`  buffer_sizerr  r   insertappend)r   rc   rg  rm   discarded_events        r   rh  zEventListenerPool._acceptEvent  s      011uh'' 	4%l33ELun-- 	$!#E;5#5553=d3C3CEt{/00K&,,H{C0A,B,B')*+ + +
 t !!T[%<<<  <"&"3"7"7":":#*000 [[/"8"8;< < <  	,$$Q.....$$U+++++r    c           	         |j         | j        j                 }| j                                        D ]T}|j        t          j        k    r|j        t          j
        k    r%t          |j        j                  }|                                }	 |j        }|j        }|                     ||||          }|                    t#          |                     nd# t$          $ rW}	|	j        d         t(          j        k    r | j        j        j                            d|j        d|d           Y d }	~	d }	~	ww xY wt          j        |_        ||_        | j        j        j                            d|j        d|            dS VdS )	Nr   z#epipe occurred while sending event z to listener z, listener state unchangedzevent z sent to listener TF)rv  r   rh   r2  r#   r   r   r   r  r   rl  r   payloadr:  ra  _eventEnveloper=   r   r5   r   r6   r7   rF   rq   r   BUSYrc   )
r   rc   pool_serialr=  rm   r  
event_typera  enveloper   s
             r   rs  z EventListenerPool._dispatchEvent  s   ()9:~,,.. 	 	G} 555%)<)BBB'(;<<--//!&J"\F#22:v3> I  IHMM(8"4"45555   x{ek11K'.444 kkk34 4 4 HHHH *=)A& %#*000LLL++/0 0 0 tt1 C4 us   AC
D8!AD33D8c           	          t          j        |          }t          |          }d| j        j        j        || j        j        ||||d}d|z  S )Nz3.0)versidra  	pool_namer  
event_namery  r  zver:%(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   getEventNameByTypery  r   rF   
identifierrh   )r   r  ra  r  r  r  payload_lenDs           r   r  z EventListenerPool._eventEnvelope  sc    .z::
'll+%0(%#	 	DFGH 	Ir    c                     | j         j        D ]}t          j        || j                   t          j        t          j        | j                   d S r+   )r   pool_eventsr   	subscriberh  r   rj  r   r  s     r   rd  zEventListenerPool._subscribe  sN    +1 	< 	<JZ):;;;;2D4HIIIIIr    c                     | j         j        D ]}t          j        || j                   t          j        t          j        | j                   d S r+   )r   r  r   unsubscriberh  r   rj  r  s     r   rp  zEventListenerPool._unsubscribe  sN    +1 	> 	>Jz4+<====64d6JKKKKKr    N)F)r  r  r  r   rj  r  rO  rm  rh  rs  r  rd  rp  r  r    r   r]  r]  b  s          6 6 6  .  
) 
) 
), , , ,:     DI I I"J J J
L L L L Lr    r]  c                       e Zd Zd ZdS )rx  c                     d| _         d S )Nr_  )ra  r   s    r   r   zGlobalSerial.__init__  s    r    Nr[  r  r    r   rx  rx    s#            r    rx  c                 ^    | j         t          k    rd| _         | xj         dz  c_         | j         S )Nr_  rV   )ra  r   )insts    r   rw  rw    s.    {fKK1KK;r    )+r6   	functoolsrI   r   rA   rX   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  r0  rQ  rT  r]  rx  rw  r  r    r   <module>r     s        				        $ $ $ $ $ $ & & & & & & ' ' ' ' ' ' ! ! ! ! ! ! 5 5 5 5 5 5 + + + + + + . . . . . . 8 8 8 8 8 8 , , , , , , 1 1 1 1 1 1 & & & & & & ; ; ; ; ; ; ; ; 6 6 6 6 6 6       7 7 7 7 7 7 3 3 3 3 3 3
l
* l
* l
* l
* l
* l
* l
* l
*\;  ;  ;  ;  ; 
 ;  ;  ; z < < < < <v < < <|    #   
    ,   "NL NL NL NL NL( NL NL NLb    6    |~~    r    