o
    ›¨Êhè?  ã                   @   s*  d Z ddlZddlZddlZddlZddlZddlmZmZ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 dd	lmZmZmZ dd
lmZmZmZmZ ddlmZ dZdZ dd„ Z!dd„ Z"dd„ Z#dd„ Z$dd„ Z%G dd„ dƒZ&G dd„ dƒZ'dd„ Z(G dd„ dƒZ)G d d!„ d!eƒZ*dS )"zStart/stop/manage workers.é    N)ÚOrderedDictÚUserListÚdefaultdict)Úpartial)ÚPopen)Úsleep)Ú	from_utf8)Úcached_property)Ú
IS_WINDOWSÚPidfileÚsignal_name)ÚgethostnameÚhost_formatÚnode_formatÚ	nodesplit)Úsaferepr)ÚClusterÚNodeÚceleryc                  G   s   d  tf|  ¡S )Nú )ÚjoinÚ
CELERY_EXE)Úargs© r   úC/var/www/html/env/lib/python3.10/site-packages/celery/apps/multi.pyÚ
celery_exe   ó   r   c                 C   sN   |}d| v rt | ƒ}t|ƒ\}}|} n|› | › �}t |› d|› �ƒ}| ||fS )Nú@)r   r   )ÚnameÚprefixÚsuffixÚhostnameÚnodenameÚ	shortnamer   r   r   Úbuild_nodename   s   ÿ
r$   c              	   C   s   t t| ||| ddd�S )Nz%iz%I)r   ÚNÚdÚhÚiÚI)r   r   )r"   r#   r!   r   r   r   Úbuild_expander*   s   ùr*   c                 C   s.   |s| S |   d¡r| › d|› �S | › d|› �S )Nú--ú=r   )Ú
startswith)ÚoptÚvaluer   r   r   Ú
format_opt6   s
   
r0   c                 C   s   dd„ |   ¡ D ƒS )Nc                 S   s<   i | ]\}}t |ƒd krd | dd¡¡nd|› �|› “qS )é   z--{}Ú_ú-)ÚlenÚformatÚreplace)Ú.0ÚkÚvr   r   r   Ú
<dictcomp>?   s    ÿÿþz+_kwargs_to_command_line.<locals>.<dictcomp>)Úitems)Úkwargsr   r   r   Ú_kwargs_to_command_line>   s   ýr=   c                   @   sD   e Zd Zdd„ Zdd„ Zddd„Zddd	„Zdd
d„Zddd„ZdS )ÚNamespacedOptionParserc                 C   s,   || _ tƒ | _g | _d| _tdd„ ƒ| _d S )NÚ c                   S   s   t ƒ S ©N)r   r   r   r   r   Ú<lambda>M   s    z1NamespacedOptionParser.__init__.<locals>.<lambda>)r   r   ÚoptionsÚvaluesÚpassthroughr   Ú
namespaces)Úselfr   r   r   r   Ú__init__H   s
   zNamespacedOptionParser.__init__c                 C   sî   dd„ | j D ƒ}d}|t|ƒk ru|| }|dkr$d ||d … ¡| _d S |d dkrc|d dkr:|  |dd … ¡ n/d }t|ƒ|d krX||d  d dkrX||d  }|d7 }|  |dd … |¡ n| j |¡ |d7 }|t|ƒk sd S d S )	Nc                 S   s   g | ]}|r|‘qS r   r   )r7   Úargr   r   r   Ú
<listcomp>P   ó    z0NamespacedOptionParser.parse.<locals>.<listcomp>r   r+   r   r3   r1   é   )r   r4   r   rD   Úprocess_long_optÚprocess_short_optrC   Úappend)rF   ÚrargsÚposrH   r/   r   r   r   ÚparseO   s$   $ðzNamespacedOptionParser.parseNc                 C   s,   d|v r|  dd¡\}}| j||dd� d S )Nr,   r1   F©Úshort)ÚsplitÚ
add_option©rF   rH   r/   r   r   r   rL   d   s   z'NamespacedOptionParser.process_long_optc                 C   s   | j ||dd� d S )NTrR   )rU   rV   r   r   r   rM   i   s   z(NamespacedOptionParser.process_short_optc                 C   s$   |d u r| j }t|fi | j| ¤ŽS r@   )rB   r   rE   )rF   ÚnsÚdefaultsr   r   r   Úoptmergel   s   zNamespacedOptionParser.optmergeFc                 C   sB   |rdpd}| j }d|v r| d¡\}}| j| }|||| < d S )Nr3   r+   ú:)rB   rT   rE   )rF   r   r/   rS   rW   r   Údestr   r   r   rU   q   s   
z!NamespacedOptionParser.add_optionr@   )FN)	Ú__name__Ú
__module__Ú__qualname__rG   rQ   rL   rM   rY   rU   r   r   r   r   r>   F   s    


