U
    Ad6                  	   @   sD  U d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	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mZ ddlmZ dZdgZdZdZdddeegeededgdgdZ ee!d< ee Z G dd dZ"ee#dddZ$dd Z%edddfed d!d"Z&e#eeee'dd#d$d%Z(dS )&z+Puppet: Install, configure and start puppet    N)StringIO)Logger)dedent)helperssubp
temp_utils
url_helperutil)Cloud)Config)
MetaSchemaget_meta_doc)ALL_DISTROSDistro)PER_INSTANCEzKhttps://raw.githubusercontent.com/puppetlabs/install-puppet/main/install.shz--test)puppet-agentpuppeta>  This module handles puppet installation and configuration. If the ``puppet``
key does not exist in global configuration, no action will be taken. If a
config entry for ``puppet`` is present, then by default the latest version of
puppet will be installed. If the ``puppet`` config key exists in the config
archive, this module will attempt to start puppet even if no installation was
performed.

The module also provides keys for configuring the new puppet 4 paths and
installing the puppet package from the puppetlabs repositories:
https://docs.puppet.com/puppet/4.2/reference/whered_it_go.html
The keys are ``package_name``, ``conf_file``, ``ssl_dir`` and
``csr_attributes_path``. If unset, their values will default to
ones that work with puppet 3.x and with distributions that ship modified
puppet 4.x that uses the old paths.
Z	cc_puppetZPuppetz#Install, configure and start puppeta`              puppet:
                install: true
                version: "7.7.0"
                install_type: "aio"
                collection: "puppet7"
                aio_install_url: 'https://git.io/JBhoQ'
                cleanup: true
                conf_file: "/etc/puppet/puppet.conf"
                ssl_dir: "/var/lib/puppet/ssl"
                csr_attributes_path: "/etc/puppet/csr_attributes.yaml"
                exec: true
                exec_args: ['--test']
                conf:
                    agent:
                        server: "puppetserver.example.org"
                        certname: "%i.%f"
                    ca_cert: |
                        -----BEGIN CERTIFICATE-----
                        MIICCTCCAXKgAwIBAgIBATANBgkqhkiG9w0BAQUFADANMQswCQYDVQQDDAJjYTAe
                        Fw0xMDAyMTUxNzI5MjFaFw0xNTAyMTQxNzI5MjFaMA0xCzAJBgNVBAMMAmNhMIGf
                        MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCu7Q40sm47/E1Pf+r8AYb/V/FWGPgc
                        b014OmNoX7dgCxTDvps/h8Vw555PdAFsW5+QhsGr31IJNI3kSYprFQcYf7A8tNWu
                        1MASW2CfaEiOEi9F1R3R4Qlz4ix+iNoHiUDTjazw/tZwEdxaQXQVLwgTGRwVa+aA
                        qbutJKi93MILLwIDAQABo3kwdzA4BglghkgBhvhCAQ0EKxYpUHVwcGV0IFJ1Ynkv
                        T3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwDwYDVR0TAQH/BAUwAwEB/zAd
                        BgNVHQ4EFgQUu4+jHB+GYE5Vxo+ol1OAhevspjAwCwYDVR0PBAQDAgEGMA0GCSqG
                        SIb3DQEBBQUAA4GBAH/rxlUIjwNb3n7TXJcDJ6MMHUlwjr03BDJXKb34Ulndkpaf
                        +GAlzPXWa7bO908M9I8RnPfvtKnteLbvgTK+h+zX1XCty+S2EQWk29i2AdoqOTxb
                        hppiGMp0tT5Havu4aceCXiy2crVcudj3NFciy8X66SoECemW9UYDCb9T5D0d
                        -----END CERTIFICATE-----
                csr_attributes:
                    custom_attributes:
                        1.2.840.113549.1.9.7: 342thbjkt82094y0uthhor289jnqthpc2290
                    extension_requests:
                        pp_uuid: ED803750-E3C7-44F5-BB08-41A04433FE2E
                        pp_image_name: my_ami_image
                        pp_preshared_key: 342thbjkt82094y0uthhor289jnqthpc2290
            z            puppet:
                install_type: "packages"
                package_name: "puppet"
                exec: false
            r   )idnametitleZdescriptionZdistrosZ	frequencyZexamplesZactivate_by_schema_keysmetac                   @   s   e Zd Zdd ZdS )PuppetConstantsc                 C   s8   || _ || _tj|d| _tj| jd| _|| _d S )NZcertszca.pem)	conf_pathssl_dirospathjoinssl_cert_dirssl_cert_pathcsr_attributes_path)selfZpuppet_conf_fileZpuppet_ssl_dirr   log r"   </usr/lib/python3/dist-packages/cloudinit/config/cc_puppet.py__init__p   s
    zPuppetConstants.__init__N)__name__
