
    1c                        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jB                   G d de"             Z# G d de#      Z$ejB                   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*y)!    N)maxint)as_bytes)	as_string)PY2)asyncore_25)ProcessStates)SupervisorStates)getProcessStateDescription)STOPPED_STATES)decode_wait_status)signame)ProcessException
BadCommand)EventListenerStates)events)RestartUnconditionally)SocketManagerc                   Z   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jB                  ejD                  ejF                  ejH                  ejJ                  ejL                  ejN                  ejP                  ejR                  ejT                  ejV                  ejX                  ejZ                  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 ZBy) 
SubprocesszA class to manage a subprocess.r   NFc                 X    || _         i | _        i | _        t        j                  | _        y)zDConstructor.

        Argument is a ProcessConfig instance.
        N)configdispatcherspipesr   STOPPEDstateselfr   s     4/usr/lib/python3/dist-packages/supervisor/process.py__init__zSubprocess.__init__;   s'    
 
"**
    c                 |    | j                   j                         D ]  }t        |d      s|j                          ! y )N
removelogs)r   valueshasattrr"   r   
dispatchers     r   r"   zSubprocess.removelogsE   6    **113 	(Jz<0%%'	(r    c                 |    | j                   j                         D ]  }t        |d      s|j                          ! y )N
reopenlogs)r   r#   r$   r)   r%   s     r   r)   zSubprocess.reopenlogsJ   r'   r    c                     | j                   j                         D ]C  }|j                         r|j                          |j	                         s4|j                          E y N)r   r#   readablehandle_read_eventwritablehandle_write_eventr%   s     r   drainzSubprocess.drainO   sR    **113 	0J
 ""$,,.""$--/	0r    c                 r   | 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_        |j                          y )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    xx4<<%++'?@@::g&%++'EFF%%h/
%++'IJJ5(r    c           	         	 t        j                  | j                  j                        }|r|d   }nt        d      d|v r)|}	 | j                  j                  j                  |      }ns| j                  j                         }d}d}|D ]I  }t        j                  j                  ||      }	 | j                  j                  j                  |      } n ||}n|}| j                  j                  j                  |||       ||fS # t        $ r3}t        d| j                  j                  dt        |            d}~ww xY w# t        $ r d}Y ww xY w# t        $ r Y w xY w)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   sc   	/++dkk&9&9:K
 !!nG/00'>H[[((--h7
 ;;'')DEB S'2,,11%8B  z" 
 	,,X{BG$$M  	/$$c!f. / /	/    s;   )D	 %E /%E		E.E  EEE	E%$E%c                 N   | j                   }||u ry|| _         |t        j                  k(  r=t        j                         }| xj                  dz  c_        || j                  z   | _        | j                  j                  |      }|  || ||      }t        j                  |       y y )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    JJ		!
