
    $g8                         d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZmZ d dl	m
Z
 d dlmZmZ d dlmZmZ d dlmZ d dlZd dlmZ d d	lmZ d d
lmZmZmZmZmZmZ d dlm Z  d dl!m"Z"m#Z# d dl$m%Z%  eej&        d          Z' eej&        d          Z( eej&        d          Z)d Z*efdZ+d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4d Z5d Z6 G d d           Z7 ej8        d!d"d#d$%           ej8        d&d'd(d)%           ej8        d*d+d,ed-.           ej8        d/d0d1ed2.           ej8        d3d4ed5.           ej8        d6d7ed8.           ej8        d9d:d;gd<d=>           ej8        d?d@edAB          gZ9dC Z:dS )D    N)literal_eval)datetime	timedeltatimezone)Enum)partialupdate_wrapper)JSONDecodeErrorloads)get_terminal_size)Redis)Sentinel)DEFAULT_CONNECTION_CLASSDEFAULT_DEATH_PENALTY_CLASSDEFAULT_JOB_CLASSDEFAULT_QUEUE_CLASSDEFAULT_SERIALIZER_CLASSDEFAULT_WORKER_CLASS)setup_loghandlers)import_attributeparse_timeout)WorkerStatusred)fggreenyellowc                     t          j        |           }t          d |j                                        D                       S )z?Reads all UPPERCASE variables defined in the given module file.c                 L    g | ]!\  }}|                                 |k    ||f"S  )upper).0kvs      N/var/www/html/netbox-4.1.3/venv/lib/python3.11/site-packages/rq/cli/helpers.py
<listcomp>z$read_config_file.<locals>.<listcomp>$   s-    PPPDAqa!Q    )	importlibimport_moduledict__dict__items)modulesettingss     r$   read_config_filer.   !   s>    &v..HPPH$5$;$;$=$=PPPQQQr&   c           
         |                      d          |                    | d                   S |                      d          2| d                              ddg          }| d                              dd          }| d                              dd	          | d                              d
d          | d                              dd          | d                              dd          | d                              dd          d}|                    | d                              di                      | d                              di           }t          |fd|i|}|                    |          S |                      dd          }t          |t                    rA|                                dv rd}n(|                                dv rd}nt          d          |                      dd          |                      dd          |                      dd	          |                      dd          ||                      dd          |                      dd           d!} |d"i |S )#aB  Returns a StrictRedis instance from a dictionary of settings.
    To use redis sentinel, you must specify a dictionary in the configuration file.
    Example of a dictionary with keys without values:
    SENTINEL = {'INSTANCES':, 'SOCKET_TIMEOUT':, 'USERNAME':, 'PASSWORD':, 'DB':, 'MASTER_NAME':, 'SENTINEL_KWARGS':}
    	REDIS_URLNSENTINEL	INSTANCES)	localhostig  MASTER_NAMEmymasterDBr   USERNAMEPASSWORDSOCKET_TIMEOUTSSLF)dbusernamepasswordsocket_timeoutsslCONNECTION_KWARGSSENTINEL_KWARGSsentinel_kwargs	REDIS_SSL)yyesttrueT)nnoffalse z5REDIS_SSL is a boolean and must be "True" or "False".
REDIS_HOSTr3   
REDIS_PORTi  REDIS_DBREDIS_PASSWORDREDIS_SSL_CA_CERTSREDIS_SSL_CERT_REQSrequired)hostportr;   r=   r?   ssl_ca_certsssl_cert_reqsr   )	getfrom_urlupdater   
master_for
isinstancestrlower
ValueError)	r-   connection_class	instancesmaster_nameconnection_kwargsrB   snr?   kwargss	            r$   get_redis_from_configrf   '   ss    ||K  ,((+)>???	j	!	!	-Z(,,[;O:PQQ	z*..}jII :&**433 ,00TBB ,00TBB&z2667GNNJ'++E599
 
 	  *!5!9!9:Mr!R!RSSS":.223DbIIiVVVDUVV}}[)))
