
    h)F                        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      Z G d dej<                        Zd Z ddZ!e"dk(  r e!        yy)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                      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d*dZd Zed        Zed        Zed        Zed        Zed        Zd Zd Zd Zd+dZ e
jB                  de
jD                  de
jF                  diZ$d Z%d*dZ&d Z'd Z(d Z)d Z*d Z+d  Z,d! Z-d" Z.d# Z/d$ Z0d% Z1d& Z2d' Z3ed(        Z4ed)        Z5y),r   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                 R   || _         |xs | j                  | _        || _        | j                  | j                  | j
                  | j                  | j                  | j                  | j                  d}t        |fi | j                  | _        t        j                         | _        y )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_keymaps        S/var/www/Befach/backend/env/lib/python3.12/site-packages/celery/events/cursesmon.py__init__zCursesMonitor.__init__3   s    +
))''&&))&&$$**
 >9T[[9OO%	    c           
      `   | j                   }|dz
  t        z
  dz
  t        z
  }|dz
  t        z
  dz
  t        z
  }|t
        k  r|}	nt
        }	||	z
  dz
  }t        t        |dz              }
||
z
  dz
  }t        ||	      j                  |	      }t        ||      j                  |      }t        ||
      j                  |
      }t        |t              j                  t              }|j                  t              }| d| d| d| d| d
}| j                  t        |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rows                r/   
format_rowzCursesMonitor.format_rowC   s<    Av+a//A!A%6:=MM

"#J#J#j014lS012
#j014D*%++J7fl+11,?j)//
;UK(..{;OOO4	axqa	{!E7!<$ #CHD3Bxr1   c                 @    | j                   j                         \  }}|S Nwingetmaxyxr-   _rC   s      r/   r=   zCursesMonitor.screen_width^   s    !!#2	r1   c                 @    | j                   j                         \  }}|S rL   rM   r-   myrQ   s      r/   screen_heightzCursesMonitor.screen_heightc   s    !!#A	r1   c                 N    | j                   j                         \  }}|t        z
  S rL   )rN   rO   BORDER_SPACINGrP   s      r/   r5   zCursesMonitor.display_widthh   s#    !!#2N""r1   c                 F    | j                   j                         \  }}|dz
  S )Nr   rM   rS   s      r/   display_heightzCursesMonitor.display_heightm   s!    !!#ABwr1   c                     | j                   S rL   )rY   r-   s    r/   limitzCursesMonitor.limitr   s    """r1   c                     | j                   syt        | j                         D ]  \  }}| j                  |d   k(  s|c S  yNr   )tasks	enumerateselected_task)r-   ies      r/   find_positionzCursesMonitor.find_positionv   s?    zzdjj)DAq!!QqT) * r1   c                 &    | j                  d       y )Nmove_selectionr[   s    r/   r#   zCursesMonitor.move_selection_up~   s    Br1   c                 &    | j                  d       y )Nr3   rg   r[   s    r/   r"   z!CursesMonitor.move_selection_down   s    Ar1   c                     | j                   sy | j                         }	 | j                   ||z      d   | _        y # t        $ r | j                   d   d   | _        Y y w xY wr^   )r_   rd   ra   
IndexError)r-   	directionposs      r/   rh   zCursesMonitor.move_selection   s]    zz  "	2!%C)O!<Q!?D 	2!%Aq!1D	2s   :  AAr   r   r   c                     	 | j                   j                         j                         }| j                  j                  |      xs |}| j                  j                  |      }| |        y y # t        $ r Y y w xY wrL   )rN   getkeyupper	Exceptionkeyaliasgetr    )r-   keyhandlers      r/   handle_keypresszCursesMonitor.handle_keypress   sq    	((//#))+C mm$+++//#&I 	  		s   (A/ /	A;:A;c                 \   | j                   j                          | j                   j                         \  }}t        d      x}}|rQ| j                   j	                  t        |      d|t        j                  t        j                  z         t        |        |||t        |             | j                   j	                  |dz
  ddt        j                         | j                   j                          	 	 | j                   j                         j                         S # t        $ r Y nw xY w9)N   r   r3   r   zPress any key to continue...)rN   eraserO   r   addstrnextcursesA_BOLDA_UNDERLINErefreshro   rp   rq   )r-   callbacktitlerT   rC   y
blank_lines          r/   alertzCursesMonitor.alert   s    ""$Bq!JHHOODGQ"MMF,>,>>@Ra!Q#A	'xx(..00  s   6'D 	D*)D*c           	         | j                   st        j                         S | j                  j                  | j                      }|j
                  st        j                         S | j                  j                         \  }}d}| j                  j                  |dz
  d|t        j                  t        j                  z         | j                  j                  |dz
  t        |      dz   d|t        |      z
  z         | j                  |dz
  dt        |      z         }|rR| j                  j                  j                  |j
                  |j!                         d      }| j#                  |       y y )NzNew rate limit: rx   r   r4   Treply)ra   r|   beepr!   r_   namerN   rO   rz   r}   r~   r>   readliner   control
rate_limitstripalert_remote_control_reply)r-   r@   rT   rC   rrlimitr   s          r/   r(   z"CursesMonitor.selection_rate_limit   s   !!;;= zz 2 23yy;;= ""$BQ1fmmf6H6H&HIQA
C2A;,?@rAvq3q6z2HH$$//		06d 0 LE++E2 r1   c                 6      fd} j                  |d      S )Nc           	      t   t        |      }
sLj                  j                  t        |      ddt        j
                  t	        j                  d      z          y 
D ]  }t        |      }t        |j                               \  }}| d}j                  j                  |d|t        j
                         t        j                  }d}	d|v r|d   }	|t	        j                  d      z  }n!d|v r|d   }	|t	        j                  d      z  }j                  j                  |dt        |      z   |	|        y )Nr   z#No replies received in 1s deadline.rx   :  errorok)
r   rN   rz   r{   r|   r}   
color_pairitemsA_NORMALr>   )rT   rC   xsr   subreplycurlinehostresponseattrtextr   r-   s             r/   r   z:CursesMonitor.alert_remote_control_reply.<locals>.callback   s   b	AGQ EMMF$5$5a$88 !q'!%hnn&6!7hr{D&--@h&#G,DF--a00DX%#D>DF--a00DSYdC "r1   zRemote Control Command Replies)r   )r-   r   r   s   `` r/   r   z(CursesMonitor.alert_remote_control_reply   s    	D2 zz($DEEr1   c                 <   d}t        j                          	 d}	 | j                  j                  |||z         }|dk7  r/|dt         j                  fv rn|dv rd}n|t        |      z  }|dz  }Tt        j                          |S # t        j                          w xY w)Nr   r   r3   rf   r   )   )r|   echorN   getch	KEY_ENTERchrnoecho)r-   xr   bufferrb   chs         r/   r   zCursesMonitor.readline   s    	AXX^^Aq1u-8b&"2"233U{!#c"g%FFA  MMO MMOs   AB Bc                     | j                   st        j                         S | j                  j                  j                  | j                   d      }| j                  |       y )NTr   )ra   r|   r   r   r   revoker   )r-   r   s     r/   r$   zCursesMonitor.revoke_selection   sJ    !!;;=   ''(:(:$'G''.r1   c                 f      j                   sy  fd} j                  |d j                          S )Nc                    j                   j                         \  }} t        |      }j                  j                  j
                     }|j                  dg      }d|j                  dd       fd|j                  dd       fgt        |j                               z   }|D ]  \  }}|
t        |      }t        |      }	|dz   }
j                   j                  |	d|
t        j                         t        || dz
        }t!        |      dk(  rPj                   j                  |	t!        |
      dz   t#        |d	   j$                  t!        |
      dz   z
               |D ]]  }t        |      }||dz
  k\  rd
}j                   j                  |dt#        d|z   j$                  dz
        t        j&                         _ " y )Nr!   )extraargskwargsr   r   rx   r3   r   z	    [...]z    r   )rN   rO   r   r!   r_   ra   infopoplistr   strr{   rz   r|   r}   r   r>   r   r=   r   )rC   rT   r   r   r@   r   	infoitemsrt   valuer   keyswrappedsublinenextyr-   s                 r/   alert_callbackz4CursesMonitor.selection_info.<locals>.alert_callback   s   XX&&(FBb	A::##D$6$67D99G99-D&$/0488Hd34 TZZ\"#I (
U;E
q'TzD&--@ub1f-w<1$HHOOTQWQZ!..#d)a-@BC
 $+ $Q BF?&7G!1 7!2D4E4E4IJ"OO	 $+ (r1   zTask details for ra   r   r-   r   s   ` r/   r'   zCursesMonitor.selection_info   s<    !!	B zz/0B0B/CD
 	
r1   c                 6     j                   st        j                         S  j                  j                   j                      j                  t
        j                  vrt        j                         S  fd} j                  |d j                          S )Nc                     t        |      }j                  j                  d      D ](  }j                  j	                  t        |      d|       * y )N
