prm 0.1.6 → 0.2.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.
Files changed (5) hide show
  1. checksums.yaml +7 -0
  2. data/bin/prm +10 -3
  3. data/lib/prm/repo.rb +296 -435
  4. data/lib/prm/rpm.rb +256 -0
  5. metadata +88 -92
data/lib/prm/rpm.rb ADDED
@@ -0,0 +1,256 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'arr-pm'
4
+ require 'fileutils'
5
+ require 'peach'
6
+ require 'digest'
7
+ require 'zlib'
8
+
9
+ module Redhat
10
+ def build_rpm_repo(path,arch,release,gpg,silent)
11
+ arch.peach do |a|
12
+ release.peach do |r|
13
+ full_path = "#{path}/#{r}/#{a}/"
14
+ repo_path = "#{full_path}/repodata/"
15
+
16
+ if !File.exists?(full_path)
17
+ FileUtils.mkdir_p(full_path)
18
+ end
19
+
20
+ if !File.exists?(repo_path)
21
+ FileUtils.mkdir(repo_path)
22
+ end
23
+
24
+ pkgnum = 0
25
+ hpkgnum = Hash.new
26
+ Dir.glob("#{full_path}/*.rpm").each do |file|
27
+ pkgnum = pkgnum + 1
28
+ hpkgnum.store(file, pkgnum)
29
+ end
30
+
31
+ primary_xml = Array.new
32
+ filelists_xml = Array.new
33
+ other_xml = Array.new
34
+ package_count = 0
35
+
36
+ Dir.glob("#{full_path}/*.rpm").peach do |file|
37
+ package_count = package_count + 1
38
+ time = Time.now
39
+ sha256sum = Digest::SHA256.file(file).hexdigest
40
+ rpm = RPM::File.new(file)
41
+ filesize = File.size?(file)
42
+ pkgmeta = Hash[*rpm.header.tags.collect { |t| [t.tag, t.value] }.inject([]) { |m,v| m + v }]
43
+ start_header = rpm.lead.length + rpm.signature.length
44
+ end_header = start_header + rpm.header.length
45
+ pkgnum = hpkgnum[file]
46
+
47
+ primary_xml << create_primary_xml(file, time, sha256sum, rpm, filesize, pkgmeta, start_header, end_header, pkgnum)
48
+ other_xml << create_other_xml(file, time, sha256sum, rpm, filesize, pkgmeta, start_header, end_header, pkgnum)
49
+ filelists_xml << create_filelists_xml(file, time, sha256sum, rpm, filesize, pkgmeta, start_header, end_header, pkgnum)
50
+ end
51
+
52
+ erb_files = %w{
53
+ primary
54
+ other
55
+ filelists
56
+ }
57
+
58
+ template_dir = File.join(File.dirname(__FILE__), "..", "..", "templates")
59
+
60
+ erb_files.each { |f|
61
+ erb = ERB.new(File.open("#{template_dir}/#{f}.xml.erb") { |file|
62
+ file.read
63
+ }).result(binding)
64
+
65
+ release_file = File.new("#{repo_path}/#{f}.xml","wb")
66
+ release_file.puts erb
67
+ release_file.close
68
+ }
69
+
70
+ xml_data_hash = Hash.new
71
+ xml_data_hash = {
72
+ "filelists" => {
73
+ "xml" => "",
74
+ "gz" => "",
75
+ "size" => "",
76
+ "osize" => "",
77
+ },
78
+ "other" => {
79
+ "xml" => "",
80
+ "gz" => "",
81
+ "size" => "",
82
+ "osize" => "",
83
+ },
84
+ "primary" => {
85
+ "xml" => "",
86
+ "gz" => "",
87
+ "size" => "",
88
+ "osize" => "",
89
+ }
90
+ }
91
+
92
+ Dir.glob("#{repo_path}/*.gz") { |f|
93
+ FileUtils.rm(f)
94
+ }
95
+
96
+ erb_files.each { |file|
97
+ xml_data_hash[file]["osize"] = File.size?("#{repo_path}/#{file}.xml")
98
+ xml_data_hash[file]["xml"] = Digest::SHA256.file("#{repo_path}/#{file}.xml").hexdigest
99
+
100
+ Zlib::GzipWriter.open("#{repo_path}/#{file}.xml.gz") do |gz|
101
+ ff = File.new("#{repo_path}/#{file}.xml", "r")
102
+ ff.each do |line|
103
+ gz.write(line)
104
+ end
105
+ end
106
+
107
+ xml_data_hash[file]["size"] = File.size?("#{repo_path}/#{file}.xml.gz")
108
+ xml_data_hash[file]["gz"] = Digest::SHA256.file("#{repo_path}/#{file}.xml.gz").hexdigest
109
+
110
+ FileUtils.rm("#{repo_path}/#{file}.xml")
111
+ FileUtils.mv("#{repo_path}/#{file}.xml.gz", "#{repo_path}/#{xml_data_hash[file]['gz']}-#{file}.xml.gz")
112
+ }
113
+
114
+ repomd_xml = Array.new
115
+ timestamp = Time.now.to_i
116
+
117
+ repomd_xml << create_repomd_xml(xml_data_hash,timestamp)
118
+ erb_two = ERB.new(File.open("#{template_dir}/repomd.xml.erb") { |file|
119
+ file.read
120
+ }).result(binding)
121
+
122
+ r_file = File.new("#{repo_path}/repomd.xml.tmp","wb")
123
+ r_file.puts erb_two
124
+ r_file.close
125
+
126
+ FileUtils.mv("#{repo_path}/repomd.xml.tmp", "#{repo_path}/repomd.xml")
127
+ puts "Built Yum repository for #{r}\n"
128
+ end
129
+ end
130
+ end
131
+
132
+ def create_repomd_xml(xml_data_hash,timestamp)
133
+ repomd_meta = String.new
134
+ xml_data_hash.each_pair do |k,v|
135
+ repomd_meta <<
136
+ %Q(<data type="#{k}">
137
+ <checksum type="sha256">#{v["gz"]}</checksum>
138
+ <open-checksum type="sha256">#{v["xml"]}</open-checksum>
139
+ <location href="repodata/#{v["gz"]}-#{k}.xml.gz"/>
140
+ <timestamp>#{timestamp}</timestamp>
141
+ <size>#{v["size"]}</size>
142
+ <open-size>#{v["osize"]}</open-size>
143
+ </data>)
144
+ end
145
+ return repomd_meta
146
+ end
147
+
148
+ def create_filelists_xml(file, time, sha256sum, rpm, filesize, pkgmeta, start_header, end_header, pkgnum)
149
+ init_filelists_data = String.new
150
+ init_filelists_data <<
151
+ %Q(<package pkgid="#{sha256sum}" name="#{pkgmeta[:name]}" arch="#{pkgmeta[:arch]}">
152
+ <version epoch="0" ver="#{pkgmeta[:version]}" rel="#{pkgmeta[:release]}"/>\n\n)
153
+
154
+ rpm.files.each do |file|
155
+ init_filelists_data << %Q( <file>#{file}</file>\n)
156
+ end
157
+
158
+ init_filelists_data <<
159
+ %Q(</package>)
160
+ return init_filelists_data
161
+ end
162
+
163
+ def create_other_xml(file, time, sha256sum, rpm, filesize, pkgmeta, start_header, end_header, pkgnum)
164
+ init_other_data = String.new
165
+ init_other_data <<
166
+ %Q(<package pkgid="#{sha256sum}" name="#{pkgmeta[:name]}" arch="#{pkgmeta[:arch]}">
167
+ <version epoch="0" ver="#{pkgmeta[:version]}" rel="#{pkgmeta[:release]}"/>\n)
168
+ init_other_data <<
169
+ %Q(</package>)
170
+
171
+ return init_other_data
172
+ end
173
+
174
+ def create_primary_xml(file, time, sha256sum, rpm, filesize, pkgmeta, start_header, end_header, pkgnum)
175
+ time = time.to_i
176
+ cut_file = File.basename(file)
177
+
178
+ init_primary_data = String.new
179
+ init_primary_data = %Q(<package type=\"rpm\">
180
+ <name>#{pkgmeta[:name]}</name>
181
+ <arch>#{pkgmeta[:arch]}</arch>
182
+ <version epoch=\"0\" ver=\"#{pkgmeta[:version]}\" rel=\"#{pkgmeta[:release]}\"/>
183
+ <checksum type=\"sha256\" pkgid=\"YES\">#{sha256sum}</checksum>
184
+ <summary>#{pkgmeta[:summary]}</summary>
185
+ <description>#{pkgmeta[:description]}</description>
186
+ <packager></packager>
187
+ <url>#{pkgmeta[:url]}</url>
188
+ <time file=\"#{time}\" build=\"#{time}\"/>
189
+ <size package=\"#{filesize}\" installed=\"\" archive=\"\"/>
190
+ <location href=\"#{cut_file}\"/>
191
+ <format>
192
+ <rpm:license>#{pkgmeta[:license]}</rpm:license>
193
+ <rpm:vendor/>
194
+ <rpm:group>#{pkgmeta[:group]}</rpm:group>
195
+ <rpm:buildhost>#{pkgmeta[:buildhost]}</rpm:buildhost>
196
+ <rpm:sourcerpm>#{pkgmeta[:sourcerpm]}</rpm:sourcerpm>\n)
197
+ # <rpm:header-range start=\"#{start_header}\" end=\"#{end_header}\"/ >\n)
198
+
199
+ provide_primary_data = String.new
200
+ if !rpm.provides.empty?
201
+ provide_primary_data << "<rpm:provides>\n"
202
+ rpm.provides.each do |prov|
203
+ name = prov[1]
204
+ prov[1].nil? ? flag = "" : flag = prov[1]
205
+ prov[2].nil? ? version = "" && release = "" : (version,release = prov[2].split(/-/))
206
+ provide_primary_data <<
207
+ "<rpm:entry name=\"#{name}\" flags=\"#{flag}\" epoch=\"0\" ver=\"#{version}\" rel=\"#{release}\"/>\n"
208
+ end
209
+ provide_primary_data << "</rpm:provides>\n"
210
+ end
211
+
212
+ init_primary_data + provide_primary_data
213
+
214
+ require_primary_data = String.new
215
+ if !rpm.requires.empty?
216
+ require_primary_data << "<rpm:requires>\n"
217
+ rpm.requires.each do |req|
218
+ next if req[0] =~ /^rpmlib/
219
+ name = req[0]
220
+ req[1].nil? ? flag = "" : flag = req[1]
221
+ req[2].nil? ? version = "" && release = "" : (version,release = req[2].split(/-/))
222
+ require_primary_data <<
223
+ "<rpm:entry name=\"#{name}\" flags=\"#{flag}\" epoch=\"0\" ver=\"#{version}\" rel=\"#{release}\"/>\n"
224
+ end
225
+ require_primary_data << "</rpm:requires>\n"
226
+ end
227
+
228
+ init_primary_data + require_primary_data
229
+
230
+ conflict_primary_data = String.new
231
+ if !rpm.conflicts.empty?
232
+ conflict_primary_data << "<rpm:conflicts>\n"
233
+ rpm.conflicts.each do |con|
234
+ name = con[0]
235
+ conflict_primary_data <<
236
+ "<rpm:entry name=\"#{name}\">\n"
237
+ end
238
+ conflict_primary_data << "</rpm:conflicts>\n"
239
+ end
240
+
241
+ init_primary_data + conflict_primary_data
242
+
243
+ files_primary_data = String.new
244
+ rpm.files.each do |file|
245
+ files_primary_data <<
246
+ "<file>#{file}</file>"
247
+ end
248
+
249
+ init_primary_data + files_primary_data
250
+
251
+ init_primary_data <<
252
+ %Q( </format>\n) + %Q(</package>)
253
+
254
+ return init_primary_data
255
+ end
256
+ end
metadata CHANGED
@@ -1,125 +1,121 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: prm
3
- version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 1
9
- - 6
10
- version: 0.1.6
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Brett Gailey
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2013-07-19 00:00:00 -07:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
11
+ date: 2013-08-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
22
14
  name: peach
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
33
20
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: aws-s3
37
21
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- version: "0"
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: aws-s3
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
47
34
  type: :runtime
48
- version_requirements: *id002
49
- - !ruby/object:Gem::Dependency
50
- name: clamp
51
35
  prerelease: false
52
- requirement: &id003 !ruby/object:Gem::Requirement
53
- none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 0
60
- version: "0"
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: clamp
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
61
48
  type: :runtime
62
- version_requirements: *id003
63
- - !ruby/object:Gem::Dependency
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
64
56
  name: arr-pm
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
65
63
  prerelease: false
66
- requirement: &id004 !ruby/object:Gem::Requirement
67
- none: false
68
- requirements:
69
- - - ">="
70
- - !ruby/object:Gem::Version
71
- hash: 3
72
- segments:
73
- - 0
74
- version: "0"
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sqlite3
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
75
76
  type: :runtime
76
- version_requirements: *id004
77
- description: PRM (Package Repository Manager) is an Operating System independent Package Repository tool. PRM supports Repository syncing to DreamObjects
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: 'PRM (Package Repository Manager) is an Operating System independent
84
+ Package Repository tool. It allows you to quickly build Debian and Yum Package Repositories.
85
+ PRM supports Repository syncing to DreamObjects '
78
86
  email: brett.gailey@dreamhost.com
79
- executables:
87
+ executables:
80
88
  - prm
81
89
  extensions: []
82
-
83
90
  extra_rdoc_files: []
84
-
85
- files:
91
+ files:
86
92
  - lib/prm/repo.rb
87
93
  - lib/prm.rb
88
94
  - templates/deb_release.erb
95
+ - lib/prm/rpm.rb
89
96
  - bin/prm
90
- has_rdoc: true
91
97
  homepage: https://github.com/dnbert/prm
92
- licenses:
98
+ licenses:
93
99
  - MIT
100
+ metadata: {}
94
101
  post_install_message:
95
102
  rdoc_options: []
96
-
97
- require_paths:
103
+ require_paths:
98
104
  - lib
99
- required_ruby_version: !ruby/object:Gem::Requirement
100
- none: false
101
- requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- hash: 3
105
- segments:
106
- - 0
107
- version: "0"
108
- required_rubygems_version: !ruby/object:Gem::Requirement
109
- none: false
110
- requirements:
111
- - - ">="
112
- - !ruby/object:Gem::Version
113
- hash: 3
114
- segments:
115
- - 0
116
- version: "0"
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
117
115
  requirements: []
118
-
119
116
  rubyforge_project:
120
- rubygems_version: 1.3.7
117
+ rubygems_version: 2.0.5
121
118
  signing_key:
122
- specification_version: 3
119
+ specification_version: 4
123
120
  summary: Package Repository Manager
124
121
  test_files: []
125
-