U
    Ad#                     @   sl  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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 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 G dd dej!Z#e$e#j%e#j&e#j'gZ(G dd deZ)dZ*dddZ+e,dddZ-ee#e.f dddZ/d ee e)dddZ0dd Z1e2dkrhe1  dS )!zFDefine 'status' utility and handler as part of cloud-init commandline.    N)gmtimesleepstrftime)AnyDictList
NamedTupleOptionalTupleUnion)safeyaml)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S )UXAppStatusz=Enum representing user-visible cloud-init application status.znot runrunningZdoneerrordisabledN)	__name__
__module____qualname____doc__NOT_RUNRUNNINGDONEERRORDISABLED r    r    6/usr/lib/python3/dist-packages/cloudinit/cmd/status.pyr      s   r   c                   @   s,   e 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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ENABLED_BY_GENERATORENABLED_BY_KERNEL_CMDLINEENABLED_BY_SYSVINITUNKNOWNr    r    r    r!   r"   '   s   r"   c                   @   sF   e Zd ZU eed< eed< eed< ee ed< eed< ee ed< dS )StatusDetailsstatusboot_status_codedescriptionerrorslast_update
datasourceN)	r   r   r   r   __annotations__r"   strr   r	   r    r    r    r!   r+   =   s   
r+   z@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.
    r,   zReport run status of cloud init)progr.   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)actionr:   r;   z-wz--waitz'Block waiting on cloud-init to complete)argparseArgumentParseradd_argumentr3   parserr    r    r!   
get_parserL   s6    	 
rC   )returnc                 C   sX  t  }t|}|jrX|jtjtjfkrX|jdkrFtj	
d tj	  t|}td q|j|jj|jj|j|j|jd}dt|i|d< d|d< |jdkr|jrdnd	}t| d
|jj  |jrB|jrd|j d}nd	}ttj||jj|j|d n>|jdkr(ttj|dddd n|jdkrBtt| |jtjkrTdS dS )z4Handle calls to 'cloud-init status' as a subcommand.r6   .g      ?)r1   r-   r,   Zdetailr/   r0   1ZschemasZ_schema_version
 zstatus: zlast_update: )prefixZ	boot_coder.   r0   r5      T),z: )indentZ	sort_keysZ
separatorsr7      r   )r   get_status_detailswaitr,   r   r   r   formatsysstdoutwriteflushr   r1   r-   valuer.   r/   r0   copydeepcopyprintZlongTABULAR_LONG_TMPLr5   dumpsr   r   )nameargspathsZdetailsZdetails_dictrI   r0   r    r    r!   handle_status_argst   sZ    


   r^   c                 C   s   t   }t stj}d}nd|kr0tj}d}ntj| rNtj	}d
| }nfd|krbtj}d}nRtjtj|jdrtj}d}n.tjt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=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&   rP   r%   joinrun_dirr$   r'   r*   )Zdisable_filer]   Zcmdline_partsZbootstatus_codereasonr    r    r!   get_bootstatus   s,    
rg   )r]   rD   c                 C   s  | pt  } tj}g }d}i }tj| jd}tj| jd}tt| \}}|t	krXtj
}tj|rtj|svtj}tt|di }d}	t| D ]\}
}|
dkr|rtj}d|}q|
dkr|d	kr|}q|}|d
\}}}| dd}qt|tr||dg  |dp&d}|dp6d}|dkrR|dkrRtj}t||}||	kr|}	q|rtj}d|}n|tjkr|	dkrtj}|	rtdt|	n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.
    rH   zstatus.jsonzresult.jsonZv1r   ZstagezRunning in stage: {0}r1   N r/   startfinishedrG   z%a, %d %b %Y %H:%M:%S %z)r   r   r   ra   rb   rd   re   rg   CLOUDINIT_DISABLED_FILEDISABLED_BOOT_CODESr   rc   r   r   r   getsorteditemsrP   	partitionlowerreplace
isinstancedictextendmaxr   r   r   r   r+   )r]   r,   r/   r1   Z	status_v1Zstatus_fileZresult_filer-   r.   Zlatest_eventkeyrU   Zds_ri   rj   Z
event_timer0   r    r    r!   rN      sp    
 

     rN   c                  C   s   t  } ttd|   dS )z$Tool to report status of cloud-init.r,   N)rC   rQ   exitr^   
parse_argsrA   r    r    r!   main  s    r{   __main__)N)N)3r   r>   rV   enumr5   ra   rQ   timer   r   r   typingr   r   r   r   r	   r
   r   Z	cloudinitr   Zcloudinit.cmd.develr   Zcloudinit.distrosr   Zcloudinit.helpersr   Zcloudinit.utilr   r   r   rk   uniqueEnumr   r"   	frozensetr$   r%   r&   rl   r+   rY   rC   intr^   r3   rg   rN   r{   r   r    r    r    r!   <module>   sB   $
		
(2!A
