class Puppet::Forge::ModuleRelease

Attributes

install_dir[R]
metadata[R]

Public Class Methods

new(source, data) click to toggle source
Calls superclass method
    # File lib/puppet/forge.rb
125 def initialize(source, data)
126   @data = data
127   @metadata = meta = data['metadata']
128 
129   name = meta['name'].tr('/', '-')
130   version = SemanticPuppet::Version.parse(meta['version'])
131   release = "#{name}@#{version}"
132 
133   if meta['dependencies']
134     dependencies = meta['dependencies'].collect do |dep|
135       begin
136         Puppet::ModuleTool::Metadata.new.add_dependency(dep['name'], dep['version_requirement'], dep['repository'])
137         Puppet::ModuleTool.parse_module_dependency(release, dep)[0..1]
138       rescue ArgumentError => e
139         raise ArgumentError, _("Malformed dependency: %{name}.") % { name: dep['name'] } +
140             ' ' + _("Exception was: %{detail}") % { detail: e }
141       end
142     end
143   else
144     dependencies = []
145   end
146 
147   super(source, name, version, Hash[dependencies])
148 end

Public Instance Methods

install(dir) click to toggle source
    # File lib/puppet/forge.rb
150 def install(dir)
151   staging_dir = self.prepare
152 
153   module_dir = dir + name[/-(.*)/, 1]
154   module_dir.rmtree if module_dir.exist?
155 
156   # Make sure unpacked module has the same ownership as the folder we are moving it into.
157   Puppet::ModuleTool::Applications::Unpacker.harmonize_ownership(dir, staging_dir)
158 
159   FileUtils.mv(staging_dir, module_dir)
160   @install_dir = dir
161 
162   # Return the Pathname object representing the directory where the
163   # module release archive was unpacked the to.
164   return module_dir
165 ensure
166   staging_dir.rmtree if staging_dir.exist?
167 end
prepare() click to toggle source
    # File lib/puppet/forge.rb
169 def prepare
170   return @unpacked_into if @unpacked_into
171 
172   Puppet.warning "#{@metadata['name']} has been deprecated by its author! View module on Puppet Forge for more info." if deprecated?
173 
174   download(@data['file_uri'], tmpfile)
175   checksum = @data['file_sha256']
176   if checksum
177     validate_checksum(tmpfile, checksum, Digest::SHA256)
178   else
179     checksum = @data['file_md5']
180     if checksum
181       validate_checksum(tmpfile, checksum, Digest::MD5)
182     else
183       raise _("Forge module is missing SHA256 and MD5 checksums")
184     end
185   end
186 
187   unpack(tmpfile, tmpdir)
188 
189   @unpacked_into = Pathname.new(tmpdir)
190 end

Private Instance Methods

deprecated?() click to toggle source
    # File lib/puppet/forge.rb
233 def deprecated?
234   @data['module'] && (@data['module']['deprecated_at'] != nil)
235 end
download(uri, destination) click to toggle source
    # File lib/puppet/forge.rb
207 def download(uri, destination)
208   response = @source.make_http_request(uri, destination)
209   destination.flush and destination.close
210   unless response.code == 200
211     raise Puppet::Forge::Errors::ResponseError.new(:uri => response.url, :response => response)
212   end
213 end
tmpdir() click to toggle source

Obtain a suitable temporary path for unpacking tarballs

@return [Pathname] path to temporary unpacking location

    # File lib/puppet/forge.rb
197 def tmpdir
198   @dir ||= Dir.mktmpdir(name, Puppet::Forge::Cache.base_path)
199 end
tmpfile() click to toggle source
    # File lib/puppet/forge.rb
201 def tmpfile
202   @file ||= Tempfile.new(name, Puppet::Forge::Cache.base_path).tap do |f|
203     f.binmode
204   end
205 end
unpack(file, destination) click to toggle source
    # File lib/puppet/forge.rb
225 def unpack(file, destination)
226   begin
227     Puppet::ModuleTool::Applications::Unpacker.unpack(file.path, destination)
228   rescue Puppet::ExecutionFailure => e
229     raise RuntimeError, _("Could not extract contents of module archive: %{message}") % { message: e.message }
230   end
231 end
validate_checksum(file, checksum, digest_class) click to toggle source
    # File lib/puppet/forge.rb
215 def validate_checksum(file, checksum, digest_class)
216   if Facter.value(:fips_enabled) && digest_class == Digest::MD5
217     raise _("Module install using MD5 is prohibited in FIPS mode.")
218   end
219 
220   if digest_class.file(file.path).hexdigest != checksum
221     raise RuntimeError, _("Downloaded release for %{name} did not match expected checksum %{checksum}") % { name: name, checksum: checksum }
222   end
223 end