o
    w7e7                     @   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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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Z,d"gZ-e.e/Z0d#d$d%ed&e-ed'ge,d(gd)Z1ee2d*< ee1Z d+d, Z3d-d. Z4d/e5d0ed1ed2e6d3df
d4d5Z7d6d7 Z8d8ed2e6fd9d:Z9	dCd8efd;d<Z:d1efd=d>Z;d?d@ Z<dAdB Z=dS )Dz7Chef: module that configures, starts and installs chef.    N)dedent)subp
temp_utils	templater
url_helperutil)Cloud)Config)
MetaSchemaget_meta_doc)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/encrypted_data_bag_secret_defaultz/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allcc_chefChefz0module that configures, starts and installs chefa          This module enables chef to be installed (from packages,
        gems, or from omnibus). Before this occurs, chef configuration is
        written to disk (validation.pem, client.pem, firstboot.json,
        client.rb), and required directories are created (/etc/chef and
        /var/log/chef and so-on). If configured, chef will be
        installed and started in either daemon or non-daemon mode.
        If run in non-daemon mode, post run actions are executed to do
        finishing activities such as removing validation.pem.a  
        chef:
          directories:
            - /etc/chef
            - /var/log/chef
          validation_cert: system
          install_type: omnibus
          initial_attributes:
            apache:
              prefork:
                maxclients: 100
              keepalive: off
          run_list:
            - recipe[apache2]
            - role[db]
          encrypted_data_bag_secret: /etc/chef/encrypted_data_bag_secret
          environment: _default
          log_level: :auto
          omnibus_url_retries: 2
          server_url: https://chef.yourorg.com:4000
          ssl_verify_mode: :verify_peer
          validation_name: yourorg-validatorchef)idnametitledescriptiondistrosexamples	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 r?   :/usr/lib/python3/dist-packages/cloudinit/config/cc_chef.pypost_run_chef   s   rA   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!   r5   r"   r   r    r#   )generated_byr!   r"   r    r#   )CHEF_RB_TPL_DEFAULTScopyitemsCHEF_RB_TPL_KEYSLOGdebugCHEF_RB_TPL_BOOL_KEYSr   r7   get_cfg_option_strupdatemake_header)iidr=   paramskvr?   r?   r@   get_template_params   s.   
rQ   r,   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_pathr5   z7First boot path empty, not writing first boot json filerun_listinitial_attributesforce_installFexec),rG   rH   r   get_cfg_option_listlist	CHEF_DIRS	itertoolschainREQUIRED_CHEF_DIRS
ensure_dirgetr;   
write_filer8   r9   r:   warningget_template_filenamestr
datasourceget_instance_idrQ   setrE   CHEF_RB_TPL_PATH_KEYSadddirnameensure_dirsr   render_to_fileCHEF_RB_PATHrJ   CHEF_FB_PATHinfokeysjsondumpsr7   r   is_exeCHEF_EXEC_PATHinstall_chefrun_chefrA   )r,   rR   rS   rT   r=   	chef_dirsd	vkey_pathvcerttemplate_fnrM   rN   param_pathsrO   rP   fb_filenameinitial_jsonrZ   r[   	installedrunr?   r?   r@   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)rG   rH   rx   
isinstancer^   tupleextendrh   appendrf   typeCHEF_EXEC_DEF_ARGSr   )r=   cmdcmd_argsr?   r?   r@   rz     s   


rz   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  )moderT   Nr?   )rD   popr   tempdirget_tmp_exec_pathr8   r9   joininsertr   re   r   )blobr   rT   kwargsr   tmpdtmpfr?   r?   r@   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   rT   r   r   )OMNIBUS_URLOMNIBUS_URL_RETRIESr   readurlcontentsr   )r   r   r   omnibus_versionrT   contentr?   r?   r@   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
 |S |dkr[t |d}t| jt |dt |d|d |S t	
d| d}|S )Ninstall_typepackagesr\   Fr5   gemsversionruby_versionT)r*   omnibusr   omnibus_urlomnibus_url_retries)r   r   r   r   zUnknown chef install type '%s')r   rJ   r7   RUBY_VERSION_DEFAULTinstall_chef_from_gemsr   install_packagesr   get_cfg_option_intrG   rf   )rS   r=   r   r   chef_versionr   r   r?   r?   r@   ry   \  s6   

	ry   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   pkgsr?   r?   r@   get_ruby_packages}  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   r8   r9   existsr   sym_linkr   )r   r   r   r?   r?   r@   r     s.   


r   )NNN)>__doc__r`   ru   loggingr8   textwrapr   	cloudinitr   r   r   r   r   cloudinit.cloudr   cloudinit.configr	   cloudinit.config.schemar
   r   cloudinit.distrosr   cloudinit.settingsr   r   r   r_   rb   r   r   r;   CHEF_ENCRYPTED_DATA_BAG_PATHCHEF_ENVIRONMENTrr   rC   	frozensetrI   rl   ra   rt   rF   rq   rx   r   r1   r/   	getLogger__name__rG   r3   __annotations__rA   rQ   rh   r^   r   rz   r   r   ry   r   r   r?   r?   r?   r@   <module>   s   


.#R
!