---))+CLLALt||+DJnn((3"i:EMM%  #r    c                     | j                   |vrgt        | j                         }dj                  t        t        |            }t	        | j
                  j                        }t        d|d|d|      y )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   sf    ::V#6tzzBM"xx,F(OP#DKK$4$45K ],<"> ? ?	 $r    c                 v    || _         | j                  j                  j                  j	                  d|z         y )Nzspawnerr: %s)spawnerrr   rF   loggerinfor   msgs     r   record_spawnerrzSubprocess.record_spawnerr   s,    ""''(<=r    c                 (   | j                   j                  }t        | j                   j                        }| j                  r!d|z  }|j
                  j                  |       yd| _        d| _        d| _	        d| _
        d| _        t        j                         | _        | j                  t        j                   t        j"                  t        j$                  t        j&                         | j)                  t        j*                         	 | j-                         \  }}	 | j                   j5                  |       \  | _        | _        	 |jG                         }	|	dk7  r| jO                  |	      S | jQ                  ||      S # t.        $ rf}| j1                  |j2                  d          | j                  t        j*                         | j)                  t        j$                         Y d}~yd}~ww xY w# t:        t<        f$ r}|j2                  d   }|t>        j@                  k(  rd|z  }n&d|dt>        jB                  jE                  ||      }| j1                  |       | j                  t        j*                         | j)                  t        j$                         Y d}~yd}~ww xY w# t:        $ r}|j2                  d   }|t>        jH                  k(  rd|z  }n&d	|dt>        jB                  jE                  ||      }| j1                  |       | j                  t        j*                         | j)                  t        j$                         |jK                  | j8                         |jM                  | j8                         Y d}~yd}~ww xY w)
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 01882[@CNN$ #( M00-2E2E)11=3H3H	J 	-001	!002NHd	+/;;+G+G+M(Ddj	,,.C" !8((-- ''$77W   	  1. 6 67m334		 ! 	88A;Du||#;kI $
 "5??#6#6tT#BD  % 6 67m334	  	88A;Du||#M#$ $ "5??#6#6tT#BD  % 6 67m334&&tzz2%%djj1	sK   F  (G2 J+  	G/	AG**G/2J(BJ##J(+	N4CNNc                 ~   || _         | j                  j                  }|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{{GWGW=XZ]^_YY[4;;#8#88
"&3
r    c                    | j                   j                  }|j                  | j                  d   d       |j                  | j                  d   d       | j                   j                  r |j                  | j                  d   d       n|j                  | j                  d   d       t        d|j                        D ]  }|j                  |        y )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    ++%%TZZ.2TZZ/3;;&&LLN3Q7LLN3Q7q'..) 	 AQ	 r    c                 6   | j                   j                  }	 |j                          | j                          | j	                         }|rY| j                   j
                  }d|d|d}|j                  dd|z          	 |j                  dd       |j                  d       y t        j                  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                   j                   }		 |	|j#                  |	       	 | j                   j.                  %|j1                  | j                   j.                         |j3                  |||       |j                  dd       |j                  d       y # t$        $ r}
t&        j(                  j+                  |
j,                  d   |
j,                  d         }d|	d|d}|j                  dd|z          Y d }
~
|j                  dd       |j                  d       y d }
~
ww xY w# t$        $ rf}
t&        j(                  j+                  |
j,                  d   |
j,                  d         }d|d   d|d}|j                  dd|z          Y d }
~
d }
~
w t5        j6                         \  \  }}}}}}|d|d|d|}d|d|d}|j                  dd|z          Y oxY w# |j                  dd       |j                  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kkoo7:JGa#!56\ MM!JKMM#Y **//#C(+C$%--I  KK//99	/8+,-1[[-=-=C)*zz/3zz/@/@/E/E+,{{&&2

4;;223 ++''C?MM#&7;;$$0$$T[[%6%67xs3 MM!JKMM#5  **388A;D694@a#!56* MM!JKMM#5  7**388A;D26q'4@a#!5667080J0J0L-!sD1Qv78!T4H2:EBa#!56 MM!JKMM#s_   A&M3 #C;M3 H% 3AJ6 %	J3.AJ.M3 .J33M3 6	M0?AL M3  AM0-M3 3%Nc                    | j                   t        j                  k(  rl|| j                  k  r|| _        | j                  dkD  rF|| j                  | j
                  j                  z
  k  r|| j
                  j                  z   | _        yyy| j                   t        j                  k(  rV|| j                  kD  rF|| j                  | j
                  j                  z   k  r|| j
                  j                  z
  | _        yyy| j                   t        j                  k(  rl|| j                  k  r|| _	        | j                  dkD  rF|| j                  | j
                  j                  z
  k  r|| j
                  j                  z   | _        yyy| j                   t        j                  k(  rB| j                  dkD  r2|| j                  | j                  z
  k  r|| j                  z   | _        yyyy)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>>)!*zzA~)tzzDKK<Q<Q/Q"R&)>)>>
 #S~ZZ=0004>>)i4>>DKKLaLa;a.b!*T[[-B-B!B /c)ZZ=1114...&/#zzA~)tzzDKK<T<T/T"U&)A)AA
 #V~ZZ=000zzA~)tzzDLL/H"I&5
 #J~ 1r    c                 h    d| _         d| _        | j                  | j                  j                        S )z Administrative stop Tr   )rz   r   killr   
