
    VhVH                       d dl 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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 d d	lmZ d d
lmZ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% 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l0m1Z1 dgZ2 e+       Z3 G d d      Z4 G d d      Z5e1 G d d             Z6 G d de
jn                  jp                        Z9 G d de:      Z; G d d      Z<y)     )annotationsN)	constants)context)AnsibleError)PlayIterator)AggregateStats)
TaskResult)string_types)to_text	to_native)PlayContext)Task)callback_loaderstrategy_loadermodule_loader)CallbackBase)Templar)HostVars)Display)lock_decorator)	dataclassTaskQueueManagerc                      e Zd Zd Zy)CallbackSendc                .    || _         || _        || _        y N)method_nameargskwargsselfr   r   r   s       S/home/dcms/DCMS/lib/python3.12/site-packages/ansible/executor/task_queue_manager.py__init__zCallbackSend.__init__6   s    &	    N__name__
__module____qualname__r#    r$   r"   r   r   5       r$   r   c                      e Zd Zd Zy)DisplaySendc                .    || _         || _        || _        y r   )methodr   r   r!   r.   r   r   s       r"   r#   zDisplaySend.__init__=   s    	r$   Nr%   r)   r$   r"   r,   r,   <   r*   r$   r,   c                  Z    e Zd ZU ded<   ded<   dZded<   dZded	<   dZd
ed<   dZd
ed<   y)
PromptSendint	worker_idstrpromptTboolprivateNsecondszt.Iterable[bytes]interrupt_inputcomplete_input)r&   r'   r(   __annotations__r7   r8   r9   r:   r)   r$   r"   r1   r1   C   s6    NKGTGS)-O&-(,N%,r$   r1   c                  6     e Zd Z fdZd Zd Zd Zd Z xZS )
FinalQueuec                6    t         |d<   t        |   |i | y )Nctx)multiprocessing_contextsuperr#   )r!   r   r   	__class__s      r"   r#   zFinalQueue.__init__N   s    /u$)&)r$   c                @    | j                  t        |g|i |       y r   )putr   r    s       r"   send_callbackzFinalQueue.send_callbackR   s     6t6v6	
r$   c                n    t        |d   t              r|d   }nt        |i |}| j                  |       y )Nr   )
isinstancer	   rD   )r!   r   r   trs       r"   send_task_resultzFinalQueue.send_task_resultW   s7    d1gz*aBT,V,B	
r$   c                @    | j                  t        |g|i |       y r   )rD   r,   r/   s       r"   send_displayzFinalQueue.send_display`   s     000	
r$   c                8    | j                  t        di |       y )Nr)   )rD   r1   )r!   r   s     r"   send_promptzFinalQueue.send_prompte   s      	
r$   )	r&   r'   r(   r#   rE   rI   rK   rM   __classcell__)rB   s   @r"   r=   r=   M   s    *





r$   r=   c                      e Zd Zd Zy)AnsibleEndPlayc                    || _         y r   )result)r!   rR   s     r"   r#   zAnsibleEndPlay.__init__l   s	    r$   Nr%   r)   r$   r"   rP   rP   k   s    r$   rP   c                      e Zd ZdZdZdZdZdZd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 Zd Zd Z ed      d        Zy)r   ao  
    This class handles the multiprocessing requirements of Ansible by
    creating a pool of worker forks, a result handler fork, and a
    manager object with shared datastructures/queues for coordinating
    work between all processes.

    The queue manager is responsible for loading the play strategy plugin,
    which dispatches the Play's tasks to hosts.
    r                  Nc	                   || _         || _        || _        t               | _        || _        || _        || _        || _        |xs d| _	        d| _
        g | _        d| _        t        j                  j                  dd      r0t        j                  d   D ]  }	|	st!        j"                  |	        d| _        t'               | _        t'               | _        	 t-               | _        t7        j8                         | _        t=        j>                         | _         y # t0        $ r}
t3        dt5        |
      z        d }