r   )r   	tracebacksplitrN   rz   r{   )rT   rC   r   r   liner-   r@   s        r/   r   z9CursesMonitor.selection_traceback.<locals>.alert_callback%  s=    b	A,,T2QD1 3r1   zTask Exception Traceback for )ra   r|   r   r!   r_   r	   EXCEPTION_STATESr   )r-   r   r@   s   ` @r/   r%   z!CursesMonitor.selection_traceback  s|    !!;;= zz 2 23::V444;;= 	2
 zz+D,>,>+?@
 	
r1   c                 f      j                   sy  fd} j                  |d j                          S )Nc                    t        |      }j                  j                  j                     }t	        |dd       xs t	        |dd       }t        |xs d|dz
        D ](  }j                  j                  t        |      d|       * y )Nresult	exceptionr   rx   r   )	r   r!   r_   ra   getattrr   rN   rz   r{   )rT   rC   r   r   r@   r   r   r-   s          r/   r   z6CursesMonitor.selection_result.<locals>.alert_callback3  sy    b	A::##D$6$67DdHd3 7dK6 V\r262QD1 3r1   zTask Result for r   r   s   ` r/   r&   zCursesMonitor.selection_result/  s;    !!	2 zzt1123
 	
r1   c                    | j                   j                  |j                        }t        j                  }|j
                  | j                  k(  rt        j                  }t        j                  |j                  xs
 t                     }|j                  d      }|j                  r|j                  j                  nd}| j                  |j
                  |j                   |||j                        }| j"                  j%                  |t&        ||       |rF| j"                  j%                  |t)        |      t*        z
  t,        z   dz
  |j                  ||z         y y )Nz%H:%M:%Sz*NONE*r3   )state_colorsrs   r!   r|   r   r?   ra   
