U
    w7e%                     @   s   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mZ d dl	m
Z
 dddZdd	 Zd
d Zdd Zdd Zdd Zdd ZeddddZedkre Ze Zej\ZZeee dS )    N)datetime)IO)dumpshow)
json_dumpsc                 C   sh  | st jddd} | jddd}d|_|jdd	d
}|jddddddd |jddddddd |jdtfd |jddd
}|jddddddd |jddddddd |jddddddd |jdtfd |jd d!d
}|jdddddd"d |jddddddd |jd t	fd |jd#d$d
}|jdddddd"d |jddddddd |jd#t
fd | S )%Nzcloudinit-analyzez,Devel tool: Analyze cloud-init logs and data)progdescriptionZSubcommandsZ
subcommand)titledestTZblamez5Print list of executed stages ordered by time to init)helpz-iz--infileZstoreinfilez/var/log/cloud-init.logzspecify where to read input.)actionr
   defaultr   z-oz	--outfileoutfile-zspecify where to write output. )r   r   z.Print list of in-order events during executionz-fz--formatprint_formatz%I%D @%Es +%dszspecify formatting of output.zspecify where to write output.r   z%Dump cloud-init events in JSON formatzspecify where to read input. Zbootz2Print list of boot times for kernel and cloud-init)argparseArgumentParserZadd_subparsersZrequiredZ
add_parseradd_argumentZset_defaultsanalyze_blameanalyze_showanalyze_dumpanalyze_boot)parserZ
subparsersZparser_blameZparser_showZparser_dumpZparser_boot r   </usr/lib/python3/dist-packages/cloudinit/analyze/__main__.py
get_parser   s        r   c              
   C   s   t |\}}t }|\}}}}t|}	t|}
t|}z(dd t|D d }t|d }W n tk
r   d}tj}Y nX d}d}d}tj|tj|tj	|i}|| }|| }|	|
|||||||d		}|
|| jf | t|| |S )
a  Report a list of how long different boot operations took.

    For Example:
    -- Most Recent Boot Record --
        Kernel Started at: <time>
        Kernel ended boot at: <time>
        Kernel time to boot (seconds): <time>
        Cloud-init activated by systemd at: <time>
        Time between Kernel end boot and Cloud-init activation (seconds):<time>
        Cloud-init start: <time>
    c                 S   s(   g | ] }|d  dkrd|d kr|qS )namez
init-localzstarting searchr   r   ).0er   r   r   
<listcomp>   s   z analyze_boot.<locals>.<listcomp>Z	timestampz4Could not find init-local log-line in cloud-init.logzYour Linux distro or container does not support this functionality.
You must be running a Kernel Telemetry supported distro.
Please check https://cloudinit.readthedocs.io/en/latest/topics/analyze.html for more information on supported distros.
a*  -- Most Recent Boot Record --
    Kernel Started at: {k_s_t}
    Kernel ended boot at: {k_e_t}
    Kernel time to boot (seconds): {k_r}
    Cloud-init activated by systemd at: {ci_sysd_t}
    Time between Kernel end boot and Cloud-init activation (seconds): {bt_r}
    Cloud-init start: {ci_start}
z-- Most Recent Container Boot Record --
    Container started at: {k_s_t}
    Cloud-init activated by systemd at: {ci_sysd_t}
    Cloud-init start: {ci_start}
)	Zk_s_tZk_e_tZk_rZbt_rZk_eZk_sZci_sysdZ	ci_sysd_tci_start)configure_ior   Zdist_check_timestampr   Zutcfromtimestamp_get_events
IndexErrorZ	FAIL_CODEZCONTAINER_CODEZSUCCESS_CODEwriteformatclean_io)r   argsinfhoutfhZkernel_infoZstatus_codeZkernel_startZ
kernel_endZci_sysd_startZkernel_start_timestampZkernel_end_timestampZci_sysd_start_timestampZlast_init_localr"   ZFAILURE_MSGZSUCCESS_MSGZCONTAINER_MSGZ
status_mapZkernel_runtimeZbetween_process_runtimekwargsr   r   r   r   t   sX    


   
r   c           	      C   s   t |\}}d}tdtj}ttt||D ]L\}}tt	|j
|dd}|d|d   |d|d  |d q2|d|d   t|| d	S )
az  Report a list of records sorted by largest time delta.

    For example:
      30.210s (init-local) searching for datasource
       8.706s (init-network) reading and applying user-data
        166ms (modules-config) ....
        807us (modules-final) ...

    We generate event records parsing cloud-init logs, formatting the output
    and sorting by record data ('delta')
    z     %ds (%n)z(^\s+\d+\.\d+)T)reverse-- Boot Record %02d --
   
%d boot records analyzed
N)r#   recompile	MULTILINE	enumerater   show_eventsr$   sortedfiltermatchr&   joinr(   )	r   r)   r*   r+   Zblame_formatridxrecordZsrecsr   r   r   r      s    r   c                 C   s   t |\}}ttt||jD ]B\}}|d|d   |d |d |d|d  q"|d|d   t|| dS )a  Generate output records using the 'standard' format to printing events.

    Example output follows:
        Starting stage: (init-local)
          ...
        Finished stage: (init-local) 0.105195 seconds

        Starting stage: (init-network)
          ...
        Finished stage: (init-network) 0.339024 seconds

        Starting stage: (modules-config)
          ...
        Finished stage: (modules-config) 0.NNN seconds

        Starting stage: (modules-final)
          ...
        Finished stage: (modules-final) 0.NNN seconds
    r.   r/   zUThe total time elapsed since completing an event is printed after the "@" character.
z>The time the event takes is printed after the "+" character.

r0   r1   N)	r#   r5   r   r6   r$   r   r&   r:   r(   )r   r)   r*   r+   r<   r=   r   r   r   r      s    r   c                 C   s0   t |\}}|tt|d  t|| dS )z%Dump cloud-init events in json formatr0   N)r#   r&   r   r$   r(   )r   r)   r*   r+   r   r   r   r     s    r   c                 C   s*   d }t | \}}|s&tj|d\}}|S )N)rawdata)r   Zload_events_infiler   Zdump_events)r   r>   Zevents_r   r   r   r$     s
    r$   c                 C   s   | j dkrtj}nBzt| j d}W n0 tk
rR   tjd| j   td Y nX | jdkrftj	}nBzt| jd}W n0 tk
r   tjd| j  td Y nX ||fS )z.Common parsing and setup of input/output filesr   r;   zCannot open file %s
r/   w)
r   sysstdinopenOSErrorstderrr&   exitr   stdout)r)   r*   r+   r   r   r   r#     s    

r#   )file_handlesreturnc                  G   s(   | D ]}|t jt jfkrq|  qdS )zclose filehandlesN)rA   rB   rG   close)rH   Zfile_handler   r   r   r(   ,  s    r(   __main__)N)r   r2   rA   r   typingr   Zcloudinit.analyzer   r   Zcloudinit.atomic_helperr   r   r   r   r   r   r$   r#   r(   __name__r   
parse_argsr)   r   r   Zaction_functorr   r   r   r   <module>   s&   
eS%
