o
    w7e6                  
   @   sR  U d Z ddlZddlZddl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 e!e"Z#G dd dZ$dede%fddZ&dd Z'edddfd efd!d"Z(d#e%d$eded%e)d&df
d'd(Z*dS ))z+Puppet: Install, configure and start puppet    N)StringIO)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.
	cc_puppet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titledescriptiondistros	frequencyexamples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 )Ncertszca.pem)	conf_pathssl_dirospathjoinssl_cert_dirssl_cert_pathcsr_attributes_path)selfpuppet_conf_filepuppet_ssl_dirr&    r*   </usr/lib/python3/dist-packages/cloudinit/config/cc_puppet.py__init__r   s
   
zPuppetConstants.__init__N)__name__
__module____qualname__r,   r*   r*   r*   r+   r   q   s    r   cloudactionc              	   C   s`   d}t D ]}z| j|| d |}W  n
 tjy   Y qw |s.td|dt  dS 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distromanage_servicer   ProcessExecutionErrorLOGwarningr#   )r0   r1   service_managedpuppet_namer*   r*   r+   _manage_puppet_services   s    r<   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_binsettingout_r*   r*   r+   get_config_value   s   rD   Tr5   c           	      C   s   g }|dur
d|g}|dur|d|g7 }|r|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  d   S 1 sPw   Y  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   )urlretriesT)dir	needs_exezpuppet-installi  )modeFcapture)r   readurlcontentsr   tempdirget_tmp_exec_pathr!   r"   r#   r   
write_filer   )	r5   rF   version
collectioncleanupargscontenttmpdtmpfr*   r*   r+   install_puppet_aio   s    
$rY   r   cfgrU   returnc              	   C   s  d|vrt 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rVd}d}d}nd}d}d }t|d|}|sm|rmt d n\|rt d|rv|nd| |dkr|d u rtD ]}z|j	||f |}W  n
 t
jy   Y qw |st ddt n|j	||f n|dkrt|j||||	 nt d| d}
t|dt|d}t|dt|d}t|dt|d}t|||}d |v rt|j}t }d!d" | D }d#|}|jt||jd$ |d   D ]t\}}|d%krPt|jd& t|j|d t|j t|j|d t|j| t|j|d n*| D ]%\}}|d'krq|d(t  }|d)|! }|" }|#||| qTt$|jd*|j  t|j|%  qd|v rt|j&t'j(|d dd+ |rt)|d, |
rt d- |d.g}d/|v r|d/ }t*|t+t,fr|-| n!t*|t.r|-|/  nt d0t0| |-t1 n|-t1 t
j
|dd1 |rt)|d2 d S d S )3Nr   z9Skipping module named %s, no 'puppet' configuration foundinstallTrR   rS   install_typepackagesrT   execF)defaultstart_serviceaio_install_url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 %slatestz+No installable puppet package in any of: %sr3   z Unknown puppet install type '%s'	conf_filer=   r    ssldirr&   csr_attributesconfc                 S   s   g | ]}|  qS r*   )lstrip).0ir*   r*   r+   
<listcomp>  s    zhandle.<locals>.<listcomp>
)sourceca_certi  certnamez%fz%iz%s.old)default_flow_styleenablezRunning puppet-agentagent	exec_argszOUnknown type %s provided for puppet 'exec_args' expected list, tuple, or stringrK   start)2r8   debugr   get_cfg_option_boolget_cfg_option_strAIO_INSTALL_URLr9   r4   r5   install_packagesr   r7   r#   rY   rD   r   	load_filer   r   DefaultingConfigParser
splitlines	read_filer   items
ensure_dirr    chownbynamer$   rQ   r%   replacesocketgetfqdnget_instance_idlowersetrename	stringifyr&   yamldumpr<   
isinstancelisttupleextendstrsplittypePUPPET_AGENT_DEFAULT_ARGS)r   rZ   r0   rU   
puppet_cfgr\   rR   rS   r]   rT   runstart_puppetdrb   puppet_userr@   puppet_packagere   r;   rg   r    r&   p_constantsrN   puppet_configcleaned_linescleaned_contentscfg_nameovcmdcmd_argsr*   r*   r+   handle   s  










r   )+__doc__loggingr!   r   ior   textwrapr   r   	cloudinitr   r   r   r   r   cloudinit.cloudr	   cloudinit.configr
   cloudinit.config.schemar   r   cloudinit.distrosr   r   cloudinit.settingsr   r{   r   r4   MODULE_DESCRIPTIONr   __annotations__	getLoggerr-   r8   r   r   r<   rD   rY   r   r   r*   r*   r*   r+   <module>   sZ   )3=

"$