A_STANDOUTr   utcfromtimestamprB   r   strftimerA   hostnamerJ   r   rN   rz   LEFT_BORDER_OFFSETr>   r6   rW   )	r-   linenor@   state_colorr   rB   timefr   r   s	            r/   display_task_rowzCursesMonitor.display_task_row@  s   ''++DJJ799***$$D--NN$df
	 "":.+/;;4;;''Htyy$))'$djj2 	 2D$?HHOOFI3nDqH JJd(:< r1   c                 z   | j                   5  | j                  }| j                          t        }t	        d      x}}|j                         \  }}|j                          |j                  dt        j                  d             |j                          |j                  d|| j                  t        j                  t        j                  d      z         t        |       |j                  t        |      || j                  ddddd	      t        j                   t        j"                  z         | j$                  }|rPt'        |      D ]B  \  }\  }}	|| j(                  kD  r n+|	j*                  rt        |      }
| j-                  
|	       D t        |       |j/                  |d
z
  |t        j0                  | j2                  dz
         | j4                  rv|j                  |dz
  || j6                  t        j                          d}d}	 | j8                  j$                  | j4                     }|j;                         }d|v rdj=                  |d         |d<   d|v rt?        |d   d      |d<   djA                  d |jC                         D              }d}t?        || j2                  tG        | j6                        z
  dz
  |      }|j                  |dz
  |tG        | j6                        z   |       ||v r{tG        |      tG        |      z
  }|j                  |dz
  |tG        | j6                        z   |z   |t        j                          n%|j                  |dz
  |dt        jH                         | jJ                  r|j                  |dz
  || jL                  t        j                          |j                  |dz
  |tG        | jL                        z   djA                  tO        | jJ                              t        jH                         n|j                  |dz
  |d       |j                  |dz
  || jP                  t        j                          |j                  |dz
  |tG        | jP                        z   tR        j=                  | j8                  tG        | j8                  jJ                  jU                         D cg c]  }|jV                  r| c}      tG        | j8                  jJ                              t        j                         | jY                  |dz
  || jZ                  t        j                          | jY                  |dz
  |tG        | jZ                        z   | j\                  t        j                         |j_                          d d d        y # tD        $ r Y w xY wc c}w # 1 sw Y   y xY w)Nrx   r4   r3      UUIDTASKWORKERTIMESTATE   r   zMissing extended infor   runtimez{:.2f}r   r   c              3   0   K   | ]  \  }}| d |   yw)=N ).0rt   r   s      r/   	<genexpr>z%CursesMonitor.draw.<locals>.<genexpr>  s'      $&C %q($s   z... -> key izNo task selectedz, zNo workers discovered.r   )sw_alivew_all)0r,   rN   rv   r   r   rO   ry   bkgdr|   r   borderrz   greetA_DIMr{   rJ   r}   r~   r_   r`   rY   r?   r   hline	ACS_HLINEr=   ra   selected_strr!   r   formatr   joinr   KeyErrorr>   r   workers
