reaper-man 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/reaper-man.rb +10 -10
- data/lib/reaper-man/command.rb +4 -6
- data/lib/reaper-man/command/package.rb +3 -5
- data/lib/reaper-man/command/package/add.rb +1 -5
- data/lib/reaper-man/command/package/remove.rb +1 -5
- data/lib/reaper-man/command/repository.rb +2 -4
- data/lib/reaper-man/command/repository/generate.rb +3 -7
- data/lib/reaper-man/command/sign.rb +4 -6
- data/lib/reaper-man/error.rb +2 -3
- data/lib/reaper-man/generator.rb +15 -18
- data/lib/reaper-man/generator/apt.rb +23 -24
- data/lib/reaper-man/generator/rubygems.rb +9 -10
- data/lib/reaper-man/generator/yum.rb +92 -95
- data/lib/reaper-man/package_list.rb +17 -18
- data/lib/reaper-man/package_list/deb.rb +32 -34
- data/lib/reaper-man/package_list/gem.rb +44 -21
- data/lib/reaper-man/package_list/rpm.rb +43 -44
- data/lib/reaper-man/signer.rb +15 -18
- data/lib/reaper-man/signer/deb.rb +6 -7
- data/lib/reaper-man/signer/rpm.rb +6 -7
- data/lib/reaper-man/signer/rubygems.rb +1 -3
- data/lib/reaper-man/utils.rb +6 -10
- data/lib/reaper-man/utils/process.rb +19 -19
- data/lib/reaper-man/version.rb +1 -1
- data/reaper-man.gemspec +4 -1
- metadata +45 -3
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "reaper-man"
|
2
|
+
require "rubygems/package"
|
3
3
|
|
4
4
|
module ReaperMan
|
5
5
|
class PackageList
|
@@ -11,6 +11,10 @@ module ReaperMan
|
|
11
11
|
# @param conf [Hash]
|
12
12
|
# @param package [String] path to package
|
13
13
|
def add(hash, package)
|
14
|
+
if hash["rubygem"] && !hash.to_smash.get(:rubygem, :clean)
|
15
|
+
hash["rubygem"] = clean(hash["rubygem"])
|
16
|
+
hash["rubygem"]["clean"] = true
|
17
|
+
end
|
14
18
|
info = extract_fields(package)
|
15
19
|
filenames = inject_package(hash, info, package)
|
16
20
|
filenames
|
@@ -21,13 +25,13 @@ module ReaperMan
|
|
21
25
|
# @param conf [Hash] configuration hash
|
22
26
|
# @param package_name [String] name
|
23
27
|
# @param version [String]
|
24
|
-
def remove(hash, package_name, version, args={})
|
28
|
+
def remove(hash, package_name, version, args = {})
|
25
29
|
deleted = false
|
26
|
-
if
|
27
|
-
if
|
28
|
-
deleted = hash[
|
30
|
+
if hash["rubygems"][package_name]
|
31
|
+
if version
|
32
|
+
deleted = hash["rubygems"][package_name].delete(version)
|
29
33
|
else
|
30
|
-
deleted = hash[
|
34
|
+
deleted = hash["rubygems"].delete(package_name)
|
31
35
|
end
|
32
36
|
end
|
33
37
|
!!deleted
|
@@ -40,12 +44,18 @@ module ReaperMan
|
|
40
44
|
def extract_fields(package)
|
41
45
|
spec = ::Gem::Package.new(package).spec
|
42
46
|
fields = Smash[
|
43
|
-
spec.
|
44
|
-
|
45
|
-
|
47
|
+
spec.class.attribute_names.map do |var_name|
|
48
|
+
value = spec.send(var_name)
|
49
|
+
next if value.nil? || (value.respond_to?(:empty?) && value.empty?)
|
50
|
+
[var_name, value]
|
51
|
+
end.compact
|
46
52
|
]
|
47
|
-
fields[
|
48
|
-
[dep.name, dep.requirement.to_s.split(
|
53
|
+
fields["dependencies"] = fields["dependencies"].map do |dep|
|
54
|
+
[dep.name, dep.requirement.to_s.split(",").map(&:strip)]
|
55
|
+
end
|
56
|
+
if fields["required_ruby_version"]
|
57
|
+
fields["required_ruby_version"] = fields["required_ruby_version"].
|
58
|
+
to_s.split(",").map(&:strip)
|
49
59
|
end
|
50
60
|
fields
|
51
61
|
end
|
@@ -58,22 +68,35 @@ module ReaperMan
|
|
58
68
|
# @return [Array<String>] package paths within package list contents
|
59
69
|
def inject_package(hash, info, package)
|
60
70
|
package_path = File.join(
|
61
|
-
|
71
|
+
"rubygems", "gems", "#{info["name"]}-#{info["version"]}.gem"
|
62
72
|
)
|
63
|
-
classification = info[
|
64
|
-
info[
|
73
|
+
classification = info["version"].prerelease? ? "prerelease" : "release"
|
74
|
+
info["version"] = info["version"].version
|
65
75
|
hash.deep_merge!(
|
66
|
-
|
76
|
+
"rubygem" => {
|
67
77
|
classification => {
|
68
|
-
info[
|
69
|
-
info[
|
70
|
-
}
|
71
|
-
}
|
72
|
-
}
|
78
|
+
info["name"] => {
|
79
|
+
info["version"].to_s => info.merge("package_path" => package_path),
|
80
|
+
},
|
81
|
+
},
|
82
|
+
},
|
73
83
|
)
|
74
84
|
package_path
|
75
85
|
end
|
76
86
|
|
87
|
+
# Clean data hash of empty values
|
88
|
+
#
|
89
|
+
# @param hash [Hash] package list information
|
90
|
+
# @return [Smash]
|
91
|
+
def clean(hash)
|
92
|
+
Smash[
|
93
|
+
hash.map { |k, v|
|
94
|
+
v = clean(v) if v.is_a?(Hash)
|
95
|
+
next if v.nil? || (v.respond_to?(:empty?) && v.empty?)
|
96
|
+
[k, v]
|
97
|
+
}
|
98
|
+
]
|
99
|
+
end
|
77
100
|
end
|
78
101
|
end
|
79
102
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "reaper-man"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
4
|
class PackageList
|
@@ -20,11 +20,11 @@ module ReaperMan
|
|
20
20
|
attr_reader :package_bucket
|
21
21
|
|
22
22
|
# default package root prefix
|
23
|
-
DEFAULT_ROOT =
|
23
|
+
DEFAULT_ROOT = "pool"
|
24
24
|
# default namespace for packages
|
25
|
-
DEFAULT_BUCKET =
|
25
|
+
DEFAULT_BUCKET = "public"
|
26
26
|
# default architectures to define
|
27
|
-
DEFAULT_ALL_MAP = [
|
27
|
+
DEFAULT_ALL_MAP = ["amd64", "i386"]
|
28
28
|
|
29
29
|
# Create new instance
|
30
30
|
#
|
@@ -35,14 +35,14 @@ module ReaperMan
|
|
35
35
|
# @option args [String] :package_root
|
36
36
|
# @option args [String] :package_bucket
|
37
37
|
# @option args [Array<String>] :all_map
|
38
|
-
def initialize(args={})
|
38
|
+
def initialize(args = {})
|
39
39
|
@origin = args[:origin].to_s
|
40
40
|
@dist = args[:codename].to_s
|
41
41
|
@component = args[:component].to_s
|
42
42
|
@package_root = args.fetch(:package_root, DEFAULT_ROOT)
|
43
43
|
@package_bucket = args.fetch(:package_bucket, DEFAULT_BUCKET)
|
44
|
-
if
|
45
|
-
raise
|
44
|
+
if dist.empty? || component.empty?
|
45
|
+
raise "Both `codename` and `component` must contain valid values"
|
46
46
|
end
|
47
47
|
@all_map = args.fetch(:all_map, DEFAULT_ALL_MAP)
|
48
48
|
end
|
@@ -63,14 +63,14 @@ module ReaperMan
|
|
63
63
|
# @param conf [Hash] configuration hash
|
64
64
|
# @param package_name [String] name
|
65
65
|
# @param version [String]
|
66
|
-
def remove(hash, package_name, version, args={})
|
66
|
+
def remove(hash, package_name, version, args = {})
|
67
67
|
hash = hash.to_smash
|
68
68
|
arch = [args.fetch(:arch, all_map)].flatten.compact
|
69
69
|
deleted = false
|
70
70
|
arch.each do |arch_name|
|
71
71
|
arch_name = "binary-#{arch_name}"
|
72
|
-
if
|
73
|
-
if
|
72
|
+
if hash.get(:yum, origin, dist, :components, component, arch_name, package_name)
|
73
|
+
if version
|
74
74
|
deleted = hash[:yum][origin][dist][:components][component][arch_name][package_name].delete(version)
|
75
75
|
else
|
76
76
|
deleted = hash[:yum][origin][dist][:components][component][arch_name].delete(package_name)
|
@@ -85,9 +85,9 @@ module ReaperMan
|
|
85
85
|
# @param package [String] path to package
|
86
86
|
# @return [Hash]
|
87
87
|
def extract_fields(package)
|
88
|
-
fields = shellout(
|
88
|
+
fields = shellout("rpm --querytags").stdout.split("\n").map do |line|
|
89
89
|
line.strip!
|
90
|
-
unless
|
90
|
+
unless line.empty? || line.start_with?("HEADER")
|
91
91
|
line
|
92
92
|
end
|
93
93
|
end.compact
|
@@ -97,18 +97,18 @@ module ReaperMan
|
|
97
97
|
end.flatten.join("\n")
|
98
98
|
|
99
99
|
cmd = "rpm -q -p #{package} --queryformat 'output:\n#{fmt}'"
|
100
|
-
result = shellout(cmd).stdout.sub(/.*output:/,
|
100
|
+
result = shellout(cmd).stdout.sub(/.*output:/, "")
|
101
101
|
|
102
102
|
data = Smash.new
|
103
103
|
key = nil
|
104
104
|
result.split("\n").each do |item|
|
105
105
|
item.strip!
|
106
106
|
next if item.empty?
|
107
|
-
if
|
108
|
-
key = item.tr(
|
107
|
+
if item.start_with?("[") && item.end_with?("]")
|
108
|
+
key = item.tr("[]", "")
|
109
109
|
else
|
110
|
-
if
|
111
|
-
if
|
110
|
+
if data[key]
|
111
|
+
if !data[key].is_a?(Array)
|
112
112
|
data[key] = [data[key]]
|
113
113
|
end
|
114
114
|
data[key] << item
|
@@ -117,7 +117,7 @@ module ReaperMan
|
|
117
117
|
end
|
118
118
|
end
|
119
119
|
end
|
120
|
-
data[:generated_sha] = checksum(File.open(package,
|
120
|
+
data[:generated_sha] = checksum(File.open(package, "r"), :sha1)
|
121
121
|
data[:generated_size] = File.size(package)
|
122
122
|
data[:generated_header] = extract_header_information(package)
|
123
123
|
data
|
@@ -130,31 +130,31 @@ module ReaperMan
|
|
130
130
|
# @param package [String] path to package file
|
131
131
|
# @return [Array<String>] package paths within package list contents
|
132
132
|
def inject_package(hash, info, package)
|
133
|
-
arch = info[
|
134
|
-
arch = arch ==
|
133
|
+
arch = info["ARCH"]
|
134
|
+
arch = arch == "all" ? all_map : [arch]
|
135
135
|
arch.map do |arch|
|
136
136
|
package_file_name = File.join(
|
137
137
|
package_root, package_bucket, origin,
|
138
138
|
dist, component, File.basename(package)
|
139
139
|
)
|
140
140
|
hash.deep_merge!(
|
141
|
-
|
141
|
+
"yum" => {
|
142
142
|
origin => {
|
143
143
|
dist => {
|
144
|
-
|
144
|
+
"components" => {
|
145
145
|
component => {
|
146
146
|
arch => {
|
147
|
-
info[
|
148
|
-
info[
|
149
|
-
}
|
150
|
-
}
|
151
|
-
}
|
152
|
-
}
|
153
|
-
}
|
154
|
-
}
|
155
|
-
}
|
147
|
+
info["NAME"] => {
|
148
|
+
info["NEVR"] => info.merge(:generated_path => package_file_name),
|
149
|
+
},
|
150
|
+
},
|
151
|
+
},
|
152
|
+
},
|
153
|
+
},
|
154
|
+
},
|
155
|
+
},
|
156
156
|
)
|
157
|
-
File.join(
|
157
|
+
File.join("yum", origin, package_file_name)
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
@@ -163,11 +163,11 @@ module ReaperMan
|
|
163
163
|
# @param package [String] path to package file
|
164
164
|
# @return [Hash] checksums
|
165
165
|
def generate_checksums(package)
|
166
|
-
File.open(package,
|
166
|
+
File.open(package, "r") do |pkg|
|
167
167
|
{
|
168
|
-
|
169
|
-
|
170
|
-
|
168
|
+
"MD5sum" => checksum(pkg.rewind && pkg, :md5),
|
169
|
+
"SHA1" => checksum(pkg.rewind && pkg, :sha1),
|
170
|
+
"SHA256" => checksum(pkg.rewind && pkg, :sha256),
|
171
171
|
}
|
172
172
|
end
|
173
173
|
end
|
@@ -179,15 +179,15 @@ module ReaperMan
|
|
179
179
|
# @return [Smash<start,end>]
|
180
180
|
# @note ported from: http://yum.baseurl.org/gitweb?p=yum.git;a=blob;f=yum/packages.py;h=eebeb9dfd264b887b054187276cea12ced3a0bc2;hb=HEAD#l2212
|
181
181
|
def extract_header_information(package)
|
182
|
-
io = File.open(package,
|
182
|
+
io = File.open(package, "rb")
|
183
183
|
|
184
184
|
# read past lead and 8 bytes of signature header
|
185
185
|
io.seek(104)
|
186
186
|
binindex = io.read(4)
|
187
|
-
sigindex, _ = binindex.unpack(
|
187
|
+
sigindex, _ = binindex.unpack("I>")
|
188
188
|
|
189
189
|
bindata = io.read(4)
|
190
|
-
sigdata, _ = bindata.unpack(
|
190
|
+
sigdata, _ = bindata.unpack("I>")
|
191
191
|
|
192
192
|
# seeked in to 112 bytes
|
193
193
|
|
@@ -199,7 +199,7 @@ module ReaperMan
|
|
199
199
|
# Round to next 8 byte boundary
|
200
200
|
|
201
201
|
disttoboundary = (sigsize % 8)
|
202
|
-
unless
|
202
|
+
unless disttoboundary == 0
|
203
203
|
disttoboundary = 8 - disttoboundary
|
204
204
|
end
|
205
205
|
|
@@ -216,9 +216,9 @@ module ReaperMan
|
|
216
216
|
|
217
217
|
binindex = io.read(4)
|
218
218
|
|
219
|
-
hdrindex, _ = binindex.unpack(
|
219
|
+
hdrindex, _ = binindex.unpack("I>")
|
220
220
|
bindata = io.read(4)
|
221
|
-
hdrdata, _ = bindata.unpack(
|
221
|
+
hdrdata, _ = bindata.unpack("I>")
|
222
222
|
|
223
223
|
# each index is 4 32bit segments - so each is 16 bytes
|
224
224
|
|
@@ -235,10 +235,9 @@ module ReaperMan
|
|
235
235
|
|
236
236
|
Smash.new(
|
237
237
|
:start => hdrstart,
|
238
|
-
:end => hdrend
|
238
|
+
:end => hdrend,
|
239
239
|
)
|
240
240
|
end
|
241
|
-
|
242
241
|
end
|
243
242
|
end
|
244
243
|
end
|
data/lib/reaper-man/signer.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
|
-
require
|
1
|
+
require "reaper-man"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
4
|
# File signer
|
5
5
|
class Signer
|
6
|
-
|
7
|
-
autoload :
|
8
|
-
autoload :
|
9
|
-
autoload :Rubygems, 'reaper-man/signer/rubygems'
|
6
|
+
autoload :Rpm, "reaper-man/signer/rpm"
|
7
|
+
autoload :Deb, "reaper-man/signer/deb"
|
8
|
+
autoload :Rubygems, "reaper-man/signer/rubygems"
|
10
9
|
|
11
10
|
include Utils::Process
|
12
11
|
|
@@ -19,7 +18,7 @@ module ReaperMan
|
|
19
18
|
# command to use for file signing
|
20
19
|
HELPER_COMMAND = File.join(
|
21
20
|
File.expand_path(File.dirname(__FILE__)),
|
22
|
-
|
21
|
+
"util-scripts/auto-helper"
|
23
22
|
)
|
24
23
|
|
25
24
|
# Create new instance
|
@@ -30,12 +29,12 @@ module ReaperMan
|
|
30
29
|
# @option args [String] :signing_type (defaults to 'origin')
|
31
30
|
# @option args [String] :key_password (defaults to `ENV['REAPER_KEY_PASSWORD']`)
|
32
31
|
# @option args [String] :package_system
|
33
|
-
def initialize(args={})
|
32
|
+
def initialize(args = {})
|
34
33
|
args = args.to_smash
|
35
34
|
@key_id = args[:signing_key]
|
36
35
|
@sign_chunk_size = args.fetch(:signing_chunk_size, 1)
|
37
|
-
@sign_type = args.fetch(:signing_type,
|
38
|
-
@key_password = args.fetch(:key_password, ENV[
|
36
|
+
@sign_type = args.fetch(:signing_type, "origin")
|
37
|
+
@key_password = args.fetch(:key_password, ENV["REAPER_KEY_PASSWORD"])
|
39
38
|
@package_system = args[:package_system]
|
40
39
|
case package_system.to_sym
|
41
40
|
when :deb, :apt
|
@@ -54,24 +53,22 @@ module ReaperMan
|
|
54
53
|
# @param src [String] path to source file
|
55
54
|
# @param dst [String] path for destination file
|
56
55
|
# @return [String] destination file path
|
57
|
-
def file(src, dst=nil, sign_opts=nil)
|
58
|
-
opts = sign_opts ? [sign_opts].flatten.compact : [
|
59
|
-
dst ||= src.sub(/#{Regexp.escape(File.extname(src))}$/,
|
56
|
+
def file(src, dst = nil, sign_opts = nil)
|
57
|
+
opts = sign_opts ? [sign_opts].flatten.compact : ["--detach-sign", "--armor"]
|
58
|
+
dst ||= src.sub(/#{Regexp.escape(File.extname(src))}$/, ".gpg")
|
60
59
|
opts << "--output '#{dst}'"
|
61
|
-
cmd = (["gpg --default-key #{key_id}"] + opts + [src]).join(
|
62
|
-
if
|
60
|
+
cmd = (["gpg --default-key #{key_id}"] + opts + [src]).join(" ")
|
61
|
+
if key_password
|
63
62
|
shellout(
|
64
63
|
"#{HELPER_COMMAND} #{cmd}",
|
65
64
|
:environment => {
|
66
|
-
|
67
|
-
}
|
65
|
+
"REAPER_KEY_PASSWORD" => key_password,
|
66
|
+
},
|
68
67
|
)
|
69
68
|
else
|
70
69
|
shellout(cmd)
|
71
70
|
end
|
72
71
|
dst
|
73
72
|
end
|
74
|
-
|
75
73
|
end
|
76
|
-
|
77
74
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "reaper-man"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
4
|
class Signer
|
@@ -12,13 +12,13 @@ module ReaperMan
|
|
12
12
|
def package(*pkgs)
|
13
13
|
pkgs = valid_packages(*pkgs)
|
14
14
|
pkgs.each_slice(sign_chunk_size) do |pkgs|
|
15
|
-
cmd = %(debsigs --sign="#{sign_type}" --default-key="#{key_id}" #{pkgs.join(
|
16
|
-
if
|
15
|
+
cmd = %(debsigs --sign="#{sign_type}" --default-key="#{key_id}" #{pkgs.join(" ")})
|
16
|
+
if key_password
|
17
17
|
shellout(
|
18
18
|
"#{Signer::HELPER_COMMAND} #{cmd}",
|
19
19
|
:environment => {
|
20
|
-
|
21
|
-
}
|
20
|
+
"REAPER_KEY_PASSWORD" => key_password,
|
21
|
+
},
|
22
22
|
)
|
23
23
|
else
|
24
24
|
shellout(cmd)
|
@@ -33,10 +33,9 @@ module ReaperMan
|
|
33
33
|
# @return [Array<String>]
|
34
34
|
def valid_packages(*pkgs)
|
35
35
|
pkgs.find_all do |pkg|
|
36
|
-
File.extname(pkg) ==
|
36
|
+
File.extname(pkg) == ".deb"
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
40
39
|
end
|
41
40
|
end
|
42
41
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "reaper-man"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
4
|
class Signer
|
@@ -12,13 +12,13 @@ module ReaperMan
|
|
12
12
|
def package(*pkgs)
|
13
13
|
pkgs = valid_packages(*pkgs)
|
14
14
|
pkgs.each_slice(sign_chunk_size) do |pkgs|
|
15
|
-
cmd = %(rpmsign --resign --key-id="#{key_id}" #{pkgs.join(
|
16
|
-
if
|
15
|
+
cmd = %(rpmsign --resign --key-id="#{key_id}" #{pkgs.join(" ")})
|
16
|
+
if key_password
|
17
17
|
shellout(
|
18
18
|
"#{Signer::HELPER_COMMAND} #{cmd}",
|
19
19
|
:environment => {
|
20
|
-
|
21
|
-
}
|
20
|
+
"REAPER_KEY_PASSWORD" => key_password,
|
21
|
+
},
|
22
22
|
)
|
23
23
|
else
|
24
24
|
shellout(cmd)
|
@@ -33,10 +33,9 @@ module ReaperMan
|
|
33
33
|
# @return [Array<String>]
|
34
34
|
def valid_packages(*pkgs)
|
35
35
|
pkgs.find_all do |pkg|
|
36
|
-
File.extname(pkg) ==
|
36
|
+
File.extname(pkg) == ".rpm"
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
40
39
|
end
|
41
40
|
end
|
42
41
|
end
|