Ë
    x[h,+  ã                   óì   — d dl Z 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dddd	d
dddddœZ	dZ
dZdZedddfZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z G d„ d«      Zd „ Zd!„ Zd"„ Z	 d&d#„Zd$„ Zd%„ Zy)'é    N)ÚsubpÚutil)Úuses_systemdÚdeltaÚdescriptionÚelapsedÚ
event_typeÚindentÚlevelÚnameÚoriginÚresultÚ	timestampÚ
total_time)z%dz%Dz%Ez%ez%Iz%lz%nz%oz%rz%tz%TÚ
successfulÚfailureÚ	containeréÿÿÿÿc                 óÆ   — t         j                  «       D ]9  \  }}|| v sŒ|dv r| j                  |d|z  «      } Œ%| j                  |d|z  «      } Œ;  | j                  di |¤ŽS )N)r   r   r   z
{%s:08.5f}z{%s}© )Ú
format_keyÚitemsÚreplaceÚformat)ÚmsgÚeventÚiÚjs       ú8/usr/lib/python3/dist-packages/cloudinit/analyze/show.pyÚformat_recordr    6   sm   € Ü× Ñ Ó"ò 1‰ˆˆ1Ø�Š8àÐ5Ñ5Ø—k‘k ! \°AÑ%5Ó6‘à—k‘k ! V¨a¡ZÓ0‘ð1ð ˆ3�:‰:Ñ˜ÑÐó    c                 ó*   — | r| j                  d«      S y )Nr   ©Úget©r   s    r   Ú
event_namer&   A   s   € ÙØ�y‰y˜Ó Ð Ør!   c                 ó*   — | r| j                  d«      S y )Nr	   r#   r%   s    r   r	   r	   G   s   € ÙØ�y‰y˜Ó&Ð&Ør!   c                 óB   — | rt        | «      j                  d«      d   S y )Nú/r   )r&   Úsplitr%   s    r   Úevent_parentr+   M   s#   € ÙÜ˜%Ó ×&Ñ& sÓ+¨AÑ.Ð.Ør!   c                 ó6   — t        | j                  d«      «      S ©Nr   )Úfloatr$   r%   s    r   Úevent_timestampr/   S   s   € Ü�—‘˜;Ó'Ó(Ð(r!   c                 ó„   — t         j                   j                  t        | «      t         j                  j                  «      S ©N)ÚdatetimeÚfromtimestampr/   ÚtimezoneÚutcr%   s    r   Úevent_datetimer6   W   s1   € Ü×Ñ×*Ñ*Ü˜Ó¤× 1Ñ 1× 5Ñ 5óð r!   c                 ó(   — || z
  j                  «       S r1   )Útotal_seconds)Út1Út2s     r   Údelta_secondsr;   ]   s   € Ø�‰G×"Ñ"Ó$Ð$r!   c                 ó>   — t        t        | «      t        |«      «      S r1   )r;   r6   )ÚstartÚfinishs     r   Úevent_durationr?   a   s   € Üœ¨Ó.´¸vÓ0FÓGÐGr!   c           	      óÒ   — |j                  «       }|j                  t        ||«      t        | t	        |«      «      ddt        |«      j                  d«      dz
  z  z   dz   dœ«       |S )Nú|ú r)   é   z`->)r   r   r
   )ÚcopyÚupdater?   r;   r6   r&   Úcount)Ú
start_timer=   r>   Úrecords       r   Úevent_recordrI   e   se   € Ø�[‰[‹]€FØ
‡M�Mä# E¨6Ó2Ü$ Z´ÀÓ1FÓGØ˜C¤:¨eÓ#4×#:Ñ#:¸3Ó#?À!Ñ#CÑDÑDÀuÑLñ	
ôð €Mr!   c                 ó   — d| z  S )NzTotal Time: %3.5f seconds
r   )r   s    r   Útotal_time_recordrK   r   s   € Ø(¨:Ñ5Ð5r!   c                   ó$   — e Zd ZdZdd„Zd„ Zd„ Zy)ÚSystemctlReaderzQ
    Class for dealing with all systemctl subp calls in a consistent manner.
    Nc                 óè   — d | _         t        j                  d«      dg| _        |r| j                  j	                  |«       | j                  j                  d|g«       | j                  «       | _        y )NÚ	systemctlÚshowz-p)Úepochr   ÚwhichÚargsÚappendÚextendr   )ÚselfÚpropertyÚ	parameters      r   Ú__init__zSystemctlReader.__init__{   sY   € ØˆŒ
Ü—Z‘Z Ó,¨fÐ5ˆŒ	ÙØ�I‰I×Ñ˜YÔ'Ø�	‰	×Ñ˜$ Ð)Ô*ð —y‘y“{ˆ�r!   c                 ó”   — 	 t        j                   | j                  d¬«      \  }}|r|S || _        y# t        $ r}|cY d}~S d}~ww xY w)zœ
        Make a subp call based on set args and handle errors by setting
        failure code

        :return: whether the subp call failed or not
        T©ÚcaptureN)r   rS   rQ   Ú	Exception)rV   ÚvalueÚerrÚsystemctl_fails       r   r   zSystemctlReader.subp†   sG   € ð	"ÜŸ™ 4§9¡9°dÔ;‰JˆE�3ÙØ�
ØˆDŒJØøÜò 	"Ø!Õ!ûð	"ús   ‚'2 ª2 ²	A»A¼AÁAc                 óº   — | j                   r$t        dj                  | j                   «      «      ‚| j                  j	                  d«      d   }t        |«      dz  S )z{
        If subp call succeeded, return the timestamp from subp as a float.

        :return: timestamp as a float
        zBSubprocess call to systemctl has failed, returning error code ({})ú=rC   i@B )r   ÚRuntimeErrorr   rQ   r*   r.   )rV   r   s     r   Úparse_epoch_as_floatz$SystemctlReader.parse_epoch_as_float–   sV   € ð �<Š<Üð,ß,2©F°4·<±<Ó,@óð ð —J‘J×$Ñ$ SÓ)¨!Ñ,ˆ	ä�YÓ 'Ñ)Ð)r!   r1   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rY   r   rd   r   r!   r   rM   rM   v   s   „ ñó	#ò"ó *r!   rM   c                  óÀ   — t        «       r
t        «       S t        j                  «       s'dt        j                  «       d   j                  «       v r
t        «       S t        S )a)  
    Determine which init system a particular linux distro is using.
    Each init system (systemd, etc) has a different way of
    providing timestamps.

    :return: timestamps of kernelboot, kernelendboot, and cloud-initstart
    or TIMESTAMP_UNKNOWN if the timestamps cannot be retrieved.
    ÚgentooÚsystem)r   Úgather_timestamps_using_systemdr   Ú
is_FreeBSDÚsystem_infoÚlowerÚgather_timestamps_using_dmesgÚTIMESTAMP_UNKNOWNr   r!   r   Údist_check_timestamprr   «   sM   € ô „~Ü.Ó0Ð0ô ‡�Ô˜H¬×(8Ñ(8Ó(:¸8Ñ(D×(JÑ(JÓ(LÑLÜ,Ó.Ð.ô Ðr!   c                  óþ  — 	 t        j                   dgd¬«      \  } }| d   j                  «       }|D ]¯  }|j                  d«      j                  d«      dk7  sŒ'|j                  d«      j	                  «       }|d   j                  d	«      }t        |«      }t        t        j                  «       «      t        t        j                  «       «      z
  }||z   }t        |||fc S  	 t        S # t        $ r Y t        S w xY w)
a  
    Gather timestamps that corresponds to kernel begin initialization,
    kernel finish initialization using dmesg as opposed to systemctl

    :return: the two timestamps plus a dummy timestamp to keep consistency
    with gather_timestamps_using_systemd
    ÚdmesgTr[   r   zUTF-8Úuserr   rC   ú])r   Ú
splitlinesÚdecodeÚfindr*   Ústripr.   Útimer   ÚuptimeÚSUCCESS_CODEr]   rq   )	ÚdataÚ_Úsplit_entriesr   ÚsplitupÚstrippedÚuser_space_timestampÚkernel_startÚ
kernel_ends	            r   rp   rp   Á   sñ   € ðÜ—)‘)˜W˜I¨tÔ4‰ˆˆaØ˜Q™×*Ñ*Ó,ˆØò 	JˆAØ�x‰x˜Ó ×%Ñ% fÓ-°Ó3ØŸ(™( 7Ó+×1Ñ1Ó3�Ø" 1™:×+Ñ+¨CÓ0�ô (-¨X£Ð$Ü$¤T§Y¡Y£[Ó1´E¼$¿+¹+»-Ó4HÑH�Ø)Ð,@Ñ@�
ô $ \°:¸zÐIÒIñ	Jô" Ðøô ò ØÜÐðús   ‚AC+ ÁB	C+ Ã#C+ Ã+	C<Ã;C<c                  ó’  — t        t        j                  «       «      t        t        j                  «       «      z
  } 	 t	        d«      j                  «       }t	        dd«      j                  «       }| }t        }t        j                  «       rt        }||z   }||z   }|| ||fS # t        $ r}t        |«       t        cY d}~S d}~ww xY w)z¸
    Gather timestamps that corresponds to kernel begin initialization,
    kernel finish initialization. and cloud-init systemd unit activation

    :return: the three timestamps
    ÚUserspaceTimestampMonotonicÚInactiveExitTimestampMonotoniczcloud-init-localN)r.   r{   r   r|   rM   rd   r}   Úis_containerÚCONTAINER_CODEr]   Úprintrq   )r„   Údelta_k_endÚ
delta_ci_sÚ	base_timeÚstatusr…   Úcloudinit_sysdÚes           r   rl   rl   à   sÅ   € ô œŸ™›Ó%¬¬d¯k©k«mÓ(<Ñ<€Lð!Ü%Ø)ó
ç
Ñ
Ó
 ð 	ô %Ø,Ð.@ó
ç
Ñ
Ó
 ð 	ð !ˆ	Üˆô ×ÑÔÜ#ˆFØ Ñ,ˆ
Ø" ZÑ/ˆð �< ¨^Ð;Ð;øô ò !ô 	ˆaŒÜ Õ ûð!ús   ½AB" Â"	CÂ+CÂ;CÃCc                 óÞ  — t        | d„ ¬«      }g }d}d}i }g }g }t        t        |«      «      D �]}  }	| |	   }
	 | |	dz      }t	        |
«      dk(  rå|rE|
j                  d«      dk(  r1|j                  t        |«      «       |j                  |«       g }d}d}|€t        |
«      }||t        |
«      <   t        |
«      t        |«      k(  r6t	        |«      d	k(  sŒ¨|j                  t        |t        ||
|«      «      «       ŒÏ|j                  d
|
j                  d«      z  «       |j                  |
«       �Œ|j                  «       }t        |
«      t        |«      k(  rAt        |||
«      }|j                  t        d|«      dz   «       ||j                  d«      z  }�Œm|j                  |«       �Œ€ |j                  t        |«      «       |j                  |«       |S # t        $ r d}Y �Œªw xY w)as  
    Take in raw events and create parent-child dependencies between events
    in order to order events in chronological order.

    :param events: JSONs from dump that represents events taken from logs
    :param print_format: formatting to represent event, time stamp,
    and time taken by the event in one line

    :return: boot records ordered chronologically
    c                 ó   — | d   S r-   r   )Úxs    r   ú<lambda>z"generate_records.<locals>.<lambda>  s
   € °°;±€ r!   )ÚkeyNg        rC   r=   r   z
init-localr>   zStarting stage: %szFinished stage: (%n) %d secondsú
r   )ÚsortedÚrangeÚlenÚ
IndexErrorr	   r$   rT   rK   r6   r+   r&   r    rI   Úpop)ÚeventsÚprint_formatÚsorted_eventsÚrecordsrG   r   Ústage_start_timeÚboot_recordsÚunprocessedr‘   r   Únext_evtÚprev_evtrH   s                 r   Úgenerate_recordsr¦     sø  € ô ˜6Ñ'?Ô@€MØ€GØ€JØ€JØÐØ€Là€KÜ”3�}Ó%Ó&ó ,-ˆØ�q‘	ˆð	Ø˜a !™e‘}ˆHô �eÓ Ò'Ù˜5Ÿ9™9 VÓ,°Ò<Ø—‘Ô0°Ó<Ô=Ø×#Ñ# GÔ,Ø�Ø!�
Ø �
àÐ!Ü+¨EÓ2�
Ø8BÐ ¤¨eÓ!4Ñ5ô ˜%Ó ¤J¨xÓ$8Ò8Ü˜hÓ'¨8Ó3Ø—N‘NÜ%Ø(Ü(¨°U¸HÓEóõð —‘Ð3°e·i±iÀÓ6GÑGÔHØ×"Ñ" 5Ô)Ùà"—‘Ó(ˆHÜ˜%Ó ¤J¨xÓ$8Ò8Ü% j°(¸EÓB�Ø—‘Ü!Ð"CÀVÓLØñôð ˜fŸj™j¨Ó1Ñ1’
ð ×"Ñ" 8Ö,ðY,-ð\ ‡N�NÔ$ ZÓ0Ô1Ø×Ñ˜Ô ØÐøôY ò 	Ø‹Hð	ús   ¹GÇG,Ç+G,c                 ó   — t        | |¬«      S )a<  
    A passthrough method that makes it easier to call generate_records()

    :param events: JSONs from dump that represents events taken from logs
    :param print_format: formatting to represent event, time stamp,
    and time taken by the event in one line

    :return: boot records ordered chronologically
    )rž   )r¦   )r�   rž   s     r   Úshow_eventsr¨   K  s   € ô ˜F°Ô>Ð>r!   c                 ó  — | j                  «       }|j                  «       sAt        j                  j	                  d| j
                  z  «       t        j                  d«       	 t        j                  |«      |fS # t        $ r d|fcY S w xY w)z˜
    Takes in a log file, read it, and convert to json.

    :param infile: The Log file to be read

    :return: json version of logfile, raw file
    zEmpty file %s
rC   N)
Úreadrz   ÚsysÚstderrÚwriter   ÚexitÚjsonÚloadsÚ
ValueError)Úinfiler~   s     r   Úload_events_infiler³   X  sq   € ð �;‰;‹=€DØ�:‰:Œ<Ü�
‰
×ÑÐ*¨V¯[©[Ñ8Ô9Ü�‰�ŒðÜ�z‰z˜$Ó Ð%Ð%øÜò Ø�TˆzÒðús   Á#A: Á:B
Â	B
)z(%n) %d seconds in %I%D)r2   r¯   r«   r{   Ú	cloudinitr   r   Úcloudinit.distrosr   r   r}   Ú	FAIL_CODErŠ   rq   r    r&   r	   r+   r/   r6   r;   r?   rI   rK   rM   rr   rp   rl   r¦   r¨   r³   r   r!   r   ú<module>r·      sÇ   ðó Û Û 
Û ç  Ý *ð, Ø
Ø
Ø
Ø
Ø
Ø
Ø
Ø
Ø
Ø
ñ€
ð €Ø€	Ø€Ø  B¨Ð+Ð òòòòò)òò%òHò
ò6÷2*ñ 2*òjò,ò><ðF +óGòT
?ór!   