o
    f0                     @   s  U d 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
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 d
Zeg dZedgZdZdZdZdZdddeddeddddddZe dgZ!e g dZ"e e#e$ e!e"g dZ%dZ&dZ'eg dZ(e)e*Z+d d!ged"gd#Z,ee-d$< d%d& Z.d'd( Z/d)e0d*ed+ed,e1d-df
d.d/Z2d0d1 Z3d2ed,e1fd3d4Z4	d=d2efd5d6Z5d+efd7d8Z6d-ee0 fd9d:Z7d;d< Z8dS )>z7Chef: module that configures, starts and installs chef.    N)List)subp
temp_utils	templater
url_helperutil)Cloud)Config)
MetaSchema)Distro)
PER_ALWAYS1.8)	/etc/chefz/var/log/chefz/var/lib/chef/var/cache/chef/var/backups/chefz/var/run/chefr   z#https://www.chef.io/chef/install.sh   z/etc/chef/validation.pemz/etc/chef/firstboot.jsonz:verify_nonez:infoz/var/log/chef/client.logz/etc/chef/client.pemr   r   z/var/run/chef/client.pidT)ssl_verify_mode	log_levellog_locationvalidation_keyvalidation_cert
client_keyjson_attribsfile_cache_pathfile_backup_pathpid_file	show_timeencrypted_data_bag_secretr   )r   r   r   r   r   r   r   )
server_url	node_nameenvironmentvalidation_namechef_licensez/etc/chef/client.rbz/usr/bin/chef-client)z-dz-i1800z-s20cc_chefallchef)iddistros	frequencyactivate_by_schema_keysmetac                 C   s6   t j| ddd}|rtjtrtt d S d S d S )Ndelete_validation_post_execFdefault)r   get_cfg_option_boolospathisfileCHEF_VALIDATION_PEM_PATHunlink)chef_cfg
delete_pem r8   :/usr/lib/python3/dist-packages/cloudinit/config/cc_chef.pypost_run_chefi   s   r:   c              	   C   s   t  }| D ]-\}}|tvrtd| q|d u r d ||< q|tv r-t||||< qt	||||< q|
t tj	|d| dtj	|ddd|d |d d |S )	Nz'Skipping unknown chef template key '%s'r   r.   r    _defaultr   r!   )generated_byr   r    r   r!   )CHEF_RB_TPL_DEFAULTScopyitemsCHEF_RB_TPL_KEYSLOGdebugCHEF_RB_TPL_BOOL_KEYSr   r0   get_cfg_option_strupdatemake_header)iidr6   paramskvr8   r8   r9   get_template_paramsq   s.   
rK   namecfgcloudargsreturnc                 C   s  d|vrt d|  dS |d }t|d}|stt}t|tD ]}t	| q"|
dt}|
d}|rN|dkrBt|| ntj|sNt d| |d	}	|	rt|j }
t|
|}t }| D ]\}}|tv r{|r{|tj| qht| t|	t| nt d
t tj|dt d}|st !d n,i }d|v r|d |d< d|v r|d }t|" D ]}|| ||< qt|t#$| tj%|ddd}t&'t(}|r|rt)||}n|rtj%|ddd}nd}|rt*| t+| dS dS )z'Handler method activated by cloud-init.r'   z8Skipping module named %s, no 'chef' key in configurationNdirectoriesr   r   systemzWchef validation_cert provided as 'system', but validation_key path '%s' does not exist.zchef_client.rbz&No template found, not rendering to %sfirstboot_pathr.   z7First boot path empty, not writing first boot json filerun_listinitial_attributesforce_installFexec),rA   rB   r   get_cfg_option_listlist	CHEF_DIRS	itertoolschainREQUIRED_CHEF_DIRS
ensure_dirgetr4   
write_filer1   r2   r3   warningget_template_filenamestr
datasourceget_instance_idrK   setr?   CHEF_RB_TPL_PATH_KEYSadddirnameensure_dirsr   render_to_fileCHEF_RB_PATHrD   CHEF_FB_PATHinfokeysjsondumpsr0   r   is_exeCHEF_EXEC_PATHinstall_chefrun_chefr:   )rL   rM   rN   rO   r6   	chef_dirsd	vkey_pathvcerttemplate_fnrG   rH   param_pathsrI   rJ   fb_filenameinitial_jsonrU   rV   	installedrunr8   r8   r9   handle   sv   




