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