r>   c                   @   sæ   e Zd ZdZ	d*dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	d+dd„Z
d+dd„Zejddddfdd„Zd,dd„Zdd„ Zdd„ Zdd„ Zedd„ ƒZedd „ ƒZed!d"„ ƒZejd#d"„ ƒZed$d%„ ƒZed&d'„ ƒZed(d)„ ƒZdS )-r   zRepresents a node in a cluster.Nc                 C   s\   || _ |pdtddƒ› �| _|| _|pd| _|  |ptƒ ¡| _|  ¡ | _	|  
¡ | _d | _d S )Nz-m Úworkerz--detachr?   )r   r   ÚcmdrN   Ú
extra_argsÚ_annotate_with_default_optsr   rB   Ú_prepare_expanderÚexpanderÚ_prepare_argvÚargvÚ_pid)rF   r   r`   rN   rB   ra   r   r   r   rG   }   s   
ÿ


zNode.__init__c                 C   sD   | j |d< |  |ddgd¡ |  |ddgd¡ |  |dgtj¡ |S )	Nú-nú	--pidfileú-pz/var/run/celery/%n.pidú	--logfileú-fz/var/log/celery/%n%I.logú--executable)r   Ú_setdefaultoptÚsysÚ
executable)rF   rB   r   r   r   rb   ‰   s
   
z Node._annotate_with_default_optsc              	   C   st   |dd … D ]}z|| W   S  t y   Y qw | |d tj |¡¡}tj |¡}|r8tj |¡s8t |¡ |S )Nr1   r   )ÚKeyErrorÚ
setdefaultÚosÚpathÚnormpathÚdirnameÚexistsÚmakedirs)rF   r&   Úaltr/   r.   Údir_pathr   r   r   rn   �   s   ÿ
zNode._setdefaultoptc                 C   s    | j  dd¡\}}t| j ||ƒS )Nr   r1   )r   rT   r*   )rF   r#   r!   r   r   r   rc   œ   s   ÿzNode._prepare_expanderc              	      s¶   ˆ   ˆ j¡ d¡}| d¡d }ˆ j ¡ }ˆ j ¡ D ]\}}|dv r3| |t|ˆ   |¡ƒ¡ | 	|¡ qd 
|¡g}t|‡ fdd„| ¡ D ƒ ˆ jg ƒ}ˆ jrY|ˆ   ˆ j¡f7 }|S )Nr   r   r1   )z-Az--appz-bz--brokerz--result-backendz--loaderz--configz	--workdirz-Cz
--no-colorz-qz--quietc                    s    g | ]\}}t |ˆ  |¡ƒ‘qS r   )r0   rd   )r7   r.   r/   ©rF   r   r   rI   ¸   s    ÿz&Node._prepare_argv.<locals>.<listcomp>)rd   r`   rT   ÚindexrB   Úcopyr;   Úinsertr0   Úpopr   Útuplera   rN   )rF   r`   r(   rB   r.   r/   rf   r   r{   r   re   ¡   s*   


€
ÿÿýÿzNode._prepare_argvc                 C   s
   |   d¡S ©Nr   )Úsendr{   r   r   r   ÚaliveÀ   s   
z
Node.alivec              
   C   sj   | j }|r.z	t ||¡ W dS  ty- } z|jtjkr‚ t|| ƒ W Y d }~dS d }~ww t|| ƒ d S )NFT)Úpidrs   ÚkillÚOSErrorÚerrnoÚESRCHÚ
maybe_call)rF   ÚsigÚon_errorr„   Úexcr   r   r   r‚   Ã   s   û
€üz	Node.sendc                 K   s   | j | jf| j|dœ|¤ŽS )N)rt   Úenv)Ú	_waitexecrf   rp   )rF   r�   r<   r   r   r   ÚstartÐ   s   ÿÿÿz
Node.startc           	      C   sB   |   ||¡}t|| d |¡|d� t||d�}| j| ¡ ||d�S )Nr   )Úargstrr�   )r�   )Úon_signalledÚ
on_failure)Úprepare_argvr‰   r   r   Úhandle_process_exitÚwait)	rF   rf   rt   r�   Úon_spawnr‘   r’   r�   Úpiper   r   r   rŽ   Ô   s   ýzNode._waitexecc                 C   s4   |dk rt || | ƒ | S |dkrt || |ƒ |S r�   )r‰   )rF   Úretcoder‘   r’   r   r   r   r”   ß   s   zNode.handle_process_exitc                 C   s(   d  |gt|ƒ ¡}tjt|ƒt d�S )Nr   )Úposix)r   ÚlistÚshlexrT   r   r
   )rF   rf   rt   r   r   r   r   r“   ç   s   zNode.prepare_argvc              	   G   s8   |D ]}z| j | W   S  ty   Y qw t|d ƒ‚r�   )rB   rq   )rF   ry   r.   r   r   r   Úgetoptë   s   ÿzNode.getoptc                 C   s   dt | ƒj› d| j› d�S )Nú<z: ú>)Útyper\   r   r{   r   r   r   Ú__repr__ó   s   zNode.__repr__c                 C   ó   |   |  dd¡¡S )Nri   rj   ©rd   rœ   r{   r   r   r   Úpidfileö   ó   zNode.pidfilec                 C   r¡   )Nrk   rl   r¢   r{   r   r   r   Úlogfileú   r¤   zNode.logfilec                 C   s6   | j d ur| j S zt| jƒ ¡ W S  ty   Y d S w r@   )rg   r   r£   Úread_pidÚ
ValueErrorr{   r   r   r   r„   þ   s   
ÿzNode.pidc                 C   s
   || _ d S r@   )rg   )rF   r/   r   r   r   r„     ó   
c                 C   s
   | j d S )Nrm   ©rB   r{   r   r   r   rp     r¨   zNode.executablec                 C   s   | j f| j S r@   )rp   rf   r{   r   r   r   Úargv_with_executable  s   zNode.argv_with_executablec                 K   s   | |t |ƒd�S )Nr©   )r=   )Úclsr   r<   r   r   r   Úfrom_kwargs  s   zNode.from_kwargs)NNNNr@   )NN)r\   r]   r^   Ú__doc__rG   rb   rn   rc   re   rƒ   r‚   r�   ro   rp   rŽ   r”   r“   rœ   r    r	   r£   r¥   Úpropertyr„   Úsetterrª   Úclassmethodr¬   r   r   r   r   r   z   s@    
ÿ


ÿ






r   c                 O   s   | d ur| |i |¤Ž d S d S r@   r   )Úfunr   r<   r   r   r   r‰     s   ÿr‰   c                   @   sR   e Zd ZeZ			ddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	ddd„Z
dS )ÚMultiParserúcelery workerr?   r   c                 C   s"   || _ || _|| _|| _|| _d S r@   )r`   rN   r   r    Úrange_prefix)rF   r`   rN   r   r    r´   r   r   r   rG      s
   
zMultiParser.__init__c                    sú   ˆj }tˆjƒ‰t|ƒdk}ˆj‰ˆ dˆj¡‰ˆ dˆj¡‰ ˆ dˆ dtƒ ¡¡}ˆ dˆ¡p1d‰ˆ dˆj	¡p:|‰ˆd	v rAdnˆ‰ˆ d
d¡pKˆj
}|rbz
ˆ |¡|}‰W n	 tya   Y nw ˆ ˆ|¡ ˆ ˆ|¡ ‡ ‡‡‡‡‡‡fdd„|D ƒS )Nr1   z--cmdz--appendz
--hostnamerh   z--prefixr?   z--suffix)z""z''z--range-prefixc              
   3   s&   � | ]}ˆ  ˆ|ˆˆˆˆ ˆ¡V  qd S r@   )Ú_node_from_options)r7   r   ©rN   r`   rB   Úpr   rF   r    r   r   Ú	<genexpr>=  s   € þÿ