,,{E
*
*C#s V99;;333CCYY[[999CCTUUU \;77\400ll:q))LL!1488 %94@@!&;ZHH F %%f%%%r&   c                     dd|z  z   | fz  S )z*Pads the given string to the given length.z%-z%dsr   )spad_to_lengths     r$   padrj   W   s    5=((QD00r&   c                 ,    g d}|D ]}| |k    r|c S | S )z(Finds the lowest scale where x <= scale.)   2   d      i  iX  i   i  r   )xscalesscales      r$   	get_scalers   \   s8    444F  ::LLL Hr&   c                     t           j        t          d          t           j        t	          d          t           j        t          d          i}	 ||          S # t          $ r | cY S w xY w)Nbusyidle	suspended)r   BUSYr   IDLEr   	SUSPENDEDr   KeyError)statesymbolss     r$   state_symbolr~   e   sh    3v;;5=={ 3 3G
u~   s   A A&%A&c           	         d}t                      j        }t          d|dz
            }d}t                      }	| D ]}
|
j        }||	|
<   t          ||          }t          |          }|dz  |z  }| D ]}
|	|
         }|sTt          ddt          ||z            z  z             }d|
j	        |||
j
        j        |
j        j        |
j        j        fz  }n-d|
j	        ||
j
        j        |
j        j        |
j        j        fz  }t          j        |           ||z  }|s(t          j        dt          |           |fz             d S d S )	Nr   rl   g      ?|u   █z1%-12s %s %d, %d executing, %d finished, %d failedz1queue %s %d, %d executing, %d finished, %d failedz%d queues, %d jobs total)r   columnsminr)   countmaxrs   r   intnamestarted_job_registryfinished_job_registryfailed_job_registryclickecholen)queuesrawby_queuequeue_classworker_classnum_jobs	termwidth
chartwidth	max_countcountsqr   rr   ratiochartlines                   r$   show_queuesr   q   s   H!##+IRR((JIVVF * *q		5))		i  Eu$E  q	 	#EEM(:(: ::;;EF&,'-%+J DD G&,'-%+J D 	
4E  I
-Vh0GGHHHHHI Ir&   c           
         t                      }| r4| D ]0}|                    |          D ]}|                    |           1n,|                                D ]}|                    |           |s|D ]}d                    |                                          }|j        d|j        d|j        d|j        d}	|sHd|	t          |
                                          ||j        |j        fz  }
t          j        |
           d|	|
                                ||j        |j        fz  }
t          j        |
           ni }| D ]}|                    |          ||<   |r,t          d |                                D                       }nd	}|D ]v}||         r8d                    t#          t%          d
 ||                                       }nd}t          j        t'          |j        dz   |dz             d|           w|s5t          j        dt)          |          t)          |           fz             d S d S )N)queuez,  ( )z'%s: %s %s. jobs: %d finished, %d failedz-worker %s %s %s. jobs: %d finished, %d failedc              3   B   K   | ]\  }t          |j                  V  d S N)r   r   )r!   r   s     r$   	<genexpr>zshow_workers.<locals>.<genexpr>   s,      EERQS[[EEEEEEr&   r   c                 Z    | j         dt          |                                           dS )Nr   r   )r   r~   	get_state)ws    r$   <lambda>zshow_workers.<locals>.<lambda>   s'    afffl1;;==>Y>Y>Y>Y)Z r&   u   –:   z%d workers, %d queues)setalladdjoinqueue_namesr   hostname
ip_addresspidr~   r   successful_job_countfailed_job_countr   r   r   keyssortedmaprj   r   )r   r   r   r   r   workersr   workerr   r   r   
queue_dict
max_length
queues_strs                 r$   show_workersr      s   eeG   	$ 	$E&***77 $ $F####$	$ #&&(( 	  	 FKK )V 	! 	!F))F$6$6$8$899K&,kkk6???FDUDUDUW]WaWaWabD !@ !1!1!3!344/+D  
4    F$$&&/+J  
4    )	!0 
 	> 	>E , 0 0u 0 = =Ju 	EE:??3D3DEEEEEJJJ 	V 	VE%  #!YY3ZZ\fgl\mnnoo 

 #
