o
    wvXj™G  ã                   @   s  d Z ddlmZmZm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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e$ƒZ%G dd„ dej&ƒZ'dd„ Z(ddd„Z)e*dkr‰e)ƒ  dS dS )z0Graphical monitor of Celery events using curses.é    )Úabsolute_importÚprint_functionÚunicode_literalsN)Údatetime)Úcount)Úceil)Úwrap)Útime)ÚVERSION_BANNERÚstates)Úapp_or_default)ÚitemsÚvalues)Ú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:„ Z0d;d<„ Z1d=d>„ Z2d?d@„ Z3dAdB„ Z4edCdD„ ƒZ5edEdF„ ƒZ6d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 {0}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© r1   úT/var/www/html/myproject/venv/lib/python3.10/site-packages/celery/events/cursesmon.pyÚ__init__6   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 |||||¡}| jd u rpt|d |… ƒ| _|d |… S )Né   g       @z{0} {1} {2} {3} {4} )Údisplay_widthÚSTATE_WIDTHÚTIMESTAMP_WIDTHÚMIN_TASK_WIDTHÚMIN_WORKER_WIDTHÚ
UUID_WIDTHÚintr   r   Úljustr   ÚformatÚscreen_widthÚlen)r/   ÚuuidÚtaskÚworkerÚ	timestampr#   ÚmxÚdetail_widthÚ
uuid_spaceÚ
uuid_widthÚ
task_widthÚworker_widthÚrowr1   r1   r2   Ú
format_rowF   s(   

ÿ
zCursesMonitor.format_rowc                 C   s   | j  ¡ \}}|S ©N©ÚwinÚgetmaxyx©r/   Ú_rD   r1   r1   r2   r>   b   ó   zCursesMonitor.screen_widthc                 C   s   | j  ¡ \}}|S rL   rM   ©r/   ÚmyrQ   r1   r1   r2   Úscreen_heightg   rR   zCursesMonitor.screen_heightc                 C   s   | j  ¡ \}}|t S rL   )rN   rO   ÚBORDER_SPACINGrP   r1   r1   r2   r5   l   ó   zCursesMonitor.display_widthc                 C   s   | j  ¡ \}}|d S )Nr   rM   rS   r1   r1   r2   Údisplay_heightq   rW   zCursesMonitor.display_heightc                 C   s   | j S rL   )rX   ©r/   r1   r1   r2   Úlimitv   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Úer1   r1   r2   Úfind_positionz   s   ÿzCursesMonitor.find_positionc                 C   ó   |   d¡ d S )Néÿÿÿÿ©Úmove_selectionrY   r1   r1   r2   r%   ‚   ó   zCursesMonitor.move_selection_upc                 C   rb   )Nr4   rd   rY   r1   r1   r2   r$   …   rf   z!CursesMonitor.move_selection_downr4   c                 C   sR   | j sd S |  ¡ }z| j ||  d | _W d S  ty(   | j d d | _Y d S w r[   )r\   ra   r^   Ú
IndexError)r/   Ú	directionÚposr1   r1   r2   re   ˆ   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 rL   )rN   ÚgetkeyÚupperÚ	ExceptionÚkeyaliasÚgetr"   )r/   ÚkeyÚhandlerr1   r1   r2   Ú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   r4   r   zPress any key to continue...)rN   ÚeraserO   r   ÚaddstrÚnextÚcursesÚA_BOLDÚA_UNDERLINEÚrefreshrj   rk   rl   )r/   ÚcallbackÚtitlerT   rD   ÚyÚ
blank_liner1   r1   r2   Ú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: rr   r   ú T©Úreply)r^   rv   Úbeepr#   r\   ÚnamerN   rO   rt   rw   rx   r?   Úreadliner!   ÚcontrolÚ
rate_limitÚstripÚalert_remote_control_reply)r/   rA   rT   rD   ÚrÚrlimitr�   r1   r1   r2   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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.rr   z{0}: Ú ÚerrorÚok)r   rN   rt   ru   rv   rw   Ú
color_pairr   r=   ÚA_NORMALr?   )
rT   rD   Úxsr|   ÚsubreplyÚcurlineÚhostÚresponseÚattrÚtext©r�   r/   r1   r2   rz   Å   s,   
þ
òz:CursesMonitor.alert_remote_control_reply.<locals>.callbackzRemote Control Command Replies)r~   )r/   r�   rz   r1   r—   r2   rˆ   Ã   s   z(CursesMonitor.alert_remote_control_replyc                 C   sŒ   t ƒ }t ¡  z9d}	 | j ||| ¡}|dkr2|dtjfv r n|dv r(t ƒ }n|t|ƒ7 }|d7 }qW t ¡  |S W t ¡  |S t ¡  w )Nr   r4   rc   r   )é   )Ústrrv   ÚechorN   ÚgetchÚ	KEY_ENTERÚchrÚnoecho)r/   Úxr|   Úbufferr_   Úchr1   r1   r2   r„   à   s,   ÷û
ÿzCursesMonitor.readlinec                 C   s0   | j st ¡ S | jjj| j dd�}|  |¡ d S )NTr€   )r^   rv   r‚   r!   r…   Úrevokerˆ   )r/   r�   r1   r1   r2   r&   ó   s   zCursesMonitor.revoke_selectionc                    ó(   ˆ j sd S ‡ fdd„}ˆ  |d ˆ ¡¡S )Nc              
      sF  ˆ j  ¡ \}} t|ƒ}ˆ jjˆ j }|jdgd�}d| dd ¡fd| dd ¡fgt| 	¡ ƒ }|D ]o\}}|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
}n||kr� nˆ j  |dtd| ˆ jd ƒtj¡ qxq1d S )Nr#   )ÚextraÚargsÚkwargsz: r   rr   r4   r   z	    [...]z    r   )rN   rO   r   r#   r\   r^   ÚinfoÚpopÚlistr   r™   ru   rt   rv   rw   r   r?   r   r>   r�   )rD   rT   r�   r|   rA   r§   Ú	infoitemsro   Úvaluer’   ÚkeysÚwrappedÚsublineÚnextyrY   r1   r2   Úalert_callbacký   sJ   þ
ýÿþý€ìz4CursesMonitor.selection_info.<locals>.alert_callbackz"Task details for {0.selected_task}©r^   r~   r=   ©r/   r°   r1   rY   r2   r)   ù   s   #
ÿzCursesMonitor.selection_infoc                    sP   ˆ j st ¡ S ˆ jjˆ j  ‰ˆjtjvrt ¡ S ‡ ‡fdd„}ˆ  |d ˆ ¡¡S )Nc                    s2   t |ƒ}ˆj d¡D ]}ˆ j t|ƒd|¡ q
d S )NÚ
r   )r   Ú	tracebackÚsplitrN   rt   ru   )rT   rD   r�   r|   Úline©r/   rA   r1   r2   r°   +  s   ÿz9CursesMonitor.selection_traceback.<locals>.alert_callbackz.Task Exception Traceback for {0.selected_task})	r^   rv   r‚   r#   r\   r   ÚEXCEPTION_STATESr~   r=   r²   r1   r·   r2   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‹   rr   r   )	r   r#   r\   r^   Úgetattrr   rN   rt   ru   )rT   rD   r�   r|   rA   r¹   r¶   rY   r1   r2   r°   9  s   
ÿÿz6CursesMonitor.selection_result.<locals>.alert_callbackz!Task Result for {0.selected_task}r±   r²   r1   rY   r2   r(   5  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*r4   )Ústate_colorsrn   r#   rv   r�   r@   r^   Ú
A_STANDOUTr   ÚutcfromtimestamprC   r	   ÚstrftimerB   ÚhostnamerK   rƒ   rN   rt   ÚLEFT_BORDER_OFFSETr?   r6   rV   )	r/   ÚlinenorA   Ústate_colorr•   rC   ÚtimefrÀ   r¶   r1   r1   r2   Údisplay_task_rowF  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„ t"|ƒ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„ t*| 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 )Nrr   r   r4   é   ÚUUIDÚTASKÚWORKERÚTIMEÚSTATEé   r   zMissing extended infor‹   Úruntimez{0:.2f}r¹   r   c                 s   s    � | ]\}}d   ||¡V  qdS )z{0}={1}N)r=   )Ú.0ro   r«   r1   r1   r2   Ú	<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 r1   ©Úalive)rÎ   Úwr1   r1   r2   Ú
<listcomp>¥  s    
ÿz&CursesMonitor.draw.<locals>.<listcomp>)ÚsÚw_aliveÚw_all)/r.   rN   rq   rÁ   r   rO   rs   Úbkgdrv   rŽ   Úborderrt   ÚgreetÚA_DIMru   rK   rw   rx   r\   r]   rX   r@   rÅ   ÚhlineÚ	ACS_HLINEr>   r^   Úselected_strr#   ÚKeyErrorr§   r=   r   Újoinr   r?   r�   ÚworkersÚ
online_strÚsortedÚinfo_strÚSTATUS_SCREENr   Úsafe_add_strÚ
help_titleÚhelpry   )r/   rN   rŸ   r|   r}   rT   rQ   r\   rJ   rA   rÂ   r§   ÚdetailÚ	selectionÚinfowinÚ	detailposr1   r1   r2   ÚdrawZ  sœ   
ÿ
þ
ÿ
þþ
ÿ€ÿ
üøÿ
$«zCursesMonitor.drawc                 O   sF   |t |ƒ | jkr|d | j| … }| jj|||g|¢R i |¤Ž d S rL   )r?   r>   rN   rt   )r/   r|   rŸ   Ústringr¥   r¦   r1   r1   r2   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 )NTr4   rr   r   r   rÆ   rÌ   )r.   rv   ÚinitscrrN   Ú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#   r1   r1   r2   Ú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.   rv   ÚnocbreakrN   rð   rš   ÚendwinrY   r1   r1   r2   ÚresetscreenÑ  s   
"üzCursesMonitor.resetscreenc                 C   s   t  | j¡ d S rL   )rv   ÚnapmsÚscreen_delayrY   r1   r1   r2   ÚnapØ  s   zCursesMonitor.napc                 C   s   t | jj| jd�ƒS )N)rZ   )r©   r#   Útasks_by_timerZ   rY   r1   r1   r2   r\   Û  s   zCursesMonitor.tasksc                 C   s   dd„ t | jjƒD ƒS )Nc                 S   s   g | ]	\}}|j r|‘qS r1   rÐ   )rÎ   rÀ   rÒ   r1   r1   r2   rÓ   á  s    
ÿz)CursesMonitor.workers.<locals>.<listcomp>)r   r#   rà   rY   r1   r1   r2   rà   ß  s   zCursesMonitor.workersrL   )r4   )7Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   rN   r  r^   Úselected_positionrÝ   rv   ÚCOLOR_BLACKró   ÚCOLOR_WHITErô   rá   ræ   rç   r=   r
   rÙ   rã   r3   rK   Úpropertyr>   rU   r5   rX   rZ   ra   r%   r$   re   ÚKEY_DOWNÚKEY_UPrœ   rm   rq   r~   r*   rˆ   r„   r&   r)   r'   r(   rÅ   rì   rå   rþ   r  r  r\   rà   r1   r1   r1   r2   r   %   sl    







	þ

