Merge pull request #628 from cpavanrun/master
[puppet-modules/puppetlabs-apt.git] / manifests / source.pp
1 # source.pp
2 # add an apt source
3 define apt::source(
4   $location          = undef,
5   $comment           = $name,
6   $ensure            = present,
7   $release           = undef,
8   $repos             = 'main',
9   $include           = {},
10   $key               = undef,
11   $pin               = undef,
12   $architecture      = undef,
13   $allow_unsigned    = false,
14   $include_src       = undef,
15   $include_deb       = undef,
16   $required_packages = undef,
17   $key_server        = undef,
18   $key_content       = undef,
19   $key_source        = undef,
20   $trusted_source    = undef,
21   $notify_update     = true,
22 ) {
23   validate_string($architecture, $comment, $location, $repos)
24   validate_bool($allow_unsigned)
25   validate_hash($include)
26
27   # This is needed for compat with 1.8.x
28   include ::apt
29
30   $_before = Apt::Setting["list-${title}"]
31
32   if $include_src != undef {
33     warning("\$include_src is deprecated and will be removed in the next major release, please use \$include => { 'src' => ${include_src} } instead")
34   }
35
36   if $include_deb != undef {
37     warning("\$include_deb is deprecated and will be removed in the next major release, please use \$include => { 'deb' => ${include_deb} } instead")
38   }
39
40   if $required_packages != undef {
41     warning('$required_packages is deprecated and will be removed in the next major release, please use package resources instead.')
42     exec { "Required packages: '${required_packages}' for ${name}":
43       command     => "${::apt::params::provider} -y install ${required_packages}",
44       logoutput   => 'on_failure',
45       refreshonly => true,
46       tries       => 3,
47       try_sleep   => 1,
48       before      => $_before,
49     }
50   }
51
52   if $key_server != undef {
53     warning("\$key_server is deprecated and will be removed in the next major release, please use \$key => { 'server' => ${key_server} } instead.")
54   }
55
56   if $key_content != undef {
57     warning("\$key_content is deprecated and will be removed in the next major release, please use \$key => { 'content' => ${key_content} } instead.")
58   }
59
60   if $key_source != undef {
61     warning("\$key_source is deprecated and will be removed in the next major release, please use \$key => { 'source' => ${key_source} } instead.")
62   }
63
64   if $trusted_source != undef {
65     warning('$trusted_source is deprecated and will be removed in the next major release, please use $allow_unsigned instead.')
66     $_allow_unsigned = $trusted_source
67   } else {
68     $_allow_unsigned = $allow_unsigned
69   }
70
71   if ! $release {
72     $_release = $::apt::params::xfacts['lsbdistcodename']
73     unless $_release {
74       fail('lsbdistcodename fact not available: release parameter required')
75     }
76   } else {
77     $_release = $release
78   }
79
80   if $ensure == 'present' and ! $location {
81     fail('cannot create a source entry without specifying a location')
82   }
83
84   if $include_src != undef and $include_deb != undef {
85     $_deprecated_include = {
86       'src' => $include_src,
87       'deb' => $include_deb,
88     }
89   } elsif $include_src != undef {
90     $_deprecated_include = { 'src' => $include_src }
91   } elsif $include_deb != undef {
92     $_deprecated_include = { 'deb' => $include_deb }
93   } else {
94     $_deprecated_include = {}
95   }
96
97   $_include = merge($::apt::params::include_defaults, $_deprecated_include, $include)
98
99   $_deprecated_key = {
100     'key_server'  => $key_server,
101     'key_content' => $key_content,
102     'key_source'  => $key_source,
103   }
104
105   if $key {
106     if is_hash($key) {
107       unless $key['id'] {
108         fail('key hash must contain at least an id entry')
109       }
110       $_key = merge($::apt::params::source_key_defaults, $_deprecated_key, $key)
111     } else {
112       validate_string($key)
113       $_key = merge( { 'id' => $key }, $_deprecated_key)
114     }
115   }
116
117   apt::setting { "list-${name}":
118     ensure        => $ensure,
119     content       => template('apt/_header.erb', 'apt/source.list.erb'),
120     notify_update => $notify_update,
121   }
122
123   if $pin {
124     if is_hash($pin) {
125       $_pin = merge($pin, { 'ensure' => $ensure, 'before' => $_before })
126     } elsif (is_numeric($pin) or is_string($pin)) {
127       $url_split = split($location, '/')
128       $host      = $url_split[2]
129       $_pin = {
130         'ensure'   => $ensure,
131         'priority' => $pin,
132         'before'   => $_before,
133         'origin'   => $host,
134       }
135     } else {
136       fail('Received invalid value for pin parameter')
137     }
138     create_resources('apt::pin', { "${name}" => $_pin })
139   }
140
141   # We do not want to remove keys when the source is absent.
142   if $key and ($ensure == 'present') {
143     if is_hash($_key) {
144       apt::key { "Add key: ${$_key['id']} from Apt::Source ${title}":
145         ensure      => present,
146         id          => $_key['id'],
147         server      => $_key['server'],
148         content     => $_key['content'],
149         source      => $_key['source'],
150         options     => $_key['options'],
151         key_server  => $_key['key_server'],
152         key_content => $_key['key_content'],
153         key_source  => $_key['key_source'],
154         before      => $_before,
155       }
156     }
157   }
158 }