o
    wvXj6>  ã                   @   sL  d Z ddlmZm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 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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e+ƒZ,G dd„ de+ƒZ-dd„ Z.G d d!„ d!e+ƒZ/G d"d#„ d#eƒZ0dS )$zStart/stop/manage workers.é    )Úabsolute_importÚunicode_literalsN)ÚOrderedDictÚdefaultdict)Úpartial)ÚPopen)Úsleep)Ú	from_utf8)Úcached_property)ÚUserListÚitems)Ú
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   úN/var/www/html/myproject/venv/lib/python3.10/site-packages/celery/apps/multi.pyÚ
celery_exe   ó   r   c                 C   sL   |}d| v rt | ƒ}t|ƒ\}}|} nd|| f }t d ||¡ƒ}| ||fS )Nú@z%s%sz{0}@{1})r   r   Úformat)Ú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ú--z{0}={1}z{0} {1})Ú
startswithr!   )ÚoptÚvaluer   r   r   Ú
format_opt:   s
   
r3   c                 C   s   dd„ t | ƒD ƒS )Nc                 S   s@   i | ]\}}t |ƒd krd | dd¡¡nd |¡d |¡“qS )é   z--{0}Ú_ú-z-{0}z{0})Úlenr!   Úreplace)Ú.0ÚkÚvr   r   r   Ú
<dictcomp>C   s    ÿÿþz+_kwargs_to_command_line.<locals>.<dictcomp>)r   )Úkwargsr   r   r   Ú_kwargs_to_command_lineB   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>Q   s    z1NamespacedOptionParser.__init__.<locals>.<lambda>)r   r   ÚoptionsÚvaluesÚpassthroughr   Ú
namespaces)Úselfr   r   r   r   Ú__init__L   s
   zNamespacedOptionParser.__init__c                 C   sè   t | jƒ}d}|t|ƒk rr|| }|dkr!d ||d … ¡| _d S |d dkr`|d dkr7|  |dd … ¡ n/d }t|ƒ|d krU||d  d dkrU||d  }|d7 }|  |dd … |¡ n| j |¡ |d7 }|t|ƒk sd S d S )Nr   r/   r   r6   r4   é   )	Úlistr   r7   r   rE   Úprocess_long_optÚprocess_short_optrD   Úappend)rG   ÚrargsÚposÚargr2   r   r   r   ÚparseS   s$   
$ðzNamespacedOptionParser.parseNc                 C   s,   d|v r|  dd¡\}}| j||dd� d S )Nú=r4   F©Úshort)ÚsplitÚ
add_option©rG   rP   r2   r   r   r   rK   h   s   z'NamespacedOptionParser.process_long_optc                 C   s   | j ||dd� d S )NTrS   )rV   rW   r   r   r   rL   m   ó   z(NamespacedOptionParser.process_short_optc                 C   s$   |d u r| j }t|fi | j| ¤ŽS rA   )rC   r   rF   )rG   ÚnsÚdefaultsr   r   r   Úoptmergep   s   zNamespacedOptionParser.optmergeFc                 C   sB   |rdpd}| j }d|v r| d¡\}}| j| }|||| < d S )Nr6   r/   ú:)rC   rU   rF   )rG   r"   r2   rT   rY   r#   Údestr   r   r   rV   u   s   
z!NamespacedOptionParser.add_optionrA   )FN)	Ú__name__Ú
__module__Ú__qualname__rH   rQ   rK   rL   r[   rV   r   r   r   r   r?   J   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 {0}Úworkerz--detachr@   )r"   r!   r   ÚcmdrM   Ú
extra_argsÚ_annotate_with_default_optsr   rC   Ú_prepare_expanderÚexpanderÚ_prepare_argvÚargvÚ_pid)rG   r"   rb   rM   rC   rc   r   r   r   rH   �   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)rG   rC   r   r   r   rd   �   s
   
z Node._annotate_with_default_optsc              	   C   sp   |dd … D ]}z|| W   S  t y   Y qw | |d tj |¡¡}tj |¡}tj |¡s6t |¡ |S )Nr4   r   )ÚKeyErrorÚ
setdefaultÚosÚpathÚnormpathÚdirnameÚexistsÚmakedirs)rG   r*   Úaltr2   r1   Údir_pathr   r   r   rp   ”   s   ÿ
zNode._setdefaultoptc                 C   s    | j  dd¡\}}t| j ||ƒS )Nr    r4   )r"   rU   r.   )rG   r'   r%   r   r   r   re       s   ÿzNode._prepare_expanderc                    sN   t ˆ  ˆ j¡g‡ fdd„tˆ jƒD ƒ ˆ jg ƒ}ˆ jr%|ˆ  ˆ j¡f7 }|S )Nc                    s    g | ]\}}t |ˆ  |¡ƒ‘qS r   )r3   rf   )r9   r1   r2   ©rG   r   r   Ú
<listcomp>¨   s    ÿz&Node._prepare_argv.<locals>.<listcomp>)Útuplerf   rb   r   rC   rc   rM   )rG   rh   r   r}   r   rg   ¥   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)Úpidru   ÚkillÚOSErrorÚerrnoÚESRCHÚ
maybe_call)rG   ÚsigÚon_errorrƒ   Úexcr   r   r   r�   ³   s   û
€üz	Node.sendc                 K   s   | j | jf| j|dœ|¤ŽS )N)rv   Úenv)Ú	_waitexecrh   rr   )rG   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)	rG   rh   rv   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ˆ   )rG   Ú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   rJ   ÚshlexrU   r	   r   )rG   rh   rv   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€   )rC   rs   )rG   r{   r1   r   r   r   ÚgetoptÛ   s   ÿzNode.getoptc                 C   s   dj | t| ƒjd�S )Nz<{name}: {0.name}>©r"   )r!   Útyper^   r}   r   r   r   Ú__repr__ã   rX   zNode.__repr__c                 C   ó   |   |  dd¡¡S )Nrk   rl   ©rf   rš   r}   r   r   r   Úpidfileæ   ó   zNode.pidfilec                 C   rž   )Nrm   rn   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 rA   )ri   r   r    Úread_pidÚ
ValueErrorr}   r   r   r   rƒ   î   s   
ÿzNode.pidc                 C   s
   || _ d S rA   )ri   )rG   r2   r   r   r   rƒ   ÷   ó   
c                 C   s
   | j d S )Nro   ©rC   r}   r   r   r   rr   û   r¥   zNode.executablec                 C   s   | j f| j S rA   )rr   rh   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)NNNNrA   )NN)r^   r_   r`   Ú__doc__rH   rd   rp   re   rg   r‚   r�   rŽ   rq   rr   r�   r“   r’   rš   r�   r
   r    r¢   Úpropertyrƒ   Úsetterr§   Úclassmethodr©   r   r   r   r   r   ~   s@    
