1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 import gzip
19 import logging
20 import xml.dom
21
22
23 import yum.comps
24
25 import pulp.server
26
27 log = logging.getLogger(__name__)
28
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
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
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
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
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
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
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