
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
Šcj
:  ã               @   s²  d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
mZ ddlmZmZmZmZmZmZmZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZm Z  dZ!ej"G dd„ dej#ƒƒZ$e$j%e$j&e$j'e$j(iZ)e$j&e$j%e$j(e$j'iZ*ej"G dd„ dej#ƒƒZ+e,e+j-e+j.e+j/e+j0gƒZ1G dd„ deƒZ2dZ3d"dd„Z4e5dœdd„Z6ee+e7f dœdd„Z8ee$ dœdd„Z9d#ee e2dœdd„Z:dd „ Z;e<d!k�r®e;ƒ  dS )$zFDefine 'status' utility and handler as part of cloud-init commandline.é    N)Údeepcopy)ÚgmtimeÚsleepÚstrftime)ÚAnyÚDictÚListÚ
NamedTupleÚOptionalÚTupleÚUnion)ÚsafeyamlÚsubp)Úread_cfg_paths)Úuses_systemd)ÚPaths)Úget_cmdlineÚ	load_fileÚ	load_jsonz/etc/cloud/cloud-init.disabledc               @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
ÚUXAppStatusz=Enum representing user-visible cloud-init application status.znot runÚrunningÚdoneÚerrorzdegraded donezdegraded runningÚdisabledN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚNOT_RUNÚRUNNINGÚDONEÚERRORÚDEGRADED_DONEÚDEGRADED_RUNNINGÚDISABLED© r%   r%   ú/usr/lib/python3.6/status.pyr      s   r   c               @   s0   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )ÚUXAppBootStatusCodez<Enum representing user-visible cloud-init boot status codes.zdisabled-by-generatorzdisabled-by-kernel-cmdlinezdisabled-by-marker-filez disabled-by-environment-variablezenabled-by-generatorzenabled-by-kernel-cmdlinezenabled-by-sysvinitÚunknownN)r   r   r   r   ÚDISABLED_BY_GENERATORÚDISABLED_BY_KERNEL_CMDLINEÚDISABLED_BY_MARKER_FILEÚDISABLED_BY_ENV_VARIABLEÚENABLED_BY_GENERATORÚENABLED_BY_KERNEL_CMDLINEÚENABLED_BY_SYSVINITÚUNKNOWNr%   r%   r%   r&   r'   6   s   r'   c               @   sJ   e Zd ZU eeee	e 
eee	e f eee eeef dS )ÚStatusDetailsN)r   r   r   r   Ústatusr'   Úboot_status_codeÚstrÚdescriptionr   Úerrorsr   Úrecoverable_errorsÚlast_updater
   Ú
datasourceÚv1r%   r%   r%   r&   r1   N   s   
r1   zcextended_status: {extended_status}
boot_status_code: {boot_code}
{last_update}detail:
{description}c             C   sX   | st jddd�} | jdtdddgddd	� | jd
ddddd� | jdddddd� | S )a%  Build or extend an arg parser for status utility.

    @param parser: Optional existing ArgumentParser instance representing the
        status subcommand which will be extended to support the args of
        this utility.

    @returns: ArgumentParser with proper argument configuration.
    r2   zReport run status of cloud init)Úprogr5   z--formatÚjsonÚtabularÚyamlz5Specify output format for cloud-id (default: tabular))ÚtypeÚchoicesÚdefaultÚhelpz-lz--longÚ
