o
    x[h¾4  ã                   @   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¡}
|
r”t|j ¡ ƒ}t||ƒ}tƒ }| ¡ D ]\}}|tv r†|r†| tj |¡¡ qst |¡ t  |
|	|¡ nt  d|	¡ tj|dt!d
�}|sªt  "d¡ n,i }d|v r¶|d |d< d|v rÍ|d }t| #¡ ƒD ]}|| ||< qÄt |t$ %|¡¡ tj&|ddd
�}t' (t)¡}|rç|rít*||ƒ}n|røt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ÿ
ÿ!