
    Ac]K                        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  G d d      Z G d de      Z G d de      Z G d de      ZdZdZd Z G d de      Zd Zy)    N)find_prefix_at_end)compact_traceback)	as_string)notify)EventRejectedEvent)ProcessLogStderrEvent)ProcessLogStdoutEvent)EventListenerStates) getEventListenerStateDescription)loggersc                   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 Zy)PDispatcherz{ Asyncore dispatcher for mainloop, representing a process channel
    (stdin, stdout, or stderr).  This class is abstract. Fc                 <    || _         || _        || _        d| _        y NF)processchannelfdclosedselfr   r   r   s       8/usr/lib/python3/dist-packages/supervisor/dispatchers.py__init__zPDispatcher.__init__   s        c           	          d| j                   j                  dt        |       d| j                  d| j                  d	S )N<z at z for  (z)>)	__class____name__idr   r   r   s    r   __repr__zPDispatcher.__repr__   s.    +/>>+B+B+-d8+/<<+/<<9 	9r   c                     t         NNotImplementedErrorr    s    r   readablezPDispatcher.readable        !!r   c                     t         r#   r$   r    s    r   writablezPDispatcher.writable#   r'   r   c                     t         r#   r$   r    s    r   handle_read_eventzPDispatcher.handle_read_event&   r'   r   c                     t         r#   r$   r    s    r   handle_write_eventzPDispatcher.handle_write_event)   r'   r   c                     t               \  }}}}| j                  j                  j                  j                  j                  dt        |       d|d|d|d	       | j                          y )Nz-uncaptured python exception, closing channel r   : ))r   r   configoptionsloggercriticalreprclose)r   niltvtbinfos        r   handle_errorzPDispatcher.handle_error,   sW    -/Q6##**33T
		 	

