Merge pull request #282 from laurenrother/security
[puppet-modules/puppetlabs-apt.git] / manifests / source.pp
1 # source.pp
2 # add an apt source
3
4 define apt::source(
5   $ensure            = present,
6   $location          = '',
7   $release           = 'UNDEF',
8   $repos             = 'main',
9   $include_src       = true,
10   $required_packages = false,
11   $key               = undef,
12   $key_server        = 'keyserver.ubuntu.com',
13   $key_content       = undef,
14   $key_source        = undef,
15   $pin               = false,
16   $architecture      = undef
17 ) {
18
19   include apt::params
20   include apt::update
21
22   $sources_list_d = $apt::params::sources_list_d
23   $provider       = $apt::params::provider
24
25   if $release == 'UNDEF' {
26     if $::lsbdistcodename == undef {
27       fail('lsbdistcodename fact not available: release parameter required')
28     } else {
29       $release_real = $::lsbdistcodename
30     }
31   } else {
32     $release_real = $release
33   }
34
35   file { "${name}.list":
36     ensure  => $ensure,
37     path    => "${sources_list_d}/${name}.list",
38     owner   => root,
39     group   => root,
40     mode    => '0644',
41     content => template("${module_name}/source.list.erb"),
42     notify  => Exec['apt_update'],
43   }
44
45
46   if ($pin != false) {
47     # Get the host portion out of the url so we can pin to origin
48     $url_split = split($location, '/')
49     $host      = $url_split[2]
50
51     apt::pin { $name:
52       ensure   => $ensure,
53       priority => $pin,
54       before   => File["${name}.list"],
55       origin   => $host,
56     }
57   }
58
59   if ($required_packages != false) and ($ensure == 'present') {
60     exec { "Required packages: '${required_packages}' for ${name}":
61       command     => "${provider} -y install ${required_packages}",
62       logoutput   => 'on_failure',
63       refreshonly => true,
64       tries       => 3,
65       try_sleep   => 1,
66       subscribe   => File["${name}.list"],
67       before      => Exec['apt_update'],
68     }
69   }
70
71   # We do not want to remove keys when the source is absent.
72   if $key and ($ensure == 'present') {
73     apt::key { "Add key: ${key} from Apt::Source ${title}":
74       ensure      => present,
75       key         => $key,
76       key_server  => $key_server,
77       key_content => $key_content,
78       key_source  => $key_source,
79       before      => File["${name}.list"],
80     }
81   }
82
83   # Need anchor to provide containment for dependencies.
84   anchor { "apt::source::${name}":
85     require => Class['apt::update'],
86   }
87 }