1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import time
20 import string
21 from importLib import File, Dependency, ChangeLog, Channel, \
22 IncompletePackage, Package, SourcePackage
23 from backendLib import gmtime, localtime
24 from spacewalk.common.usix import ListType, TupleType, IntType, LongType, StringType, UnicodeType
25 from spacewalk.common.rhnLog import log_debug
26 from spacewalk.common.stringutils import to_string
27 from spacewalk.common.usix import LongType
28
29
31
32 tagMap = {
33
34 'last_modified': None,
35
36 'checksum': None,
37 'checksum_type': None,
38 'checksum_list': None,
39 'sigchecksum': None,
40 'sigchecksum_type': None,
41 }
42
43 - def populate(self, header, size, checksum_type, checksum, path=None, org_id=None,
44 header_start=None, header_end=None, channels=[]):
45
46
47
48 for f in self.keys():
49 field = f
50 if f in self.tagMap:
51 field = self.tagMap[f]
52 if not field:
53
54 continue
55
56
57 val = header[field]
58 if f == 'build_time':
59 if type(val) in (IntType, LongType):
60
61 val = gmtime(val)
62 if f == 'payload_size':
63 if val is None:
64
65 if ('longarchivesize' in header) and (header['longarchivesize'] > 0):
66 val = header['longarchivesize']
67 elif val < 0:
68
69
70 val = LongType(val) + 2 ** 32
71 elif val:
72
73 if isinstance(val, UnicodeType):
74 val = to_string(val)
75 else:
76 val = str(val)
77 elif val == []:
78 val = None
79 self[f] = val
80
81 self['package_size'] = size
82 self['checksum_type'] = checksum_type
83 self['checksum'] = checksum
84 self['checksums'] = {checksum_type: checksum}
85 self['path'] = path
86 self['org_id'] = org_id
87 self['header_start'] = header_start
88 self['header_end'] = header_end
89 self['last_modified'] = localtime(time.time())
90 if 'sigmd5' in self:
91 if self['sigmd5']:
92 self['sigchecksum_type'] = 'md5'
93 self['sigchecksum'] = self['sigmd5']
94 del(self['sigmd5'])
95
96
97 vendor = self['vendor']
98 if vendor is None:
99 self['vendor'] = 'Red Hat, Inc.'
100 payloadFormat = self['payload_format']
101 if payloadFormat is None:
102 self['payload_format'] = 'cpio'
103 if self['payload_size'] is None:
104 self['payload_size'] = 0
105 return self
106
107
109
110 tagMap = rpmPackage.tagMap.copy()
111 tagMap.update({
112 'package_group': 'group',
113 'rpm_version': 'rpmversion',
114 'payload_size': 'archivesize',
115 'installed_size': 'size',
116 'payload_format': 'payloadformat',
117 'build_host': 'buildhost',
118 'build_time': 'buildtime',
119 'source_rpm': 'sourcerpm',
120
121 'requires': None,
122 'provides': None,
123 'conflicts': None,
124 'obsoletes': None,
125 'suggests': None,
126 'supplements': None,
127 'enhances': None,
128 'recommends': None,
129 'breaks': None,
130 'predepends': None,
131 'files': None,
132 'changelog': None,
133 'channels': None,
134
135 'package_size': None,
136 'org_id': None,
137 'md5sum': None,
138 'path': None,
139 'header_start': None,
140 'header_end': None,
141
142 'sigpgp': None,
143 'siggpg': None,
144 'package_id': None,
145 'multi_arch': None,
146 })
147
148 - def populate(self, header, size, checksum_type, checksum, path=None, org_id=None,
149 header_start=None, header_end=None, channels=[]):
168
171
202
205
214
216 """
217 Populates a tag with a list of Class instances, getting the
218 information from a header
219 """
220
221
222 fix = {}
223 itemcount = 0
224
225 for f, rf in Class.tagMap.items():
226 v = sanitizeList(header[rf])
227 ic = len(v)
228 if not itemcount or ic < itemcount:
229 itemcount = ic
230 fix[f] = v
231
232
233 if self[tag] is None:
234 self[tag] = []
235
236 unique_deps = []
237 for i in range(itemcount):
238 hash = {}
239 for k, v in fix.items():
240
241
242 if not len(v) and k == 'version':
243 hash[k] = ''
244 elif not len(v) and k == 'flags':
245 hash[k] = 0
246 else:
247 hash[k] = v[i]
248
249
250
251 if Class in [rpmOldRecommends, rpmOldSupplements, rpmOldSuggests, rpmOldEnhances]:
252 if tag in ['recommends', 'supplements'] and not(hash['flags'] & (1 << 27)):
253 continue
254 if tag in ['suggests', 'enhances'] and (hash['flags'] & (1 << 27)):
255 continue
256
257 obj = Class()
258
259
260 if tag in ['requires', 'provides', 'obsoletes', 'conflicts', 'recommends', 'suggests', 'supplements', 'enhances', 'breaks', 'predepends']:
261 if not len(hash['name']):
262 continue
263 dep_nv = (hash['name'], hash['version'], hash['flags'])
264
265 if dep_nv not in unique_deps:
266 unique_deps.append(dep_nv)
267 obj.populate(hash)
268 self[tag].append(obj)
269 else:
270
271 continue
272 else:
273 if tag == 'files':
274 hash['checksum_type'] = self['checksum_type']
275 obj.populate(hash)
276 self[tag].append(obj)
277
278
280 tagMap = rpmPackage.tagMap.copy()
281 tagMap.update({
282 'package_group': 'group',
283 'rpm_version': 'rpmversion',
284 'payload_size': 'archivesize',
285 'build_host': 'buildhost',
286 'build_time': 'buildtime',
287 'source_rpm': 'sourcerpm',
288
289
290 'package_size': None,
291 'org_id': None,
292 'md5sum': None,
293 'path': None,
294
295 'payload_format': None,
296 'channels': None,
297 'package_id': None,
298 })
299
300 - def populate(self, header, size, checksum_type, checksum, path=None, org_id=None,
301 header_start=None, header_end=None, channels=[]):
302 rpmPackage.populate(self, header, size, checksum_type, checksum, path, org_id,
303 header_start, header_end)
304
305 if self['package_group'] is None:
306 self['package_group'] = "Unspecified"
307
308 nvr = []
309
310 self['package_group'] = self['package_group'].rstrip()
311
312 for tag in ['name', 'version', 'release']:
313 nvr.append(header[tag])
314
315
316
317 if 1051 in list(header.keys()):
318 self['source_rpm'] = "%s-%s-%s.nosrc.rpm" % tuple(nvr)
319 else:
320 self['source_rpm'] = "%s-%s-%s.src.rpm" % tuple(nvr)
321
322
323 self['sigchecksum_type'] = 'md5'
324 self['sigchecksum'] = string.join(
325 ["%02x" % ord(x) for x in self['sigchecksum']], '')
326
327
329
330 tagMap = {
331 'name': 'filenames',
332 'device': 'filedevices',
333 'inode': 'fileinodes',
334 'file_mode': 'filemodes',
335 'username': 'fileusername',
336 'groupname': 'filegroupname',
337 'rdev': 'filerdevs',
338 'file_size': 'filesizes',
339 'mtime': 'filemtimes',
340 'filedigest': 'filemd5s',
341
342 'linkto': 'filelinktos',
343 'flags': 'fileflags',
344 'verifyflags': 'fileverifyflags',
345 'lang': 'filelangs',
346 }
347
349 ChangeLog.populate(self, hash)
350
351 tm = self['mtime']
352 if type(tm) in (IntType, LongType):
353
354 self['mtime'] = localtime(tm)
355 if type(self['filedigest']) == StringType:
356 self['checksum'] = self['filedigest']
357 del(self['filedigest'])
358
359
361
362 tagMap = {
363 'name': 'provides',
364 'version': 'provideversion',
365 'flags': 'provideflags',
366 }
367
368
370
371 tagMap = {
372 'name': 'requirename',
373 'version': 'requireversion',
374 'flags': 'requireflags',
375 }
376
378
379 tagMap = {
380 'name': 1156,
381 'version': 1157,
382 'flags': 1158,
383 }
384
386
387 tagMap = {
388 'name' : 5049,
389 'version' : 5050,
390 'flags' : 5051,
391 }
392
394
395 tagMap = {
396 'name' : 1156,
397 'version' : 1157,
398 'flags' : 1158,
399 }
400
402
403 tagMap = {
404 'name' : 5046,
405 'version' : 5047,
406 'flags' : 5048,
407 }
408
410
411 tagMap = {
412 'name' : 1159,
413 'version' : 1160,
414 'flags' : 1161,
415 }
416
418
419 tagMap = {
420 'name' : 5052,
421 'version' : 5053,
422 'flags' : 5054,
423 }
424
426
427 tagMap = {
428 'name' : 1159,
429 'version' : 1160,
430 'flags' : 1161,
431 }
432
434
435 tagMap = {
436 'name' : 5055,
437 'version' : 5056,
438 'flags' : 5057,
439 }
440
442
443 tagMap = {
444 'name': 'conflictname',
445 'version': 'conflictversion',
446 'flags': 'conflictflags',
447 }
448
449
451
452 tagMap = {
453 'name': 'obsoletename',
454 'version': 'obsoleteversion',
455 'flags': 'obsoleteflags',
456 }
457
458
460
461 tagMap = {
462 'name': 1159,
463 'version': 1160,
464 'flags': 1161,
465 }
466
467
469
470 tagMap = {
471 'name': 1159,
472 'version': 1160,
473 'flags': 1161,
474 }
475
476
478 tagMap = {
479 'name': 'changelogname',
480 'text': 'changelogtext',
481 'time': 'changelogtime',
482 }
483
485 ChangeLog.populate(self, hash)
486
487 tm = self['time']
488 if type(tm) in (IntType, LongType):
489
490 self['time'] = localtime(tm)
491
492
493 for i in ('text', 'name'):
494 try:
495 self[i] = UnicodeType(self[i], "utf-8")
496 except UnicodeDecodeError:
497 self[i] = UnicodeType(self[i], "iso-8859-1")
498
499
501 if l is None:
502 return []
503 if type(l) in (ListType, TupleType):
504 return l
505 return [l]
506
507
508 -def createPackage(header, size, checksum_type, checksum, relpath, org_id, header_start,
509 header_end, channels):
510 """
511 Returns a populated instance of rpmBinaryPackage or rpmSourcePackage
512 """
513 if header.is_source:
514 log_debug(4, "Creating source package")
515 p = rpmSourcePackage()
516 else:
517 log_debug(4, "Creating package")
518 p = rpmBinaryPackage()
519
520
521
522 header.hdr.fullFilelist()
523 p.populate(header, size, checksum_type, checksum, relpath, org_id, header_start, header_end,
524 channels)
525 return p
526