1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import rpm
20 import sys
21 import os.path
22 from importLib import GenericPackageImport, IncompletePackage, \
23 Import, InvalidArchError, InvalidChannelError, \
24 IncompatibleArchError
25 from mpmSource import mpmBinaryPackage
26 from spacewalk.common import rhn_pkg
27 from spacewalk.common.rhnConfig import CFG
28 from spacewalk.server import taskomatic
29 from spacewalk.server.rhnServer import server_packages
30
31
33
34 - def __init__(self, batch, backend, caller=None, strict=0, repogen=True):
35
36
37 GenericPackageImport.__init__(self, batch, backend)
38 self.affected_channels = []
39
40
41
42 self.affected_channel_packages = {}
43 if not caller:
44 self.caller = "backend.(unknown)"
45 else:
46 self.caller = caller
47 self._strict_subscription = strict
48 self.repogen = repogen
49
62
64
65 self.backend.lookupPackageArches(self.package_arches)
66 self.backend.lookupChannels(self.channels)
67
68 self.channel_package_arch_compat = {}
69 for channel, channel_row in self.channels.items():
70 if not channel_row:
71
72 continue
73 self.channel_package_arch_compat[channel_row['channel_arch_id']] = None
74 self.backend.lookupChannelPackageArchCompat(self.channel_package_arch_compat)
75 self.backend.lookupPackageNames(self.names)
76 self.backend.lookupEVRs(self.evrs)
77 self.backend.lookupChecksums(self.checksums)
78
79
80 uniqdict = {}
81 for package in self.batch:
82 if package.ignored:
83 continue
84 self._postprocessPackageNEVRA(package)
85 if not CFG.ENABLE_NVREA:
86
87 nevrao = (
88 package['name_id'],
89 package['evr_id'],
90 package['package_arch_id'],
91 package['org_id'])
92 else:
93
94 nevrao = (
95 package['name_id'],
96 package['evr_id'],
97 package['package_arch_id'],
98 package['org_id'],
99 package['checksum_id'])
100
101 if nevrao not in uniqdict:
102
103 package['channels'] = {}
104
105
106
107 self.__copyChannels(package, package)
108 uniqdict[nevrao] = package
109 else:
110
111
112 self._comparePackages(package, uniqdict[nevrao])
113
114 package.ignored = 1
115 firstpackage = uniqdict[nevrao]
116
117 self.__copyChannels(package, firstpackage)
118
119 package.first_package = firstpackage
120
124
148
150
151 self.affected_channel_packages.clear()
152 self.affected_channel_packages.update(affected_channels)
153 for channel_label, channel_row in list(self.channels.items()):
154 channel_id = channel_row['id']
155 if channel_id in affected_channels:
156 affected_channels[channel_id] = channel_label
157 self.affected_channels = list(affected_channels.values())
158
173
174
176 dpHash = destPackage['channels']
177 for schannelName in sourcePackage.channels:
178
179 channel = self.channels[schannelName]
180 if not channel:
181
182 sourcePackage.ignored = 1
183 raise InvalidChannelError(channel,
184 "Unsupported channel %s" % schannelName)
185
186 charch = channel['channel_arch_id']
187 archCompat = self.channel_package_arch_compat[charch]
188 if not archCompat:
189
190 sourcePackage.ignored = 1
191 raise InvalidArchError(charch,
192 "Invalid channel architecture %s" % charch)
193
194
195
196 if sourcePackage['package_arch_id'] not in archCompat:
197 sourcePackage.ignored = 1
198 raise IncompatibleArchError(sourcePackage.arch, charch,
199 "Package arch %s incompatible with channel %s" %
200 (sourcePackage.arch, schannelName))
201
202 dpHash[channel['id']] = schannelName
203
204 destPackage.channels = list(dpHash.values())
205
206
208
209 - def __init__(self, batch, backend, caller=None, update_last_modified=0):
218
220
221
222 return hasattr(rpm, 'RPMTAG_'+tag.upper())
223
225 ChannelPackageSubscription._processPackage(self, package)
226
227
228 group = package['package_group']
229 if group not in self.groups:
230 self.groups[group] = None
231 sourceRPM = package['source_rpm']
232 if (sourceRPM is not None) and (sourceRPM not in self.sourceRPMs):
233 self.sourceRPMs[sourceRPM] = None
234
235
236 package['copyright'] = self._fix_encoding(package['license'])
237
238 for tag in ('recommends', 'suggests', 'supplements', 'enhances', 'breaks', 'predepends'):
239 if not self._rpm_knows(tag) or tag not in package or type(package[tag]) != type([]):
240
241
242
243 package[tag] = []
244
245
246 for tag in ('provides', 'requires', 'conflicts', 'obsoletes', 'recommends', 'suggests', 'supplements', 'enhances', 'breaks', 'predepends'):
247 depList = package[tag]
248 if type(depList) != type([]):
249 sys.stderr.write("!!! packageImport.PackageImport._processPackage: "
250 "erronous depList for '%s', converting to []\n" % tag)
251 depList = []
252 for dep in depList:
253 nv = []
254 for f in ('name', 'version'):
255 nv.append(dep[f])
256 del dep[f]
257 nv = tuple(nv)
258 dep['capability'] = nv
259 if nv not in self.capabilities:
260 self.capabilities[nv] = None
261
262 fileList = package['files']
263 for f in fileList:
264 filename = self._fix_encoding(f['name'])
265 nv = (filename, '')
266 del f['name']
267 f['capability'] = nv
268 if nv not in self.capabilities:
269 self.capabilities[nv] = None
270 fchecksumTuple = (f['checksum_type'], f['checksum'])
271 if fchecksumTuple not in self.checksums:
272 self.checksums[fchecksumTuple] = None
273
274
275 unique_package_changelog_hash = {}
276 unique_package_changelog = []
277 for changelog in package['changelog']:
278 key = (changelog['name'], changelog['time'], changelog['text'])
279 if key not in unique_package_changelog_hash:
280 self.changelog_data[key] = None
281 unique_package_changelog.append(changelog)
282 unique_package_changelog_hash[key] = 1
283 package['changelog'] = unique_package_changelog
284
285
286 package['description'] = self._fix_encoding(package['description'])
287 package['summary'] = self._fix_encoding(package['summary'])
288
309
311 upload_force = self.uploadForce
312 if not upload_force and self._update_last_modified:
313
314 upload_force = 0.5
315 try:
316 self.backend.processPackages(self.batch,
317 uploadForce=upload_force,
318 forceVerify=self.forceVerify,
319 ignoreUploaded=self.ignoreUploaded,
320 transactional=self.transactional)
321 self._import_signatures()
322 except:
323
324 self.backend.rollback()
325 raise
326 self.backend.commit()
327 if not self._update_last_modified:
328
329
330 for p in self.batch:
331 if p.diff and p.diff.level == 0.5:
332
333 p.diff = None
334
335
347
348 - def __postprocess(self):
349
350
351 for package in self.batch:
352 if package.ignored:
353
354 continue
355
356 self.__postprocessPackage(package)
357
358 - def __postprocessPackage(self, package):
359 """ populate the columns foo_id with id numbers from appropriate hashes """
360 package['package_group'] = self.groups[package['package_group']]
361 source_rpm = package['source_rpm']
362 if source_rpm is not None:
363 source_rpm = self.sourceRPMs[source_rpm]
364 else:
365 source_rpm = ''
366 package['source_rpm_id'] = source_rpm
367 package['checksum_id'] = self.checksums[(package['checksum_type'], package['checksum'])]
368
369
370 for tag in ('provides', 'requires', 'conflicts', 'obsoletes', 'files', 'recommends', 'suggests', 'supplements', 'enhances', 'breaks', 'predepends'):
371 for entry in package[tag]:
372 nv = entry['capability']
373 entry['capability_id'] = self.capabilities[nv]
374 for c in package['changelog']:
375 c['changelog_data_id'] = self.changelog_data[(c['name'], c['time'], c['text'])]
376 fileList = package['files']
377 for f in fileList:
378 f['checksum_id'] = self.checksums[(f['checksum_type'], f['checksum'])]
379
381 if (package1['checksum_type'] == package2['checksum_type']
382 and package1['checksum'] == package2['checksum']):
383 return
384
385 raise Exception("Different packages in the same batch")
386
391
401
403 if text is None:
404 return None
405 try:
406 return text.decode('utf8')
407 except UnicodeDecodeError:
408 return text.decode('iso8859-1')
409
410
412
413 - def __init__(self, batch, backend, caller=None, update_last_modified=0):
414 Import.__init__(self, batch, backend)
415 self._update_last_modified = update_last_modified
416 self.ignoreUploaded = 1
417 self.sourceRPMs = {}
418 self.groups = {}
419 self.checksums = {}
420
424
443
445 upload_force = self.uploadForce
446 if not upload_force and self._update_last_modified:
447
448 upload_force = 0.5
449 try:
450 self.backend.processSourcePackages(self.batch,
451 uploadForce=upload_force,
452 forceVerify=self.forceVerify,
453 ignoreUploaded=self.ignoreUploaded,
454 transactional=self.transactional)
455 except:
456
457 self.backend.rollback()
458 raise
459 self.backend.commit()
460 if not self._update_last_modified:
461
462
463 for p in self.batch:
464 if p.diff and p.diff.level == 0.5:
465
466 p.diff = None
467
468
470 if (package1['checksum_type'] == package2['checksum_type']
471 and package1['checksum'] == package2['checksum']):
472 return
473
474 raise Exception("Different packages in the same batch")
475
477 Import._processPackage(self, package)
478
479 package.arch = 'src'
480 package.source_rpm = package['source_rpm']
481 sourceRPM = package['source_rpm']
482 if not sourceRPM:
483
484 raise Exception("Source RPM %s does not exist")
485 self.sourceRPMs[sourceRPM] = None
486 self.groups[package['package_group']] = None
487
488 checksumTuple = (package['checksum_type'], package['checksum'])
489 if checksumTuple not in self.checksums:
490 self.checksums[checksumTuple] = None
491
492 sigchecksumTuple = (package['sigchecksum_type'], package['sigchecksum'])
493 if sigchecksumTuple not in self.checksums:
494 self.checksums[sigchecksumTuple] = None
495
496 - def __postprocess(self):
497
498
499 for package in self.batch:
500 if package.ignored:
501
502 continue
503
504 self.__postprocessPackage(package)
505
506 - def __postprocessPackage(self, package):
507
508 package['package_group'] = self.groups[package['package_group']]
509 package['source_rpm_id'] = self.sourceRPMs[package['source_rpm']]
510 package['checksum_id'] = self.checksums[(package['checksum_type'],
511 package['checksum'])]
512 package['sigchecksum_id'] = self.checksums[(package['sigchecksum_type'],
513 package['sigchecksum'])]
514
519
520
525