store_trueFzJReport long format of statuses including run stage name and error messages)ÚactionrA   rB   z-wz--waitz'Block waiting on cloud-init to complete)ÚargparseÚArgumentParserÚadd_argumentr4   )Úparserr%   r%   r&   Ú
get_parser`   s,    	
rI   )Úreturnc          	   C   sæ  t ƒ }t|ƒ}|jr`xJ|jtjtjtjfkr^|jdkrLt	j
jdƒ t	j
jƒ  t|ƒ}tdƒ qW |j|jjtj|j|jƒj|jj|j|j|j|jdœ|j–}|jdk�r~|jr²dnd}tj|j|jƒj}t|› d|› �ƒ |j�r¼|jrød|j› d�}nd}ttj|jj||jj|j|d	�d
|j�r4ddj|jƒ n
d|j› �  d|j�rjddjdd„ |jjƒ D ƒƒ n
d|j› �  ƒ n>|jdk�r¢ttj|dddd�ƒ n|jdk�r¼ttj|ƒƒ |jtj k�rÎdS |jt!j"ƒ k�râdS dS )z4Handle calls to 'cloud-init status' as a subcommand.r=   Ú.g      Ð?)r9   r3   r2   Úextended_statusZdetailr6   r7   r8   Ú
Ú zstatus: zlast_update: )rL   ÚprefixZ	boot_coder5   r8   z
errors:z
	- ú z
recoverable_errors:c             S   s.   g | ]&\}}|› d �dj dd„ |D ƒƒ ‘qS )z:
	- z
	- c             S   s   g | ]}|j d dƒ‘qS )rM   rP   )Úreplace)Ú.0Úir%   r%   r&   ú
<listcomp>Ì   s    z1handle_status_args.<locals>.<listcomp>.<listcomp>)Újoin)rR   ÚkÚvr%   r%   r&   rT   Ê   s   z&handle_status_args.<locals>.<listcomp>r<   é   Tú,ú: )ÚindentZ	sort_keysZ
separatorsr>   é   r   )rY   rZ   )#r   Úget_status_detailsÚwaitr2   r   r   r   r#   ÚformatÚsysÚstdoutÚwriteÚflushr   r9   r3   ÚvalueÚUXAppStatusDegradedMapCompatÚgetr5   r6   r7   r8   r:   ÚprintZlongÚTABULAR_LONG_TMPLrU   Úitemsr<   Údumpsr   r!   ÚUXAppStatusDegradedMapÚvalues)ÚnameÚargsÚpathsZdetailsZdetails_dictrO   Ústater8   r%   r%   r&   Úhandle_status_argsˆ   s^    


D&rq   c             C   sô   t ƒ jƒ }tƒ stj}d}nÐd|kr0tj}d}n¼tjj| ƒrNtj	}dj
| ƒ}nžd|krbtj}d}nŠdtjjddƒksŽtƒ ršdtjd	d
gƒjkrštj}d}nRtjjtjj|jdƒƒr¾tj}d}n.tjjtjj|jdƒƒrâtj}d}n
tj}d}||fS )a  Report whether cloud-init current boot status

    @param disable_file: The path to the cloud-init disable file.
    @param paths: An initialized cloudinit.helpers.Paths object.
    @returns: A tuple containing (code, reason) about cloud-init's status and
    why.
    zCloud-init enabled on sysvinitzcloud-init=enabledz<Cloud-init enabled by kernel command line cloud-init=enabledzCloud-init disabled by {0}zcloud-init=disabledz;Cloud-init disabled by kernel parameter cloud-init=disabledZKERNEL_CMDLINErN   Ú	systemctlzshow-environmentzNCloud-init disabled by environment variable KERNEL_CMDLINE=cloud-init=disabledr   z+Cloud-init disabled by cloud-init-generatorÚenabledz2Cloud-init enabled by systemd cloud-init-generatorz'Systemd generator may not have run yet.)r   Úsplitr   r'   r/   r.   ÚosÚpathÚexistsr+   r_   r*   Úenvironrf   r   ra   r,   rU   Úrun_dirr)   r-   r0   )Zdisable_filero   Zcmdline_partsZbootstatus_codeÚreasonr%   r%   r&   Úget_bootstatusè   s8    
