o
    Df)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,   P/home/ubuntu/webapp/venv/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rd
} 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 rd|d |d< d|v rt |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 sw   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 sw   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>       @

