o
    f]K                     @   s   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 dZG dd deZG dd deZG dd deZdZdZdd ZG dd deZdd ZdS )    N)find_prefix_at_end)compact_traceback)	as_string)notify)EventRejectedEvent)ProcessLogStderrEvent)ProcessLogStdoutEvent)EventListenerStates) getEventListenerStateDescription)loggersc                   @   s\   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd ZdS )PDispatcherz{ Asyncore dispatcher for mainloop, representing a process channel
    (stdin, stdout, or stderr).  This class is abstract. Fc                 C   s   || _ || _|| _d| _d S NF)processchannelfdclosedselfr   r   r    r   I/var/www/html/venv/lib/python3.10/site-packages/supervisor/dispatchers.py__init__   s   
zPDispatcher.__init__c                 C   s   d| j jt| | j| jf S )Nz<%s at %s for %s (%s)>)	__class____name__idr   r   r   r   r   r   __repr__   s
   zPDispatcher.__repr__c                 C      t NNotImplementedErrorr   r   r   r   readable       zPDispatcher.readablec                 C   r   r   r   r   r   r   r   writable#   r!   zPDispatcher.writablec                 C   r   r   r   r   r   r   r   handle_read_event&   r!   zPDispatcher.handle_read_eventc                 C   r   r   r   r   r   r   r   handle_write_event)   r!   zPDispatcher.handle_write_eventc                 C   s<   t  \}}}}| jjjjdt| |||f  |   d S )Nz:uncaptured python exception, closing channel %s (%s:%s %s))r   r   configoptionsloggercriticalreprclose)r   niltvtbinfor   r   r   handle_error,   s   zPDispatcher.handle_errorc                 C   s0   | j s| jjjjd| j| f  d| _ d S d S )Nz#fd %s closed, stopped monitoring %sT)r   r   r%   r&   r'   debugr   r   r   r   r   r*   9   s   
zPDispatcher.closec                 C   s   d S r   r   r   r   r   r   flush?   r!   zPDispatcher.flushN)r   
__module____qualname____doc__r   r   r   r    r"   r#   r$   r/   r*   r1   r   r   r   r   r      s    r   c                   @   s|   e Zd ZdZdZdZdZdZdZdd Z	dd Z
d	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )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.
    NF    c                 C   s   || _ || _|| _| jj| _|   |   | j| _| jj}| jj	}|t
|f| _|t
|f| _tjj| _| j j}|jj| jk| _|j| _|j| _dS )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_levelr%   r&   loglevellog_to_mainlogstdout_events_enabledstderr_events_enabled)r   r   r7   r   
begintokenendtokenr%   r   r   r   r   T   s    

zPOutputDispatcher.__init__c                 C   s   | j j}| j}t|d| }t|d| }t|d| }t|d| }|s'|r-|j | _|r=tj| j|d|  ||d |rLtj	| j|j
d d d	S d	S )
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)rO   N)r   r%   r   getattrr&   	getLoggerr:   r   handle_filehandle_syslogname)r   r%   r   logfilerQ   rR   	to_syslogr   r   r   r8   p   s.   	
z!POutputDispatcher._init_normallogc                 C   sB   t | jjd| j }|r| jjj | _tj| jd|d dS dS )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_maxbytesrM   )rO   rQ   N)	rS   r   r%   r   r&   rT   
capturelogr   handle_boundIO)r   capture_maxbytesr   r   r   r9      s   
z"POutputDispatcher._init_capturelogc                 C   s:   | j | jfD ]}|d ur|jD ]
}|  |  qqd S r   )r:   rZ   handlersremovereopenr   loghandlerr   r   r   
removelogs   s   

