o
    w7er'                     @   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 ddl	m
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
lmZmZmZmZ ddgZdZG dd de
ZeddeddeddgZeddeddeddeddedded d!ed"d#ed$d%ed&d'ed(d)ed*d)ed+d,gZd-efd.d/Zd-efd0d1Z dHd2d3Z!d4d5 Z"d6d7 Z#d8d9 Z$d:d; Z%d<d= Z&d>d? Z'dId@e(fdAdBZ)dCdD Z*dEdF Z+e,dGkre-e+  dS dS )JzGDefine 'collect-logs' utility and handler to include in cloud-init cmd.    N)datetime)Path)
NamedTuple)read_cfg_paths)Paths)ProcessExecutionErrorsubp)tempdir)chdircopy
ensure_dir
write_filez/var/log/cloud-init.logz/var/log/cloud-init-output.logz/run/cloud-initc                   @   s   e Zd ZU eed< eed< dS )
ApportFilepathlabelN)__name__
__module____qualname__str__annotations__ r   r   :/usr/lib/python3/dist-packages/cloudinit/cmd/devel/logs.pyr      s   
 r   z(/var/log/installer/autoinstall-user-dataAutoInstallUserDataz/autoinstall.yamlAutoInstallYAMLz'/etc/cloud/cloud.cfg.d/99-installer.cfgInstallerCloudCfgz//var/log/installer/ubuntu_desktop_installer.logUdiLogz-/var/log/installer/subiquity-server-debug.logSubiquityServerDebugz-/var/log/installer/subiquity-client-debug.logSubiquityClientDebugz%/var/log/installer/curtin-install.log	CurtinLogz0/var/log/installer/subiquity-curtin-install.confCurtinInstallConfigz8/var/log/installer/curtin-install/subiquity-initial.confCurtinConfigInitialz:/var/log/installer/curtin-install/subiquity-curthooks.confCurtinConfigCurtHooksz8/var/log/installer/curtin-install/subiquity-extract.confCurtinConfigExtractz=/var/log/installer/curtin-install/subiquity-partitioning.confCurtinConfigPartitioningz(/var/log/installer/curtin-error-logs.tarCurtinErrorz$/var/log/installer/curtin-errors.tarz(/var/log/installer/block/probe-data.json	ProbeDatareturnc                  C      t  } | dS )Nuserdata_raw)r   get_ipath_curpathsr   r   r   _get_user_data_fileN      
r,   c                  C   r'   )Ndata)r   	get_cpathr*   r   r   r   _get_cloud_data_pathS   r-   r0   c              	   C   s`   | s	t jddd} | jdddddd	d
 | jddddd t }| jdddddd|d | S )a2  Build or extend and arg parser for collect-logs utility.

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

    @returns: ArgumentParser with proper argument configuration.
    collect-logsz)Collect and tar all cloud-init debug info)progdescriptionz	--verbosez-vcountr   	verbosityzBe more verbose.)actiondefaultdesthelpz	--tarfilez-tzcloud-init.tar.gzzOThe tarfile to create containing all collected logs. Default: cloud-init.tar.gz)r7   r9   z--include-userdataz-uF
store_trueuserdatazPOptionally include user-data from {0} which could contain sensitive information.)r7   r6   r8   r9   )argparseArgumentParseradd_argumentr,   format)parseruser_data_filer   r   r   
get_parserX   s<   		rB   c                 C   s*   dg}t  dkr|ti jd  |S )z>Return a list of files to ignore for /run/cloud-init directoryzhook-hotplug-cmdr   instance_data_sensitive)osgetuidappendr   lookups)curdirfilesignored_filesr   r   r   _copytree_rundir_ignore_files   s
   rK   c              
   C   s   t tj| zt| j}W n" ty1 } zt|t| t	d| d| W Y d}~dS d}~ww t|| t	d| d| |S )CHelper which runs a command and writes output or error to filename.collecting %s failed.
   Ncollected %s
)
r   rD   r   dirnamer   stdoutr   r   r   _debug)cmdfilenamemsgr5   outputer   r   r   _write_command_output_to_file   s   
rX   c              
   C   s   t tj| zt|d}tj| ||d W d   n1 s!w   Y  W n" tyI } zt|t	| t