stopsignalr   s    r   stopzSubprocess.stop{  s+    #' yy//00r    c                 \   | j                   t        j                  k(  rt        j                         }| j	                  |       || j
                  dz   kD  rW| j                  j                  j                  j                  dt        | j                  j                        z         || _        yyy)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d))A-.##**//,y9I9I/JJL&)# / 0r    c                     d| _         d| _        d| _        | j                  t        j
                         | j                  t        j                         y )Nr   T)rZ   rY   ry   rn   r   rW   rd   r}   r   s    r   give_upzSubprocess.give_up  s@    
M112---.r    c                    t        j                          }| j                  j                  }t        | j                  j                        }| j
                  t        j                  k(  r@d|z  }|j                  j                  |       | j                  t        j                         y| j                  s/d|dt        |      d}|j                  j                  |       |S | j
                  t        j                  k(  r| j                  j                  }n| j                  j                   }d}|rd}|j                  j                  d|d	| j                  d
|dt        |             d| _        || j                  j$                  z   | _        | j)                  t        j*                  t        j,                  t        j                         | j                  t        j                         | j                  }|r| j                   }	 	 |j/                  ||       y# t0        $ ra}	|	j2                  t2        j4                  k(  r>d|d	| j                  dt7        |	      }|j                  j                  |       Y d}	~	y d}	~	ww xY w#  t9        j:                         }
d|d| j                  d|
}|j                  j=                  |       | j                  t        j>                         d| _        d| _        |cY S xY w)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[    iik++%% 0 01
 ::...ECNN  %m334xx/CNN  %J ::///++11K++11K'H + $ ( '	. 	 4;;333
 	M11)22)22	4 	-001hh88)C	
S#&( '  99+/:DHHc#hPCNN((-  	%%'B:E:>((BHCNN##C(m334 DLDJJs2   
H 	J&AJ<J
 JJJ
 
A5Lc           
         | j                   j                  }t        | j                   j                        }| j                  s/d|dt        |      d}|j                  j                  |       |S |j                  j                  d|d| j                  dt        |             | j                  t        j                  t        j                  t        j                         	 	 |j                  | j                  |       y	# t        $ ra}|j                  t        j                   k(  r>d|d| j                  dt#        |      }|j                  j                  |       Y d	}~y	 d	}~ww xY w#  t%        j&                         }d
|d| j                  d|}|j                  j)                  |       | j+                  t        j,                         |cY S xY w)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  sn    ++%% 0 01xx/CNN  %J + $ '. 	 	M11)22)22	4	TXXs+& %  	99+/:DHHs8%C NN((-  		%%'B +TXXr;CNN##C(m334Js2   'D 	E.AE)#E1 (E))E..E1 1A'Gc                 $   | j                          t        |      \  }}t        j                         }| j                  |       || _        t        | j                  j                        }|| j                  kD  r'|| j                  z
  | j                  j                  k  }nBd}| j                  j                  j                  j                  d|d| j                  d       || j                  j                  v }| j                  rd| _        d| _        || _        d|d|d}| j%                  t&        j(                         | j+                  t&        j,                         |r1| j                  j                  j                  j/                  |       n| j                  j                  j                  j                  |       n|rd	| _        d
| _        d|d|dz   d}| j%                  t&        j2                         | j+                  t&        j4                         | j                  j                  j                  j                  |       n5d| _        d| _        || _        | j8                  t&        j2                  k(  r| j+                  t&        j:                         | j%                  t&        j:                         |r]d|d|dz   d}| j+                  t&        j<                  d       | j                  j                  j                  j/                  |       nfd|z  | _        d|d|dz   d}| j+                  t&        j<                  d       | j                  j                  j                  j                  |       d| _        | j                  j                  j?                  | j@                         i | _         i | _!        | jD                  ;tG        jH                  tG        jJ                  | | jD                               d	| _"        y	y	)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iik88= 0 01.1F1FFKKKK&&++ +6txxAB
 dkk333<< !DLDJ DO(3S9C 6 67m334##**//4##**//4  #DOODM'2C:J4JKC 6 67m334KK&&++C0 DJDL DO
 zz]333!!-"7"78 5 56+6l8JK!!-"6"6!F##**//4 !3R 7+6>N8NO!!-"6"6!G##**//4..tzz:

 ::! MM&33D$**EFDJ	 "r    c                     | j                   j                  y | j                   j                  j                  | j                   j                        }|S r+   )r   r   rF   drop_privilegesrs   s     r   r   zSubprocess.set_uidu  s:    ;;??"kk!!11$++//B
