
"T`J                 @   s<  d  Z  d d l Z d d l m 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 m Z d d l m Z m Z m Z m Z d d	 g Z d
 Z d Z d d d  Z d d   Z d d   Z d d   Z d d   Z d d d  Z d d   Z d d   Z e d k r8e j e    d S)zGDefine 'collect-logs' utility and handler to include in cloud-init cmd.    N)datetime)INSTANCE_JSON_SENSITIVE_FILE)tempdir)ProcessExecutionErrorsubp)chdircopy
ensure_dir
write_filez/var/log/cloud-init.logz/var/log/cloud-init-output.logz/run/cloud-initz%/var/lib/cloud/instance/user-data.txtc             C   s   |  s t  j d d d d  }  |  j d d d d d	 d
 d d d d |  j d d d	 d d d |  j d d d	 d d d d d d d j t  |  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.
    progzcollect-logsZdescriptionz)Collect and tar all cloud-init debug infoz	--verbosez-vactioncountdefaultr   dest	verbosityhelpzBe more verbose.z	--tarfilez-tzcloud-init.tar.gzzOThe tarfile to create containing all collected logs. Default: cloud-init.tar.gzz--include-userdataz-uF
store_trueuserdatazPOptionally include user-data from {0} which could contain sensitive information.)argparseArgumentParseradd_argumentformatUSER_DATA_FILE)parser r   :/usr/lib/python3/dist-packages/cloudinit/cmd/devel/logs.py
get_parser   s    			
r   c             C   s   t  j   d k r f  St f S)z3Return a list of files to ignore if we are non-rootr   )osgetuidr   )curdirfilesr   r   r    _copytree_ignore_sensitive_files3   s    r!   c             C   s   y t  |   \ } } WnL t k
 rd } z, t | t |   t d | d |  WYd d } ~ Xn& Xt | |  t d | d |  | Sd S)zCHelper which runs a command and writes output or error to filename.zcollecting %s failed.
   Nzcollected %s
)r   r   r
   str_debug)cmdfilenamemsgr   out_er   r   r   _write_command_output_to_file:   s    'r+   c             C   s    | | k r t  j j |   d  S)N)sysstderrwrite)r'   levelr   r   r   r   r$   G   s    r$   c             C   sN   t  j j |   r6 t |  |  t d |  d |  n t d |  d |  d  S)Nzcollected file: %s
r"   zfile %s did not exist
   )r   pathisfiler   r$   )r1   Zout_dirr   r   r   r   _collect_fileL   s    r3   c       
      C   sy  | r, t  j   d k r, t j j d  d St  j j |   }  t j   j	   j
 d  } d j |  } t d d  } t  j j | |  } t d d	 g t  j j | d
  d |  } t d d d d g t  j j | d  d |  } | s| r | n d } t d | d |  t d g t  j j | d  d |  t d d d d g t  j j | d  d |  x t D] } t | | |  qoW| rt t | |  t  j j | d  }	 t |	  t  j j t  rt j t t  j j |	 d  d t t d t d |  n t d t d |  t |  + t d  d! |  | j | d" d#  g  Wd$ QRXWd$ QRXt j 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
r"   z%Y-%m-%dzcloud-init-logs-{0}dirz/tmpz
cloud-initz	--versionversionzcloud-init --versionz
dpkg-queryz--showz-f=${Version}
zdpkg-versionzdpkg versionznot-availablez!collected cloud-init version: %s
Zdmesgz	dmesg.txtzdmesg outputZ
journalctlz--boot=0z-ozshort-precisezjournal.txtzsystemd journal of current bootZrunignorezcollected dir %s
zdirectory '%s' did not exist
ZtarZczvf/ Nz	Wrote %s
)r   r   r,   r-   r.   r1   abspathr   ZutcnowdateZstrftimer   r   joinr+   r$   CLOUDINIT_LOGSr3   r   r	   existsCLOUDINIT_RUN_DIRshutilZcopytreer!   r   r   replace)
tarfileZinclude_userdatar   r:   Zlog_dirZtmp_dirr5   Zdpkg_verlogZrun_dirr   r   r   collect_logsT   sX    		


	4rC   c             C   s   t  | j | j | j  S)z:Handle calls to 'cloud-init collect-logs' as a subcommand.)rC   rA   r   r   )nameargsr   r   r   handle_collect_logs_args   s    rF   c              C   s   t    }  t d |  j    S)z4Tool to collect and tar all cloud-init related logs.zcollect-logs)r   rF   
parse_args)r   r   r   r   main   s    	rH   __main__)__doc__r   r   r   r?   r,   Zcloudinit.sourcesr   Zcloudinit.temp_utilsr   Zcloudinit.subpr   r   Zcloudinit.utilr   r   r	   r
   r<   r>   r   r   r!   r+   r$   r3   rC   rF   rH   __name__exitr   r   r   r   <module>   s,   "7