Package backend :: Package server :: Package repomd :: Module view
[hide private]
[frames] | no frames]

Source Code for Module backend.server.repomd.view

  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  import re 
 16   
 17  XML_ENCODING = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
 18   
 19   
20 -class RepoView:
21
22 - def __init__(self, primary, filelists, other, updateinfo, groups, modules, fileobj, 23 checksum_type):
24 self.primary = primary 25 self.filelists = filelists 26 self.other = other 27 self.updateinfo = updateinfo 28 self.groups = groups 29 self.modules = modules 30 31 self.fileobj = fileobj 32 if checksum_type == 'sha1': 33 self.checksum_type = 'sha' 34 else: 35 self.checksum_type = checksum_type
36
37 - def _get_data(self, data_type, data_obj):
38 output = [] 39 output.append(" <data type=\"%s\">" % (data_type)) 40 output.append(" <location href=\"repodata/%s.xml.gz\"/>" 41 % (data_type)) 42 output.append(" <checksum type=\"%s\">%s</checksum>" 43 % (self.checksum_type, data_obj['gzip_checksum'])) 44 output.append(" <timestamp>%d</timestamp>" % (data_obj['timestamp'])) 45 output.append(" <open-checksum type=\"%s\">%s</open-checksum>" 46 % (self.checksum_type, data_obj['open_checksum'])) 47 output.append(" </data>") 48 return output
49
50 - def _get_comps_data(self):
51 output = [] 52 if self.groups: 53 output.append(" <data type=\"group\">") 54 output.append(" <location href=\"repodata/comps.xml\"/>") 55 output.append(" <checksum type=\"%s\">%s</checksum>" 56 % (self.checksum_type, self.groups['open_checksum'])) 57 output.append(" <timestamp>%d</timestamp>" 58 % (self.groups['timestamp'])) 59 output.append(" </data>") 60 61 return output
62
63 - def _get_modules_data(self):
64 output = [] 65 if self.modules: 66 output.append(" <data type=\"group\">") 67 output.append(" <location href=\"repodata/modules.yaml\"/>") 68 output.append(" <checksum type=\"%s\">%s</checksum>" 69 % (self.checksum_type, self.modules['open_checksum'])) 70 output.append(" <timestamp>%d</timestamp>" 71 % (self.groups['timestamp'])) 72 output.append(" </data>") 73 74 return output
75
76 - def write_repomd(self):
77 output = [] 78 output.append(XML_ENCODING) 79 output.append("<repomd xmlns=\"http://linux.duke.edu/metadata/repo\">") 80 output.extend(self._get_data('primary', self.primary)) 81 output.extend(self._get_data('filelists', self.filelists)) 82 output.extend(self._get_data('other', self.other)) 83 output.extend(self._get_data('updateinfo', self.updateinfo)) 84 output.extend(self._get_comps_data()) 85 output.extend(self._get_modules_data()) 86 output.append("</repomd>") 87 self.fileobj.write('\n'.join(output))
88 89
90 -class PrimaryView(object):
91
92 - def __init__(self, channel, fileobj):
93 self.channel = channel 94 self.fileobj = fileobj
95
96 - def _get_deps(self, deps):
97 output = [] 98 for dep in deps: 99 if dep['flag']: 100 line = " <rpm:entry name=\"%s\" flags=\"%s\" \ 101 epoch=\"%s\" ver=\"%s\" " % (dep['name'], dep['flag'], 102 dep['epoch'], dep['version']) 103 if dep['release']: 104 line += "rel=\"%s\" " % dep['release'] 105 line += "/>" 106 output.append(line) 107 else: 108 output.append(" <rpm:entry name=\"%s\" />" 109 % (text_filter(dep['name']))) 110 return output
111
112 - def _get_files(self, files):
113 output = [] 114 filere = re.compile('.*bin\/.*|^\/etc\/.*|^\/usr\/lib\.sendmail$') 115 for pkg_file in files: 116 if filere.match(pkg_file): 117 output.append(" <file>%s</file>" 118 % (text_filter(pkg_file))) 119 return output
120
121 - def _get_package(self, package):
122 output = [] 123 output.append(" <package type=\"rpm\">") 124 output.append(" <name>%s</name>" % (package.name)) 125 output.append(" <arch>%s</arch>" % (package.arch)) 126 output.append(" <version epoch=\"%s\" ver=\"%s\" rel=\"%s\" />" 127 % (package.epoch, package.version, package.release)) 128 output.append(" <checksum type=\"%s\" pkgid=\"YES\">%s</checksum>" 129 % (package.checksum_type, package.checksum)) 130 output.append(" <summary>%s</summary>" 131 % (text_filter(package.summary))) 132 output.append(" <description>%s</description>" 133 % (text_filter(package.description))) 134 output.append(" <packager></packager>") 135 output.append(" <url></url>") 136 output.append(" <time file=\"%d\" build=\"%d\" />" 137 % (package.build_time, package.build_time)) 138 output.append(" <size package=\"%d\" installed=\"%d\" " 139 "archive=\"%d\" />" 140 % (package.package_size, package.installed_size, 141 package.payload_size)) 142 output.append(" <location href=\"getPackage/%s\" />" 143 % (package.filename)) 144 output.append(" <format>") 145 output.append(" <rpm:license>%s</rpm:license>" 146 % (text_filter(package.copyright))) 147 output.append(" <rpm:vendor>%s</rpm:vendor>" 148 % (text_filter(package.vendor))) 149 output.append(" <rpm:group>%s</rpm:group>" 150 % (text_filter(package.package_group))) 151 output.append(" <rpm:buildhost>%s</rpm:buildhost>" 152 % (text_filter(package.build_host))) 153 output.append(" <rpm:sourcerpm>%s</rpm:sourcerpm>" 154 % (text_filter(package.source_rpm))) 155 output.append(" <rpm:header-range start=\"%d\" end=\"%d\" />" 156 % (package.header_start, package.header_end)) 157 158 output.append(" <rpm:provides>") 159 output.extend(self._get_deps(package.provides)) 160 output.append(" </rpm:provides>") 161 162 output.append(" <rpm:requires>") 163 output.extend(self._get_deps(package.requires)) 164 output.append(" </rpm:requires>") 165 166 output.append(" <rpm:recommends>") 167 output.extend(self._get_deps(package.recommends)) 168 output.append(" </rpm:recommends>") 169 170 output.append(" <rpm:suggests>") 171 output.extend(self._get_deps(package.suggests)) 172 output.append(" </rpm:suggests>") 173 174 output.append(" <rpm:supplements>") 175 output.extend(self._get_deps(package.supplements)) 176 output.append(" </rpm:supplements>") 177 178 output.append(" <rpm:enhances>") 179 output.extend(self._get_deps(package.enhances)) 180 output.append(" </rpm:enhances>") 181 182 output.append(" <rpm:conflicts>") 183 output.extend(self._get_deps(package.conflicts)) 184 output.append(" </rpm:conflicts>") 185 186 output.append(" <rpm:obsoletes>") 187 output.extend(self._get_deps(package.obsoletes)) 188 output.append(" </rpm:obsoletes>") 189 190 output.extend(self._get_files(package.files)) 191 192 output.append(" </format>") 193 output.append(" </package>") 194 195 return output
196
197 - def write_start(self):
198 output = XML_ENCODING + "\n" + \ 199 "<metadata xmlns=\"http://linux.duke.edu/metadata/common\" " + \ 200 "xmlns:rpm=\"http://linux.duke.edu/metadata/rpm\" " + \ 201 "packages=\"%d\">" % self.channel.num_packages 202 203 self.fileobj.write(output)
204
205 - def write_package(self, package):
206 self.fileobj.write('\n'.join(self._get_package(package)))
207
208 - def write_end(self):
209 self.fileobj.write("</metadata>")
210 211
212 -class FilelistsView(object):
213
214 - def __init__(self, channel, fileobj):
215 self.channel = channel 216 self.fileobj = fileobj
217
218 - def _get_package(self, package):
219 output = [] 220 output.append(" <package pkgid=\"%s\" name=\"%s\" arch=\"%s\">" 221 % (package.checksum, package.name, package.arch)) 222 output.append(" <version epoch=\"%s\" ver=\"%s\" rel=\"%s\" />" 223 % (package.epoch, package.version, package.release)) 224 225 for file_name in package.files: 226 output.append(" <file>%s</file>" % (text_filter(file_name))) 227 output.append(" </package>") 228 return output
229
230 - def write_start(self):
231 output = XML_ENCODING + "\n" + \ 232 "<filelists xmlns=\"http://linux.duke.edu/metadata/filelists\" " + \ 233 "packages=\"%d\">" % self.channel.num_packages 234 235 self.fileobj.write(output)
236
237 - def write_package(self, package):
238 self.fileobj.write('\n'.join(self._get_package(package)))
239
240 - def write_end(self):
241 self.fileobj.write("</filelists>")
242 243
244 -class OtherView(object):
245
246 - def __init__(self, channel, fileobj):
247 self.channel = channel 248 self.fileobj = fileobj
249
250 - def _get_package(self, package):
251 output = [] 252 output.append(" <package pkgid=\"%s\" name=\"%s\" arch=\"%s\">" 253 % (package.checksum, package.name, package.arch)) 254 output.append(" <version epoch=\"%s\" ver=\"%s\" rel=\"%s\" />" 255 % (package.epoch, package.version, package.release)) 256 257 for changelog in package.changelog: 258 output.append(" <changelog author=\"%s\" date=\"%d\">" 259 % (text_filter_attribute(changelog['author']), 260 changelog['date'])) 261 output.append(" " + text_filter(changelog['text'])) 262 output.append(" </changelog>") 263 output.append(" </package>") 264 return output
265
266 - def write_start(self):
267 output = XML_ENCODING + "\n" + \ 268 "<otherdata xmlns=\"http://linux.duke.edu/metadata/other\" " + \ 269 "packages=\"%d\">" % self.channel.num_packages 270 271 self.fileobj.write(output)
272
273 - def write_package(self, package):
274 self.fileobj.write('\n'.join(self._get_package(package)))
275
276 - def write_end(self):
277 self.fileobj.write("</otherdata>")
278 279
280 -class UpdateinfoView(object):
281
282 - def __init__(self, channel, fileobj):
283 self.channel = channel 284 self.fileobj = fileobj
285
286 - def _get_references(self, erratum):
287 output = [] 288 output.append(" <references>") 289 290 ref_string = " <reference href=\"%s%s\" id=\"%s\" type=\"%s\">" 291 for cve_ref in erratum.cve_references: 292 output.append(ref_string 293 % ("http://cve.mitre.org/cgi-bin/cvename.cgi?name=", 294 cve_ref, cve_ref, "cve")) 295 output.append(" </reference>") 296 297 for bz_ref in erratum.bz_references: 298 output.append(ref_string 299 % ("http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=", 300 bz_ref['bug_id'], bz_ref['bug_id'], "bugzilla")) 301 output.append(" " + text_filter(bz_ref['summary'])) 302 output.append(" </reference>") 303 304 output.append(" </references>") 305 return output
306
307 - def _get_packages(self, erratum):
308 output = [] 309 310 output.append(" <pkglist>") 311 output.append(" <collection short=\"%s\">" 312 % text_filter_attribute(self.channel.label)) 313 output.append(" <name>%s</name>" 314 % text_filter(self.channel.name)) 315 316 for package in erratum.packages: 317 output.append(" <package name=\"%s\" version=\"%s\" " 318 "release=\"%s\" epoch=\"%s\" arch=\"%s\" src=\"%s\">" 319 % (package.name, package.version, package.release, 320 package.epoch, package.arch, text_filter(package.source_rpm))) 321 output.append(" <filename>%s</filename>" 322 % text_filter(package.filename)) 323 output.append(" <sum type=\"%s\">%s</sum>" 324 % (package.checksum_type, package.checksum)) 325 output.append(" </package>") 326 327 output.append(" </collection>") 328 output.append(" </pkglist>") 329 return output
330
331 - def _get_erratum(self, erratum):
332 output = [] 333 334 output.append(" <update from=\"security@redhat.com\" " + 335 "status=\"final\" type=\"%s\" version=\"%s\">" 336 % (erratum.advisory_type, erratum.version)) 337 output.append(" <id>%s</id>" % erratum.readable_id) 338 output.append(" <title>%s</title>" % text_filter(erratum.title)) 339 output.append(" <issued date=\"%s\"/>" % erratum.issued) 340 output.append(" <updated date=\"%s\"/>" % erratum.updated) 341 output.append(" <description>%s</description>" 342 % text_filter("%s\n\n\%s" % (erratum.synopsis, erratum.description))) 343 344 output.extend(self._get_references(erratum)) 345 output.extend(self._get_packages(erratum)) 346 347 output.append(" </update>") 348 349 return output
350
351 - def write_updateinfo(self):
352 output = XML_ENCODING + "\n" + "<updates>\n" 353 354 self.fileobj.write(output) 355 356 for erratum in self.channel.errata: 357 self.fileobj.write('\n'.join(self._get_erratum(erratum))) 358 359 self.fileobj.write("\n</updates>")
360 361
362 -class RepoMDView(object):
363
364 - def __init__(self, repomd):
365 self.repomd = repomd
366
367 - def get_file(self):
368 repomd_file = open(self.repomd.filename) 369 return repomd_file
370 371
372 -def text_filter(text):
373 # do & first 374 s = text.replace('&', '&amp;') 375 s = s.replace('<', '&lt;') 376 s = s.replace('>', '&gt;') 377 return s
378 379
380 -def text_filter_attribute(text):
381 s = text_filter(text) 382 s = s.replace('"', '&quot;') 383 return s
384