Class: PuppetForgeMirror

Inherits:
Object
  • Object
show all
Defined in:
lib/puppet-forge-mirror.rb

Overview

Mirror /v3 forges

Instance Method Summary collapse

Constructor Details

#initialize(forge_url, modules_dir) ⇒ PuppetForgeMirror

Returns a new instance of PuppetForgeMirror.



10
11
12
13
# File 'lib/puppet-forge-mirror.rb', line 10

def initialize(forge_url, modules_dir)
  @modules_dir = modules_dir
  @forge_url = forge_url
end

Instance Method Details

#download_module(url, mod, owner, filename, checksum) ⇒ Object

Download a specific module



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/puppet-forge-mirror.rb', line 32

def download_module(url, mod, owner, filename, checksum)
  module_dir = File.join(@modules_dir, owner, mod)
  filepath = File.join(module_dir, filename)

  FileUtils.mkdir_p module_dir unless File.exist? module_dir

  if File.exist? filepath
    return if Digest::MD5.file(filepath).hexdigest == checksum
  end

  puts "downloading #{url}"
  data = http_get(url)
  return if data.nil?
  open(filepath, 'wb') { |f| f.write(data) }
end

#download_modulesObject



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/puppet-forge-mirror.rb', line 48

def download_modules
  url = URI.join(@forge_url, '/v3/releases')
  while
    data = http_get(url)
    break if data.nil?

    r = JSON.parse(data)
    r['results'].each do |m|
      if m['file_size'] > 1024 * 1024 * 1
        puts "#{m['metadata']['name']} is too big, skipping"
        next
      end
      download_module(
        URI.join(@forge_url, m['file_uri']),
        m['module']['name'],
        m['module']['owner']['username'],
        m['file_uri'].split('/').last,
        m['file_md5']
      )
    end
    next_url = r['pagination']['next']
    break if next_url.nil?
    url = URI.join(@forge_url, next_url)
  end
end

#http_get(url) ⇒ Object

Perform http GET request, return response.body if status code is 200



16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/puppet-forge-mirror.rb', line 16

def http_get(url)
  uri = URI(url)

  Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
    request = Net::HTTP::Get.new uri
    response = http.request request

    if response.code != '200'
      puts "Error #{response.code}: Failed to get #{uri}"
      return nil
    end
    response.body
  end
end