r   c                     | j                   sQ| j                  j                  j                  j                  j                  d| j                  d|        d| _         y y )Nzfd z closed, stopped monitoring T)r   r   r2   r3   r4   debugr   r    s    r   r7   zPDispatcher.close9   sF    {{LL''..449=$GIDK r   c                      y r#    r    s    r   flushzPDispatcher.flush?   s    r   N)r   
__module____qualname____doc__r   r   r!   r&   r)   r+   r-   r<   r7   rA   r@   r   r   r   r      s;    = F9""""r   r   c                   f    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y)POutputDispatcherae  
    Dispatcher for one channel (stdout or stderr) of one process.
    Serves several purposes:

    - capture output sent within <!--XSUPERVISOR:BEGIN--> and
      <!--XSUPERVISOR:END--> tags and signal a ProcessCommunicationEvent
      by calling notify(event).
    - route the output to the appropriate log handlers as specified in the
      config.
    NFr   c                 d   || _         || _        || _        | j                  j                  | _        | j	                          | j                          | j                  | _        | j                  j                  }| j                  j                  }|t        |      f| _        |t        |      f| _        t        j                  j                  | _        | j                   j"                  }|j$                  j&                  | j                   k  | _        |j*                  | _        |j,                  | _        y)z
        Initialize the dispatcher.

        `event_type` should be one of ProcessLogStdoutEvent or
        ProcessLogStderrEvent
        N)r   
event_typer   r   _init_normallog_init_capturelog	normallogchildlogBEGIN_TOKEN	END_TOKENlenbegintoken_dataendtoken_datar   LevelsByNameDEBGmainlog_levelr2   r3   loglevellog_to_mainlogstdout_events_enabledstderr_events_enabled)r   r   rH   r   
begintokenendtokenr2   s          r   r   zPOutputDispatcher.__init__T   s     $.. __00
??,, *C
O<&H6$1166$$$nn559K9KK%+%A%A"%+%A%A"r   c                    | j                   j                  }| j                  }t        |d|z        }t        |d|z        }t        |d|z        }t        |d|z        }|s|r|j                  j                         | _        |r't        j                  | j                  |d|  ||       |r/t        j                  | j                  |j                  dz          y	y	)
z
        Configure the "normal" (non-capture) log for this channel of this
        process.  Sets self.normallog if logging is enabled.
        
%s_logfile%s_logfile_maxbytes%s_logfile_backupsz	%s_syslog%(message)s)filenamefmtrotatingmaxbytesbackupsz %(message)s)ra   N)r   r2   r   getattrr3   	getLoggerrK   r   handle_filehandle_syslogname)r   r2   r   logfilerc   rd   	to_syslogs          r   rI   z!POutputDispatcher._init_normallogp   s    
 $$,,&,"896#87#BC&"6"@AFK'$9:	i#^^557DN !!)\)! !!KK.0 r   c                    t        | j                  j                  d| j                  z        }|rV| j                  j                  j                  j                         | _        t        j                  | j                  d|       yy)z
        Configure the capture log for this process.  This log is used to
        temporarily capture output when special output is detected.
        Sets self.capturelog if capturing is enabled.
        z%s_capture_maxbytesr_   )ra   rc   N)	re   r   r2   r   r3   rf   
capturelogr   handle_boundIO)r   capture_maxbytess     r   rJ   z"POutputDispatcher._init_capturelog   sk     #4<<#6#6#84<<#GI"ll1199CCEDO""!) r   c                     | j                   | j                  fD ]6  }||j                  D ]"  }|j                          |j	                          $ 8 y r#   )rK   rm   handlersremovereopenr   loghandlers      r   
removelogszPOutputDispatcher.removelogs   sJ    NNDOO4 	%C"|| %GNN$NN$%	%r   c                     | j                   | j                  fD ]&  }||j                  D ]  }|j                           ( y r#   )rK   rm   rq   rs   rt   s      r   
reopenlogszPOutputDispatcher.reopenlogs   s@    NNDOO4 	%C"|| %GNN$%	%r   c                 
   |rl| j                   j                  }|j                  j                  rt	        |      }| j
                  r| j
                  j                  |       | j                  rot        |t              s|}n	 |j                  d      }d}|j                  j                  j                  | j                  ||j                  | j                   |       | j                   dk(  rB| j"                  r5t%        t'        | j                   | j                   j(                  |             y y | j*                  r5t%        t-        | j                   | j                   j(                  |             y y y # t        $ r d|z  }Y w xY w)Nzutf-8Undecodable: %rz%%(name)r %(channel)s output:
%(data)s)ri   r   datastdout)r   r2   r3   
strip_ansistripEscapesrL   inforV   
isinstancebytesdecodeUnicodeDecodeErrorr4   ru   rT   ri   r   rW   r   r	   pidrX   r   )r   r|   r2   textmsgs        r   _logzPOutputDispatcher._log   sC   \\((F~~((#D)}}""4(""!$.D8#{{73 ?%%))&&&++ LLt * 5 ||x'---dll LL,,d4 . ---dll LL,,d4 .3  . 80478s   E1 1FFc                 R   | j                   %| j                  }d| _        | j                  |       y | j                  r| j                  \  }}n| j
                  \  }}t        | j                        |k  ry | j                  }d| _        	 |j                  |d      \  }}| j                  |       | j                          || _        |r| j                          y y # t        $ rB d }t        ||      }|r| j                  || d  z   | _        |d |  }| j                  |       Y ^w xY w)Nr      )rm   output_bufferr   capturemoderQ   rP   rO   splittoggle_capturemode
ValueErrorr   record_output)r   r|   tokentokenlenbeforeafterindexs          r   r   zPOutputDispatcher.record_output   s$   ??"%%D!$DIIdO"00OE8"22OE8t!!"h.!! 	' JJua0MFE IIf##%!&D    	E&tU3E%)%7%7$vw-%G"GeV}IIdO	s   
C AD&%D&c                    | j                    | _         | j                  V| j                   r| j                  | _        y | j                  j                  D ]  }|j	                           | j                  j                         }| j                  }| j                  j                  j                  }| j                  | j                  | j                  j                  |      }t        |       d}| j                  j                  j                  j                  j                  |||       | j                  j                  D ]"  }|j!                          |j#                          $ | j$                  | _        y y )Nz-%(procname)r %(channel)s emitted a comm event)procnamer   )r   rm   rL   rq   rA   getvaluer   r   r2   ri   rH   r   r   r3   r4   r>   rr   rs   rK   )r   rv   r|   r   r   eventr   s          r   r   z$POutputDispatcher.toggle_capturemode   s"   #///??& $#77 $GMMO$//1,,<<..33dll6F6FMuE##++2288BJAH 9 J  $77 %GNN$NN$% !%' 'r   c                      yr   r@   r    s    r   r)   zPOutputDispatcher.writable	      r   c                     | j                   ryyNFTr   r    s    r   r&   zPOutputDispatcher.readable      ;;r   c                     | j                   j                  j                  j                  | j                        }| xj
                  |z  c_        | j                          |s| j                          y y r#   )r   r2   r3   readfdr   r   r   r7   )r   r|   s     r   r+   z#POutputDispatcher.handle_read_event  sV    ||""**11$'':d" JJL	 r   )r   rB   rC   rD   rL   rK   rm   r   r   r   rI   rJ   rw   ry   r   r   r   r)   r&   r+   r@   r   r   rF   rF   B   s]    	 HIJKMB8@ %%@"!H/0
r   rF   c                   v    e Zd ZdZdZdZdZdZ ee      Z	 ee      Z
d Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zy)PEventListenerDispatcherzN An output dispatcher that monitors and changes a process'
    listener_state Nr   s   READY
s   RESULT c                    t         j                  | |||       t        j                  | j                  _        d | j                  _        d| _        d | _        t        |j                  d|z        }|rt        |j                  d|z        }t        |j                  d|z        }|j                  j                  j                         | _        t        j                  | j                  |d|  ||       y y )Nr   r\   r]   r^   r_   )rb   rc   rd   )r   r   r
   ACKNOWLEDGEDr   listener_stater   result	resultlenre   r2   r3   rf   rL   r   rg   )r   r   r   r   rj   rc   rd   s          r   r   z!PEventListenerDispatcher.__init__&  s    T7GR8 ':&F&F#!'..,*@Aw~~/Dw/NOHgnn.BW.LMG#NN22<<>DM!)\)!	 r   c                     | j                   <| j                   j                  D ]"  }|j                          |j                          $ y y r#   )rL   rq   rr   rs   r   rv   s     r   rw   z#PEventListenerDispatcher.removelogs>  s>    ==$==11 !  ! %r   c                 t    | j                   ,| j                   j                  D ]  }|j                           y y r#   )rL   rq   rs   r   s     r   ry   z#PEventListenerDispatcher.reopenlogsD  s4    ==$==11 ! ! %r   c                      yr   r@   r    s    r   r)   z!PEventListenerDispatcher.writableJ  r   r   c                     | j                   ryyr   r   r    s    r   r&   z!PEventListenerDispatcher.readableM  r   r   c                 x   | j                   j                  j                  j                  | j                        }|r| xj
                  |z  c_        | j                   j                  j                  }|d| j                  d|}| j                   j                  j                  j                  j                  |       | j                  ra| j                   j                  j                  j                  rt        |      }| j                  j                  |       n| j                          | j                          y )Nr0   z	 output:
)r   r2   r3   r   r   state_bufferri   r   r4   r>   rL   r~   r   r   r7   handle_listener_state_change)r   r|   r   r   s       r   r+   z*PEventListenerDispatcher.handle_read_eventR  s    ||""**11$'':%||**//H)14<<FCLL''..44S9}}<<&&..99'-D""4(
 JJL))+r   c                    | j                   }|sy | j                  }|j                  j                  }|j                  }|t
        j                  k(  rd| _         y |t
        j                  k(  rt        |      | j                  k  ry |j                  | j                        rG| j                  t
        j                         | j                  }| j                   |d  | _         d |_        n-| j                  t
        j                         d| _         d |_        | j                   r| j                          y y |t
        j                  k(  r.| j                  t
        j                         d| _         d |_        y |t
        j                   k(  r@| j"                  ^|j%                  d      }|dk(  ry | j                   d | }| j                   |dz   d  | _         || j&                  d  }	 t)        |      | _        n| j"                  t        | j:                        z
  }	|	rX| xj:                  | j                   d |	 z  c_        | j                   |	d  | _         | j"                  t        | j:                        z
  }	|	s:| j=                  | j:                         d | j                  _        d| _        d | _        | j                   r| j                          y y y # t*        $ r 	 t-        |      }n# t.        $ r d|z  }Y nw xY w|j                  j0                  j2                  j5                  |d|d       | j                  t
        j                         d| _         t7        t9        ||j                               d |_        Y y w xY w)Nr      
r   r{   z: bad result line: '')r   r   r2   ri   r   r
   UNKNOWNr   rO   READY_FOR_EVENTS_LEN
startswithREADY_FOR_EVENTS_TOKEN_change_listener_stateREADYr   r   BUSYr   findRESULT_TOKEN_START_LENintr   r   r   r3   r4   warnr   r   r   handle_result)
r   r|   r   r   stater   posresult_liner   neededs
             r   r   z5PEventListenerDispatcher.handle_listener_state_changef  s     ,,>>&&&&'/// #D'4444y4444!<!<=++,?,E,EF44$($5$5hi$@! $++,?,G,GH$'! $  113)///''(;(C(CD #D GM)...~~%ii&"9 "//5$($5$5c!ef$=!'(C(C(DE	%(^DN  #dkk*::KK4#4#4Wf#==K(,(9(9&'(BD%!^^c$++.>>F&&t{{3)-DLL&"%DK%)DN  113 !U / " F&/&<- F&7+&EFNN**11669A;O //0C0K0KL(+D%-gw}}EF$(GMs7    K 	M6KM6K/,M6.K//BM65M6c                    | j                   }|j                  j                  }|j                  j                  j                  }	 | j                   j
                  j                  j                  |j                  |       |j                  d|z         | j                  t        j                         y # t        $ rU |j                  d|z         | j                  t        j                         t        t        ||j                               Y y  |j                  d|z         | j                  t        j                          t        t        ||j                               Y y xY w)Nz%s: event was processedz%s: event was rejectedz%s: event caused an error)r   r2   ri   r3   r4   groupresult_handlerr   r>   r   r
   r   RejectEventr   r   r   r   )r   r   r   r   r4   s        r   r   z&PEventListenerDispatcher.handle_result  s   ,,>>&&''..	?LL%%44W]]FKLL2X=>''(;(H(HI 	?KK08;<''(;(H(HI%gw}}=>	?KK3h>?''(;(C(CD%gw}}=>s   A-B2 2AE$AE$c                    | j                   }|j                  j                  }|j                  }|dt	        |      dt	        |      }|j                  j
                  j                  j                  |       ||_        |t        j                  k(  r5d|z  }|j                  j
                  j                  j                  |       y y )Nz: z -> z%s: has entered the UNKNOWN state and will no longer receive events, this usually indicates the process violated the eventlistener protocol)r   r2   ri   r   r   r3   r4   r>   r
   r   r   )r   	new_stater   r   	old_stater   s         r   r   z/PEventListenerDispatcher._change_listener_state  s    ,,>>&&**	 ,Y7,Y7
 	%%++C0!*+3339;CDC NN""))..s3	 4r   )r   rB   rC   rD   rL   r   r   RESULT_TOKEN_STARTrO   r   r   r   rw   ry   r)   r&   r+   r   r   r   r@   r   r   r   r     sd    HL'#56 !340!!
,(U4n?$4r   r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)PInputDispatcherz Input (stdin) dispatcher c                 B    t         j                  | |||       d| _        y )Nr   )r   r   input_bufferr   s       r   r   zPInputDispatcher.__init__  s    T7GR8r   c                 6    | j                   r| j                  syy)NTF)r   r   r    s    r   r)   zPInputDispatcher.writable  s    T[[r   c                      yr   r@   r    s    r   r&   zPInputDispatcher.readable  r   r   c                     | j                   j                  j                  j                  | j                  | j
                        }| j
                  |d  | _        y r#   )r   r2   r3   writer   r   )r   sents     r   rA   zPInputDispatcher.flush  sG    ||""**00151B1BD --de4r   c                     | j                   r	 | j                          y y # t        $ rC}|j                  d   t        j
                  k(  rd| _         | j                          n Y d }~y d }~ww xY w)Nr   r   )r   rA   OSErrorargserrnoEPIPEr7   )r   whys     r   r-   z#PInputDispatcher.handle_write_event  s]    

   88A;%++-(+D%JJL !s     	A,9A''A,N)	r   rB   rC   rD   r   r)   r&   rA   r-   r@   r   r   r   r     s    $ 
5	r   r   s   [)   H   f   A   B   C   D   R   s   u   J   K   h   l   p   mc                     d}d}d}t        |       }||k  rR|dk(  r| ||dz    t        v rd}n1|r/| j                  t        |      }|dk(  r|| |d z   S || || z   }|}d}|dz  }||k  rR|S )z>
    Remove all ANSI color escapes from the given string.
    r   r   r   r   N)rO   ANSI_TERMINATORSr   ANSI_ESCAPE_BEGIN)sr   showiLns         r   r   r     s     FD	AAA
a%191QU'77D(!,ABw!"~%!Aa&	Q a% Mr   c                       e Zd ZdZy)r   zY The exception type expected by a dispatcher when a handler wants
    to reject an event N)r   rB   rC   rD   r@   r   r   r   r     s    r   r   c                 $    |dk7  rt        |      y )Ns   OK)r   )r   responses     r   default_handlerr      s    5(## r   )r   supervisor.medusa.asynchat_25r   supervisor.medusa.asyncore_25r   supervisor.compatr   supervisor.eventsr   r   r   r	   supervisor.statesr
   r   
supervisorr   r   rF   r   r   r   r   r   	Exceptionr   r   r@   r   r   <module>r      s     < ; ' $ 0 3 3 1 > 2 2hW WrE4{ E4N{ @  2 ,) $r   