r    c                 \    | j                   j                  |j                   j                  k  S r+   r   priorityr   others     r   __lt__zSubprocess.__lt__{  !    {{##ell&;&;;;r    c                 \    | j                   j                  |j                   j                  k(  S r+   r   r   s     r   __eq__zSubprocess.__eq__~  s!    {{##u||'<'<<<r    c           	          | j                   j                  }t        rt        |      j	                  d      }dt        |       d|dt        | j                               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__  sO     {{T?))*:;DtH&t~~'78: 	:r    c                     | j                   S r+   )r   r   s    r   r  zSubprocess.get_state  s    zzr    c                    t        j                          }| j                  }| j                  |       | j                  j                  j
                  }| j                  j                  j                  t        j                  kD  r$|t        j                  k(  rv| j                  j                  r| j                  j                  t        u r| j                          n| j                  | j                  j                  vr| j                          n|t        j                   k(  r3| j"                  s'| j                  j$                  rf| j                          nU|t        j&                  k(  rB| j(                  | j                  j*                  k  r|| j,                  kD  r| j                          t/        | j                  j0                        }|t        j2                  k(  r|| j"                  z
  | j                  j4                  kD  r|d| _        d| _        | j7                  t        j2                         | j9                  t        j:                         d| j                  j4                  z  }|j=                  d|d|       |t        j&                  k(  rN| j(                  | j                  j*                  kD  r*| j?                          d}|j=                  d|d|       y y |t        j@                  k(  ru| j,                  |z
  }|dk  r`| j                  j                  j
                  jC                  d|d| jD                  d	       | jG                  tH        jJ                         y y y )
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  st   iik

88=$$++;;##&6&A&AA,,,;;**{{..2HH

??$++2G2GG JJL-///;;((JJL-///<<4;;#;#;;TZZ'

 0 01M***T^^#dkk&;&;; 
 ##M$:$:;!!-"7"7846:kk6K6KL  SABM)))||dkk666 !SAB 7 m,,,

S(IA~ ##**//:E:>((D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   !   s    * CFENEIHNEKGGKEJHE+(
(
	0,%^ 	v>>v<<v>>v>>v==v>> @ @ @ @	
I!"?>G8R		 EN6,1
*/Sj-^[z<=	:>*r    r   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	FastCGISubprocessz7Extends Subprocess class to handle FastCGI subprocessesc                 >    t         j                  | |       d | _        y 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                  j                         | _        y)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  si     ::%&JKKtzz#34%15S_'N O O22==?r    c                 b    | j                          t        j                  |       }|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  s1     	t$;!DN
r    c                     d| _         y)zM
        Releases reference to FastCGI socket when process is reaped
        N)r   r   s    r   after_finishzFastCGISubprocess.after_finish  s    
 r    c                 T    t         j                  | ||      }| j                          |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  s)     ""4c2r    c                    | j                   j                         }| j                  j                  }|j	                  |d       |j	                  | j
                  d   d       | j                  j                  r |j	                  | j
                  d   d       n|j	                  | j
                  d   d       t        d|j                        D ]  }|j                  |        y)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 TZZ/3;;&&LLN3Q7LLN3Q7q'..) 	 AQ	 r    N)
r  r  r  r  r   r&  r   r)  r   r   r  r    r   r  r    s$    A	@	 r    r  c                   H    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)ProcessGroupBasec                     || _         i | _        | j                   j                  D ]*  }|j                  |       | j                  |j                  <   , y r+   )r   	processesprocess_configsmake_processrh   )r   r   pconfigs      r   r   zProcessGroupBase.__init__  sH    {{22 	FG+2+?+?+EDNN7<<(	Fr    c                 \    | j                   j                  |j                   j                  k  S r+   r   r   s     r   r   zProcessGroupBase.__lt__  r   r    c                 \    | j                   j                  |j                   j                  k(  S r+   r   r   s     r   r   zProcessGroupBase.__eq__  s!    {{##u||'<'<<<r    c                     | j                   j                  }t        rt        |      j	                  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__  sF     {{T?))*:;D15D157 	7r    c                 b    | j                   j                         D ]  }|j                           y r+   )r2  r#   r"   r   processs     r   r"   zProcessGroupBase.removelogs%  *    ~~,,. 	!G 	!r    c                 b    | j                   j                         D ]  }|j                           y r+   )r2  r#   r)   r<  s     r   r)   zProcessGroupBase.reopenlogs)  r>  r    c                    t        | j                  j                               }|j                          |j	                          |D ]~  }|j                         }|t        j                  k(  r|j                          7|t        j                  k(  r|j                          [|t        j                  k(  so|j                           y r+   )listr2  r#   sortreverser  r   r   r   r~   rW   r   )r   r2  procr   s       r   stop_allzProcessGroupBase.stop_all-  s    ..01	 
	DNN$E---		-000		-///
	r    c                     | j                   j                         D cg c]  }|j                         t        vs| c}S c c}w )z@ Processes which aren't in a state that is considered 'stopped' )r2  r#   r  r   )r   xs     r   get_unstopped_processesz(ProcessGroupBase.get_unstopped_processes>  s;     NN113 "qq{{}8  " 	" "s
   A A c                 ~    i }| j                   j                         D ]  }|j                  |j                          |S r+   )r2  r#   r   r   )r   r   r=  s      r   get_dispatchersz ProcessGroupBase.get_dispatchersC  s=    ~~,,. 	4Gw223	4r    c                      y r+   r  r   s    r   before_removezProcessGroupBase.before_removeI  s    r    N)r  r  r  r   r   r   r  r"   r)   rE  rH  rJ  rL  r  r    r   r0  r0    s5    F<=7!!""
r    r0  c                       e Zd Zd Zy)ProcessGroupc                 b    | j                   j                         D ]  }|j                           y r+   )r2  r#   r  )r   rD  s     r   r  zProcessGroup.transitionM  s(    NN))+ 	DOO	r    N)r  r  r  r  r  r    r   rN  rN  L  s    r    rN  c                       e Zd Zd Zy)FastCGIProcessGroupc                 `   t         j                  | |       |j                  dt              } ||j                  |j
                  j                        | _        	 | j                  j                          y # t        $ r.}t        d| j                  j                         d|      d }~ww xY w)NsocketManager)rq   z Could not create FastCGI socket r?   )rN  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.v/C/C6<nn6K6KM	**, 	''..0!5 	s   A6 6	B-?)B((B-Nr  r  r  r   r  r    r   rQ  rQ  Q  s    r    rQ  c                   J    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y)EventListenerPoolc                     t         j                  | |       g | _        d| _        d| _        d| _        | j                          y )Nr   )r0  r   event_bufferseriallast_dispatchdispatch_throttle
_subscriber   s     r   r   zEventListenerPool.__init__c  s;    !!$/!"r    c                     |j                   }| j                  j                         }||v r| j                  |j                  d       y y )NThead)r=  r2  r#   _acceptEventrc   )r   rc   r=  procss       r   handle_rejectedz!EventListenerPool.handle_rejectedk  sA    --%%'eekk5 r    c                    | j                   j                         }d}|D ]P  }|j                          |j                  t        j
                  k(  s1|j                  t        j                  k(  sOd}R |rd| j                  rGt        j                         }|| j                  k  r|| _        || j                  z
  | j                  k  ry | j                          y y )NFT)r2  r#   r  r   r   r   r  r   READYr`  rX   r_  dispatch)r   r2  dispatch_capabler=  ra   s        r   r  zEventListenerPool.transitionr  s    NN))+	   	,G  }} 5 55))-@-F-FF'+$	, %%iik+++ *-D&+++d.D.DDMMO r    c                 $    | j                          y r+   )_unsubscriber   s    r   rL  zEventListenerPool.before_remove  s    r    c                     | j                   rO| j                   j                  d      }| j                  |      }|s| j                  |d       n| j                   rOt	        j                         | _        y )Nr   Trc  )r]  pop_dispatchEventre  rX   r_  )r   rc   oks      r   rj  zEventListenerPool.dispatch  sg    %%))!,E$$U+B !!%d!3  "YY[r    c                    t        | j                  j                        }t        |d      st	        t
              |_        t        |d      si |_        | j                  j                  |j                  vr-t	        |       |j                  | j                  j                  <   ng| j                  j                  j                  j                  d|j                  |t        | j                        | j                  j                  fz         t        | j                        | j                  j                  k\  rf| j                  rZ| j                  j                  d      }| j                  j                  j                  j                  d|d|j                         |r| j                  j!                  d|       y | j                  j#                  |       y )Nr^  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GlobalSerialr^  rs  rF   rq   r   lenr]  buffer_sizero  r   insertappend)r   rc   rd  rm   discarded_events        r   re  zEventListenerPool._acceptEvent  s`      0 01uh'%l3ELun-!#E;;5#5#553=d3CEt{{//0KK&&,,H{C0A0A,B'')*+
 t  !T[[%<%<<  "&"3"3"7"7":##**00 /"8"8;< $$Q.$$U+r    c           	         |j                   | j                  j                     }| j                  j	                         D ]  }|j
                  t        j                  k7  r"|j                  t        j                  k(  s@t        |j                  j                        }|j                         }	 |j                  }|j                  }| j                  ||||      }|j!                  t#        |             t        j2                  |_        ||_        | j                  j,                  j.                  j1                  d|j                  d|        y y# t$        $ rl}	|	j&                  d   t(        j*                  k7  r | j                  j,                  j.                  j1                  d|j                  d|d       Y d }	~	d }	~	ww xY w)	Nr   z#epipe occurred while sending event z to listener z, listener state unchangedzevent z sent to listener TF)rs  r   rh   r2  r#   r   r   r   r  r   ri  r   payloadr:  r^  _eventEnveloper=   r   r5   r   r6   r7   rF   rq   r   BUSYrc   )
r   rc   pool_serialr=  rm   r|  
event_typer^  enveloper   s
             r   rp  z EventListenerPool._dispatchEvent  sl   (()9)9:~~,,. 	G}} 5 55%%)<)B)BB'(;(;<--/!&J"\\F#22:v3> IHMM(8"45 *=)A)A& %##**00LL+/0 7	: #  xx{ekk1KK''..44 k34 s   .AE	GA!GGc           	          t        j                  |      }t        |      }d| j                  j                  j
                  || j                  j                  ||||d}d|z  S )Nz3.0)versidr^  	pool_namer  