ÿ


ÿ






r   c                 O   s   | d ur| |i |¤Ž d S d S rA   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 rA   )rb   rM   r#   r$   Úrange_prefix)rG   rb   rM   r#   r$   r±   r   r   r   rH     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ˆ‰|rZzˆ 
|¡ˆj}‰W n	 tyY   Y nw ˆ ˆ|¡ ˆ ˆ|¡ ‡ ‡‡‡‡‡‡fd
d„|D ƒS )Nr4   z--cmdz--appendz
--hostnamerj   z--prefixr@   z--suffix)z""z''c              
   3   s&   � | ]}ˆ  ˆ|ˆˆˆˆ ˆ¡V  qd S rA   )Ú_node_from_options)r9   r"   ©rM   rb   rC   Úpr#   rG   r$   r   r   Ú	<genexpr>-  s   € þÿ
ÿz$MultiParser.parse.<locals>.<genexpr>)rD   ÚdictrC   r7   r#   Úpoprb   rM   r   r$   Ú_get_rangesr±   r¤   Ú_update_ns_optsÚ_update_ns_ranges)rG   r´   ÚnamesÚrangesr%   r   r³   r   rQ     s*   
ÿýzMultiParser.parsec                 C   s>   t |||ƒ\}}	}
|	|jv r|	n|}t|	||| ||¡|jƒS rA   )r(   rF   r   r[   rE   )rG   r´   r"   r#   r$   rb   rM   rC   Ú	namespacer&   r5   r   r   r   r²   3  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©r9   Únr   r   r   r~   <  s    z+MultiParser._get_ranges.<locals>.<listcomp>r4   )ÚintÚrange)rG   r»   Ú	noderanger   r   r   r¸   :  s   zMultiParser._get_rangesc              	   C   s|   t t|jƒƒD ]4\}}| ¡ r;t|ƒd }|dk r td|f ƒ‚z|j||   |¡ W q ty:   td|f ƒ‚w qd S )Nr4   r   zIndexes start at 1 got: %rzNo node at index %r)rJ   r   rF   ÚisdigitrÂ   rs   ÚupdateÚ
IndexError)rG   r´   r»   Úns_nameÚns_optsÚns_indexr   r   r   r¹   >  s   ÿúÿzMultiParser._update_ns_optsc                 C   s^   t t|jƒƒD ]%\}}d|v s|r,d|v r,|  ||¡D ]
}|j|  |¡ q|j |¡ qd S )Nú,r6   )rJ   r   rF   Ú_parse_ns_rangerÆ   r·   )rG   r´   r¼   rÈ   rÉ   Úsubnsr   r   r   rº   K  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Ë   r6   c                 s   s   � | ]}t |ƒV  qd S rA   r¾   rÀ   r   r   r   rµ   W  s   € 
ÿz.MultiParser._parse_ns_range.<locals>.<genexpr>r4   )rU   ÚextendrÃ   rÂ   rM   )rG   rY   r¼   ÚretÚspacerŽ   Ústopr   r   r   rÌ   R  s   

