
    Vh                         d dl mZmZmZ eZdZd dlZd dlZd dl	m
Z
 d dlmZ  ej                         xZad ZddZd Zd	 Z G d
 de
      Zy)    )absolute_importdivisionprint_functiona  
    name: profile_roles
    type: aggregate
    short_description: adds timing information to roles
    description:
        - This callback module provides profiling for ansible roles.
    requirements:
      - whitelisting in configuration
    options:
      summary_only:
        description:
          - Only show summary, not individual task profiles.
            Especially usefull in combination with C(DISPLAY_SKIPPED_HOSTS=false) and/or C(ANSIBLE_DISPLAY_OK_HOSTS=false).
        type: bool
        default: False
        env:
          - name: PROFILE_ROLES_SUMMARY_ONLY
        ini:
          - section: callback_profile_roles
            key: summary_only
        version_added: 1.5.0
N)CallbackBase)reducec           
      H    d }dt        t        || dz  gdddg            z  S )Nc                 >    t        t        | d   |            | dd  z   S )Nr      )listdivmod)llbs     p/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/ansible/posix/plugins/callback/profile_roles.pyredivzsecondsToStr.<locals>.rediv,   s#    F2a5!$%12..    z%d:%02d:%02d.%03di  <   )tupler   )tr   s     r   secondsToStrr   *   s6    / uD|T2r23"5 5 5r   c                 p    t        |       dk(  rd}nd| z  } dt        |       z
  }|dk  rd}||z  }| |dS )Nr   O   z%s     )len)msgfcharwidthfillers       r   filledr   3   sH    
3x1}ckSXqyU]F6""r   c                    | j                   ~t        j                         | j                  | j                      z
  | j                  | j                   <   | j                  | j                   xx   | j                  | j                      z  cc<   y y N)currenttimestatstotalsselfs    r   	timestampr(   ?   s`    ||#'99;DLL1I#I

4<< DLL!TZZ%==!  r   c                     t        j                  d      } t        t        j                          t        z
        }t        t        j                          t        z
        }t        j                          at        | d|dd|      S )Nz%A %d %B %Y  %H:%M:%S %zz ()z       )r#   strftimer   tnt0r   )time_currenttime_elapsedtime_total_elapseds      r   tasktimer1   E   sf    ==!;<L		b 01L%diikB&67	Bw8JL M Mr   c                   b     e Zd ZdZdZdZdZdZ fdZd fd	Z	d Z
d	 Zd
 Zd Zd Zd Z xZS )CallbackModulezD
    This callback module provides profiling for ansible roles.
    g       @	aggregatezansible.posix.profile_rolesTc                     t        j                         | _        t        j                         | _        d | _        d | _        t        t        | #          y r!   )	collectionsCounterr$   r%   r"   summary_onlysuperr3   __init__)r'   	__class__s    r   r:   zCallbackModule.__init__X   s?     ((*
!))+ nd,.r   c                 ^    t         t        |   |||       | j                  d      | _        y )N)	task_keysvar_optionsdirectr8   )r9   r3   set_options
get_optionr8   )r'   r=   r>   r?   r;   s       r   r@   zCallbackModule.set_optionsa   s,    nd/)Q\ek/l OON;r   c                 d    | j                   s$| j                  j                  t                      y y r!   )r8   _displaydisplayr1   r&   s    r   _display_tasktimez CallbackModule._display_tasktimeg   s$      MM!!(*- !r   c                    | j                          t        |        |j                  r|j                  j                  | _        n|j
                  | _        t        j                         | j                  | j                  <   y)z-
        Logs the start of each task
        N)rE   r(   _role
_role_namer"   actionr#   r$   r'   tasks     r   _record_taskzCallbackModule._record_taskk   sR     	 $::::00DL;;DL#'99;

4<< r   c                 &    | j                  |       y r!   rL   )r'   rK   is_conditionals      r   v2_playbook_on_task_startz(CallbackModule.v2_playbook_on_task_starty       $r   c                 &    | j                  |       y r!   rN   rJ   s     r   !v2_playbook_on_handler_task_startz0CallbackModule.v2_playbook_on_handler_task_start|   rQ   r   c                 $    | j                          y r!   )rE   r&   s    r   playbook_on_setupz CallbackModule.playbook_on_setup   s     r   c                 X   | j                          | j                  j                  t        dd             t	        |        t        | j                  j                               }| j                  j                         D ]G  }dj                  |d   dz   dj                  |d               }| j                  j                  |       I dj                  d	dj                  |            }| j                  j                  t        dd
             | j                  j                  |       y )N =)r   z{0:-<70}{1:->9}r   r   z
 {0:.02f}sr
   ztotal ~)
rE   rC   rD   r   r(   sumr%   valuesmost_commonformat)r'   r$   
total_timeresultr   	msg_totals         r   playbook_on_statsz CallbackModule.playbook_on_stats   s     fRs34$++-.
 kk--/ 	'F$++F1I,<m>R>RSYZ[S\>]^CMM!!#&	' '--i9M9Mj9YZ	fRs34i(r   )NNN)__name__
__module____qualname____doc__CALLBACK_VERSIONCALLBACK_TYPECALLBACK_NAMECALLBACK_NEEDS_WHITELISTr:   r@   rE   rL   rP   rS   rU   ra   __classcell__)r;   s   @r   r3   r3   O   sH     M1M#/<./  !)r   r3   )*)
__future__r   r   r   type__metaclass__DOCUMENTATIONr6   r#   ansible.plugins.callbackr   ansible.module_utils.six.movesr   r-   r,   r   r   r(   r1   r3    r   r   <module>rs      s_    C B.   1 1 $))+ R5	#>MA)\ A)r   