reaper-man 0.1.8 → 0.1.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/README.md +1 -1
- 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 +13 -12
- 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 +46 -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 +50 -9
@@ -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,20 @@ 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
|
-
|
48
|
-
[
|
53
|
+
if fields["dependencies"]
|
54
|
+
fields["dependencies"] = fields["dependencies"].map do |dep|
|
55
|
+
[dep.name, dep.requirement.to_s.split(",").map(&:strip)]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
if fields["required_ruby_version"]
|
59
|
+
fields["required_ruby_version"] = fields["required_ruby_version"].
|
60
|
+
to_s.split(",").map(&:strip)
|
49
61
|
end
|
50
62
|
fields
|
51
63
|
end
|
@@ -58,22 +70,35 @@ module ReaperMan
|
|
58
70
|
# @return [Array<String>] package paths within package list contents
|
59
71
|
def inject_package(hash, info, package)
|
60
72
|
package_path = File.join(
|
61
|
-
|
73
|
+
"rubygems", "gems", "#{info["name"]}-#{info["version"]}.gem"
|
62
74
|
)
|
63
|
-
classification = info[
|
64
|
-
info[
|
75
|
+
classification = info["version"].prerelease? ? "prerelease" : "release"
|
76
|
+
info["version"] = info["version"].version
|
65
77
|
hash.deep_merge!(
|
66
|
-
|
78
|
+
"rubygem" => {
|
67
79
|
classification => {
|
68
|
-
info[
|
69
|
-
info[
|
70
|
-
}
|
71
|
-
}
|
72
|
-
}
|
80
|
+
info["name"] => {
|
81
|
+
info["version"].to_s => info.merge("package_path" => package_path),
|
82
|
+
},
|
83
|
+
},
|
84
|
+
},
|
73
85
|
)
|
74
86
|
package_path
|
75
87
|
end
|
76
88
|
|
89
|
+
# Clean data hash of empty values
|
90
|
+
#
|
91
|
+
# @param hash [Hash] package list information
|
92
|
+
# @return [Smash]
|
93
|
+
def clean(hash)
|
94
|
+
Smash[
|
95
|
+
hash.map { |k, v|
|
96
|
+
v = clean(v) if v.is_a?(Hash)
|
97
|
+
next if v.nil? || (v.respond_to?(:empty?) && v.empty?)
|
98
|
+
[k, v]
|
99
|
+
}
|
100
|
+
]
|
101
|
+
end
|
77
102
|
end
|
78
103
|
end
|
79
104
|
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
|