r{   c              C   s´   x®dD ]¦} t j ddd| gƒj}tdd	„ |jƒ D ƒƒ}|d
 jdƒpL|d
 dksTtjS |d dkrŠ|d dkrpqn|d dkrŠ|d dkrŠq|d dks¢|d dkr¨tjS tjS W dS )zËGet status from systemd.

    Using systemd, we can get more fine-grained status of the
    individual unit. Determine if we're still
    running or if there's an error we haven't otherwise detected
    úcloud-final.serviceúcloud-config.serviceúcloud-init.serviceúcloud-init-local.servicerr   Zshowz5--property=ActiveState,UnitFileState,SubState,MainPIDc             S   s    g | ]}d d„ |j dƒD ƒ‘qS )c             S   s   g | ]}|j ƒ ‘qS r%   )Ústrip)rR   Úxr%   r%   r&   rT   )  s    z2_get_systemd_status.<locals>.<listcomp>.<listcomp>ú=)rt   )rR   Úrr%   r%   r&   rT   )  s    z'_get_systemd_status.<locals>.<listcomp>ZUnitFileStaters   ZstaticZActiveStateZactiveZSubStateZexitedr   ZMainPIDÚ0ZfailedN)r|   r}   r~   r   )r   ra   ÚdictÚ
splitlinesÚ
startswithr   r!   r   )Zservicera   Zstatesr%   r%   r&   Ú_get_systemd_status  s0       
rˆ   )ro   rJ   c          	   C   sf  | pt ƒ } tj}g }d}i }tjj| jdƒ}tjj| jdƒ}tt| ƒ\}}|t	krXtj
}tjj|ƒrŠtjj|ƒsvtj}tt|ƒƒjdi ƒ}d}	i }
�x0t|jƒ ƒD �]\}}|dkrÊ|rÈtj}dj|ƒ}q¢|dk�r|d	krâ|}q¢|}|jd
ƒ\}}}|jƒ jddƒ}q¢t|tƒr¢|j|jdg ƒƒ |jdƒ�p2d}|jdƒ�pBd}|jdi ƒ}x@|jƒ D ]4}||
k�rzt|| ƒ|
|< n|
| j|| ƒ �qZW |dk�r¬|dk�r¬tj}t||ƒ}||	kr¢|}	q¢W |�rÔtj}n|tjk�rð|	dk�rðtj}tƒ �r|tjtj
fk�rtƒ }|�r|}|	�r.t dt!|	ƒƒnd}|
�rDt"j||ƒ}|j#dd	ƒ t$|||||
|||ƒS )z¶Return a dict with status, details and errors.

    @param paths: An initialized cloudinit.helpers.paths object.

    Values are obtained from parsing paths.run_dir/status.json.
    rN   zstatus.jsonzresult.jsonr:   r   ZstagezRunning in stage: {0}r9   NrP   r6   ÚstartÚfinishedr7   z%a, %d %b %Y %H:%M:%S %z)%r   r   r   ru   rv   rU   ry   r{   ÚCLOUDINIT_DISABLED_FILEÚDISABLED_BOOT_CODESr$   rw   r   r   r   rf   Úsortedri   r_   Ú	partitionÚlowerrQ   Ú
isinstancer…   ÚextendÚkeysr   Úmaxr!   r    r   rˆ   r   r   rk   Úpopr1   )ro   r2   r6   r9   Z	status_v1Zstatus_fileZresult_filer3   r5   Zlatest_eventr7   Úkeyrd   ZdsÚ_r‰   rŠ   Zcurrent_recoverable_errorsZerr_typeZ
event_timeZsystemd_statusr8   r%   r%   r&   r]   G  sŠ    





r]   c              C   s   t ƒ } tjtd| jƒ ƒƒ dS )z$Tool to report status of cloud-init.r2   N)rI   r`   Úexitrq   Ú
parse_args)rH   r%   r%   r&   Úmain©  s    r™   Ú__main__)N)N)=r   rE   Úenumr<   ru   r`   Úcopyr   Ztimer   r   r   Ztypingr   r   r   r	   r
   r   r   Z	cloudinitr   r   Zcloudinit.cmd.develr   Zcloudinit.distrosr   Zcloudinit.helpersr   Zcloudinit.utilr   r   r   r‹   ÚuniqueÚEnumr   r   r#   r    r"   rk   re   r'   Ú	frozensetr)   r*   r+   r,   rŒ   r1   rh   rI   Úintrq   r4   r{   rˆ   r]   r™   r   r%   r%   r%   r&   Ú<module>   sJ   $



(`+4b
