o
    ›¨Êh)F  ã                   @   sð   d 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mZ dd	lmZ dd
lmZmZ dZdZdZdZdZdZdZdZdZG dd„ dƒZG dd„ dejƒZdd„ Z ddd„Z!e"dkrve!ƒ  dS dS )z0Graphical monitor of Celery events using curses.é    N)Údatetime)Úcount)Úceil)Úwrap)Útime)ÚVERSION_BANNERÚstates)Úapp_or_default)ÚabbrÚabbrtask)ÚCursesMonitorÚevtopé   é   é$   é   é   é   zGevents: {s.event_count} tasks:{s.task_count} workers:{w_alive}/{w_all}
c                   @   sf  e Zd ZdZi ZdZdZdZdZdZ	e
jZe
jZdZdZdZd	e› �Zd
ZdGdd„Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ ZdHd d!„Z e
j!d"e
j"d#e
j#d$iZ$d%d&„ Z%dGd'd(„Z&d)d*„ Z'd+d,„ Z(d-d.„ Z)d/d0„ Z*d1d2„ Z+d3d4„ Z,d5d6„ Z-d7d8„ Z.d9d:„ Z/d;d<„ Z0d=d>„ Z1d?d@„ Z2dAdB„ Z3edCdD„ ƒZ4edEdF„ ƒZ5dS )Ir   z#A curses based Celery task monitor.Né
   r   z
Selected: zWorkers online: zKeys: z9j:down k:up i:info t:traceback r:result c:revoke ^c: quitzcelery events zInfo: c                 C   s\   || _ |p| j| _|| _| j| j| j| j| j| j| j	dœ}t
|fi | j¤Ž| _t ¡ | _d S )N)ÚJÚKÚCÚTÚRÚIÚL)ÚappÚkeymapÚstateÚmove_selection_downÚmove_selection_upÚrevoke_selectionÚselection_tracebackÚselection_resultÚselection_infoÚselection_rate_limitÚdictÚ	threadingÚRLockÚlock)Úselfr   r   r   Údefault_keymap© r,   úI/var/www/html/env/lib/python3.10/site-packages/celery/events/cursesmon.pyÚ__init__3   s   ù	zCursesMonitor.__init__c              
   C   sü   | j }|d t d t }|d t d t }|tk r|}	nt}	||	 d }tt|d ƒƒ}
||
 d }t||	ƒ 	|	¡}t||ƒ 	|¡}t
||
ƒ 	|
¡}t|tƒ 	t¡}| 	t¡}|› d|› d|› d|› d|› d�
}| jd u rxt|d |… ƒ| _|d |… S )Né   g       @ú )Údisplay_widthÚSTATE_WIDTHÚTIMESTAMP_WIDTHÚMIN_TASK_WIDTHÚMIN_WORKER_WIDTHÚ
UUID_WIDTHÚintr   r
   Úljustr   Úscreen_widthÚlen)r*   ÚuuidÚtaskÚworkerÚ	timestampr   ÚmxÚdetail_widthÚ