d| d| W Y d}~dS d}~ww t
d| d| dS )rL   w)rQ   stderrNrM   rN   rO   )r   rD   r   rP   open
subprocesscallOSErrorr   r   rR   )rS   rT   rU   r5   frW   r   r   r   _stream_command_output_to_file   s   r`   c                 C   s   ||krt j|  d S d S N)sysrZ   write)rU   levelr5   r   r   r   rR      s   rR   c                 C   s>   t j| rt| | td|  d| d S td|  d| d S )Nzcollected file: %s
rN   zfile %s did not exist
   )rD   r   isfiler   rR   )r   out_dirr5   r   r   r   _collect_file   s   
rh   c                 C   s   t D ]}t| |j j}| stt| t|jt|| q|rBtD ]}t| |j j}| s8tt| t|jt|| q$dS dS )z'Obtain subiquity logs and config files.N)	INSTALLER_APPORT_FILESr   r   parentexistsr   r   rh    INSTALLER_APPORT_SENSITIVE_FILES)log_dirinclude_userdatar5   src_filedestination_dirr   r   r   collect_installer_logs   s   rq   rn   c                 C   s  |rt  dkrtjd dS t j| } t 	 
d}tdd}t j||}tddgt j|d	d
|d}tg dt j|dd|d}|sS|rQ|nd}td| td| d| tdgt j|dd|d tg dt j|dd|d tD ]}t||| q|rt }t||| t||| t j|d}	t|	 t jtrztjtt j|	dtd W n# tjy }
 ztjd tjt|
d  W Y d}
~
nd}
~
ww tdt d| ntdt d| t jt jtdrtt }| rtt|t|t|  t| t d d!| |!|d" d#g W d   n	1 s0w   Y  W d   n	1 s@w   Y  tjd$|   dS )%zCollect all cloud-init logs and tar them up into the provided tarfile.

    @param tarfile: The path of the tar-gzipped file to create.
    @param include_userdata: Boolean, true means include user-data.
    r   zMTo include userdata, root user is required. Try sudo cloud-init collect-logs
rN   zcloud-init-logs-%Y-%m-%dz/tmp)dir
cloud-initz	--versionversionzcloud-init --version)rS   rT   rU   r5   )z
dpkg-queryz--showz-f=${Version}
rs   zdpkg-versionzdpkg versionznot-availablez	version: z!collected cloud-init version: %s
dmesgz	dmesg.txtzdmesg output)
journalctlz--boot=0z-ozshort-precisezjournal.txtzsystemd journal of current bootrun)ignorez(Failed collecting file(s) due to error:

Nzcollected dir %s
zdirectory '%s' did not exist
disabledtarczvf/ z	Wrote %s
)"rD   rE   rb   rZ   rc   r   abspathr   utcnowdatestrftimer	   joinrX   printrR   r`   CLOUDINIT_LOGSrh   r,   rq   r   rk   CLOUDINIT_RUN_DIRshutilcopytreerK   Errorr   r   r0   r
   r   replace)tarfilern   r5   rm   tmp_dirrt   dpkg_verlogrA   run_dirrW   cloud_data_dirr   r   r   collect_logs   s   

 


Cr   c                 C   s   t |j|j|jS )z:Handle calls to 'cloud-init collect-logs' as a subcommand.)r   r   r;   r5   )nameargsr   r   r   handle_collect_logs_args  s   r   c                  C   s   t  } td|  S )z4Tool to collect and tar all cloud-init related logs.r1   )rB   r   
parse_args)r@   r   r   r   main"  s   r   __main__ra   )r   ).__doc__r<   rD   r   r\   rb   r   pathlibr   typingr   cloudinit.cmd.develr   cloudinit.helpersr   cloudinit.subpr   r   cloudinit.temp_utilsr	   cloudinit.utilr
   r   r   r   r   r   r   rl   ri   r   r,   r0   rB   rK   rX   r`   rR   rh   rq   boolr   r   r   r   exitr   r   r   r   <module>   s   	%
.U