apt::source: pass the weak_ssl param to apt::key
[puppet-modules/puppetlabs-apt.git] / manifests / source.pp
1 # @summary Manages the Apt sources in /etc/apt/sources.list.d/.
2 #
3 # @example Install the puppetlabs apt source
4 #   apt::source { 'puppetlabs':
5 #     location => 'http://apt.puppetlabs.com',
6 #     repos    => 'main',
7 #     key      => {
8 #       id     => '6F6B15509CF8E59E6E469F327F438280EF8D349F',
9 #       server => 'keyserver.ubuntu.com',
10 #     },
11 #   }
12 #
13 # @param location
14 #   Required, unless ensure is set to 'absent'. Specifies an Apt repository. Valid options: a string containing a repository URL.
15 #
16 # @param comment
17 #   Supplies a comment for adding to the Apt source file.
18 #
19 # @param ensure
20 #   Specifies whether the Apt source file should exist. Valid options: 'present' and 'absent'.
21 #
22 # @param release
23 #   Specifies a distribution of the Apt repository.
24 #
25 # @param repos
26 #   Specifies a component of the Apt repository.
27 #
28 # @param include
29 #   Configures include options. Valid options: a hash of available keys.
30 #
31 # @option include [Boolean] :deb
32 #   Specifies whether to request the distribution's compiled binaries. Default true.
33 #
34 # @option include [Boolean] :src
35 #   Specifies whether to request the distribution's uncompiled source code. Default false.
36 #
37 # @param key
38 #   Creates a declaration of the apt::key defined type. Valid options: a string to be passed to the `id` parameter of the `apt::key`
39 #   defined type, or a hash of `parameter => value` pairs to be passed to `apt::key`'s `id`, `server`, `content`, `source`, `weak_ssl`,
40 #   and/or `options` parameters.
41 #
42 # @param pin
43 #   Creates a declaration of the apt::pin defined type. Valid options: a number or string to be passed to the `id` parameter of the
44 #   `apt::pin` defined type, or a hash of `parameter => value` pairs to be passed to `apt::pin`'s corresponding parameters.
45 #
46 # @param architecture
47 #   Tells Apt to only download information for specified architectures. Valid options: a string containing one or more architecture names,
48 #   separated by commas (e.g., 'i386' or 'i386,alpha,powerpc'). Default: undef (if unspecified, Apt downloads information for all architectures
49 #   defined in the Apt::Architectures option).
50 #
51 # @param allow_unsigned
52 #   Specifies whether to authenticate packages from this release, even if the Release file is not signed or the signature can't be checked.
53 #
54 # @param notify_update
55 #   Specifies whether to trigger an `apt-get update` run.
56 #
57 define apt::source(
58   Optional[String] $location                    = undef,
59   String $comment                               = $name,
60   String $ensure                                = present,
61   Optional[String] $release                     = undef,
62   String $repos                                 = 'main',
63   Optional[Variant[Hash]] $include              = {},
64   Optional[Variant[String, Hash]] $key          = undef,
65   Optional[Variant[Hash, Numeric, String]] $pin = undef,
66   Optional[String] $architecture                = undef,
67   Boolean $allow_unsigned                       = false,
68   Boolean $notify_update                        = true,
69 ) {
70
71   include ::apt
72
73   $_before = Apt::Setting["list-${title}"]
74
75   if !$release {
76     if $facts['os']['distro']['codename'] {
77       $_release = $facts['os']['distro']['codename']
78     } else {
79       fail('os.distro.codename fact not available: release parameter required')
80     }
81   } else {
82     $_release = $release
83   }
84
85   if $ensure == 'present' {
86     if ! $location {
87       fail('cannot create a source entry without specifying a location')
88     }
89     elsif ($::apt::proxy['https_acng']) and ($location =~ /(?i:^https:\/\/)/) {
90       $_location = regsubst($location, 'https://','http://HTTPS///')
91     }
92     else {
93       $_location = $location
94     }
95     # Newer oses, do not need the package for HTTPS transport.
96     $_transport_https_releases = [ 'wheezy', 'jessie', 'stretch', 'trusty', 'xenial' ]
97     if ($facts['os']['distro']['codename'] in $_transport_https_releases) and $_location =~ /(?i:^https:\/\/)/ {
98       ensure_packages('apt-transport-https')
99     }
100   } else {
101     $_location = undef
102   }
103
104   $includes = merge($::apt::include_defaults, $include)
105
106   if $key {
107     if $key =~ Hash {
108       unless $key['id'] {
109         fail('key hash must contain at least an id entry')
110       }
111       $_key = merge($::apt::source_key_defaults, $key)
112     } else {
113       $_key = { 'id' => assert_type(String[1], $key) }
114     }
115   }
116
117   $header = epp('apt/_header.epp')
118
119   $sourcelist = epp('apt/source.list.epp', {
120     'comment'          => $comment,
121     'includes'         => $includes,
122     'opt_architecture' => $architecture,
123     'allow_unsigned'   => $allow_unsigned,
124     'location'         => $_location,
125     'release'          => $_release,
126     'repos'            => $repos,
127   })
128
129   apt::setting { "list-${name}":
130     ensure        => $ensure,
131     content       => "${header}${sourcelist}",
132     notify_update => $notify_update,
133   }
134
135   if $pin {
136     if $pin =~ Hash {
137       $_pin = merge($pin, { 'ensure' => $ensure, 'before' => $_before })
138     } elsif ($pin =~ Numeric or $pin =~ String) {
139       $url_split = split($location, '[:\/]+')
140       $host      = $url_split[1]
141       $_pin = {
142         'ensure'   => $ensure,
143         'priority' => $pin,
144         'before'   => $_before,
145         'origin'   => $host,
146       }
147     } else {
148       fail('Received invalid value for pin parameter')
149     }
150     create_resources('apt::pin', { "${name}" => $_pin })
151   }
152
153   # We do not want to remove keys when the source is absent.
154   if $key and ($ensure == 'present') {
155     if $_key =~ Hash {
156       if $_key['ensure'] != undef {
157         $_ensure = $_key['ensure']
158       } else {
159         $_ensure = $ensure
160       }
161
162       apt::key { "Add key: ${$_key['id']} from Apt::Source ${title}":
163         ensure   => $_ensure,
164         id       => $_key['id'],
165         server   => $_key['server'],
166         content  => $_key['content'],
167         source   => $_key['source'],
168         options  => $_key['options'],
169         weak_ssl => $_key['weak_ssl'],
170         before   => $_before,
171       }
172     }
173   }
174 }