J#ej3&6
Q"G"G"G"GTUUUU J
*c'llCKK-HHIIIIIJ Jr&   c                    t          | ||||           |st          j        d           t          | ||||           |sHt          j        d           dd l}t          j        d|j                                        z             d S d S )NrL   r   zUpdated: %s)r   r   r   r   r   now)r   r   r   r   r   r   s         r$   	show_bothr      s    X{LAAA 
2h\BBB <
2
=8#4#8#8#:#::;;;;;	< <r&   c                 l    	 | rt          j                      ||  | rt          j        |            nd S 4r   )r   cleartimesleep)intervalfuncargss      r$   refreshr      sJ     	KMMMd 	Jx    Er&   c                 h    | r|rt          d          | rd}n|rd}nd}t          |||           d S )Nz3Flags --verbose and --quiet are mutually exclusive.DEBUGWARNINGINFO)date_format
log_format)RuntimeErrorr   )verbosequietr   r   levels        r$   setup_loghandlers_from_argsr      s`     R5 RPQQQ 	 eLLLLLLr&   c                 N    G d dt                     }d }|                     d          r|j        }| dd          }n|                     d          r|j        }| dd          }n|                     d          }|dk    rd| v r1|                     d          dz   |k    r|j        }| d |dz
           }nFd| v r1|                     d          dz   |k    r|j        }| d |dz
           }n|j        }| d |         }| |dz   d          }n	|j        }| }|                    d          rq	 t          |dd          d	          5 }|                                }d d d            n# 1 swxY w Y   n+# t          $ r t          j        |dd          d
          w xY w||j        k    r;	 t          |          }np# t          $ r t          j        d|pd|z  z            w xY w||j        k    r;	 t          |          }n*# t           $ r t          j        d|pd|z  z            w xY w||fS )Nc                       e Zd ZdZdZdZdS )'parse_function_arg.<locals>.ParsingModer   r      N)__name__
__module____qualname__
PLAIN_TEXTJSONLITERAL_EVALr   r&   r$   ParsingModer      s        
r&   r   r   r   %=r   @rz	Not foundzUnable to parse %s as JSON.z%s. non keyword argumentzcUnable to eval %s as Python object. See https://docs.python.org/3/library/ast.html#ast.literal_eval)r   
startswithr   r   findindexr   openreadFileNotFoundErrorr   	FileErrorr   r
   BadParameterr   	Exception)argumentarg_posr   keywordmodevaluer   files           r$   parse_function_argr      s       d   
 G3 			S	!	! 'c""199h8>>##6#6#:e#C#C"'";UQY;/X^^C%8%81%<%E%E"/";UQY;/"-"6E6*UQY[[)EE)DE :	:eABBi%% $		$ $ $ $ $ $ $ $ $ $ $ $ $ $ $  	: 	: 	:/%)[999	: {	x%LLEE 	x 	x 	x$%BgFuQknuQu%vwww	x	)	)	)	 ''EE 	 	 	$NB87BD  	 E>sH   'E, ?E E,  E$$E, 'E$(E, ,(F#F3 3'G)G9 9'H c                     g }i }| D ]Z}t          |t          |          dz             \  }}|||v rt          j        d          |||<   E|                    |           [||fS )Nr   z7You can't specify multiple values for the same keyword.)r   r   r   r   append)	argumentsr   re   r   r   r   s         r$   parse_function_argsr   0  s    DF  +Hc$ii!mDD&  ()cddd#F7OOKK<r&   c                     | R|t          j        d          t          j        t          j                  t          t          |                     z   S |t          j        |d          S d S )Nz6You can't specify both --schedule-in and --schedule-at)secondsz%Y-%m-%dT%H:%M:%S)	r   BadArgumentUsager   r   r   utcr   r   strptime)schedule_inschedule_ats     r$   parse_scheduler   ?  sl    "()bccc|HL))ImK>X>X,Y,Y,YYY		  .ABBB 
!	 r&   c                   @    e Zd ZdZddeeeeedfdZ	e
d             ZdS )	CliConfigzGA helper class to be used with click commands, to handle shared optionsNc	                    d | _         || _        || _        |r$|D ]!}t          j                            |           "	 t          |          | _        n<# t          t          f$ r(}t          j        t          |          d          d }~ww xY w	 t          |          | _        n<# t          t          f$ r(}t          j        t          |          d          d }~ww xY w	 t          |          | _        n<# t          t          f$ r(}t          j        t          |          d          d }~ww xY w	 t          |          | _        n<# t          t          f$ r(}t          j        t          |          d          d }~ww xY w	 t          |          | _        d S # t          t          f$ r(}t          j        t          |          d          d }~ww xY w)N--worker-class)
param_hint--job-classz--death-penalty-class--queue-class--connection-class)_connectionurlconfigsyspathr   r   r   ImportErrorAttributeErrorr   r   r]   	job_classdeath_penalty_classr   r`   )selfr  r  r   r  r  r   r`   r
  r   re   pthexcs                r$   __init__zCliConfig.__init__K  s      	% % %$$$$	L 0 > >D^, 	L 	L 	L$SXX:JKKKK	L	I-i88DNN^, 	I 	I 	I$SXX-HHHH	I	S'78K'L'LD$$^, 	S 	S 	S$SXX:QRRRR	S	K/<<D^, 	K 	K 	K$SXX/JJJJ	K	P$45E$F$FD!!!^, 	P 	P 	P$SXX:NOOOO	Psw   A B##BBB$ $C5#CC!C6 6D/#D**D/3E F#E<<FF G,#GGc                 <   | j         | j        r%| j                            | j                  | _         nc| j        r8| j        rt          | j                  ni }t          || j                  | _         n$t          t          j        | j                  | _         | j         S r   )	r  r  r`   rY   r  r.   rf   osenviron)r  r-   s     r$   
