Package pulp :: Package server :: Module comps_util
[hide private]
[frames] | no frames]

Source Code for Module pulp.server.comps_util

  1  #!/usr/bin/python 
  2  # 
  3  # Copyright (c) 2010 Red Hat, Inc. 
  4  # 
  5  # This software is licensed to you under the GNU General Public License, 
  6  # version 2 (GPLv2). There is NO WARRANTY for this software, express or 
  7  # implied, including the implied warranties of MERCHANTABILITY or FITNESS 
  8  # FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 
  9  # along with this software; if not, see 
 10  # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. 
 11  # 
 12  # Red Hat trademarks are not licensed under GPLv2. No permission is 
 13  # granted to use or replicate Red Hat trademarks that are incorporated 
 14  # in this software or its documentation. 
 15   
 16   
 17  # Python 
 18  import gzip 
 19  import logging 
 20  import xml.dom 
 21   
 22  # 3rd Party 
 23  import yum.comps 
 24   
 25  import pulp.server 
 26   
 27  log = logging.getLogger(__name__) 
 28   
29 -def yum_group_to_model_group(obj):
30 """ 31 Translate a yum.comps.Group to a model.PackageGroup 32 @param obj: yum.comps.Group object 33 @return: model.PackageGroup object 34 """ 35 grp = pulp.server.db.model.PackageGroup(obj.groupid, obj.name, 36 obj.description, obj.user_visible, obj.display_order, obj.default, 37 obj.langonly) 38 grp['mandatory_package_names'].extend(obj.mandatory_packages.keys()) 39 grp['optional_package_names'].extend(obj.optional_packages.keys()) 40 grp['default_package_names'].extend(obj.default_packages.keys()) 41 grp['conditional_package_names'] = obj.conditional_packages 42 grp['translated_name'] = obj.translated_name 43 grp['translated_description'] = obj.translated_description 44 return grp
45
46 -def yum_category_to_model_category(obj):
47 """ 48 Translate a yum.comps.Category to a model.PackageGroupCategory 49 @param obj: yum.comps.Category object 50 @return: model.PackageGroupCategory object 51 """ 52 ctg = pulp.server.db.model.PackageGroupCategory(obj.categoryid, 53 obj.name, obj.description, obj.display_order) 54 groupids = [grp for grp in obj.groups] 55 ctg['packagegroupids'].extend(groupids) 56 ctg['translated_name'] = obj.translated_name 57 ctg['translated_description'] = obj.translated_description 58 return ctg
59
60 -def model_group_to_yum_group(obj):
61 """ 62 Translate a model.PackageGroup to a yum.comps.Group 63 @param obj: model.PackageGroup obj 64 @return: yum.comps.Group object 65 """ 66 grp = yum.comps.Group() 67 grp.name = obj['name'] 68 grp.description = obj['description'] 69 grp.user_visible = obj['user_visible'] 70 grp.display_order = obj['display_order'] 71 grp.default = obj['default'] 72 grp.langonly = obj['langonly'] 73 grp.groupid = obj['id'] 74 for key in obj['translated_name']: 75 grp.translated_name[key] = obj['translated_name'][key] 76 for key in obj['translated_description']: 77 grp.translated_description[key] = obj['translated_description'][key] 78 for pkgname in obj['mandatory_package_names']: 79 grp.mandatory_packages[pkgname] = 1 80 for pkgname in obj['optional_package_names']: 81 grp.optional_packages[pkgname] = 1 82 for pkgname in obj['default_package_names']: 83 grp.default_packages[pkgname] = 1 84 for key in obj['conditional_package_names']: 85 grp.conditional_packages[key] = obj['conditional_package_names'][key] 86 return grp
87
88 -def model_category_to_yum_category(obj):
89 """ 90 Translate a model.PackageGroupCategory to an object that 91 yum.comps.Comps can work with 92 @param obj: model.PackageGroupCategory object 93 @return: yum.comps.Category 94 """ 95 cat = yum.comps.Category() 96 cat.name = obj['name'] 97 cat.description = obj['description'] 98 cat.display_order = obj['display_order'] 99 cat.categoryid = obj['id'] 100 for key in obj['translated_name']: 101 cat.translated_name[key] = obj['translated_name'][key] 102 for key in obj['translated_description']: 103 cat.translated_description[key] = obj['translated_description'][key] 104 for groupid in obj['packagegroupids']: 105 cat._groups[groupid] = groupid 106 return cat
107
108 -def form_comps_xml(ctgs, grps):
109 """ 110 Form the XML representation of a 'comps.xml' from 111 model.PackageGroupCategories and model.PackageGroup objects 112 @param ctgs: List of model.PackageGroupCategories 113 @param grps: List of model.PackageGroup 114 @return: unicode string representing XML data for 115 passed in Categories/Groups 116 """ 117 newComps = yum.comps.Comps() 118 for cid in ctgs: 119 category = model_category_to_yum_category(ctgs[cid]) 120 newComps.add_category(category) 121 for gid in grps: 122 pkggrp = model_group_to_yum_group(grps[gid]) 123 newComps.add_group(pkggrp) 124 return newComps.xml()
125 126 127
128 -def update_repomd_xml_string(repomd_xml, compsxml_checksum, 129 compsxml_timestamp, compsxml_gz_checksum=None, 130 open_compsxml_gz_checksum=None, compsxml_gz_timestamp=None):
131 """ 132 Accept input xml string of repomd data and update it with new comps info 133 @param repomd_xml: string repomd_xml 134 @param compsxml_checksum: checksum of compsxml file 135 @param compsxml_timestamp: timestamp of compsxml file 136 @param compsxml_gz_checksum: checksum of compsxml gzipped file 137 @param open_compsxml_gz_checksum: checksum of compsxml gzipped file uncompressed 138 @param compsxml_gz_timestamp: timestamp of compsxml gzipped file 139 """ 140 dom = xml.dom.minidom.parseString(repomd_xml) 141 group_elems = filter(lambda x: x.getAttribute("type") == "group", dom.getElementsByTagName("data")) 142 if len(group_elems) > 0: 143 elem = group_elems[0].getElementsByTagName("checksum")[0] 144 elem.childNodes[0].data = compsxml_checksum 145 elem = group_elems[0].getElementsByTagName("timestamp")[0] 146 elem.childNodes[0].data = compsxml_timestamp 147 else: 148 # If no group info is present, then we need to create it. 149 repomd_elems = dom.getElementsByTagName("repomd") 150 if len(repomd_elems) < 1: 151 raise Exception("Unable to find 'repomd' element in %s" % (repomd_xml)) 152 data_elem = dom.createElement("data") 153 data_elem.setAttribute("type", "group") 154 155 loc_elem = dom.createElement("location") 156 loc_elem.setAttribute("href", "repodata/comps.xml") 157 data_elem.appendChild(loc_elem) 158 159 checksum_elem = dom.createElement("checksum") 160 checksum_elem.setAttribute("type", "sha256") 161 checksum_value = dom.createTextNode(compsxml_checksum) 162 checksum_elem.appendChild(checksum_value) 163 data_elem.appendChild(checksum_elem) 164 165 ts_elem = dom.createElement("timestamp") 166 ts_value = dom.createTextNode("%s" % (compsxml_timestamp)) 167 ts_elem.appendChild(ts_value) 168 data_elem.appendChild(ts_elem) 169 repomd_elems[0].appendChild(data_elem) 170 171 if compsxml_gz_checksum is not None and open_compsxml_gz_checksum is not None \ 172 and compsxml_gz_timestamp is not None: 173 group_gz_elems = filter(lambda x: x.getAttribute("type") == "group_gz", 174 dom.getElementsByTagName("data")) 175 if len(group_gz_elems) > 0: 176 elem = group_gz_elems[0].getElementsByTagName("checksum")[0] 177 elem.childNodes[0].data = compsxml_gz_checksum 178 elem = group_gz_elems[0].getElementsByTagName("open-checksum")[0] 179 elem.childNodes[0].data = open_compsxml_gz_checksum 180 elem = group_gz_elems[0].getElementsByTagName("timestamp")[0] 181 elem.childNodes[0].data = compsxml_gz_timestamp 182 else: 183 raise Exception("Not implemented, need to add support for creating group_gz metdata info in repomd.xml") 184 return dom.toxml()
185 186
187 -def update_repomd_xml_file(repomd_path, comps_path, comps_gz_path=None):
188 """ 189 Update the repomd.xml with the checksum info for comps_path 190 @param repomd_path: repomd.xml file path 191 @param comps_path: comps.xml file path 192 @param comps_gz_path: optional comps.xml.gz file path 193 @return: True if repomd_path has been updated, False otherwise 194 """ 195 compsxml_checksum = pulp.server.util.get_file_checksum(hashtype="sha256", 196 filename=comps_path) 197 compsxml_timestamp = pulp.server.util.get_file_timestamp(comps_path) 198 compsxml_gz_checksum = None 199 open_compsxml_gz_checksum = None 200 compsxml_gz_timestamp = None 201 if comps_gz_path: 202 compsxml_gz_checksum = pulp.server.util.get_file_checksum(hashtype="sha256", 203 filename=comps_gz_path) 204 compsxml_gz_timestamp = pulp.server.util.get_file_timestamp(comps_gz_path) 205 uncompressed = gzip.open(comps_gz_path, 'r').read() 206 open_compsxml_gz_checksum = compsxml_checksum 207 try: 208 repomd = open(repomd_path, "r").read() 209 updated_xml = update_repomd_xml_string(repomd, 210 compsxml_checksum, compsxml_timestamp, 211 compsxml_gz_checksum, open_compsxml_gz_checksum, 212 compsxml_gz_timestamp) 213 open(repomd_path, "w").write(updated_xml.encode("UTF-8")) 214 log.info("update_repomd_xml_file completed") 215 except xml.dom.DOMException, e: 216 log.error(e) 217 log.error("Unable to update group info for %s" % (repomd_path)) 218 return False 219 return True
220