467f568af4a74ff475fb2ed77da0e2c31298dc16
[puppet-modules/puppetlabs-apt.git] / lib / puppet / type / apt_key.rb
1 require 'pathname'
2 require 'puppet/parameter/boolean'
3
4 Puppet::Type.newtype(:apt_key) do
5   @doc = <<-MANIFEST
6     @summary This type provides Puppet with the capabilities to manage GPG keys needed
7       by apt to perform package validation. Apt has it's own GPG keyring that can
8       be manipulated through the `apt-key` command.
9
10     @example Basic usage
11       apt_key { '6F6B15509CF8E59E6E469F327F438280EF8D349F':
12         source => 'http://apt.puppetlabs.com/pubkey.gpg'
13       }
14
15     **Autorequires**
16
17     If Puppet is given the location of a key file which looks like an absolute
18     path this type will autorequire that file.
19
20     @api private
21   MANIFEST
22
23   ensurable
24
25   validate do
26     if self[:refresh] == true && self[:ensure] == :absent
27       raise(_('ensure => absent and refresh => true are mutually exclusive'))
28     end
29     if self[:content] && self[:source]
30       raise(_('The properties content and source are mutually exclusive.'))
31     end
32     if self[:id].length < 40
33       warning(_('The id should be a full fingerprint (40 characters), see README.'))
34     end
35   end
36
37   newparam(:id, namevar: true) do
38     desc 'The ID of the key you want to manage.'
39     # GPG key ID's should be either 32-bit (short) or 64-bit (long) key ID's
40     # and may start with the optional 0x, or they can be 40-digit key fingerprints
41     newvalues(%r{\A(0x)?[0-9a-fA-F]{8}\Z}, %r{\A(0x)?[0-9a-fA-F]{16}\Z}, %r{\A(0x)?[0-9a-fA-F]{40}\Z})
42     munge do |value|
43       id = if value.start_with?('0x')
44              value.partition('0x').last.upcase
45            else
46              value.upcase
47            end
48       id
49     end
50   end
51
52   newparam(:content) do
53     desc 'The content of, or string representing, a GPG key.'
54   end
55
56   newparam(:source) do
57     desc 'Location of a GPG key file, /path/to/file, ftp://, http:// or https://'
58     newvalues(%r{\Ahttps?://}, %r{\Aftp://}, %r{\A/\w+})
59   end
60
61   autorequire(:file) do
62     if self[:source] && Pathname.new(self[:source]).absolute?
63       self[:source]
64     end
65   end
66
67   newparam(:server) do
68     desc 'The key server to fetch the key from based on the ID. It can either be a domain name or url.'
69     defaultto :'keyserver.ubuntu.com'
70
71     newvalues(%r{\A((hkp|hkps|http|https)://)?([a-z\d])([a-z\d-]{0,61}\.)+[a-z\d]+(:\d{2,5})?$})
72   end
73
74   newparam(:options) do
75     desc 'Additional options to pass to apt-key\'s --keyserver-options.'
76   end
77
78   newparam(:refresh, boolean: true, parent: Puppet::Parameter::Boolean) do
79     desc 'When true, recreate an existing expired key'
80     defaultto false
81   end
82
83   newproperty(:fingerprint) do
84     desc <<-MANIFEST
85       The 40-digit hexadecimal fingerprint of the specified GPG key.
86
87       This property is read-only.
88     MANIFEST
89   end
90
91   newproperty(:long) do
92     desc <<-MANIFEST
93       The 16-digit hexadecimal id of the specified GPG key.
94
95       This property is read-only.
96     MANIFEST
97   end
98
99   newproperty(:short) do
100     desc <<-MANIFEST
101       The 8-digit hexadecimal id of the specified GPG key.
102
103       This property is read-only.
104     MANIFEST
105   end
106
107   newproperty(:expired) do
108     desc <<-MANIFEST
109       Indicates if the key has expired.
110
111       This property is read-only.
112     MANIFEST
113   end
114
115   newproperty(:expiry) do
116     desc <<-MANIFEST
117       The date the key will expire, or nil if it has no expiry date.
118
119       This property is read-only.
120     MANIFEST
121   end
122
123   newproperty(:size) do
124     desc <<-MANIFEST
125       The key size, usually a multiple of 1024.
126
127       This property is read-only.
128     MANIFEST
129   end
130
131   newproperty(:type) do
132     desc <<-MANIFEST
133       The key type, one of: rsa, dsa, ecc, ecdsa
134
135       This property is read-only.
136     MANIFEST
137   end
138
139   newproperty(:created) do
140     desc <<-MANIFEST
141       Date the key was created.
142
143       This property is read-only.
144     MANIFEST
145   end
146 end