
­­­­­­­­­­­­­­­­­­
<!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re;  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rdnd}tj|j|jj}t| d|  |jr|jrd|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rttj|dddd n|jdkrttj| |jtj krdS |jt!j" krd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}nd|kr0tj}d}ntjj| rNtj	}dj
| }nd|krbtj}d}ndtjjddkst rdtjd	d
gjkrtj}d}nRtjjtjj|jdrtj}d}n.tjjtjj|jdrt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   xd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rq|d dks|d dkrtjS tjS W dS )zGet 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|rtjj|svtj}tt|jdi }d}	i }
x0t|j D ]\}}|dkr|rtj}dj|}q|dkr|d	kr|}q|}|jd
\}}}|j jdd}qt|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rtj}t||}||	kr|}	qW |rtj}n|tjkr|	dkrt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 )zReturn 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
