Package rhnpush :: Module rpm2mpm
[hide private]
[frames] | no frames]

Source Code for Module rhnpush.rpm2mpm

  1  # 
  2  # Copyright (c) 2008--2018 Red Hat, Inc. 
  3  # 
  4  # This software is licensed to you under the GNU General Public License, 
  5  # version 2 (GPLv2). There is NO WARRANTY for this software, express or 
  6  # implied, including the implied warranties of MERCHANTABILITY or FITNESS 
  7  # FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 
  8  # along with this software; if not, see 
  9  # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. 
 10  # 
 11  # Red Hat trademarks are not licensed under GPLv2. No permission is 
 12  # granted to use or replicate Red Hat trademarks that are incorporated 
 13  # in this software or its documentation. 
 14  # 
 15   
 16  import sys 
 17  import time 
 18   
 19  # pylint: disable=F0401 
 20  from spacewalk.common import rhn_rpm, rhn_mpm 
 21  from spacewalk.common.usix import ListType, TupleType 
 22   
 23   
24 -def main():
25 packages = sys.argv[1:] 26 if not packages: 27 return 28 29 for pkgfile in packages: 30 # Try to open the package as a patch first 31 with open(pkgfile) as f: 32 header = rhn_rpm.get_package_header(file_obj=f) 33 p = rpm_to_mpm(header, f) 34 dest_filename = _compute_filename(p.header) 35 print("Writing out the package to %s" % dest_filename) 36 with open(dest_filename, "w+") as dest_file: 37 p.write(dest_file)
38 39
40 -def _compute_filename(hdr):
41 return '%s-%s.%s.mpm' % (hdr['name'], hdr['version'], hdr['arch'])
42 43
44 -def rpm_to_mpm(header, file_stream):
45 tag_map = { 46 'package_group': 'group', 47 'rpm_version': 'rpmversion', 48 'payload_size': 'archivesize', 49 'payload_format': 'payloadformat', 50 'build_host': 'buildhost', 51 'build_time': 'buildtime', 52 'source_rpm': 'sourcerpm', 53 } 54 55 tags = [ 56 'name', 57 'epoch', 58 'version', 59 'release', 60 'arch', 61 'description', 62 'summary', 63 'license', 64 'package_group', 65 'rpm_version', 66 'payload_size', 67 'payload_format', 68 'build_host', 69 'build_time', 70 'cookie', 71 'vendor', 72 'source_rpm', 73 'sigmd5', 74 'sigpgp', 75 'siggpg', 76 'sigsize', 77 ] 78 79 result = {} 80 for t in tags: 81 tt = tag_map.get(t, t) 82 result[t] = header[tt] 83 84 # Add files 85 result['files'] = _extract_files(header) 86 87 # Dependency 88 result['provides'] = _extract_rpm_requires(header) 89 result['requires'] = _extract_rpm_provides(header) 90 result['conflicts'] = _extract_rpm_conflicts(header) 91 result['obsoletes'] = _extract_rpm_obsoletes(header) 92 93 result['changelog'] = _extract_rpm_changelog(header) 94 95 # md5sum, package_size 96 file_stream.seek(0, 2) 97 file_size = file_stream.tell() 98 result['package_size'] = file_size 99 100 is_source = 0 101 if header.is_source: 102 is_source = 1 103 result['is_source'] = is_source 104 105 result['package_type'] = 'rpm' 106 107 h = rhn_mpm.MPM_Header(result) 108 p = rhn_mpm.MPM_Package() 109 p.header = h 110 p.payload_stream = file_stream 111 112 return p
113 114
115 -def _extract_files(header):
116 tag_maps = { 117 'name': 'filenames', 118 'device': 'filedevices', 119 'inode': 'fileinodes', 120 'file_mode': 'filemodes', 121 'username': 'fileusername', 122 'groupname': 'filegroupname', 123 'rdev': 'filerdevs', 124 'file_size': 'filesizes', 125 'mtime': 'filemtimes', 126 'md5': 'filemd5s', 127 'linkto': 'filelinktos', 128 'flags': 'fileflags', 129 'verifyflags': 'fileverifyflags', 130 'lang': 'filelangs', 131 } 132 files = _extract_array_fields(header, tag_maps) 133 # Munge the mtime 134 for f in files: 135 f['mtime'] = gmtime(f['mtime']) 136 return files
137 138
139 -def _extract_rpm_provides(header):
140 tag_maps = { 141 'name': 'provides', 142 'version': 'provideversion', 143 'flags': 'provideflags', 144 } 145 return _extract_array_fields(header, tag_maps)
146 147
148 -def _extract_rpm_requires(header):
149 tag_maps = { 150 'name': 'requirename', 151 'version': 'requireversion', 152 'flags': 'requireflags', 153 } 154 return _extract_array_fields(header, tag_maps)
155 156
157 -def _extract_rpm_conflicts(header):
158 tag_maps = { 159 'name': 'conflictname', 160 'version': 'conflictversion', 161 'flags': 'conflictflags', 162 } 163 return _extract_array_fields(header, tag_maps)
164 165
166 -def _extract_rpm_obsoletes(header):
167 tag_maps = { 168 'name': 'obsoletename', 169 'version': 'obsoleteversion', 170 'flags': 'obsoleteflags', 171 } 172 return _extract_array_fields(header, tag_maps)
173 174
175 -def _extract_rpm_changelog(header):
176 tag_maps = { 177 'name': 'changelogname', 178 'text': 'changelogtext', 179 'time': 'changelogtime', 180 } 181 cl = _extract_array_fields(header, tag_maps) 182 # Munge the changelog time 183 for c in cl: 184 c['time'] = gmtime(c['time']) 185 return cl
186 187
188 -def _extract_array_fields(header, tag_maps):
189 # First determine the number of entries 190 key = list(tag_maps.keys())[0] 191 rpmtag = tag_maps.get(key) 192 arr = header[rpmtag] 193 if arr is None: 194 # nothing to do 195 return [] 196 count = len(arr) 197 198 result = [] 199 for i in range(count): 200 tag_dict = {} 201 for key, rpmtag in tag_maps.items(): 202 arr = header[rpmtag] 203 if not isinstance(arr, (ListType, TupleType)): 204 arr = [arr] 205 tag_dict[key] = arr[i] 206 result.append(tag_dict) 207 return result
208 209
210 -def gmtime(timestamp):
211 ttuple = time.gmtime(timestamp) 212 return "%d-%02d-%02d %02d:%02d:%02d" % ttuple[:6]
213 214 if __name__ == '__main__': 215 sys.exit(main() or 0) 216