
    Vh"                         d dl mZmZmZ eZd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_tasks
    type: aggregate
    short_description: adds time information to tasks
    description:
      - Ansible callback plugin for timing individual tasks and overall execution time.
      - "Mashup of 2 excellent original works: https://github.com/jlafon/ansible-profile,
         https://github.com/junaid18183/ansible_home/blob/master/ansible_plugins/callback_plugins/timestamp.py.old"
      - "Format: C(<task start timestamp>) C(<length of previous task>) C(<current elapsed playbook execution time>)"
      - It also lists the top/bottom time consuming tasks in the summary (configurable)
      - Before 2.4 only the environment variables were available for configuration.
    requirements:
      - enable in configuration - see examples section below for details.
    options:
      output_limit:
        description: Number of tasks to display in the summary
        default: 20
        env:
          - name: PROFILE_TASKS_TASK_OUTPUT_LIMIT
        ini:
          - section: callback_profile_tasks
            key: task_output_limit
      sort_order:
        description: Adjust the sorting output of summary tasks
        choices: ['descending', 'ascending', 'none']
        default: 'descending'
        env:
          - name: PROFILE_TASKS_SORT_ORDER
        ini:
          - section: callback_profile_tasks
            key: sort_order
      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_TASKS_SUMMARY_ONLY
        ini:
          - section: callback_profile_tasks
            key: summary_only
        version_added: 1.5.0
a,  
example: >
  To enable, add this to your ansible.cfg file in the defaults block
    [defaults]
    callbacks_enabled=ansible.posix.profile_tasks
sample output: >
#
#    TASK: [ensure messaging security group exists] ********************************
#    Thursday 11 June 2017  22:50:53 +0100 (0:00:00.721)       0:00:05.322 *********
#    ok: [localhost]
#
#    TASK: [ensure db security group exists] ***************************************
#    Thursday 11 June 2017  22:50:54 +0100 (0:00:00.558)       0:00:05.880 *********
#    changed: [localhost]
#
N)reduce)CallbackBasec           
      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_tasks.pyredivzsecondsToStr.<locals>.redivW   s#    F2a5!$%12..    z%d:%02d:%02d.%03di  <   )tupler   )tr   s     r   secondsToStrr   U   s/    / veq4xlD"b5Q'R!SSSr   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   ]   sH    
3x1}ckSXqyU]F6""r   c                     | j                   Vt        j                         | j                  | j                      d   z
  }| j                  | j                      dxx   |z  cc<   y y )Nstartedelapsed)currenttimestats)selfr"   s     r   	timestampr'   i   sP    ||))+

4<< 8 CC

4<< +w6+  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   tasktimer0   o   s\    ==!;<L		b 01L%diikB&67	B<wHZ[\\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 )CallbackModulez
    This callback module provides per-task timing, ongoing playbook elapsed time
    and ordered list of top 20 longest running tasks at end.
    g       @	aggregatezansible.posix.profile_tasksTc                     t        j                         | _        d | _        d | _        d | _        d | _        t        t        | '          y N)
collectionsOrderedDictr%   r#   
sort_ordersummary_onlytask_output_limitsuperr2   __init__)r&   	__class__s    r   r<   zCallbackModule.__init__   s>     ,,.
 !%nd,.r   c                    t         t        |   |||       | j                  d      | _        | j                  D| j                  dk(  rd| _        n-| j                  dk(  rd| _        n| j                  dk(  rd | _        | j                  d      | _        | j                  d	      | _        | j                  2| j                  d
k(  rd | _        y t        | j                        | _        y y )N)	task_keysvar_optionsdirectr8   	ascendingF
descendingTnoner9   output_limitall)r;   r2   set_options
get_optionr8   r9   r:   int)r&   r?   r@   rA   r=   s       r   rG   zCallbackModule.set_options   s    nd/)Q\ek/l//,7??&+-"'L0"&F*"& OON;!%!@!!-%%.)-&),T-C-C)D&	 .r   c                 d    | j                   s$| j                  j                  t                      y y r5   )r9   _displaydisplayr0   r&   s    r   _display_tasktimez CallbackModule._display_tasktime   s$      MM!!(*- !r   c                    | j                          t        |        |j                  | _        | j                  | j                  vr>t        j
                         d|j                         d| j                  | j                  <   n.t        j
                         | j                  | j                     d<   | j                  j                  dk\  r+|j                         | j                  | j                     d<   yy)z-
        Logs the start of each task
        g        )r!   r"   namer!      pathN)
rN   r'   _uuidr#   r%   r$   get_namerK   	verbosityget_pathr&   tasks     r   _record_taskzCallbackModule._record_task   s     	 $ zz<<tzz)3799;3X\XeXeXg'hDJJt||$26))+DJJt||$Y/==""a'/3}}DJJt||$V, (r   c                 &    | j                  |       y r5   rY   )r&   rX   is_conditionals      r   v2_playbook_on_task_startz(CallbackModule.v2_playbook_on_task_start       $r   c                 &    | j                  |       y r5   r[   rW   s     r   !v2_playbook_on_handler_task_startz0CallbackModule.v2_playbook_on_handler_task_start   r^   r   c                 $    | j                          y r5   )rN   rM   s    r   playbook_on_setupz CallbackModule.playbook_on_setup   s     r   c                    | j                          | j                  j                  t        dd             t	        |        d | _        t        | j                  j                               }| j                  1t        | j                  j                         d | j                        }t        |      d | j                   }|D ]  \  }}dj                  |d   dz   d	j                  |d
         | j                  j                  dz
        }d|v r/|dj                  |d   dz   | j                  j                        z  }| j                  j                  |        y )N =)r   c                     | d   d   S )Nr
   r"    )xs    r   <lambda>z2CallbackModule.playbook_on_stats.<locals>.<lambda>   s    ad9o r   )keyreversez{0:-<{2}}{1:->9}rP   r   z
 {0:.02f}sr"   	   rR   z

{0:-<{1}})rN   rK   rL   r   r'   r#   r   r%   itemsr8   sortedr:   formatcolumns)r&   r%   resultsuuidresultr   s         r   playbook_on_statsz CallbackModule.playbook_on_stats   sC    fRs34$tzz'')* ??&

  "-G w- 7!7!78 $ 	'LD&%,,VF^d-BMDXDXY_`iYjDkmqmzmz  nC  nC  FG  nG  HC~,,VF^d-BDMMDYDYZZMM!!#&		'r   )NNN)__name__
__module____qualname____doc__CALLBACK_VERSIONCALLBACK_TYPECALLBACK_NAMECALLBACK_NEEDS_WHITELISTr<   rG   rN   rY   r]   r`   rb   rt   __classcell__)r=   s   @r   r2   r2   x   sI     M1M#/E,.?(  !'r   r2   )*)
__future__r   r   r   type__metaclass__DOCUMENTATIONEXAMPLESr6   r$   ansible.module_utils.six.movesr   ansible.plugins.callbackr   r,   r+   r   r   r'   r0   r2   rg   r   r   <module>r      sh    C B+Z"   1 1 $))+ RT	#7]d'\ d'r   