__module____qualname__r$   r"   r"   r"   r#   r   o   s   r   )cloudactionc              	   C   sd   d}t D ]>}z"|j|| d |}W  qHW q tjk
rD   Y qX q|s`| d|dt  dS )z8Attempts to perform action on one of the puppet services z.servicez0Could not '%s' any of the following services: %s, N)PUPPET_PACKAGE_NAMESdistroZmanage_servicer   ProcessExecutionErrorwarningr   )r!   r(   r)   Zservice_managedpuppet_namer"   r"   r#   _manage_puppet_servicesz   s    
r1   c                 C   s   t  | dd|g\}}| S )zGet the config value for a given setting using `puppet config print`
    :param puppet_bin: path to puppet binary
    :param setting: setting to query
    configprint)r   rstrip)
puppet_binZsettingout_r"   r"   r#   get_config_value   s    r8   T)r-   c           	   
   C   s   g }|dk	rd|g}|dk	r(|d|g7 }|r6|dg7 }t j|ddj}tj|  dd@}tj|d	}t	j
||d
d tj|g| ddW  5 Q R  S Q R X dS )a  Install puppet-agent from the puppetlabs repositories using the one-shot
    shell script

    :param distro: Instance of Distro
    :param url: URL from where to download the install script
    :param version: version to install, blank defaults to latest
    :param collection: collection to install, blank defaults to latest
    :param cleanup: whether to purge the puppetlabs repo after installation
    Nz-vz-cz	--cleanup   )urlZretriesT)dirZ	needs_exezpuppet-installi  )modeFZcapture)r   Zreadurlcontentsr   ZtempdirZget_tmp_exec_pathr   r   r   r	   
write_filer   )	r-   r:   version
collectioncleanupargsZcontentZtmpdZtmpfr"   r"   r#   install_puppet_aio   s     
 rD   )r   cfgr(   r!   rC   returnc               	   C   s  d|kr| d|  d S |d }t|dd}t|dd }t|dd }t|dd}	t|d	d}
tj|d
dd}tj|ddd}tj|dtd}|	dkrd}d}d}nd}d}d }t|d|}|s|r|d n|r| d|r|nd|	 |	dkr||d krjtD ]@}z |j||f |}W  qPW n t	j
k
rJ   Y nX q|sz|ddt n|j||f n.|	dkrt|j||||
 n|d|	 d}t|dt|d}t|dt|d}t|dt|d}t||||}d |kr8t|j}t }d!d" | D }d#|}|jt||jd$ |d   D ]\}}|d%krt|jd& t|j|d t|j t|j|d t|j| t|j|d nT| D ]J\}}|d'kr|d(t }|d)|  }|! }|"||| qt#|jd*|j  t|j|$  qNd|kr^t|j%t&j'|d dd+ |rpt(||d, |r| d- |d.g}d/|kr|d/ }t)|t*t+fr|,| n6t)|t-r|,|.  n|d0t/| |,t0 n
|,t0 t	j	|dd1 |rt(||d2 d S )3Nr   z9Skipping module named %s, no 'puppet' configuration foundinstallTr@   rA   install_typeZpackagesrB   execF)defaultZstart_serviceaio_install_urlZaiorootz/opt/puppetlabs/bin/puppetr   package_namez@Puppet install set to false but version supplied, doing nothing.z'Attempting to install puppet %s from %sZlatestz+No installable puppet package in any of: %sr+   z Unknown puppet install type '%s'	conf_filer2   r   Zssldirr   Zcsr_attributesconfc                 S   s   g | ]}|  qS r"   )lstrip).0ir"   r"   r#   
<listcomp>  s     zhandle.<locals>.<listcomp>
)sourceZca_certi  Zcertnamez%fz%iz%s.old)Zdefault_flow_styleenablezRunning puppet-agentZagentZ	exec_argszOUnknown type %s provided for puppet 'exec_args' expected list, tuple, or stringr=   start)1debugr	   Zget_cfg_option_boolZget_cfg_option_strAIO_INSTALL_URLr/   r,   r-   Zinstall_packagesr   r.   r   rD   r8   r   Z	load_filer   r   ZDefaultingConfigParser
splitlinesZ	read_filer   itemsZ
ensure_dirr   Zchownbynamer   r?   r   replacesocketZgetfqdnZget_instance_idlowersetrenameZ	stringifyr   yamldumpr1   
isinstancelisttupleextendstrsplittypePUPPET_AGENT_DEFAULT_ARGS) r   rE   r(   r!   rC   Z
puppet_cfgrG   r@   rA   rH   rB   runZstart_puppetdrK   Zpuppet_userr5   Zpuppet_packagerM   r0   rN   r   r   Zp_constantsr>   Zpuppet_configZcleaned_linesZcleaned_contentsZcfg_nameovcmdZcmd_argsr"   r"   r#   handle   s&            




        

 
  
 



ro   ))__doc__r   r]   ior   Zloggingr   textwrapr   ra   Z	cloudinitr   r   r   r   r	   Zcloudinit.cloudr
   Zcloudinit.configr   Zcloudinit.config.schemar   r   Zcloudinit.distrosr   r   Zcloudinit.settingsr   rY   rj   r,   ZMODULE_DESCRIPTIONr   __annotations__r   rg   r1   r8   rD   rd   ro   r"   r"   r"   r#   <module>	   sb   )3=%    