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

Public Instance Methods

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

Private Instance Methods

deprecated?() click to toggle source
    # File lib/puppet/forge.rb
234 def deprecated?
235   @data['module'] && (@data['module']['deprecated_at'] != nil)
236 end
download(uri, destination) click to toggle source
    # File lib/puppet/forge.rb
208 def download(uri, destination)
209   response = @source.make_http_request(uri, destination)
210   destination.flush and destination.close
211   unless response.code == 200
212     raise Puppet::Forge::Errors::ResponseError.new(:uri => response.url, :response => response)
213   end
214 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
198 def tmpdir
199   @dir ||= Dir.mktmpdir(name, Puppet::Forge::Cache.base_path)
200 end
tmpfile() click to toggle source
    # File lib/puppet/forge.rb
202 def tmpfile
203   @file ||= Tempfile.new(name, Puppet::Forge::Cache.base_path).tap do |f|
204     f.binmode
205   end
206 end
unpack(file, destination) click to toggle source
    # File lib/puppet/forge.rb
226 def unpack(file, destination)
227   begin
228     Puppet::ModuleTool::Applications::Unpacker.unpack(file.path, destination)
229   rescue Puppet::ExecutionFailure => e
230     raise RuntimeError, _("Could not extract contents of module archive: %{message}") % { message: e.message }
231   end
232 end
validate_checksum(file, checksum, digest_class) click to toggle source
    # File lib/puppet/forge.rb
216 def validate_checksum(file, checksum, digest_class)
217   if Puppet.runtime[:facter].value(:fips_enabled) && digest_class == Digest::MD5
218     raise _("Module install using MD5 is prohibited in FIPS mode.")
219   end
220 
221   if digest_class.file(file.path).hexdigest != checksum
222     raise RuntimeError, _("Downloaded release for %{name} did not match expected checksum %{checksum}") % { name: name, checksum: checksum }
223   end
224 end