~
ww xY w)N   Fmodule_pathzXUnable to use multiprocessing, this is normally caused by lack of access to /dev/shm: %s)!
_inventory_variable_manager_loaderr   _stats	passwords_stdout_callback_run_additional_callbacks	_run_tree_forks_callbacks_loaded_callback_plugins_start_at_doner   CLIARGSgetr   add_directory_terminateddict_failed_hosts_unreachable_hostsr=   _final_qOSErrorr   r   	threadingLock_callback_locktempfileTemporaryFile_connection_lockfile)r!   	inventoryvariable_managerloaderr`   stdout_callbackrun_additional_callbacksrun_treeforkspathes              r"   r#   zTaskQueueManager.__init__   s6   #!1$&" /)A&!jq!&!## ??}e46 6!//56
 ! "V"&&	J&LDM (nn. %-$:$:$<!  	Jy  }F  GH  }I   I  J  J	Js   D 	D>"D99D>c                h    g | _         t        |      D ]  }| j                   j                  d         y r   )_workersrangeappend)r!   numis      r"   _initialize_processesz&TaskQueueManager._initialize_processes   s.    s 	'AMM  &	'r$   c           
     d   | j                   ryd}| j                  t        j                  | _        t	        | j                  t
              rd}nt	        | j                  t              rk| j                  t        vrt        d| j                  z        t        j                  | j                        | _        | j                  j                          d}nt        d      t        t        j                  d            }t        j                  D ]J  }t        j                  |d      }|r||vs!|j                  |       3t        j!                  d|z         L |D ]  }t#        |dd	      }t#        |d
t#        |dd            }t#        |dg       }|r|d   }	nIt$        j&                  j)                  t$        j&                  j+                  |j,                              \  }	}
t        j/                  d|	z         |dk(  r-|	| j                  k7  s|rt        j1                  d|	z         d}nD|	dk(  r| j2                  rn2| j4                  r$|r$t        j                  |	t        j                  vr	  |       }|rW|| j6                  vr,|j                          | j6                  j                  |       n7t        j1                  d|d|	d       nt        j!                  d|	z          d| _         y# t8        $ r/}t        j!                  d|	dt;        |             Y d}~d}~ww xY w)z
        Loads all available callbacks, with the exception of those which
        utilize the CALLBACK_TYPE option. When CALLBACK_TYPE is set to 'stdout',
        only one such callback plugin will be loaded.
        NFTz)Invalid callback for stdout specified: %szMcallback must be an instance of CallbackBase or the name of a callback plugin)
class_onlyz-Skipping callback plugin '%s', unable to loadCALLBACK_TYPE CALLBACK_NEEDS_ENABLEDCALLBACK_NEEDS_WHITELIST_redirected_namesr   z Attempting to use '%s' callback.stdoutz=Skipping callback '%s', as we already have a stdout callback.treezSkipping callback 'z', already loaded as 'z'.zFSkipping callback '%s', as it does not create a valid plugin instance.z', unable to load due to: )re   ra   CDEFAULT_STDOUT_CALLBACKrG   r   r
   r   r   ri   set_optionslistallCALLBACKS_ENABLEDr   displaywarninggetattrosr~   splitextbasename_original_pathvvvvvvvrc   rb   rf   	Exceptionr   )r!   stdout_callback_loadedcallback_listcplugincallback_plugincallback_typecallback_needs_enabledcnamescallback_nameextcallback_objr   s                r"   load_callbackszTaskQueueManager.load_callbacks   s    !!!&  ($%$=$=D!d++\:%)"--|<$$O;"#NQUQfQf#fgg(7(;(;D<Q<Q(R%%%113)-&noo _00DAB $$ 
	UA$((t<F .!((0 ORS ST
	U  - .	O#O_bIM%,_>VX_`o  rL  NS  YT  &U" _.A2FF &q	 (*ww'7'78H8HIgIg8h'i$MM<NO( D$9$99=SJJ^bopq)-&&(T^^338N''/=H[H[3[.0  #4+A+AA$002..55lC

