Class: Omnizip::Formats::Rpm::Writer
- Inherits:
-
Object
- Object
- Omnizip::Formats::Rpm::Writer
- Includes:
- Constants
- Defined in:
- lib/omnizip/formats/rpm/writer.rb
Overview
RPM package writer
Creates RPM packages with binary payload (CPIO archive). Supports multiple compression algorithms: gzip, bzip2, xz, zstd.
Constant Summary collapse
- COMPRESSION_INFO =
Supported compression types and their properties
{ gzip: { name: "gzip", flags: "9" }, bzip2: { name: "bzip2", flags: "9" }, xz: { name: "xz", flags: "9" }, zstd: { name: "zstd", flags: "19" }, none: { name: nil, flags: nil }, }.freeze
- ARCHITECTURES =
Architecture mapping
{ "noarch" => 0, "i386" => 1, "i486" => 2, "i586" => 3, "i686" => 4, "x86_64" => 9, "amd64" => 9, "ia64" => 11, "ppc" => 5, "ppc64" => 16, "sparc" => 6, "sparc64" => 7, "alpha" => 8, "s390" => 14, "s390x" => 15, "arm" => 12, "aarch64" => 19, }.freeze
- TAG_NAMES =
Tag ID mapping (reverse of Tag::TAG_IDS)
{ # Header tags name: 1000, version: 1001, release: 1002, epoch: 1003, summary: 1004, description: 1005, buildtime: 1006, buildhost: 1007, size: 1009, distribution: 1010, vendor: 1011, license: 1014, packager: 1015, group: 1016, url: 1020, os: 1021, arch: 1022, prein: 1023, postin: 1024, preun: 1025, postun: 1026, filesizes: 1028, filemodes: 1030, fileuids: 1031, filegids: 1032, filemtimes: 1034, filedigests: 1035, filelinktos: 1036, fileflags: 1037, fileusername: 1039, filegroupname: 1040, archivesize: 1046, rpmversion: 1064, dirindexes: 1116, basenames: 1117, dirnames: 1118, payloadformat: 1124, payloadcompressor: 1125, payloadflags: 1126, # Signature tags sigsize: 257, sha1header: 269, }.freeze
Constants included from Constants
Constants::FILE_CONFIG, Constants::FILE_DOC, Constants::FILE_LICENSE, Constants::FILE_README, Constants::FLAG_EQUAL, Constants::FLAG_GREATER, Constants::FLAG_LESS, Constants::HEADER_HEADER_SIZE, Constants::HEADER_MAGIC, Constants::HEADER_SIGNED_TYPE, Constants::LEAD_MAGIC, Constants::LEAD_SIZE, Constants::PACKAGE_BINARY, Constants::PACKAGE_SOURCE, Constants::TAG_ENTRY_SIZE, Constants::TYPE_BINARY, Constants::TYPE_CHAR, Constants::TYPE_I18NSTRING, Constants::TYPE_INT16, Constants::TYPE_INT32, Constants::TYPE_INT64, Constants::TYPE_INT8, Constants::TYPE_NULL, Constants::TYPE_STRING, Constants::TYPE_STRING_ARRAY
Instance Attribute Summary collapse
-
#arch ⇒ String
readonly
Architecture.
-
#compression ⇒ Symbol
readonly
Compression type.
-
#epoch ⇒ String?
readonly
Package epoch.
-
#files ⇒ Hash<String, String>
readonly
File contents.
-
#metadata ⇒ Hash
readonly
Additional metadata.
-
#name ⇒ String
readonly
Package name.
-
#release ⇒ String
readonly
Package release.
-
#version ⇒ String
readonly
Package version.
Instance Method Summary collapse
-
#add_directory(path, mode: 0o755, owner: "root", group: "root") ⇒ Object
Add directory to package.
-
#add_file(path, content, mode: 0o644, owner: "root", group: "root", mtime: nil) ⇒ Object
Add file to package.
-
#compression_info ⇒ Hash
Get compression info.
-
#initialize(name:, version:, release:, arch: "noarch", epoch: nil, compression: :gzip, **metadata) ⇒ Writer
constructor
Initialize RPM writer.
-
#validate_compression(comp) ⇒ Symbol
Validate compression type.
-
#write(output_path) ⇒ String
Write RPM package to file.
-
#write_to_io(io) ⇒ Object
Write RPM package to IO.
Constructor Details
#initialize(name:, version:, release:, arch: "noarch", epoch: nil, compression: :gzip, **metadata) ⇒ Writer
Initialize RPM writer
148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 148 def initialize(name:, version:, release:, arch: "noarch", epoch: nil, compression: :gzip, **) @name = name @version = version @release = release @arch = arch @epoch = epoch @compression = validate_compression(compression) @metadata = @files = [] @directories = [] end |
Instance Attribute Details
#arch ⇒ String (readonly)
Returns Architecture.
128 129 130 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 128 def arch @arch end |
#compression ⇒ Symbol (readonly)
Returns Compression type.
131 132 133 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 131 def compression @compression end |
#epoch ⇒ String? (readonly)
Returns Package epoch.
125 126 127 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 125 def epoch @epoch end |
#files ⇒ Hash<String, String> (readonly)
Returns File contents.
134 135 136 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 134 def files @files end |
#metadata ⇒ Hash (readonly)
Returns Additional metadata.
137 138 139 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 137 def @metadata end |
#name ⇒ String (readonly)
Returns Package name.
116 117 118 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 116 def name @name end |
#release ⇒ String (readonly)
Returns Package release.
122 123 124 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 122 def release @release end |
#version ⇒ String (readonly)
Returns Package version.
119 120 121 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 119 def version @version end |
Instance Method Details
#add_directory(path, mode: 0o755, owner: "root", group: "root") ⇒ Object
Add directory to package
209 210 211 212 213 214 215 216 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 209 def add_directory(path, mode: 0o755, owner: "root", group: "root") @directories << { path: path, mode: mode, owner: owner, group: group, } end |
#add_file(path, content, mode: 0o644, owner: "root", group: "root", mtime: nil) ⇒ Object
Add file to package
191 192 193 194 195 196 197 198 199 200 201 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 191 def add_file(path, content, mode: 0o644, owner: "root", group: "root", mtime: nil) @files << { path: path, content: content, mode: mode, owner: owner, group: group, mtime: mtime || Time.now.to_i, } end |
#compression_info ⇒ Hash
Get compression info
179 180 181 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 179 def compression_info COMPRESSION_INFO[@compression] end |
#validate_compression(comp) ⇒ Symbol
Validate compression type
166 167 168 169 170 171 172 173 174 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 166 def validate_compression(comp) return :gzip unless comp unless COMPRESSION_INFO.key?(comp) raise ArgumentError, "Unsupported compression: #{comp}. " \ "Supported: #{COMPRESSION_INFO.keys.join(', ')}" end comp end |
#write(output_path) ⇒ String
Write RPM package to file
222 223 224 225 226 227 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 222 def write(output_path) File.open(output_path, "wb") do |io| write_to_io(io) end output_path end |
#write_to_io(io) ⇒ Object
Write RPM package to IO
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 |
# File 'lib/omnizip/formats/rpm/writer.rb', line 232 def write_to_io(io) # Build payload (compressed CPIO) payload_io = StringIO.new("".b) cpio_data = build_cpio_payload compress_payload(cpio_data, payload_io) payload_io.rewind payload_data = payload_io.read # Build headers main_header = build_main_header(payload_data.bytesize) sig_header = build_signature_header(main_header.bytesize, payload_data.bytesize) # Build lead lead = build_lead # Write RPM in order io.write(lead) io.write(sig_header) io.write(main_header) io.write(payload_data) end |