uuid_spaceÚ
uuid_widthÚ
task_widthÚworker_widthÚrowr,   r,   r-   Ú
format_rowC   s$   
"
zCursesMonitor.format_rowc                 C   s   | j  ¡ \}}|S ©N©ÚwinÚgetmaxyx©r*   Ú_r?   r,   r,   r-   r9   ^   ó   zCursesMonitor.screen_widthc                 C   s   | j  ¡ \}}|S rG   rH   ©r*   ÚmyrL   r,   r,   r-   Úscreen_heightc   rM   zCursesMonitor.screen_heightc                 C   s   | j  ¡ \}}|t S rG   )rI   rJ   ÚBORDER_SPACINGrK   r,   r,   r-   r1   h   ó   zCursesMonitor.display_widthc                 C   s   | j  ¡ \}}|d S )Nr   rH   rN   r,   r,   r-   Údisplay_heightm   rR   zCursesMonitor.display_heightc                 C   s   | j S rG   )rS   ©r*   r,   r,   r-   Úlimitr   s   zCursesMonitor.limitc                 C   s8   | j sdS t| j ƒD ]\}}| j|d kr|  S q
dS ©Nr   )ÚtasksÚ	enumerateÚselected_task)r*   ÚiÚer,   r,   r-   Úfind_positionv   s   ÿzCursesMonitor.find_positionc                 C   ó   |   d¡ d S )Néÿÿÿÿ©Úmove_selectionrT   r,   r,   r-   r    ~   ó   zCursesMonitor.move_selection_upc                 C   r]   )Nr/   r_   rT   r,   r,   r-   r   �   ra   z!CursesMonitor.move_selection_downr/   c                 C   sR   | j sd S |  ¡ }z| j ||  d | _W d S  ty(   | j d d | _Y d S w rV   )rW   r\   rY   Ú
IndexError)r*   Ú	directionÚposr,   r,   r-   r`   „   s   ÿzCursesMonitor.move_selectionr   r   r   c                 C   sZ   z	| j  ¡  ¡ }W n
 ty   Y d S w | j |¡p|}| j |¡}|d ur+|ƒ  d S d S rG   )rI   ÚgetkeyÚupperÚ	ExceptionÚkeyaliasÚgetr   )r*   ÚkeyÚhandlerr,   r,   r-   Úhandle_keypress‘   s   ÿ
ÿzCursesMonitor.handle_keypressc                 C   s¨   | j  ¡  | j  ¡ \}}tdƒ }}|r'| j  t|ƒd|tjtjB ¡ t|ƒ |||t|ƒƒ | j  |d ddtj¡ | j  	¡  	 z| j  
¡  ¡ W S  tyR   Y nw qA)Né   r   r/   r   zPress any key to continue...)rI   ÚeraserJ   r   ÚaddstrÚnextÚcursesÚA_BOLDÚA_UNDERLINEÚrefreshre   rf   rg   )r*   ÚcallbackÚtitlerO   r?   ÚyÚ
blank_liner,   r,   r-   Úalert›   s(   

ÿÿ
ÿýzCursesMonitor.alertc                 C   sÊ   | j st ¡ S | jj| j  }|jst ¡ S | j ¡ \}}d}| j |d d|tj	tj
B ¡ | j |d t|ƒd d|t|ƒ  ¡ |  |d dt|ƒ ¡}|rc| jjj|j| ¡ dd�}|  |¡ d S d S )NzNew rate limit: rm   r   r0   T©Úreply)rY   rq   Úbeepr   rW   ÚnamerI   rJ   ro   rr   rs   r:   Úreadliner   ÚcontrolÚ
rate_limitÚstripÚalert_remote_control_reply)r*   r<   rO   r?   ÚrÚrlimitr{   r,   r,   r-   r%   ­   s    (ÿýz"CursesMonitor.selection_rate_limitc                    s   ‡ ‡fdd„}ˆ  |d¡S )Nc           
   	      sØ   t |ƒ}ˆ sˆj t|ƒddtjt d¡ ¡ d S ˆ D ]N}t|ƒ}t| ¡ ƒ\}}|› d�}ˆj |d|tj¡ tj}d}	d|v rM|d }	|t d¡O }nd|v r\|d }	|t d¡O }ˆj |dt	|ƒ |	|¡ qd S )Nr   z#No replies received in 1s deadline.rm   ú: Ú ÚerrorÚok)
r   rI   ro   rp   rq   rr   Ú
color_pairÚitemsÚA_NORMALr:   )
rO   r?   Úxsrw   ÚsubreplyÚcurlineÚhostÚresponseÚattrÚtext©r{   r*   r,   r-   ru   Á   s,   
þ
òz:CursesMonitor.alert_remote_control_reply.<locals>.callbackzRemote Control Command Replies)ry   )r*   r{   ru   r,   r“   r-   r‚   ¿   s   z(CursesMonitor.alert_remote_control_replyc                 C   sˆ   d}t  ¡  z8d}	 | j ||| ¡}|dkr0|dt jfv rn|dv r&d}n|t|ƒ7 }|d7 }q
W t  ¡  |S W t  ¡  |S t  ¡  w )Nr†   r   r/   r^   r   )é   )rq   ÚechorI   ÚgetchÚ	KEY_ENTERÚchrÚnoecho)r*   Úxrw   ÚbufferrZ   Úchr,   r,   r-   r~   Ü   s,   ÷û
ÿzCursesMonitor.readlinec                 C   s0   | j st ¡ S | jjj| j dd�}|  |¡ d S )NTrz   )rY   rq   r|   r   r   Úrevoker‚   )r*   r{   r,   r,   r-   r!   ï   s   zCursesMonitor.revoke_selectionc                    ó*   ˆ j sd S ‡ fdd„}ˆ  |dˆ j › �¡S )Nc              
      s8  ˆ j  ¡ \}} t|ƒ}ˆ jjˆ j }|jdgd�}d| dd ¡fd| dd ¡fgt| 	¡ ƒ }|D ]h\}}|d u r:q1t
|ƒ}t|ƒ}	|d }
ˆ j  |	d|
tj¡ t|| d ƒ}t|ƒdkrvˆ j  |	t|
ƒd t|d	 ˆ jt|
ƒd  ƒ¡ q1|D ] }t|ƒ}||d kr†d
}ˆ j  |dtd| ˆ jd ƒtj¡ qxq1d S )Nr   )ÚextraÚargsÚkwargsr…   r   rm   r/   r   z	    [...]z    r   )rI   rJ   r   r   rW   rY   ÚinfoÚpopÚlistrŠ   Ústrrp   ro   rq   rr   r   r:   r
   r9   r‹   )r?   rO   rŒ   rw   r<   r¢   Ú	infoitemsrj   ÚvaluerŽ   ÚkeysÚwrappedÚsublineÚnextyrT   r,   r-   Úalert_callbackù   sF   þ
ýÿþýüòz4CursesMonitor.selection_info.<locals>.alert_callbackzTask details for ©rY   ry   ©r*   r¬   r,   rT   r-   r$   õ   s   !ÿzCursesMonitor.selection_infoc                    sR   ˆ j st ¡ S ˆ jjˆ j  ‰ˆjtjvrt ¡ S ‡ ‡fdd„}ˆ  |dˆ j › �¡S )Nc                    s2   t |ƒ}ˆj d¡D ]}ˆ j t|ƒd|¡ q
d S )NÚ
r   )r   Ú	tracebackÚsplitrI   ro   rp   )rO   r?   rŒ   rw   Úline©r*   r<   r,   r-   r¬   %  s   ÿz9CursesMonitor.selection_traceback.<locals>.alert_callbackzTask Exception Traceback for )rY   rq   r|   r   rW   r   ÚEXCEPTION_STATESry   r®   r,   r³   r-   r"     s   
þz!CursesMonitor.selection_tracebackc                    rž   )Nc                    s^   t |ƒ}ˆ jjˆ j }t|dd ƒpt|dd ƒ}t|pd|d ƒD ]}ˆ j t|ƒd|¡ q d S )NÚresultÚ	exceptionr†   rm   r   )	r   r   rW   rY   Úgetattrr   rI   ro   rp   )rO   r?   rŒ   rw   r<   rµ   r²   rT   r,   r-   r¬   3  s   
ÿÿz6CursesMonitor.selection_result.<locals>.alert_callbackzTask Result for r­   r®   r,   rT   r-   r#   /  s   
þzCursesMonitor.selection_resultc           	      C   s²   | j  |j¡}tj}|j| jkrtj}t 	|j
ptƒ ¡}| d¡}|jr(|jjnd}|  |j|j|||j¡}| j |t||¡ |rW| j |t|ƒt t d |j||B ¡ d S d S )Nz%H:%M:%Sz*NONE*r/   )Ústate_colorsri   r   rq   r‹   r;   rY   Ú
A_STANDOUTr   Úutcfromtimestampr>   r   Ústrftimer=   ÚhostnamerF   r}   rI   ro   ÚLEFT_BORDER_OFFSETr:   r2   rQ   )	r*   Úlinenor<   Ústate_colorr‘   r>   Útimefr¼   r²   r,   r,   r-   Údisplay_task_row@  s(   
ÿ
þ
þÿzCursesMonitor.display_task_rowc                 C   sr  | j ��ª | j}|  ¡  t}tdƒ }}| ¡ \}}| ¡  | dt 	d¡¡ | 
¡  | d|| jtjt 	d¡B ¡ t|ƒ | t|ƒ||  ddddd	¡tjtjB ¡ | j}|rwt|ƒD ]\}\}}	|| jkri n|	jrpt|ƒ}
|  |
|	¡ q\t|ƒ | |d
 |tj| jd ¡ | j�r| |d || jtj¡ d}d}z	| jj| j }W n	 ty¯   Y n-w | ¡ }d|v rÁd |d ¡|d< d|v rÎt |d dƒ|d< d !dd„ | "¡ D ƒ¡}d}t || jt#| jƒ d |ƒ}| |d |t#| jƒ |¡ ||v �rt#|ƒt#|ƒ }| |d |t#| jƒ | |tj¡ n| |d |dtj$¡ | j%�rJ| |d || j&tj¡ | |d |t#| j&ƒ d !t'| j%ƒ¡tj$¡ n	| |d |d¡ | |d || j(tj¡ | |d |t#| j(ƒ t)j| jt#dd„ | jj% *¡ D ƒƒt#| jj%ƒd�tj¡ |  +|d || j,tj¡ |  +|d |t#| j,ƒ | j-tj¡ | .¡  W d   ƒ d S 1 �s²w   Y  d S )Nrm   r0   r/   é   ÚUUIDÚTASKÚWORKERÚTIMEÚSTATEé   r   zMissing extended infor†   Úruntimez{:.2f}rµ   r   c                 s   s"   � | ]\}}|› d |› �V  qdS )ú=Nr,   )Ú.0rj   r§   r,   r,   r-   Ú	<genexpr>€  s
   € ÿ
ÿz%CursesMonitor.draw.<locals>.<genexpr>z... -> key izNo task selectedz, zNo workers discovered.r   c                 S   s   g | ]}|j r|‘qS r,   ©Úalive)rË   Úwr,   r,   r-   Ú
<listcomp>Ÿ  s    
ÿz&CursesMonitor.draw.<locals>.<listcomp>)ÚsÚw_aliveÚw_all)/r)   rI   rl   r½   r   rJ   rn   Úbkgdrq   r‰   Úborderro   ÚgreetÚA_DIMrp   rF   rr   rs   rW   rX   rS   r;   rÁ   ÚhlineÚ	ACS_HLINEr9   rY   Úselected_strr   ÚKeyErrorr¢   Úformatr
   ÚjoinrŠ   r:   r‹   ÚworkersÚ
online_strÚsortedÚinfo_strÚSTATUS_SCREENÚvaluesÚsafe_add_strÚ
help_titleÚhelprt   )r*   rI   rš   rw   rx   rO   rL   rW   rE   r<   r¾   r¢   ÚdetailÚ	selectionÚinfowinÚ	detailposr,   r,   r-   ÚdrawT  sœ   
ÿ
þ
ÿ
þþ
ÿ€ÿ
üøÿ
$«zCursesMonitor.drawc                 O   sF   |t |ƒ | jkr|d | j| … }| jj|||g|¢R i |¤Ž d S rG   )r:   r9   rI   ro   )r*   rw   rš   Ústringr    r¡   r,   r,   r-   rä   ¬  s   "zCursesMonitor.safe_add_strc              	   C   s  | j �{ t ¡ | _| j d¡ | j d¡ t ¡  t d| j| j	¡ t dtj
| j	¡ t dtj| j	¡ t dtj| j	¡ t dtj| j	¡ t dtj| j¡ tjt d¡tjt d¡tjt d¡i| _tjD ]
}t d¡| j|< qgt ¡  W d   ƒ d S 1 s�w   Y  d S )NTr/   rm   r   r   rÂ   rÈ   )r)   rq   ÚinitscrrI   ÚnodelayÚkeypadÚstart_colorÚ	init_pairÚ
foregroundÚ
backgroundÚ	COLOR_REDÚCOLOR_GREENÚCOLOR_MAGENTAÚ
COLOR_BLUEÚCOLOR_YELLOWr   ÚSUCCESSr‰   ÚREVOKEDÚSTARTEDr¸   r´   Úcbreak)r*   r   r,   r,   r-   Úinit_screen±  s&   
þ

"ézCursesMonitor.init_screenc                 C   sP   | j � t ¡  | j d¡ t ¡  t ¡  W d   ƒ d S 1 s!w   Y  d S ©NF)r)   rq   ÚnocbreakrI   rï   r•   ÚendwinrT   r,   r,   r-   ÚresetscreenË  s   
"üzCursesMonitor.resetscreenc                 C   s   t  | j¡ d S rG   )rq   ÚnapmsÚscreen_delayrT   r,   r,   r-   ÚnapÒ  s   zCursesMonitor.napc                 C   s   t | jj| jd�ƒS )N)rU   )r¤   r   Útasks_by_timerU   rT   r,   r,   r-   rW   Õ  s   zCursesMonitor.tasksc                 C   s   dd„ | j j ¡ D ƒS )Nc                 S   s   g | ]	\}}|j r|‘qS r,   rÍ   )rË   r¼   rÏ   r,   r,   r-   rÐ   Û  s    
ÿz)CursesMonitor.workers.<locals>.<listcomp>)r   rÞ   rŠ   rT   r,   r,   r-   rÞ   Ù  s   zCursesMonitor.workersrG   )r/   )6Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rI   r  rY   Úselected_positionrÚ   rq   ÚCOLOR_BLACKrò   ÚCOLOR_WHITEró   rß   rå   ræ   r   rÖ   rá   r.   rF   Úpropertyr9   rP   r1   rS   rU   r\   r    r   r`   ÚKEY_DOWNÚKEY_UPr—   rh   rl   ry   r%   r‚   r~   r!   r$   r"   r#   rÁ   rë   rä   rý   r  r  rW   rÞ   r,   r,   r,   r-   r   "   sl    







	þ

)X
r   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚDisplayThreadc                    s   || _ d| _tƒ  ¡  d S rþ   )ÚdisplayÚshutdownÚsuperr.   )r*   r  ©Ú	__class__r,   r-   r.   á  s   zDisplayThread.__init__c                 C   s(   | j s| j ¡  | j ¡  | j rd S d S rG   )r  r  rë   r  rT   r,   r,   r-   Úrunæ  s   