Xgiv#wxOO$lo|$|}W.	` "&	  Wdfopqfr sts   2A8K77	L/ $L**L/c                   | j                   s| j                          | j                  j                  |      }t	        | j
                  |      }|j                         }|j                  |       |j                         |j                  z   |_	        t        | j                  | j                  | j
                        | _        t        || j                  | j                  j!                               }| j"                  r1t%        | j"                  d      r| j"                  j'                  |       | j(                  D ]   }t%        |d      s|j'                  |       " | j+                  d|       t-        | j                  ||| j                  || j.                        }| j1                  t3        | j4                  |j6                               t9        j:                  |j<                  |       }|$t?        d|j<                  z  |j@                        | jB                  jE                         D ].  }	| j                  jG                  |	      }
|jI                  |
       0 | jJ                  jE                         D ]'  }	|jL                  jN                  jQ                  |	       ) | jS                          tT        jV                  j;                  d	      |jX                  d
| _        	 |j[                  ||      }|j]                          | j_                          |ja                         D ]  }	d
| jB                  |	<    |jb                  rte        |      |S # |j]                          | j_                          w xY w)al  
        Iterates over the roles/tasks in a play, using the given (or default)
        strategy for queueing tasks. The default is the linear strategy, which
        operates like classic Ansible by keeping all hosts in lock-step with
        a given task (meaning no hosts move on to the next task until all hosts
        are done with the current task).
        )play)ry   	variables)rw   rx   ry   set_play_contextv2_playbook_on_play_start)rw   r   play_contextrx   all_varsstart_at_donez#Invalid play strategy specified: %s)objstart_at_taskT)3re   r   r]   get_varsr   r^   copypost_validatecompile_roles_handlershandlersr   r\   hostvarsr   r`   rv   filenora   hasattrr   rf   rE   r   rg   r   minrd   
batch_sizer   ri   strategyr   _dsrm   keysget_hostmark_host_failedrn   _play_removed_hostsr   clear_failed_hostsr   rh   r   runcleanup_cleanup_processesget_failed_hostsend_playrP   )r!   r   r   templarnew_playr   r   iteratorr   	host_namehostplay_returns               r"   r   zTaskQueueManager.run  s    %%!))222=B99;w'$;;=@Q@QQ oo!33<<
 #8T^^T=V=V=]=]=_`!!--/AB!!22<@#55 	?O(:;00>	? 	6A  oo%!33--
 	""3t{{H4G4G#HI #&&x'8'8$?DxGXGXX^b^f^fgg ++002 	,I??++I6D%%d+	, 00557 	<INN))00;	< 	!
 ??/;@Z@Z@b"&D	&",,x>K##% "224 	1I,0Dy)	1  -- ##%s   'M "M8c                   t         j                  d       | j                          | j                  j	                          | j                          t        j                  j                          t        j                  j                          y )NzRUNNING CLEANUP)
r   debug	terminatero   closer   sysr   flushstderrr!   s    r"   r   zTaskQueueManager.cleanupf  sW    '(! 	



r$   c                   t        | d      rt        t        j                  dz
  dd      D ][  }t	        d | j
                  D              s n=|r$t        j                  t        j                         Gt        j                  d       ] | j
                  D ]'  }|s|j                         s	 |j                          ) y y # t        $ r Y 7w xY w)Nr   rT   c              3  D   K   | ]  }|xr |j                           y wr   )is_alive).0