+X
r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚDisplayThreadc                 C   s   || _ d| _tj | ¡ d S rÿ   )ÚdisplayÚshutdownr,   ÚThreadr3   )r/   r  r1   r1   r2   r3   ç  s   zDisplayThread.__init__c                 C   s(   | j s| j ¡  | j ¡  | j rd S d S rL   )r  r  rì   r  rY   r1   r1   r2   Úrunì  s   

þzDisplayThread.runN)r  r  r	  r3   r  r1   r1   r1   r2   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: {0!r}.  Retry in {1}s.©Úfile)Úprintr=   ÚsysÚstderr)ÚexcÚintervalr1   r1   r2   Úon_connection_errorô  s
   ÿ
ÿz+capture_events.<locals>.on_connection_errorr4   z-> evtop: starting capture...r  Ú*)ÚhandlerszConnection lost: {0!r})r  r  r  Úconnection_for_readÚensure_connectionÚconfÚbroker_connection_max_retriesÚeventsÚReceiverÚeventr  rþ   ÚcaptureÚconnection_errorsÚchannel_errorsr=   )r!   r#   r  r  ÚconnÚrecvr  r1   r1   r2   Ú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,  rl   r  rß   r  ÚKeyboardInterruptÚ
SystemExit)r!   r#   r  Ú	refresherr1   r1   r2   r     s$   

ýr   Ú__main__rL   )+r
  Ú
__future__r   r   r   rv   r  r,   r   Ú	itertoolsr   Úmathr   Útextwrapr   r	   Úceleryr
   r   Ú
celery.appr   Úcelery.fiver   r   Úcelery.utils.textr   r   Ú__all__rV   rÁ   r:   r6   r7   r9   r8   rä   Úobjectr   r  r  r,  r   r  r1   r1   r1   r2   Ú<module>   sB      C

ÿ