Module: ReaperMan::Generator::Apt

Defined in:
lib/reaper-man/generator/apt.rb

Overview

Generator methods for apt

Instance Method Summary collapse

Instance Method Details

#generate!Object

Generate the repository



9
10
11
# File 'lib/reaper-man/generator/apt.rb', line 9

def generate!
  generate_dists(package_config[:apt])
end

#generate_dists(pkg_hash) ⇒ TrueClass

Generate the repository dists

Parameters:

  • pkg_hash (Hash)

    repository description

Returns:

  • (TrueClass)


17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/reaper-man/generator/apt.rb', line 17

def generate_dists(pkg_hash)
  pkg_hash.each do |origin_name, dists|
    dists.each do |dist_name, dist_args|
      dist_args[:components].each do |component_name, arches|
        arches.each do |arch_name, packages|
          package_file(origin_name, dist_name, component_name, arch_name, packages)
          release_headers = Smash.new
          release_headers["Label"] = dist_args["label"]
          release_headers["Archive"] = dist_name
          sign_file_if_setup do
            release_file(origin_name, dist_name, component_name, arch_name, release_headers)
          end
        end
      end
      release_headers = Smash[
        %w(Codename Suite Label Description Version).map do |field_name|
          if val = dist_args[field_name.downcase]
            [field_name, val]
          end
        end.compact
      ]
      release_headers["Components"] = dist_args[:components].keys.join(" ")
      signed = sign_file_if_setup("--clearsign") do
        release_file(origin_name, dist_name, release_headers)
      end
      if File.exists?("#{signed}.gpg")
        FileUtils.mv(
          "#{signed}.gpg",
          File.join(File.dirname(signed), "InRelease")
        )
      end
      sign_file_if_setup do
        release_file(origin_name, dist_name, release_headers)
      end
    end
  end
  true
end

#package_file(*args) ⇒ String

Create Packages file

Parameters:

  • args (String)

    argument list for file path

Returns:

  • (String)

    path to compressed Packages file



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/reaper-man/generator/apt.rb', line 72

def package_file(*args)
  pkgs = args.pop
  args.insert(1, "dists")
  create_file(*args.push("Packages")) do |file|
    pkgs.each do |pkg_name, pkgs|
      pkgs.each do |pkg_version, pkg_meta|
        pkg_meta.each do |field_name, field_value|
          if field_value
            file.puts "#{field_name}: #{field_value}"
          end
        end
        file.puts
      end
    end
  end
  compress_file(*args)
end

#release_file(*args) ⇒ TrueClass

Create Release file

Parameters:

  • args (String)

    argument list for file path

Returns:

  • (TrueClass)


94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/reaper-man/generator/apt.rb', line 94

def release_file(*args)
  header = args.detect { |a| a.is_a?(Hash) }
  header ? args.delete(header) : header = Smash.new
  header.merge(Smash[%w(Origin Codename Component Architecture).zip(args)])
  header["Date"] = Time.now.utc.strftime("%a, %d %b %Y %H:%M:%S %Z")
  args.insert(1, "dists")
  create_file(*args.dup.push("Release")) do |file|
    contents = Dir.glob(File.join(File.dirname(file.path), "**", "*"))
    header_content = header.map do |key, value|
      next unless value
      "#{key.to_s.capitalize}: #{value}"
    end.compact.join("\n")
    file.puts header_content
    [["MD5Sum", :md5], ["SHA1", :sha1], ["SHA256", :sha256]].each do |field, digest|
      file.puts "#{field}:"
      contents.each do |content|
        next if File.expand_path(content) == File.expand_path(file.path) || File.directory?(content)
        File.open(content, "r") do |content_file|
          line = [" "]
          line << checksum(content_file, digest)
          line << content_file.size
          line << content_file.path.sub(File.dirname(file.path), "").sub(/^\//, "")
          file.puts line.join(" ")
        end
      end
    end
    true
  end
end

#sign_file_if_setup(opts = nil) { ... } ⇒ String

Sign file if configured for signing

Yields:

  • block returning file path

Returns:

  • (String)

    file path



60
61
62
63
64
65
66
# File 'lib/reaper-man/generator/apt.rb', line 60

def sign_file_if_setup(opts = nil)
  path = yield
  if signer && options[:sign]
    signer.file(path, nil, opts)
  end
  path
end