online_strsortedinfo_strSTATUS_SCREENvaluesalivesafe_add_str
help_titlehelpr   )r-   rN   r   r   r   rT   rQ   r_   rI   r@   r   r   detail	selectioninfowin	detailposws                    r/   drawzCursesMonitor.drawT  s   YY U	((C  ""A"1X%A
LLNEBIIKHHS&++A./JJLJJq!TZZ8I8I!8L)LMJJtAw4??663;VW$N}}v'9'99; JJE&/&6NC!TT000yy!%a))&$7 '7 IIb1fa!1!143D3Dq3HI !!

261d&7&7G., $

 0 01C1C DI %>>+D D(*2//$y/*JY4')-d8nb)AX88 $*.**,$ D ,Ft#003t7H7H3IIAM%' 

261s4+<+<'=#=wGW$ #Gs6{ :IJJrAvq3t/@/@+A'AI'M%v}}6 

261&8&//J ||

261doov}}E

261s4??';#;99VDLL%9:FOOM 

261&>? JJrAvq$--?JJQC..$$jjDJJ,>,>,E,E,G !-q$%GG "# !- .djj001	 %  	 b1fa&--Hb1fa#doo*>&>		$ll,KKMkU	 U	F   N!-UU	 U	s>   G?V1#V0JV1=V,CV1	V)%V1(V))V11V:c                     |t        |      z   | j                  kD  r|d | j                  |z
   } | j                  j                  |||g|i | y rL   )r>   r=   rN   rz   )r-   r   r   stringr   r   s         r/   r   zCursesMonitor.safe_add_str  sP    s6{?T...2T..23F1f6t6v6r1   c           	         | j                   5  t        j                         | _        | j                  j	                  d       | j                  j                  d       t        j                          t        j                  d| j                  | j                         t        j                  dt        j                  | j                         t        j                  dt        j                  | j                         t        j                  dt        j                  | j                         t        j                  dt        j                  | j                         t        j                  dt        j                  | j                         t        j                   t        j"                  d      t        j$                  t        j"                  d      t        j&                  t        j"                  d      i| _        t        j*                  D ]$  }t        j"                  d      | j(                  |<   & t        j,                          d d d        y # 1 sw Y   y xY w)NTr3   rx   r   r   r   r   )r,   r|   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!   s     r/   init_screenzCursesMonitor.init_screen  s   YY 	~~'DHHHT"HHOOD! QAQ 0 0$//BQ 2 2DOODQ 4 4dooFQ 1 14??CQ 3 3T__E!'1B1B11E!'1B1B11E!'1B1B11E!GD  00+1+<+<Q+?!!%( 1 MMO/	 	 	s   H5IIc                     | j                   5  t        j                          | j                  j	                  d       t        j
                          t        j                          d d d        y # 1 sw Y   y xY wNF)r,   r|   nocbreakrN   r  r   endwinr[   s    r/   resetscreenzCursesMonitor.resetscreen  sJ    YY 	OOHHOOE"KKMMMO		 	 	s   AA..A7c                 B    t        j                  | j                         y rL   )r|   napmsscreen_delayr[   s    r/   napzCursesMonitor.nap  s    T&&'r1   c                 `    t        | j                  j                  | j                              S )N)r\   )r   r!   tasks_by_timer\   r[   s    r/   r_   zCursesMonitor.tasks  s#    DJJ,,4::,>??r1   c                     | j                   j                  j                         D cg c]  \  }}|j                  r| c}}S c c}}w rL   )r!   r   r   r   )r-   r   r   s      r/   r   zCursesMonitor.workers  s?    ,0JJ,>,>,D,D,F [Xq77   	 s   ArL   )r3   )6__name__
__module____qualname____doc__r    rN   r  ra   selected_positionr   r|   COLOR_BLACKr	  COLOR_WHITEr
  r   r   r   r   r   r   r0   rJ   propertyr=   rU   r5   rY   r\   rd   r#   r"   rh   KEY_DOWNKEY_UPr   rr   rv   r   r(   r   r   r$   r'   r%   r&   r   r   r   r  r  r  r_   r   r   r1   r/   r   r   "   s|   -F
CLML##J##J#JJGD^,-EH& 6     # #   # # 2 s  #'H$3$F:&/'
R
"
"<(Vp7
4( @ @  r1   r   c                   $     e Zd Z fdZd Z xZS )DisplayThreadc                 >    || _         d| _        t        |           y r  )displayshutdownsuperr0   )r-   r.  	__class__s     r/   r0   zDisplayThread.__init__  s    r1   c                     | j                   sB| j                  j                          | j                  j                          | j                   sAy y rL   )r/  r.  r   r  r[   s    r/   runzDisplayThread.run  s2    --LLLL --r1   )r!  r"  r#  r0   r3  __classcell__)r1  s   @r/   r,  r,    s    
r1   r,  c                    d }	 t        dt        j                         | j                         5 }	 |j	                  || j
                  j                         | j                  j                  |d|j                  i      }|j                          |j                          |j                          d d d        # |j                  |j                  z   $ r(}t        d|t        j                         Y d }~Hd }~ww xY w# 1 sw Y   QxY w)Nc                 Z    t        dj                  | |      t        j                         y )Nz&Connection Error: {!r}.  Retry in {}s.file)printr   sysstderr)excintervals     r/   on_connection_errorz+capture_events.<locals>.on_connection_error  s$    6==!$	-r1   z-> evtop: starting capture...r7  *)handlerszConnection lost: )r9  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<  s          r/   capture_eventsrM    s    - -CJJ?$$& 		D$D&&':'*xx'M'MOzz**43:L*M##%##%		D  ))D,?,?? D)#1

CCD		D 		Ds/   DA?B::C>C94D9C>>DD
c                    t        |       } | j                  j                         }t        ||       }|j	                          t        |      }|j                          	 t        | ||       y# t        $ r) d|_	        |j                          |j                           t        t        f$ r* d|_	        |j                          |j                          Y yw xY w)zStart curses monitor.TN)r
   rE  Stater   r  r,  startrM  rq   r/  r   r  KeyboardInterrupt
SystemExit)r   r!   r.  	refreshers       r/   r   r      s    

CJJEE3'Gg&IOO
sE7+ !	z* !	s   A, ,A&CC__main__rL   )#r$  r|   r:  r*   r   	itertoolsr   mathr   textwrapr   r   celeryr   r	   
celery.appr
   celery.utils.textr   r   __all__rW   r   r:   r6   r7   r9   r8   r   r   Threadr,  rM  r   r!  r   r1   r/   <module>r]     s    6  
       ) % ,
$ 
 

z zz
I$$ 
D(* z	G r1   