r   c                 C   s   t d tg}d| v r6| d }t|ttfr|| nt|tr(|| nt 	dt
| |t n|t tj|dd d S )NzRunning chef-clientexec_argumentszRUnknown type %s provided for chef 'exec_arguments' expected list, tuple, or stringFcapture)rA   rB   rs   
isinstancerY   tupleextendrc   appendra   typeCHEF_EXEC_DEF_ARGSr   )r6   cmdcmd_argsr8   r8   r9   ru      s   


ru   distroc                 K   s   |  }|dd}tj| dd'}tj||}|d| t	j
|| dd tjd
d|i|W  d	   S 1 s=w   Y  d	S )a  Write blob to a tempfile, and call subp with args, kwargs. Then cleanup.

    'basename' as a kwarg allows providing the basename for the file.
    The 'args' argument to subp will be updated with the full path to the
    filename as the first argument.
    basename	subp_blobT)dir	needs_exer   i  )moderO   Nr8   )r>   popr   tempdirget_tmp_exec_pathr1   r2   joininsertr   r`   r   )blobr   rO   kwargsr   tmpdtmpfr8   r8   r9   subp_blob_in_tempfile   s   $r   c                 C   sP   |du rt }|du rt}|du rg }nd|g}tj||dj}t| ||dddS )ag  Install an omnibus unified package from url.

    @param url: URL where blob of chef content may be downloaded. Defaults to
        OMNIBUS_URL.
    @param retries: Number of retries to perform when attempting to read url.
        Defaults to OMNIBUS_URL_RETRIES
    @param omnibus_version: Optional version string to require for omnibus
        install.
    Nz-v)urlretrieszchef-omnibus-installF)r   r   rO   r   r   )OMNIBUS_URLOMNIBUS_URL_RETRIESr   readurlcontentsr   )r   r   r   omnibus_versionrO   contentr8   r8   r9   install_chef_from_omnibus  s   r   c                 C   s   t |dd}t j|ddd}|dkr2t |dd }t |dt}t||| j t j|dd	d}|S |dkr?| jd
g |S |dkr\t |d}t| jt |dt |d|d |S t	
d| d}|S )Ninstall_typepackagesrW   Fr.   gemsversionruby_versionTr'   omnibusr   omnibus_urlomnibus_url_retries)r   r   r   r   zUnknown chef install type '%s')r   rD   r0   RUBY_VERSION_DEFAULTinstall_chef_from_gemsr   install_packagesr   get_cfg_option_intrA   ra   )rN   r6   r   r   chef_versionr   r   r8   r8   r9   rt   .  s6   

	rt   c                 C   s&   d|  d|  g}| dkr| d |S )Nzruby%sz
ruby%s-devr   )zlibopenssl-ruby1.8zrubygems1.8)r   )r   pkgsr8   r8   r9   get_ruby_packagesO  s   
r   c              
   C   s   | t|  tjdstd|  d tjds#td|  d |r9tjdddd| dd	d
ddg	dd d S tjg ddd d S )N/usr/bin/gemz/usr/bin/gem%sz/usr/bin/rubyz/usr/bin/ruby%sinstallr'   z-v %s--no-ri	--no-rdoc--bindir/usr/bin-qFr   )r   r   r'   r   r   r   r   r   )r   r   r1   r2   existsr   sym_linkr   )r   r   r   r8   r8   r9   r   W  s.   


r   )NNN)9__doc__r[   rp   loggingr1   typingr   	cloudinitr   r   r   r   r   cloudinit.cloudr   cloudinit.configr	   cloudinit.config.schemar
   cloudinit.distrosr   cloudinit.settingsr   r   r   rZ   r]   r   r   r4   rm   r=   	frozensetrC   rg   r\   ro   r@   rl   rs   r   	getLogger__name__rA   r,   __annotations__r:   rK   rc   rY   r   ru   r   r   rt   r   r   r8   r8   r8   r9   <module>   s   


#R
!