event_namerv  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   getEventNameByTyperv  r   rF   
identifierrh   )r   r  r^  r  r|  r  payload_lenDs           r   r}  z EventListenerPool._eventEnvelope  si    ..z:
'l++%%00((%#	DFGH 	Ir    c                     | j                   j                  D ]"  }t        j                  || j                         $ t        j                  t        j
                  | j                         y r+   )r   pool_eventsr   	subscribere  r   rg  r   r  s     r   ra  zEventListenerPool._subscribe  sM    ++11 	<JZ):):;	<22D4H4HIr    c                     | j                   j                  D ]"  }t        j                  || j                         $ t        j                  t        j
                  | j                         y r+   )r   r  r   unsubscribere  r   rg  r  s     r   rm  zEventListenerPool._unsubscribe  sM    ++11 	>Jz4+<+<=	>644d6J6JKr    N)F)r  r  r  r   rg  r  rL  rj  re  rp  r}  ra  rm  r  r    r   rZ  rZ  b  s8    6.
),: DI"J
Lr    rZ  c                       e Zd Zd Zy)ru  c                     d| _         y )Nr\  )r^  r   s    r   r   zGlobalSerial.__init__  s	    r    NrX  r  r    r   ru  ru    s    r    ru  c                 x    | j                   t        k(  rd| _         | xj                   dz  c_         | j                   S )Nr\  rV   )r^  r   )insts    r   rt  rt    s-    {{fKK1K;;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  rN  rQ  rZ  ru  rt  r  r    r   <module>r     s      	     $ & ' ! 5 + . 8 , 1 & ; 6  7 3
l
* l
* l
*\; 
 ; z <v < <|# 
, "NL( NLb6  ~r    