o
    x[hZ%  ã                   @   sÎ   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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deddfdd„Zedkreeƒ Ze ¡ Zej\ZZeeeƒ dS dS )é    N)ÚdatetimeÚtimezone)Ú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ÚdescriptionÚSubcommandsÚ
subcommand)ÚtitleÚdestTÚblamez5Print list of executed stages ordered by time to init)Úhelpz-iz--infileÚ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. Úbootz2Print list of boot times for kernel and cloud-init)ÚargparseÚArgumentParserÚadd_subparsersÚrequiredÚ
add_parserÚadd_argumentÚset_defaultsÚanalyze_blameÚanalyze_showÚanalyze_dumpÚanalyze_boot)ÚparserÚ
subparsersÚparser_blameÚparser_showÚparser_dumpÚparser_boot© r)   ú</usr/lib/python3/dist-packages/cloudinit/analyze/__init__.pyÚ
get_parser   sÀ   þÿúúÿúúúÿúúÿúúr+   c              
   C   s  t |ƒ\}}t ¡ }|\}}}}t |tj¡}	t |tj¡}
t |tj¡}zdd„ t|ƒD ƒd }t |d tj¡}W n tyI   d}tj	}Y nw d}d}d}tj	|tj
|tj|i}|| }|| }|	|
|||||||d	œ	}| || jdi |¤Ž¡ 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 v r|‘qS )Únamez
init-localzstarting searchr	   r)   )Ú.0Úer)   r)   r*   Ú
<listcomp>‰   s    ýz analyze_boot.<locals>.<listcomp>éÿÿÿÿÚ	timestampz4Could not find init-local log-line in cloud-init.logzîYour Linux distro or container does not support this functionality.
You must be running a Kernel Telemetry supported distro.
Please check https://docs.cloud-init.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}
)	Úk_s_tÚk_e_tÚk_rÚbt_rÚk_eÚk_sÚci_sysdÚ	ci_sysd_tÚci_startNr)   )Úconfigure_ior   Údist_check_timestampr   Úfromtimestampr   ÚutcÚ_get_eventsÚ
IndexErrorÚ	FAIL_CODEÚCONTAINER_CODEÚSUCCESS_CODEÚwriteÚformatÚclean_io)r,   ÚargsÚinfhÚoutfhÚkernel_infoÚstatus_codeÚkernel_startÚ
kernel_endÚci_sysd_startÚkernel_start_timestampÚkernel_end_timestampÚci_sysd_start_timestampÚlast_init_localr:   ÚFAILURE_MSGÚSUCCESS_MSGÚCONTAINER_MSGÚ
status_mapÚkernel_runtimeÚbetween_process_runtimeÚkwargsr)   r)   r*   r"   t   s\   ÿþû
ÿ
þÿÿÿý÷
r"   c           	      C   s¤   t |ƒ\}}d}t dtj¡}d}tt t|ƒ|¡ƒD ]&\}}tt	|j
|ƒdd�}| d|d  ¡ | d |¡d ¡ | d¡ q| 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+)r   T)Úreverseú-- Boot Record %02d --
é   Ú
ú%d boot records analyzed
N)r;   ÚreÚcompileÚ	MULTILINEÚ	enumerater   Úshow_eventsr?   ÚsortedÚfilterÚmatchrD   ÚjoinrF   )	r,   rG   rH   rI   Úblame_formatÚrÚidxÚrecordÚsrecsr)   r)   r*   r   Ë   s   ÿr   c                 C   s†   t |ƒ\}}tt t|ƒ|j¡ƒD ]!\}}| 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.

r]   r^   N)	r;   rb   r   rc   r?   r   rD   rg   rF   )r,   rG   rH   rI   rj   rk   r)   r)   r*   r    æ   s   ÿÿÿr    c                 C   s0   t |ƒ\}}| tt|ƒƒd ¡ t||ƒ dS )z%Dump cloud-init events in json formatr]   N)r;   rD   r   r?   rF   )r,   rG   rH   rI   r)   r)   r*   r!     s   r!   c                 C   s*   d }t  | ¡\}}|stj|d�\}}|S )N)Úrawdata)r   Úload_events_infiler   Údump_events)r   rm   ÚeventsÚ_r)   r)   r*   r?     s
   r?   c                 C   s¶   | j dkr	tj}n zt| j dƒ}W n ty(   tj d| j  ¡ t d¡ Y nw | jdkr5tj	}||fS zt| jdƒ}W ||fS  tyZ   tj d| j ¡ t d¡ Y ||fS w )z.Common parsing and setup of input/output filesr   ri   zCannot open file %s
r\   Úw)
r   ÚsysÚstdinÚopenÚOSErrorÚstderrrD   Úexitr   Ústdout)rG   rH   rI   r)   r)   r*   r;     s&   
þ
úüür;   Úfile_handlesÚreturnc                  G   s(   | D ]}|t jt jfv rq| ¡  qdS )zclose filehandlesN)rs   rt   ry   Úclose)rz   Úfile_handler)   r)   r*   rF   1  s
   
ýrF   Ú__main__)N)r   r_   rs   r   r   Útypingr   Úcloudinit.analyzer   r   Úcloudinit.atomic_helperr   r+   r"   r   r    r!   r?   r;   rF   Ú__name__r#   Ú
parse_argsrG   r   r,   Úaction_functorr)   r)   r)   r*   Ú<module>   s*   
eW%
ü