
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
\¼me%  ã               @   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rÀeƒ Zejƒ 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.6/__init__.pyÚ
get_parser   s¤    



r   c             C   sô   t |ƒ\}}tjƒ }|\}}}}tj|ƒ}	tj|ƒ}
tj|ƒ}y(dd„ t|ƒD ƒd
 }tj|d ƒ}W n tk
r„   d}tj}Y nX d}d}d}tj|tj|tj	|i}|| }|| }|	|
|||||||d	œ	}|j
|| 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.logzôYour 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   sD    






r   c       	      C   s¨   t |ƒ\}}d}tjdtjƒ}d}xdttjt|ƒ|ƒƒD ]L\}}tt	|j
|ƒdd�}|jd|d  ƒ |jdj|ƒd ƒ |jdƒ q8W |j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)Úreversez-- Boot Record %02d --
r!   Ú
z%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 |ƒ\}}x\ttjt|ƒ|jƒƒD ]B\}}|jd|d  ƒ |jdƒ |jdƒ |jdj|ƒd ƒ q$W |j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
    z-- Boot Record %02d --
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/   z%d boot records analyzed
N)	r$   r3   r   r4   r%   r   r'   r8   r)   )r   r*   r+   r,   r:   r;   r   r   r   r   â   s    r   c             C   s0   t |ƒ\}}|jtt|ƒƒd ƒ t||ƒ dS )z%Dump cloud-init events in json formatr/   N)r$   r'   r   r%   r)   )r   r*   r+   r,   r   r   r   r     s    r   c             C   s*   d }t j| ƒ\}}|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}nByt| j dƒ}W n0 tk
rR   tjjd| j  ƒ tjdƒ Y nX | jdkrftj	}nByt| jdƒ}W n0 tk
r¦   tjjd| j ƒ tjdƒ Y nX ||fS )z.Common parsing and setup of input/output filesr   r9   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,   x&| D ]}|t jt jfkrq|jƒ  qW dS )zclose filehandlesN)r?   r@   rE   Úclose)rF   Zfile_handler   r   r   r)   -  s    
r)   Ú__main__)N)r   r0   r?   r   Z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%