zPOutputDispatcher.removelogsc                 C   s2   | j | jfD ]}|d ur|jD ]}|  qqd S r   )r:   rZ   r]   r_   r`   r   r   r   
reopenlogs   s   

zPOutputDispatcher.reopenlogsc                 C   s   |ro| j j}|jjrt|}| jr| j| | jrHt|t	s"|}nz|
d}W n ty6   d| }Y nw d}|jjj| j||j| j|d | jdkr_| jr]tt| j | j j| d S d S | jrqtt| j | j j| d S d S d S )Nzutf-8Undecodable: %rz%%(name)r %(channel)s output:
%(data)s)rW   r   datastdout)r   r%   r&   
strip_ansistripEscapesr;   inforE   
isinstancebytesdecodeUnicodeDecodeErrorr'   ra   rC   rW   r   rF   r   r   pidrG   r   )r   rf   r%   textmsgr   r   r   _log   sF   


zPOutputDispatcher._logc                 C   s   | j d u r| j}d| _| | d S | jr| j\}}n| j\}}t| j|kr)d S | j}d| _z
||d\}}W n) tyb   d }t	||}|r[| j|| d   | _|d |  }| | Y nw | | | 
  || _|rw|   d S d S )Nr6      )rZ   output_bufferrr   capturemoder@   r?   r>   split
ValueErrorr   toggle_capturemoderecord_output)r   rf   tokentokenlenbeforeafterindexr   r   r   ry      s8   




zPOutputDispatcher.record_outputc                 C   s   | j  | _ | jd ur\| j r| j| _d S | jjD ]}|  q| j }| j}| jjj	}| 
| j| jj|}t| d}| jjjjj|||d | jjD ]
}|  |  qK| j| _d S d S )Nz-%(procname)r %(channel)s emitted a comm event)procnamer   )ru   rZ   r;   r]   r1   getvaluer   r   r%   rW   r7   ro   r   r&   r'   r0   r^   r_   r:   )r   rb   rf   r   r   eventrq   r   r   r   rx      s*   





z$POutputDispatcher.toggle_capturemodec                 C      dS r   r   r   r   r   r   r"   	  r!   zPOutputDispatcher.writablec                 C      | j rdS dS NFTr   r   r   r   r   r         zPOutputDispatcher.readablec                 C   s<   | j jj| j}|  j|7  _|   |s|   d S d S r   )r   r%   r&   readfdr   rt   ry   r*   )r   rf   r   r   r   r#     s   z#POutputDispatcher.handle_read_event)r   r2   r3   r4   r;   r:   rZ   ru   rt   r   r8   r9   rc   rd   rr   ry   rx   r"   r    r#   r   r   r   r   r5   B   s$      $r5   c                   @   sx   e Zd ZdZdZdZdZdZeeZ	eeZ
dd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd ZdS )PEventListenerDispatcherzN An output dispatcher that monitors and changes a process'
    listener_state Nr6   s   READY
s   RESULT c                 C   s   t | ||| tj| j_d | j_d| _d | _t	|j
d| }|rHt	|j
d| }t	|j
d| }|j
j | _tj| j|d|  ||d d S d S )Nr6   rJ   rK   rL   rM   )rP   rQ   rR   )r   r   r	   ACKNOWLEDGEDr   listener_stater   result	resultlenrS   r%   r&   rT   r;   r   rU   )r   r   r   r   rX   rQ   rR   r   r   r   r   &  s&   

z!PEventListenerDispatcher.__init__c                 C   s0   | j d ur| j jD ]}|  |  q	d S d S r   )r;   r]   r^   r_   r   rb   r   r   r   rc   >  s   

z#PEventListenerDispatcher.removelogsc                 C   s(   | j d ur| j jD ]}|  q	d S d S r   )r;   r]   r_   r   r   r   r   rd   D  s
   

z#PEventListenerDispatcher.reopenlogsc                 C   r   r   r   r   r   r   r   r"   J  r!   z!PEventListenerDispatcher.writablec                 C   r   r   r   r   r   r   r   r    M  r   z!PEventListenerDispatcher.readablec                 C   s   | j jj| j}|r<|  j|7  _| j jj}d|| j|f }| j jjj	| | j
r;| j jjjr5t|}| j
| n|   |   d S )Nz%r %s output:
%s)r   r%   r&   r   r   state_bufferrW   r   r'   r0   r;   rh   ri   rj   r*   handle_listener_state_change)r   rf   r   rq   r   r   r   r#   R  s   
z*PEventListenerDispatcher.handle_read_eventc           
      C   sT  | j }|sd S | j}|jj}|j}|tjkrd| _ d S |tjkr[t|| j	k r)d S |
| jrD| tj | j	}| j |d  | _ d |_n| tj d| _ d |_| j rY|   d S d S |tjkrn| tj d| _ d |_d S |tjkr&| jd u r|d}|dkrd S | j d | }| j |d d  | _ || jd  }zt|| _W nx ty   zt|}W n ty   d| }Y nw |jjjd||f  | tj d| _ tt||j d |_Y d S w | jt| j }	|	r	|  j| j d |	 7  _| j |	d  | _ | jt| j }	|	s| | j d | j_d| _d | _| j r(|   d S d S d S )Nr6      
rs   re   z%s: bad result line: '%s')r   r   r%   rW   r   r	   UNKNOWNr   r>   READY_FOR_EVENTS_LEN
startswithREADY_FOR_EVENTS_TOKEN_change_listener_stateREADYr   r   BUSYr   findRESULT_TOKEN_START_LENintrw   r   rn   r&   r'   warnr   r   r   handle_result)
r   rf   r   r   stater{   posresult_liner   neededr   r   r   r   f  s   






*z5PEventListenerDispatcher.handle_listener_state_changec                 C   s   | j }|jj}|jjj}z| j jj|j| |d|  | 	t
j W d S  tyE   |d|  | 	t
j tt||j Y d S    |d|  | 	t
j tt||j Y d S )Nz%s: event was processedz%s: event was rejectedz%s: event caused an error)r   r%   rW   r&   r'   groupresult_handlerr   r0   r   r	   r   RejectEventr   r   r   r   )r   r   r   r   r'   r   r   r   r     s   
z&PEventListenerDispatcher.handle_resultc                 C   sj   | j }|jj}|j}d|t|t|f }|jjj| ||_|tj	kr3d| }|jjj
| d S d S )Nz%s: %s -> %sz%s: has entered the UNKNOWN state and will no longer receive events, this usually indicates the process violated the eventlistener protocol)r   r%   rW   r   r
   r&   r'   r0   r	   r   r   )r   	new_stater   r   	old_staterq   r   r   r   r     s    
z/PEventListenerDispatcher._change_listener_state)r   r2   r3   r4   r;   r   r   RESULT_TOKEN_STARTr>   r   r   r   rc   rd   r"   r    r#   r   r   r   r   r   r   r   r     s"    Wr   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )PInputDispatcherz Input (stdin) dispatcher c                 C   s   t | ||| d| _d S )Nr6   )r   r   input_bufferr   r   r   r   r     s   
zPInputDispatcher.__init__c                 C   s   | j r| jsdS dS )NTF)r   r   r   r   r   r   r"     s   zPInputDispatcher.writablec                 C   r   r   r   r   r   r   r   r      r!   zPInputDispatcher.readablec                 C   s*   | j jj| j| j}| j|d  | _d S r   )r   r%   r&   writer   r   )r   sentr   r   r   r1     s   zPInputDispatcher.flushc              
   C   sb   | j r/z|   W d S  ty. } z|jd tjkr"d| _ |   n W Y d }~d S d }~ww d S )Nr   r6   )r   r1   OSErrorargserrnoEPIPEr*   )r   whyr   r   r   r$     s   
z#PInputDispatcher.handle_write_eventN)	r   r2   r3   r4   r   r"   r    r1   r$   r   r   r   r   r     s    r   s   [)   H   f   A   B   C   D   R   s   u   J   K   h   l   p   mc                 C   s   d}d}d}t | }||k rG|dkr| ||d  tv rd}n |r?| t|}|dkr3|| |d  S || ||  }|}d}|d7 }||k s|S )z>
    Remove all ANSI color escapes from the given string.
    r6   rs   r   r   N)r>   ANSI_TERMINATORSr   ANSI_ESCAPE_BEGIN)sr   showiLnr   r   r   ri     s"   ri   c                   @   s   e Zd ZdZdS )r   zY The exception type expected by a dispatcher when a handler wants
    to reject an event N)r   r2   r3   r4   r   r   r   r   r     s    r   c                 C   s   |dkrt |d S )Ns   OK)r   )r   responser   r   r   default_handler   s   r   )r   supervisor.medusa.asynchat_25r   supervisor.medusa.asyncore_25r   supervisor.compatr   supervisor.eventsr   r   r   r   supervisor.statesr	   r
   
supervisorr   r   r5   r   r   r   r   ri   	Exceptionr   r   r   r   r   r   <module>   s,    4 Z H 