o
    r¨Êh]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   úH/var/www/html/env/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r„d 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 