worker_prcs     r"   	<genexpr>z6TaskQueueManager._cleanup_processes.<locals>.<genexpr>s  s!     `J:?**=*=*??`s    zFOne or more worker processes are still running and will be terminated.)r   r   r   WORKER_SHUTDOWN_POLL_COUNTanyr   timesleepWORKER_SHUTDOWN_POLL_DELAYr   r   r   r   AttributeError)r!   attempts_remainingr   s      r"   r   z#TaskQueueManager._cleanup_processesp  s    4$&+A,H,H1,LbRT&U n"`RVR_R_``%JJq;;<OO$lmn #mm 
*"5"5"7",,. % * s   -C	CCc                "    t               | _        y r   )rl   rm   r   s    r"   r   z#TaskQueueManager.clear_failed_hosts  s    !Vr$   c                    | j                   S r   )r\   r   s    r"   get_inventoryzTaskQueueManager.get_inventory  s    r$   c                    | j                   S r   )r]   r   s    r"   get_variable_managerz%TaskQueueManager.get_variable_manager  s    %%%r$   c                    | j                   S r   )r^   r   s    r"   
get_loaderzTaskQueueManager.get_loader  s    ||r$   c                     | j                   d d  S r   )r   r   s    r"   get_workerszTaskQueueManager.get_workers  s    }}Qr$   c                    d| _         y )NT)rk   r   s    r"   r   zTaskQueueManager.terminate  s
    r$   c                L    d}| j                   D ]  }t        |dd       sd} |S )NFexitcodeT)r   r   )r!   defunctxs      r"   has_dead_workersz!TaskQueueManager.has_dead_workers  s4    
  	Aq*d+	 r$   rs   )attrc                .   | j                   g| j                  z   D ]  }t        |dd      rt        |dd      }g }|dfD ]A  }t        ||d       }|t        ||j                  d      d       }|1|j	                  |       C g }	d}
|D ]c  }t        |t              r |	j	                  |j                                n|	j	                  |       t        |t              sU|j                  sbd}
e |
r|s|D ]  }	  ||	i |   y # t        $ r}t        j                  dt        |      dt        |      d	t        |             d
dlm} d
dlm} t        j%                  ddj'                   | |       d               z          Y d }~d }~ww xY w)NdisabledFwants_implicit_tasks	v2_on_anyv2_TzFailure using method (z) in callback plugin (z): r   )	format_tb)exc_infozCallback Exception: 
 rU   )ra   rf   r   removeprefixr   rG   r	   
clean_copyr   implicitr   r   r   r   	tracebackr   r   r   vvvjoin)r!   r   r   r   r   r   methodspossiblegotitnew_argsis_implicit_taskargr.   r   r   r   s                   r"   rE   zTaskQueueManager.send_callback  s    $ 5 569O9OO 2	_O 
E: $+?<RTY#Z  G(+6 *4@=#OX5J5J55QSWXE$NN5)* H
  % 
,c:.OOCNN$45 OOC(c4(S\\'+$
,  (<! __H//_U2	_Z ! _OO`ghs`tv}  N  wO  QX  YZ  Q[  %\  ]3,KK 8388IhjYZmD\;] ]^^_s   :D	FA:FF)NTFN)r&   r'   r(   __doc__RUN_OK	RUN_ERRORRUN_FAILED_HOSTSRUN_UNREACHABLE_HOSTSRUN_FAILED_BREAK_PLAYRUN_UNKNOWN_ERRORr#   r   r   r   r   r   r   r   r   r   r   r   r   r   rE   r)   r$   r"   r   r   p   s     FI&=P'[&zVp$$&  	 )*3_ +3_r$   )=
__future__r   r   r   rt   rq   r   typingtmultiprocessing.queuesmultiprocessingansibler   r   r   ansible.errorsr   ansible.executor.play_iteratorr   ansible.executor.statsr   ansible.executor.task_resultr	   ansible.module_utils.sixr
   +ansible.module_utils.common.text.convertersr   r   ansible.playbook.play_contextr   ansible.playbook.taskr   ansible.plugins.loaderr   r   r   ansible.plugins.callbackr   ansible.templater   ansible.vars.hostvarsr   ansible.utils.displayr   ansible.utils.lockr   ansible.utils.multiprocessingr@   dataclassesr   __all__r   r   r,   r1   queuesSimpleQueuer=   r   rP   r   r)   r$   r"   <module>r-     s   $ # 	 
      "  ' 7 1 3 1 J 5 & R R 1 $ * ) - L !

)   - - -
''33 
<Y 
c_ c_r$   