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