o
    th4                     @   s  U 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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dZdZddd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!g e $ e"e#dddd d!Z%d"Z&d#Z'd$Z(e)e*Z+d%d&ged'gd(Z,ee-d)< d*d+ Z.d,d- Z/d.d/ Z0d0e1d1ed2ed3e2d4df
d5d6Z3d7d8 Z4d9ed3e2fd:d;Z5	dDd9efd<d=Z6d2efd>d?Z7d4ee1 fd@dAZ8dBdC Z9dS )Ez7Chef: 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/chef/cache/var/chef/backupz/var/run/chef)r   r   r   )z/var/cache/chefz/var/backups/chefz#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.pemz/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_chefg   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_paramso   s.   
rK   c               	   C   s   t  D ]A\} }tj| rEt| D ]1}tjtj||r-tdtj| || qtdtj| || t	
tj| || qqdS )zEMigrate legacy chef backup and cache directories to new config paths.z4Ignoring migration of %s. File already exists in %s.zMoving %s to %s.N)CHEF_DIR_MIGRATIONr?   r1   r2   existslistdirjoinrA   rB   shutilmove)old_dirmigrated_dirfilenamer8   r8   r9   migrate_chef_config_dirs   s$   rU   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"t
  |dt}|d}|rQ|dkrEt|| ntj|sQt d| tj|d	td
}	|d}
|
rt|j }t||}t }| D ]\}}|tv r|r|tj| qst| t |
|	| nt d|	 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}|rt+| 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.config_pathr.   zchef_client.rbz&No template found, not rendering to %sfirstboot_pathz7First 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_dirrU   getr4   
write_filer1   r2   r3   warningrD   CHEF_RB_PATHget_template_filenamestr
datasourceget_instance_idrK   setr?   CHEF_RB_TPL_PATH_KEYSadddirnameensure_dirsr   render_to_fileCHEF_FB_PATHinfokeysjsondumpsr0   r   is_exeCHEF_EXEC_PATHinstall_chefrun_chefr:   )rV   rW   rX   rY   r6   	chef_dirsd	vkey_pathvcertcfg_filenametemplate_fnrG   rH   param_pathsrI   rJ   fb_filenameinitial_jsonr`   ra   	installedrunr8   r8   r9   handle   s~   




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   r~   
isinstancerd   tupleextendro   appendrl   typeCHEF_EXEC_DEF_ARGSr   )r6   cmdcmd_argsr8   r8   r9   r      s   


r   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  )moderY   Nr8   )r>   popr   tempdirget_tmp_exec_pathr1   r2   rO   insertr   rk   r   )blobr   rY   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   rY   r   r   )OMNIBUS_URLOMNIBUS_URL_RETRIESr   readurlcontentsr   )r   r   r   omnibus_versionrY   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packagesrb   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   rl   )rX   r6   r   r   chef_versionr   r   r8   r8   r9   r   F  s6   

	r   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_packagesg  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   rM   r   sym_linkr   )r   r   r   r8   r8   r9   r   o  s.   


r   )NNN):__doc__rf   r{   loggingr1   rP   typingr   	cloudinitr   r   r   r   r   cloudinit.cloudr   cloudinit.configr	   cloudinit.config.schemar
   cloudinit.distrosr   cloudinit.settingsr   r   re   rh   rL   r   r   r4   rx   r=   	frozensetrC   rs   rz   r@   rm   r~   r   	getLogger__name__rA   r,   __annotations__r:   rK   rU   ro   rd   r   r   r   r   r   r   r   r8   r8   r8   r9   <module>   s   

#X
!