þzDisplayThread.run)r  r  r  r.   r  Ú__classcell__r,   r,   r  r-   r  ß  s    r  c                 C   sÆ   dd„ }	 t dtjd� |  ¡ �J}z!| || jj¡ | jj|d|j	id�}| 
¡  | ¡  | ¡  W n  |j|j yR } zt d|›�tjd� W Y d }~nd }~ww W d   ƒ n1 s]w   Y  q)	Nc                 S   s   t d | |¡tjd� d S )Nz&Connection Error: {!r}.  Retry in {}s.©Úfile)ÚprintrÜ   ÚsysÚstderr)ÚexcÚintervalr,   r,   r-   Úon_connection_errorî  s
   ÿ
ÿz+capture_events.<locals>.on_connection_errorr/   z-> evtop: starting capture...r  Ú*)ÚhandlerszConnection lost: )r  r  r  Úconnection_for_readÚensure_connectionÚconfÚbroker_connection_max_retriesÚeventsÚReceiverÚeventr  rý   ÚcaptureÚconnection_errorsÚchannel_errors)r   r   r  r  ÚconnÚrecvr  r,   r,   r-   Úcapture_eventsì  s&   
ÿ €ÿ€øþr.  c              	   C   sš   t | ƒ} | j ¡ }t|| ƒ}| ¡  t|ƒ}| ¡  z	t| ||ƒ W dS  ty6   d|_	| 
¡  | ¡  ‚  ttfyL   d|_	| 
¡  | ¡  Y dS w )zStart curses monitor.TN)r	   r&  ÚStater   rý   r  Ústartr.  rg   r  rÝ   r  ÚKeyboardInterruptÚ
SystemExit)r   r   r  Ú	refresherr,   r,   r-   r      s$   

ýr   Ú__main__rG   )#r	  rq   r  r'   r   Ú	itertoolsr   Úmathr   Útextwrapr   r   Úceleryr   r   Ú
celery.appr	   Úcelery.utils.textr
   r   Ú__all__rQ   r½   r6   r2   r3   r5   r4   râ   r   ÚThreadr  r.  r   r  r,   r,   r,   r-   Ú<module>   s>       @

ÿ