mprm 0.9.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f52e3b7d9d1d577ec71b4586c8662444c8bdc480
4
+ data.tar.gz: 2d9eb4be9a2e97efe3e5498ec6033763bb3677d4
5
+ SHA512:
6
+ metadata.gz: 7c8389587a9d105b8cccf6d8f679e27658c805d207471542ffab4b897b5b22a150de32feff41e38c6b8b875c7a58b5c01ff2d02b2e7dfda7fe3c61d4760d9eb6
7
+ data.tar.gz: ba89fb38852568b28012f0272cae23a1ca74ee7032ce7bda50b34d4eae88ca2af8f561ecda7e3986e81b4c10048ddb1eb9a83a004cd8173ce25745716aea4207
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'clamp'
4
+ require 'mprm'
5
+
6
+ class Main < Clamp::Command
7
+ option ["-v", "--version"], :flag, "Version information"
8
+ option ["-t", "--type"], "TYPE", "Type of repo to create"
9
+ option ["-p", "--path"], "PATH", "Path to repo location"
10
+ option ["-r", "--release"], "RELEASE", "OS version to create"
11
+ option ["-a", "--arch"], "ARCH", "Architecture of repo contents"
12
+ option ["-c", "--component"], "COMPONENT", "Component to create [DEB ONLY]"
13
+ option ["-l", "--label"], "LABEL", "Label for generated repository [DEB ONLY]"
14
+ option ["-o", "--origin"], "ORIGIN", "Origin for generated repository [DEB ONLY]"
15
+ option ["--nocache"], :flag, "Don't cache md5 sums [DEB ONLY]"
16
+ option ["-d", "--directory"], "DIRECTORY", "Move packages from directory to target", :default => false
17
+ option ["-e", "--recent"], :flag, "Snapshot the most recent unique packages", :default => false
18
+ option ["-k", "--gpg"], "GPG KEY", "Sign release files with this GPG key", :default => false
19
+ option ["-x", "--gpg_passphrase"], "GPG PASSPHRASE", "Passphrase for GPG key", :default => false
20
+ option ["-n", "--gpg_sign_algorithm"], "GPG SIGN ALGORITHM", "Digest algorithm to use for signing (e.g SHA1, SHA512, etc)", :default => "sha256"
21
+
22
+ def execute
23
+ if version?
24
+ puts "MPRM version: #{MPRM::VERSION}"
25
+ exit
26
+ end
27
+
28
+ unless type && path && release && arch
29
+ puts "Type, Path, Release and Arch are required arguments"
30
+ exit
31
+ end
32
+
33
+ if recent? && !snapshot
34
+ raise "--snapshot is required for --recent"
35
+ end
36
+
37
+ if type == "deb" && !component
38
+ raise "--deb option required for the --component option!"
39
+ end
40
+
41
+ r = MPRM::Repo.new
42
+ r.release = release
43
+ r.arch = arch
44
+ r.type = type
45
+ r.path = path
46
+ r.label = label
47
+ r.origin = origin
48
+ unless upload.nil?
49
+ r.upload = upload
50
+ end
51
+ unless gpg.nil?
52
+ r.gpg = gpg
53
+ r.gpg_passphrase = gpg_passphrase
54
+ r.gpg_sign_algorithm = gpg_sign_algorithm
55
+ end
56
+ unless accesskey.nil?
57
+ r.accesskey = accesskey
58
+ end
59
+ unless secretkey.nil?
60
+ r.secretkey = secretkey
61
+ end
62
+ unless snapshot.nil?
63
+ r.snapshot = snapshot
64
+ end
65
+ unless component.nil?
66
+ r.component = component
67
+ end
68
+ if recent?
69
+ r.recent = recent?
70
+ end
71
+ unless directory.nil?
72
+ r.directory = directory
73
+ end
74
+ if nocache?
75
+ r.nocache = nocache?
76
+ end
77
+
78
+ r.create
79
+ end
80
+ end
81
+
82
+ Main.run
@@ -0,0 +1,13 @@
1
+ require 'logger'
2
+
3
+ module MPRM
4
+ class << self
5
+ attr_accessor :logger
6
+ end
7
+
8
+ self.logger = Logger.new(STDOUT)
9
+ self.logger.level = Logger::DEBUG
10
+ end
11
+
12
+ require 'mprm/version'
13
+ require 'mprm/repo'
@@ -0,0 +1,218 @@
1
+ require 'fileutils'
2
+ require 'zlib'
3
+ require 'erb'
4
+ require 'digest/md5'
5
+ require 'digest/sha1'
6
+ require 'digest/sha2'
7
+ require 'parallel'
8
+ require 'time'
9
+ require 'thread'
10
+
11
+ module Debian
12
+ def build_apt_repo(path, component, arch, release, label, origin, gpg, nocache)
13
+ release.each { |r|
14
+ component.each { |c|
15
+ arch.each { |a|
16
+ fpath = path + "/dists/" + r + "/" + c + "/" + "binary-" + a + "/"
17
+ pfpath = fpath + "Packages"
18
+ rfpath = fpath + "Release"
19
+
20
+ MPRM.logger.debug "Building Path: #{fpath}"
21
+
22
+ FileUtils.mkpath(fpath)
23
+ FileUtils.touch(pfpath)
24
+ FileUtils.touch(rfpath)
25
+ generate_packages_gz(fpath,pfpath,path,rfpath,r,c,a)
26
+ }
27
+ }
28
+ generate_release(path,r,component,arch,label,origin)
29
+
30
+ unless gpg == false
31
+ generate_release_gpg(path,r, gpg)
32
+ end
33
+ }
34
+ end
35
+
36
+ def move_apt_packages(path,component,arch,release,directory)
37
+ unless File.exist?(directory)
38
+ MPRM.logger.debug "ERROR: #{directory} doesn't exist... not doing anything\n"
39
+ return false
40
+ end
41
+
42
+ files_moved = []
43
+ release.each { |r|
44
+ component.each { |c|
45
+ arch.each { |a|
46
+ Dir.glob(directory + "/*.deb") do |file|
47
+ MPRM.logger.debug file
48
+ if file =~ /^.*#{a}.*\.deb$/i || file =~ /^.*all.*\.deb$/i || file =~ /^.*any.*\.deb$/i
49
+ if file =~ /^.*#{r}.*\.deb$/i
50
+ # Lets do this here to help mitigate packages like "asdf-123+wheezy.deb"
51
+ FileUtils.cp(file, "#{path}/dists/#{r}/#{c}/binary-#{a}/")
52
+ FileUtils.rm(file)
53
+ else
54
+ FileUtils.cp(file, "#{path}/dists/#{r}/#{c}/binary-#{a}/")
55
+ files_moved << file
56
+ end
57
+ end
58
+ end
59
+ }
60
+ }
61
+ }
62
+
63
+ files_moved.each do |f|
64
+ if File.exist?(f)
65
+ FileUtils.rm(f)
66
+ end
67
+ end
68
+ # Regex?
69
+ #/^.*#{arch}.*\.deb$/i
70
+ end
71
+
72
+ def generate_packages_gz(fpath,pfpath,path,rfpath,r,c,a)
73
+ MPRM.logger.debug "Generating Packages: #{r} : #{c} : binary-#{a}"
74
+
75
+ npath = "dists/" + r + "/" + c + "/" + "binary-" + a + "/"
76
+
77
+ d = File.open(pfpath, "w+")
78
+ write_mutex = Mutex.new
79
+
80
+ Parallel.each(Dir.glob("#{fpath}*.deb"), in_threads: 5) do |deb|
81
+ algs = {
82
+ 'md5' => Digest::MD5.new,
83
+ 'sha1' => Digest::SHA1.new,
84
+ 'sha256' => Digest::SHA256.new
85
+ }
86
+ sums = {
87
+ 'md5' => '',
88
+ 'sha1' => '',
89
+ 'sha256' => ''
90
+ }
91
+ tdeb = File.basename(deb)
92
+ init_size = File.size(deb)
93
+ deb_contents = nil
94
+
95
+ FileUtils.mkdir_p "tmp/#{tdeb}/"
96
+ if not nocache
97
+ sums.keys.each do |s|
98
+ sum_path = "#{path}/dists/#{r}/#{c}/binary-#{a}/#{s}-results/#{tdeb}"
99
+ FileUtils.mkdir_p File.dirname(sum_path)
100
+
101
+ if File.exist?(sum_path)
102
+ stored_sum = File.read(sum_path)
103
+ sum = stored_sum unless nocache.nil?
104
+ end
105
+
106
+ unless sum
107
+ deb_contents ||= File.read(deb)
108
+ sum = algs[s].hexdigest(deb_contents)
109
+ end
110
+
111
+ sums[s] = sum
112
+ if nocache.nil?
113
+ File.open(sum_path, 'w') { |f| f.write(sum) }
114
+ elsif sum != stored_sum
115
+ MPRM.logger.debug "WARN: #{s}sum mismatch on #{deb}\n"
116
+ end
117
+ end
118
+ end
119
+ `ar p #{deb} control.tar.gz | tar zx -C tmp/#{tdeb}/`
120
+
121
+ package_info = [
122
+ "Filename: #{npath}#{s3_compatible_encode(tdeb)}",
123
+ "MD5: #{sums['md5']}",
124
+ "SHA1: #{sums['sha1']}",
125
+ "SHA256: #{sums['sha256']}",
126
+ "Size: #{init_size}"
127
+ ]
128
+
129
+ write_mutex.synchronize do
130
+ # Copy the control file data into the Packages list
131
+ d.write(File.read("tmp/#{tdeb}/control").gsub!(/\n+/, "\n"))
132
+ d.write(package_info.join("\n"))
133
+ d.write("\n\n") # blank line between package info in the Packages file
134
+ end
135
+ end
136
+
137
+ FileUtils.rmtree 'tmp/'
138
+
139
+ d.close
140
+
141
+ Zlib::GzipWriter.open(pfpath + ".gz") do |gz|
142
+ f = File.new(pfpath, "r")
143
+ f.each do |line|
144
+ gz.write(line)
145
+ end
146
+ end
147
+ end
148
+
149
+ def generate_release(path,release,component,arch,label,origin)
150
+ date = Time.now.utc
151
+
152
+ release_info = {}
153
+ unreasonable_array = ["Packages", "Packages.gz", "Release"]
154
+ component_ar = []
155
+ Dir.glob(path + "/dists/" + release + "/*").select { |f|
156
+ f.slice!(path + "/dists/" + release + "/")
157
+ unless f == "Release" or f == "Release.gpg"
158
+ component_ar << f
159
+ end
160
+ }
161
+
162
+ component_ar.each do |c|
163
+ arch.each do |ar|
164
+ unreasonable_array.each do |unr|
165
+ tmp_path = "#{path}/dists/#{release}/#{c}/binary-#{ar}"
166
+ tmp_hash = {}
167
+ filename = "#{c}/binary-#{ar}/#{unr}".chomp
168
+
169
+ byte_size = File.size("#{tmp_path}/#{unr}").to_s
170
+ file_contents = File.read("#{tmp_path}/#{unr}")
171
+
172
+ tmp_hash['size'] = byte_size
173
+ tmp_hash['md5'] = Digest::MD5.hexdigest(file_contents)
174
+ tmp_hash['sha1'] = Digest::SHA1.hexdigest(file_contents)
175
+ tmp_hash['sha256'] = Digest::SHA256.hexdigest(file_contents)
176
+ release_info[filename] = tmp_hash
177
+ end
178
+ end
179
+ end
180
+
181
+
182
+ template_dir = File.join(File.dirname(__FILE__), "..", "..", "templates")
183
+ erb = ERB.new(File.read("#{template_dir}/deb_release.erb"), nil, "-").result(binding)
184
+
185
+ File.open("#{path}/dists/#{release}/Release.tmp","wb") do |x|
186
+ x.puts erb
187
+ end
188
+
189
+ FileUtils.move("#{path}/dists/#{release}/Release.tmp", "#{path}/dists/#{release}/Release")
190
+ end
191
+
192
+ # We expect that GPG is installed and a key has already been made
193
+ def generate_release_gpg(path,release,gpg)
194
+ Dir.chdir("#{path}/dists/#{release}") do
195
+ if gpg_sign_algorithm.nil?
196
+ sign_algorithm = "none"
197
+ else
198
+ sign_algorithm = gpg_sign_algorithm
199
+ end
200
+
201
+ if gpg.nil?
202
+ sign_cmd = "gpg --digest-algo \"#{sign_algorithm}\" --yes --output Release.gpg -b Release"
203
+ elsif !gpg_passphrase.nil?
204
+ sign_cmd = "echo \'#{gpg_passphrase}\' | gpg --digest-algo \"#{sign_algorithm}\" -u #{gpg} --passphrase-fd 0 --yes --output Release.gpg -b Release"
205
+ else
206
+ sign_cmd = "gpg --digest-algo \"#{sign_algorithm}\" -u #{gpg} --yes --output Release.gpg -b Release"
207
+ end
208
+ MPRM.logger.debug "Exec: #{sign_cmd}"
209
+ MPRM.logger.debug `#{sign_cmd}`
210
+ end
211
+ end
212
+
213
+ def s3_compatible_encode(str)
214
+ str.gsub(/[#\$&'\(\)\*\+,\/:;=\?@\[\]]/) { |x| x.each_byte.map { |b| '%' + b.to_s(16) }.join }
215
+ end
216
+ end
217
+
218
+
@@ -0,0 +1,57 @@
1
+ require 'mprm/debian'
2
+ require 'mprm/rpm'
3
+
4
+ module MPRM
5
+ class Repo
6
+ include Debian
7
+ include Redhat
8
+
9
+ attr_accessor :path
10
+ attr_accessor :type
11
+ attr_accessor :component
12
+ attr_accessor :arch
13
+ attr_accessor :release
14
+ attr_accessor :label
15
+ attr_accessor :origin
16
+ attr_accessor :gpg
17
+ attr_accessor :gpg_passphrase
18
+ attr_accessor :gpg_sign_algorithm
19
+ attr_accessor :secretkey
20
+ attr_accessor :accesskey
21
+ attr_accessor :directory
22
+ attr_accessor :recent
23
+ attr_accessor :nocache
24
+
25
+ def create
26
+ if "#{@type}" == "deb"
27
+ parch,pcomponent,prelease = _parse_vars(arch,component,release)
28
+ if directory
29
+ build_apt_repo(path,pcomponent,parch,prelease,label,origin,gpg,nocache)
30
+ if move_apt_packages(path,pcomponent,parch,prelease,directory) == false
31
+ return
32
+ end
33
+ end
34
+ build_apt_repo(path,pcomponent,parch,prelease,label,origin,gpg,nocache)
35
+ elsif "#{@type}" == "rpm"
36
+ component = nil
37
+ parch,pcomponent,prelease = _parse_vars(arch,component,release)
38
+ if directory
39
+ build_rpm_repo(path,parch,prelease,gpg)
40
+ if move_rpm_packages(path,parch,prelease,directory) == false
41
+ return
42
+ end
43
+ end
44
+ build_rpm_repo(path,parch,prelease,gpg)
45
+ end
46
+ end
47
+
48
+ def _parse_vars(arch_ar,component_ar,release_ar)
49
+ arch_ar = arch.split(",")
50
+ if !component.nil?
51
+ component_ar = component.split(",")
52
+ end
53
+ release_ar = release.split(",")
54
+ [arch_ar,component_ar,release_ar]
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,301 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fileutils'
4
+ require 'parallel'
5
+ require 'digest'
6
+ require 'zlib'
7
+ require 'erb'
8
+
9
+ module Redhat
10
+ def build_rpm_repo(path,arch,release,gpg)
11
+ begin
12
+ require 'arr-pm'
13
+ rescue NameError, LoadError
14
+ MPRM.logger.debug "please install the `arr-pm` gem to support RPM packages"
15
+ end
16
+
17
+ arch.each do |a|
18
+ release.each do |r|
19
+ full_path = "#{path}/#{r}/#{a}/"
20
+ repo_path = "#{full_path}/repodata/"
21
+
22
+ if !File.exist?(full_path)
23
+ FileUtils.mkdir_p(full_path)
24
+ end
25
+
26
+ if !File.exist?(repo_path)
27
+ FileUtils.mkdir(repo_path)
28
+ end
29
+
30
+ pkgnum = 0
31
+ hpkgnum = {}
32
+ Dir.glob("#{full_path}/*.rpm").each do |file|
33
+ pkgnum = pkgnum + 1
34
+ hpkgnum.store(file, pkgnum)
35
+ end
36
+
37
+ primary_xml = []
38
+ filelists_xml = []
39
+ other_xml = []
40
+ package_count = 0
41
+
42
+ Parallel.each(Dir.glob("#{full_path}/*.rpm"), :in_threads => 5) do |file|
43
+ package_count = package_count + 1
44
+ time = Time.now
45
+ sha256sum = Digest::SHA256.file(file).hexdigest
46
+ rpm = RPM::File.new(file)
47
+ filesize = File.size?(file)
48
+ pkgmeta = Hash[*rpm.header.tags.collect { |t| [t.tag, t.value] }.inject([]) { |m,v| m + v }]
49
+ start_header = rpm.lead.length + rpm.signature.length
50
+ end_header = start_header + rpm.header.length
51
+ pkgnum = hpkgnum[file]
52
+
53
+ primary_xml << create_primary_xml(file, time, sha256sum, rpm, filesize, pkgmeta, start_header, end_header, pkgnum)
54
+ other_xml << create_other_xml(file, time, sha256sum, rpm, filesize, pkgmeta, start_header, end_header, pkgnum)
55
+ filelists_xml << create_filelists_xml(file, time, sha256sum, rpm, filesize, pkgmeta, start_header, end_header, pkgnum)
56
+ end
57
+
58
+ erb_files = %w{
59
+ primary
60
+ other
61
+ filelists
62
+ }
63
+
64
+ template_dir = File.join(File.dirname(__FILE__), "..", "..", "templates")
65
+
66
+ erb_files.each { |f|
67
+ erb = ERB.new(File.read("#{template_dir}/#{f}.xml.erb"), nil, "-").result(binding)
68
+
69
+ File.open("#{repo_path}/#{f}.xml","wb") do |x|
70
+ x.puts erb
71
+ end
72
+ }
73
+
74
+ xml_data_hash = {}
75
+ xml_data_hash = {
76
+ "filelists" => {
77
+ "xml" => "",
78
+ "gz" => "",
79
+ "size" => "",
80
+ "osize" => "",
81
+ },
82
+ "other" => {
83
+ "xml" => "",
84
+ "gz" => "",
85
+ "size" => "",
86
+ "osize" => "",
87
+ },
88
+ "primary" => {
89
+ "xml" => "",
90
+ "gz" => "",
91
+ "size" => "",
92
+ "osize" => "",
93
+ }
94
+ }
95
+
96
+ Dir.glob("#{repo_path}/*.gz") { |f|
97
+ FileUtils.rm(f)
98
+ }
99
+
100
+ erb_files.each { |file|
101
+ xml_data_hash[file]["osize"] = File.size?("#{repo_path}/#{file}.xml")
102
+ xml_data_hash[file]["xml"] = Digest::SHA256.file("#{repo_path}/#{file}.xml").hexdigest
103
+
104
+ Zlib::GzipWriter.open("#{repo_path}/#{file}.xml.gz") do |gz|
105
+ ff = File.new("#{repo_path}/#{file}.xml", "r")
106
+ ff.each do |line|
107
+ gz.write(line)
108
+ end
109
+ end
110
+
111
+ xml_data_hash[file]["size"] = File.size?("#{repo_path}/#{file}.xml.gz")
112
+ xml_data_hash[file]["gz"] = Digest::SHA256.file("#{repo_path}/#{file}.xml.gz").hexdigest
113
+
114
+ FileUtils.rm("#{repo_path}/#{file}.xml")
115
+ FileUtils.mv("#{repo_path}/#{file}.xml.gz", "#{repo_path}/#{xml_data_hash[file]['gz']}-#{file}.xml.gz")
116
+ }
117
+
118
+ repomd_xml = []
119
+ timestamp = Time.now.to_i
120
+
121
+ repomd_xml << create_repomd_xml(xml_data_hash,timestamp)
122
+ erb_two = ERB.new(File.open("#{template_dir}/repomd.xml.erb", "r") { |file|
123
+ file.read
124
+ }).result(binding)
125
+
126
+ File.open("#{repo_path}/repomd.xml.tmp","wb") do |x|
127
+ x.puts erb_two
128
+ end
129
+
130
+ FileUtils.mv("#{repo_path}/repomd.xml.tmp", "#{repo_path}/repomd.xml")
131
+
132
+ unless gpg == false
133
+ # We expect that GPG is installed and a key has already been made
134
+ sign_cmd = "gpg -u #{gpg} --yes --detach-sign --armor #{repo_path}/repomd.xml"
135
+ MPRM.logger.debug "Exec: #{sign_cmd}"
136
+ MPRM.logger.debug `#{sign_cmd}`
137
+ end
138
+
139
+ MPRM.logger.debug "Built Yum repository for #{full_path}"
140
+ end
141
+ end
142
+ end
143
+
144
+ def move_rpm_packages(path,arch,release,directory)
145
+ unless File.exist?(directory)
146
+ MPRM.logger.debug "ERROR: #{directory} doesn't exist... not doing anything"
147
+ return false
148
+ end
149
+
150
+ files_moved = []
151
+ release.each { |r|
152
+ arch.each { |a|
153
+ Dir.glob(directory + "/*.rpm") do |file|
154
+ if file =~ /^.*#{a}.*\.rpm$/i || file =~ /^.*all.*\.rpm$/i || file =~ /^.*any.*\.rpm$/i
155
+ target_dir = "#{path}/#{r}/#{a}/"
156
+ FileUtils.mkpath(target_dir)
157
+ if file =~ /^.*#{r}.*\.rpm$/i
158
+ # Lets do this here to help mitigate packages like "asdf-123+rhel7.rpm"
159
+ FileUtils.cp(file, target_dir)
160
+ FileUtils.rm(file)
161
+ else
162
+ FileUtils.cp(file, target_dir)
163
+ files_moved << file
164
+ end
165
+ end
166
+ end
167
+ }
168
+ }
169
+
170
+ files_moved.each do |f|
171
+ if File.exist?(f)
172
+ FileUtils.rm(f)
173
+ end
174
+ end
175
+ end
176
+
177
+ def create_repomd_xml(xml_data_hash,timestamp)
178
+ repomd_meta = String.new
179
+ xml_data_hash.each_pair do |k,v|
180
+ repomd_meta <<
181
+ %Q(<data type="#{k}">
182
+ <checksum type="sha256">#{v["gz"]}</checksum>
183
+ <open-checksum type="sha256">#{v["xml"]}</open-checksum>
184
+ <location href="repodata/#{v["gz"]}-#{k}.xml.gz"/>
185
+ <timestamp>#{timestamp}</timestamp>
186
+ <size>#{v["size"]}</size>
187
+ <open-size>#{v["osize"]}</open-size>
188
+ </data>)
189
+ end
190
+ repomd_meta
191
+ end
192
+
193
+ def create_filelists_xml(file, time, sha256sum, rpm, filesize, pkgmeta, start_header, end_header, pkgnum)
194
+ init_filelists_data = String.new
195
+ init_filelists_data <<
196
+ %Q(<package pkgid="#{sha256sum}" name="#{pkgmeta[:name]}" arch="#{pkgmeta[:arch]}">
197
+ <version epoch="0" ver="#{pkgmeta[:version]}" rel="#{pkgmeta[:release]}"/>\n\n)
198
+
199
+ rpm.files.each do |filex|
200
+ init_filelists_data << %Q( <file>#{filex}</file>\n)
201
+ end
202
+
203
+ init_filelists_data <<
204
+ %Q(</package>)
205
+ init_filelists_data
206
+ end
207
+
208
+ def create_other_xml(file, time, sha256sum, rpm, filesize, pkgmeta, start_header, end_header, pkgnum)
209
+ init_other_data = String.new
210
+ init_other_data <<
211
+ %Q(<package pkgid="#{sha256sum}" name="#{pkgmeta[:name]}" arch="#{pkgmeta[:arch]}">
212
+ <version epoch="0" ver="#{pkgmeta[:version]}" rel="#{pkgmeta[:release]}"/>\n)
213
+ init_other_data <<
214
+ %Q(</package>)
215
+
216
+ init_other_data
217
+ end
218
+
219
+ def create_primary_xml(file, time, sha256sum, rpm, filesize, pkgmeta, start_header, end_header, pkgnum)
220
+ time = time.to_i
221
+ cut_file = File.basename(file)
222
+
223
+ init_primary_data = String.new
224
+ init_primary_data = %Q(<package type=\"rpm\">
225
+ <name>#{pkgmeta[:name]}</name>
226
+ <arch>#{pkgmeta[:arch]}</arch>
227
+ <version epoch=\"0\" ver=\"#{pkgmeta[:version]}\" rel=\"#{pkgmeta[:release]}\"/>
228
+ <checksum type=\"sha256\" pkgid=\"YES\">#{sha256sum}</checksum>
229
+ <summary>#{pkgmeta[:summary]}</summary>
230
+ <description>#{pkgmeta[:description]}</description>
231
+ <packager></packager>
232
+ <url>#{pkgmeta[:url]}</url>
233
+ <time file=\"#{time}\" build=\"#{time}\"/>
234
+ <size package=\"#{filesize}\" installed=\"\" archive=\"\"/>
235
+ <location href=\"#{cut_file}\"/>
236
+ <format>
237
+ <rpm:license>#{pkgmeta[:license]}</rpm:license>
238
+ <rpm:vendor/>
239
+ <rpm:group>#{pkgmeta[:group]}</rpm:group>
240
+ <rpm:buildhost>#{pkgmeta[:buildhost]}</rpm:buildhost>
241
+ <rpm:sourcerpm>#{pkgmeta[:sourcerpm]}</rpm:sourcerpm>\n)
242
+ # <rpm:header-range start=\"#{start_header}\" end=\"#{end_header}\"/ >\n)
243
+
244
+ provide_primary_data = String.new
245
+ if !rpm.provides.empty?
246
+ provide_primary_data << "<rpm:provides>\n"
247
+ rpm.provides.each do |prov|
248
+ name = prov[1]
249
+ prov[1].nil? ? flag = "" : flag = prov[1]
250
+ prov[2].nil? ? version = "" && release = "" : (version,release = prov[2].split(/-/))
251
+ provide_primary_data <<
252
+ "<rpm:entry name=\"#{name}\" flags=\"#{flag}\" epoch=\"0\" ver=\"#{version}\" rel=\"#{release}\"/>\n"
253
+ end
254
+ provide_primary_data << "</rpm:provides>\n"
255
+ end
256
+
257
+ init_primary_data << provide_primary_data
258
+
259
+ require_primary_data = String.new
260
+ if !rpm.requires.empty?
261
+ require_primary_data << "<rpm:requires>\n"
262
+ rpm.requires.each do |req|
263
+ next if req[0] =~ /^rpmlib/
264
+ name = req[0]
265
+ req[1].nil? ? flag = "" : flag = req[1]
266
+ req[2].nil? ? version = "" && release = "" : (version,release = req[2].split(/-/))
267
+ require_primary_data <<
268
+ "<rpm:entry name=\"#{name}\" flags=\"#{flag}\" epoch=\"0\" ver=\"#{version}\" rel=\"#{release}\"/>\n"
269
+ end
270
+ require_primary_data << "</rpm:requires>\n"
271
+ end
272
+
273
+ init_primary_data << require_primary_data
274
+
275
+ conflict_primary_data = String.new
276
+ if !rpm.conflicts.empty?
277
+ conflict_primary_data << "<rpm:conflicts>\n"
278
+ rpm.conflicts.each do |con|
279
+ name = con[0]
280
+ conflict_primary_data <<
281
+ "<rpm:entry name=\"#{name}\">\n"
282
+ end
283
+ conflict_primary_data << "</rpm:conflicts>\n"
284
+ end
285
+
286
+ init_primary_data << conflict_primary_data
287
+
288
+ files_primary_data = String.new
289
+ rpm.files.each do |filex|
290
+ files_primary_data <<
291
+ "<file>#{filex}</file>"
292
+ end
293
+
294
+ init_primary_data << files_primary_data
295
+
296
+ init_primary_data <<
297
+ %Q( </format>\n) + %Q(</package>)
298
+
299
+ init_primary_data
300
+ end
301
+ end
@@ -0,0 +1,3 @@
1
+ module PRM
2
+ VERSION = "0.9.0"
3
+ end
@@ -0,0 +1,23 @@
1
+ Date: <%= date.rfc2822 %>
2
+ Suite: <%= release %>
3
+ <% if origin -%>
4
+ Origin: <%= origin %>
5
+ <% end -%>
6
+ <% if label -%>
7
+ Label: <%= label %>
8
+ <% end -%>
9
+ MD5Sum:
10
+ d41d8cd98f00b204e9800998ecf8427e 0 Release
11
+ <% release_info.each_pair do |k,v| -%>
12
+ <%= "#{release_info[k]['md5']} #{release_info[k]['size']} #{k}" %>
13
+ <% end -%>
14
+ SHA1:
15
+ da39a3ee5e6b4b0d3255bfef95601890afd80709 0 Release
16
+ <% release_info.each_pair do |k,v| -%>
17
+ <%= "#{release_info[k]['sha1']} #{release_info[k]['size']} #{k}" %>
18
+ <% end -%>
19
+ SHA256:
20
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 Release
21
+ <% release_info.each_pair do |k,v| -%>
22
+ <%= "#{release_info[k]['sha256']} #{release_info[k]['size']} #{k}" %>
23
+ <% end -%>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <filelists xmlns="http://linux.duke.edu/metadata/filelists" packages="<%=package_count%>">
3
+ <% filelists_xml.each do |package| %>
4
+ <%= package %>
5
+ <% end %>
6
+ </filelists>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <otherdata xmlns="http://linux.duke.edu/metadata/other" packages="<%=package_count%>">
3
+ <% other_xml.each do |package| %>
4
+ <%= package %>
5
+ <% end %>
6
+ </otherdata>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <metadata xmlns="http://linux.duke.edu/metadata/common" xmlns:rpm="http://linux.duke.edu/metadata/rpm" packages="<%=package_count%>">
3
+ <% primary_xml.each do |package| %>
4
+ <%= package %>
5
+ <% end %>
6
+ </metadata>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <repomd xmlns="http://linux.duke.edu/metadata/repo" xmlns:rpm="http://linux.duke.edu/metadata/rpm">
3
+ <revision><%=timestamp%></revision>
4
+ <% repomd_xml.each do |package| %>
5
+ <%= package %>
6
+ <% end %>
7
+ </repomd>
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mprm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: ruby
6
+ authors:
7
+ - Brett Gailey
8
+ - Mike Perham
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2018-10-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: parallel
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '1.12'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '1.12'
28
+ - !ruby/object:Gem::Dependency
29
+ name: arr-pm
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 0.0.10
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 0.0.10
42
+ - !ruby/object:Gem::Dependency
43
+ name: clamp
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: 1.0.1
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: 1.0.1
56
+ description: Mike's PRM (Package Repository Manager) is an OS-independent Package
57
+ Repository tool. It allows you to quickly build Debian and Yum Package Repositories.
58
+ email: mperham@gmail.com
59
+ executables:
60
+ - mprm
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - bin/mprm
65
+ - lib/mprm.rb
66
+ - lib/mprm/debian.rb
67
+ - lib/mprm/repo.rb
68
+ - lib/mprm/rpm.rb
69
+ - lib/mprm/version.rb
70
+ - templates/deb_release.erb
71
+ - templates/filelists.xml.erb
72
+ - templates/other.xml.erb
73
+ - templates/primary.xml.erb
74
+ - templates/repomd.xml.erb
75
+ homepage: https://github.com/mperham/prm
76
+ licenses:
77
+ - MIT
78
+ metadata: {}
79
+ post_install_message:
80
+ rdoc_options: []
81
+ require_paths:
82
+ - lib
83
+ required_ruby_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ requirements: []
94
+ rubyforge_project:
95
+ rubygems_version: 2.6.13
96
+ signing_key:
97
+ specification_version: 4
98
+ summary: Mike's Package Repository Manager
99
+ test_files: []