ÿzMultiParser._parse_ns_rangeN)r°   r@   r@   r@   r   )F)r^   r_   r`   r   rH   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 )Nra   )Únodesr   rb   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)rG   rÒ   rb   rŒ   rÓ   rÔ   rÕ   rÖ   r×   rØ   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rß   rà   rá   r   r   r   rH   b  s$   
zCluster.__init__c                    s   ‡ fdd„ˆ D ƒS )Nc                    s   g | ]}ˆ   |¡‘qS r   )Ú
start_node)r9   Únoder}   r   r   r~   ‡  s    z!Cluster.start.<locals>.<listcomp>r   r}   r   r}   r   rŽ   †  s   zCluster.startc                 C   s(   t | j|ƒ |  |¡}t | j||ƒ |S rA   )rˆ   rØ   Ú_start_noderÛ   )rG   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á   )rG   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Ý   )rG   r‰   rã   r   r   r   Úsend_all—  s   þzCluster.send_allc                 C   s   |   tj¡S rA   )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 rA   )rˆ   rÙ   rä   rÛ   rM   )rã   Úretval©ÚretvalsrG   r   r   Úrestart_on_down¢  s   
z(Cluster.restart.<locals>.restart_on_downrI   ©Úretryræ   r‰   ©Ú_stop_nodes)rG   r‰   rî   r   rì   r   ÚrestartŸ  s   zCluster.restartc                 C   ó   | j |||d�S ©Nrï   rñ   ©rG   rð   Úcallbackr‰   r   r   r   rÑ   «  r   zCluster.stoprI   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Þ   rJ   rç   Úshutdown_nodesrˆ   )rG   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   r4   )Úsetrˆ   rÓ   rÔ   r   r�   rÝ   ÚaddrÕ   rÖ   r‚   rÚ   r7   r   Úfloatr×   )rG   rÒ   r‰   rð   ÚPÚ	to_removerã   Úitsr   r   r   rù   ¸  s@   €
€
ûóïzCluster.shutdown_nodesc                 C   s$   | D ]}|j |kr|  S qt|ƒ‚rA   )r"   rs   )rG   r"   rã   r   r   r   ÚfindÕ  s
   
ÿzCluster.findc                 c   s(   � | D ]}|j r|V  qt||ƒ qd S rA   )rƒ   rˆ   )rG   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   r~   ä  s    z$Cluster.__repr__.<locals>.<listcomp>r›   )r!   r7   r   rœ   r^   r}   r   r   r   r�   â  s   þzCluster.__repr__c                 C   s   | j S rA   )rÒ   r}   r   r   r   Údataè  s   zCluster.data)NNNNNNNNNNNNNNNNNrA   )r^   r_   r`   rª   rH   rŽ   râ   rä   rè   r„   ré   ÚSIGTERMró   rÑ   rø   rò   rù   r   rç   r�   r«   r  r   r   r   r   r   _  sD    
ñ$
r   )1rª   Ú
__future__r   r   r†   ru   r™   ré   rq   Úcollectionsr   r   Ú	functoolsr   Ú
subprocessr   Útimer   Úkombu.utils.encodingr	   Úkombu.utils.objectsr
   Úcelery.fiver   r   Úcelery.platformsr   r   r   Úcelery.utils.nodenamesr   r   r   r   Úcelery.utils.safereprr   Ú__all__r   r   r(   r.   r3   r>   Úobjectr?   r   rˆ   r¯   r   r   r   r   r   Ú<module>   s<    4 R