ÿz$MultiParser.parse.<locals>.<genexpr>)rC   ÚdictrB   r4   r   r   r`   rN   r   r    r´   Ú_get_rangesr§   Ú_update_ns_optsÚ_update_ns_ranges)rF   r·   ÚnamesÚrangesr!   r´   r   r¶   r   rQ   )  s,   
ÿýzMultiParser.parsec                 C   s>   t |||ƒ\}}	}
|	|jv r|	n|}t|	||| ||¡|jƒS r@   )r$   rE   r   rY   rD   )rF   r·   r   r   r    r`   rN   rB   Ú	namespacer"   r2   r   r   r   rµ   C  s
   ÿzMultiParser._node_from_optionsc                 C   s$   t |d ƒ}dd„ td|d ƒD ƒS )Nr   c                 S   s   g | ]}t |ƒ‘qS r   ©Ústr©r7   Únr   r   r   rI   L  rJ   z+MultiParser._get_ranges.<locals>.<listcomp>r1   )ÚintÚrange)rF   r½   Ú	noderanger   r   r   rº   J  s   zMultiParser._get_rangesc              	   C   s|   t |j ¡ ƒD ]4\}}| ¡ r;t|ƒd }|dk r td|›�ƒ‚z|j||   |¡ W q ty:   td|›�ƒ‚w qd S )Nr1   r   zIndexes start at 1 got: zNo node at index )rš   rE   r;   ÚisdigitrÄ   rq   ÚupdateÚ