connectionzCliConfig.connectionx  s    #x \#'#8#A#A$(#K#K   \<@KO+DK888R#84CX#Y#Y  #8TEZ#[#[ r&   )r   r   r   __doc__r   r   r   r   r   r  propertyr  r   r&   r$   r   r   H  sh        QQ )#7'1+P +P +P +PZ 	  	  X	  	  	 r&   r   z--urlz-uRQ_REDIS_URLz(URL describing Redis connection details.)envvarhelpz--configz-c	RQ_CONFIGzModule containing RQ settings.r  z-wRQ_WORKER_CLASSzRQ Worker class to use)r  defaultr  r  z-jRQ_JOB_CLASSzRQ Job class to user  RQ_QUEUE_CLASSzRQ Queue class to user  RQ_CONNECTION_CLASSzRedis client class to usez--pathz-P.zSpecify the import path.T)r  r  multiplez--serializerz-Sz@Path to serializer, defaults to rq.serializers.DefaultSerializer)r  r  c                 X     t           D ]} |             fd}t          |           S )Nc                  v    t          j                    }t          di |} |j        |g| dd          R i |S )Nr   r   )r   get_current_contextr   invoke)r   re   ctx
cli_configr   s       r$   wrapperz pass_cli_config.<locals>.wrapper  sP    '))((((
sz$
@T!""X@@@@@@r&   )shared_optionsr	   )r   optionr*  s   `  r$   pass_cli_configr-    sQ       vd||A A A A A
 '4(((r&   );r'   r  r	  r   astr   r   r   r   enumr   	functoolsr   r	   jsonr
   r   shutilr   r   redisr   redis.sentinelr   rq.defaultsr   r   r   r   r   r   rq.logutilsr   rq.utilsr   r   	rq.workerr   styler   r   r   r.   rf   rj   rs   r~   r   r   r   r   r   r   r   r   r   r,  r+  r-  r   r&   r$   <module>r:     s       				 



        2 2 2 2 2 2 2 2 2 2       - - - - - - - - ' ' ' ' ' ' ' ' $ $ $ $ $ $        # # # # # #                * ) ) ) ) ) 4 4 4 4 4 4 4 4 " " " " " "geke$$$(((		*	*	*R R R 6; -& -& -& -&`1 1 1
  	 	 	(I (I (IV6J 6J 6Jr	< 	< 	<  
M 
M 
M4 4 4n  C C C:  :  :  :  :  :  :  : | EL$~<fgggELT+<\]]]EL$'8BV]u   EL^EV]rsssEL)9CV]tuuuEL$((	   EL4#5OZ^___EL(O	  0) ) ) ) )r&   