(#12823) Add apt::key defined type and modify apt::source to use it
[puppet-modules/puppetlabs-apt.git] / manifests / key.pp
1 define apt::key (
2   $key = $title,
3   $ensure = present,
4   $key_content = false,
5   $key_source = false,
6   $key_server = "keyserver.ubuntu.com"
7 ) {
8
9   include apt::params
10
11   if $key_content {
12     $method = "content"
13   } elsif $key_source {
14     $method = "source"
15   } elsif $key_server {
16     $method = "server"
17   }
18
19   # This is a hash of the parts of the key definition that we care about.
20   # It is used as a unique identifier for this instance of apt::key. It gets
21   # hashed to ensure that the resource name doesn't end up being pages and
22   # pages (e.g. in the situation where key_content is specified).
23   $digest = sha1("${key}/${key_content}/${key_source}/${key_server}/")
24
25   # Allow multiple ensure => present for the same key to account for many
26   # apt::source resources that all reference the same key.
27   case $ensure {
28     present: {
29       if defined(Exec["apt::key $key absent"]) {
30         fail ("Cannot ensure Apt::Key[$key] present; $key already ensured absent")
31       } elsif !defined(Exec["apt::key $key present"]) {
32         # this is a marker to ensure we don't simultaneously define a key
33         # ensure => absent AND ensure => present
34         exec { "apt::key $key present":
35           path   => "/",
36           onlyif => "/bin/false",
37           noop   => true;
38         }
39       }
40       if !defined(Exec[$digest]) {
41         exec { $digest:
42           path    => "/bin:/usr/bin",
43           unless  => "/usr/bin/apt-key list | /bin/grep '${key}'",
44           command => $method ? {
45             "content" => "echo '${key_content}' | /usr/bin/apt-key add -",
46             "source"  => "wget -q '${key_source}' -O- | apt-key add -",
47             "server"  => "apt-key adv --keyserver '${key_server}' --recv-keys '${key}'",
48           };
49         }
50       }
51     }
52     absent: {
53       if defined(Exec["apt::key $key present"]) {
54         fail ("Cannot ensure Apt::Key[$key] absent; $key already ensured present")
55       }
56       exec { "apt::key $key absent":
57         path    => "/bin:/usr/bin",
58         onlyif  => "apt-key list | grep '$key'",
59         command => "apt-key del '$key'",
60         user    => "root",
61         group   => "root",
62       }
63     }
64     default: {
65       fail "Invalid 'ensure' value '$ensure' for aptkey"
66     }
67   }
68 }