IndexError)rF   r·   r½   Úns_nameÚns_optsÚns_indexr   r   r   r»   N  s   ÿúÿzMultiParser._update_ns_optsc                 C   s^   t |j ¡ ƒD ]%\}}d|v s|r,d|v r,|  ||¡D ]
}|j|  |¡ q|j |¡ qd S )Nú,r3   )rš   rE   r;   Ú_parse_ns_rangerÈ   r   )rF   r·   r¾   rÊ   rË   Úsubnsr   r   r   r¼   [  s   €üzMultiParser._update_ns_rangesFc                 C   sr   g }d|v r|  d¡p|gD ](}|r1d|v r1|  d¡\}}| dd„ tt|ƒt|ƒd ƒD ƒ¡ q| |¡ q|S )NrÍ   r3   c                 s   s   � | ]}t |ƒV  qd S r@   rÀ   rÂ   r   r   r   r¸   g  s   € 
ÿz.MultiParser._parse_ns_range.<locals>.<genexpr>r1   )rT   ÚextendrÅ   rÄ   rN   )rF   rW   r¾   ÚretÚspacer�   Ústopr   r   r   rÎ   b  s   

ÿzMultiParser._parse_ns_rangeN)r³   r?   r?   r?   r   )F)r\   r]   r^   r   rG   rQ   rµ   rº   r»   r¼   rÎ   r   r   r   r   r²     s    
þ	r²   c                   @   sÜ   e Zd ZdZ																d"dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	e
jfdd„Zdde
jfdd„Zdde
jfdd„Zdde
jfdd„Ze
jdfdd„Zdd„ Zd#dd„Zdd„ Zed d!„ ƒZdS )$r   zRepresent a cluster of workers.Nc                 C   sx   || _ |ptdƒ| _|| _|| _|| _|| _|| _|| _|	| _	|
| _
|| _|| _|| _|| _|| _|| _|| _|| _d S )Nr_   )Únodesr   r`   r�   Úon_stopping_preambleÚon_send_signalÚon_still_waiting_forÚon_still_waiting_progressÚon_still_waiting_endÚon_node_startÚon_node_restartÚon_node_shutdown_okÚon_node_statusÚon_node_signalÚon_node_signal_deadÚon_node_downÚon_child_spawnÚon_child_signalledÚon_child_failure)rF   rÔ   r`   r�   rÕ   rÖ   r×   rØ   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rß   rà   rá   râ   rã   r   r   r   rG   r  s$   
zCluster.__init__c                    s   ‡ fdd„ˆ D ƒS )Nc                    s   g | ]}ˆ   |¡‘qS r   )Ú
start_node)r7   Únoder{   r   r   rI   —  s    z!Cluster.start.<locals>.<listcomp>r   r{   r   r{   r   r�   –  s   zCluster.startc                 C   s(   t | j|ƒ |  |¡}t | j||ƒ |S r@   )r‰   rÚ   Ú_start_noderÝ   )rF   rå   r˜   r   r   r   rä   ™  s   
zCluster.start_nodec                 C   s   |j | j| j| j| jd�S )N)r–   r‘   r’   )r�   r�   rá   râ   rã   )rF   rå   r   r   r   ræ   Ÿ  s   üzCluster._start_nodec                 C   s8   | j | jd�D ]}t| j|t|ƒƒ | || j¡ qd S )N©Úon_down)Úgetpidsrà   r‰   rÞ   r   r‚   rß   )rF   rŠ   rå   r   r   r   Úsend_all§  s   þzCluster.send_allc                 C   s   |   tj¡S r@   )rê   ÚsignalÚSIGKILLr{   r   r   r   r…   ¬  s   zCluster.killc                    s&   g ‰ ‡ ‡fdd„}ˆj d||d� ˆ S )Nc                    s2   t ˆj| ƒ ˆ | ¡}t ˆj| |ƒ ˆ  |¡ d S r@   )r‰   rÛ   ræ   rÝ   rN   )rå   Úretval©ÚretvalsrF   r   r   Úrestart_on_down²  s   
z(Cluster.restart.<locals>.restart_on_downrK   ©Úretryrè   rŠ   ©Ú_stop_nodes)rF   rŠ   rð   r   rî   r   Úrestart¯  s   zCluster.restartc                 C   ó   | j |||d�S ©Nrñ   ró   ©rF   rò   ÚcallbackrŠ   r   r   r   rÓ   »  r   zCluster.stoprK   c                 C   rö   r÷   ró   rø   r   r   r   Ústopwait¾  r   zCluster.stopwaitc                 C   sN   |d ur|n| j }t| j|d�ƒ}|r#| j|||d�D ]	}t||ƒ qd S d S )Nrç   )rŠ   rò   )rà   rš   ré   Úshutdown_nodesr‰   )rF   rò   rè   rŠ   rÔ   rå   r   r   r   rô   Á  s   þzCluster._stop_nodesc                 c   s  � t |ƒ}t| j|ƒ t ƒ }|D ]}t| j|t|ƒƒ | || j¡s*| |¡ |V  q||8 }|r‚t| j|ƒ d}|r{t ƒ }|D ]&}|d7 }t| j	|ƒ | 
¡ sft| j|ƒ | |¡ |V  t| j|ƒ  nq@||8 }|ry|t|ƒ sytt|ƒƒ |s;t| jƒ d S d S )Nr   r1   )Úsetr‰   rÕ   rÖ   r   r‚   rß   Úaddr×   rØ   rƒ   rÜ   r4   r   ÚfloatrÙ   )rF   rÔ   rŠ   rò   ÚPÚ	to_removerå   Úitsr   r   r   rû   È  s@   €
€
ûóïzCluster.shutdown_nodesc                 C   s$   | D ]}|j |kr|  S qt|ƒ‚r@   )r   rq   )rF   r   rå   r   r   r   Úfindå  s
   
ÿzCluster.findc                 c   s(   � | D ]}|j r|V  qt||ƒ qd S r@   )r„   r‰   )rF   rè   rå   r   r   r   ré   ë  s   €üzCluster.getpidsc                 C   s(   dj t| ƒtdd„ | D ƒƒt| ƒjd�S )Nz<{name}({0}): {1}>c                 S   s   g | ]}|j ‘qS r   ©r   rÂ   r   r   r   rI   ô  s    z$Cluster.__repr__.<locals>.<listcomp>r  )r5   r4   r   rŸ   r\   r{   r   r   r   r    ò  s   þzCluster.__repr__c                 C   s   | j S r@   )rÔ   r{   r   r   r   Údataø  s   zCluster.data)NNNNNNNNNNNNNNNNNr@   )r\   r]   r^   r­   rG   r�   rä   ræ   rê   r…   rë   ÚSIGTERMrõ   rÓ   rú   rô   rû   r  ré   r    r®   r  r   r   r   r   r   o  sD    
ñ$
r   )+r­   r‡   rs   r›   rë   ro   Úcollectionsr   r   r   Ú	functoolsr   Ú
subprocessr   Útimer   Úkombu.utils.encodingr   Úkombu.utils.objectsr	   Úcelery.platformsr
   r   r   Úcelery.utils.nodenamesr   r   r   r   Úcelery.utils.safereprr   Ú__all__r   r   r$   r*   r0   r=   r>   r   r‰   r²   r   r   r   r   r   Ú<module>   s8    4 R