1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16   
 17   
 18   
 19   
 20  import string 
 21  import sys 
 22  from xml.dom.minidom import parseString 
 23  from xml.sax import SAXParseException 
 24   
 25   
 28   
 29   
 30   
 55   
 56   
 63   
 64   
 66      _db_label = None 
 67      _slot_name = None 
 68   
 70          self.quantity = quantity 
  71   
 74   
 76          """Returns the label of this type of slot in the database""" 
 77          return self._db_label 
  78   
 80          """Returns the name of the slot, used by 
 81          rhn_entitlements.modify_org_service""" 
 82          return self._slot_name 
   83   
 84   
 88   
 89   
 93   
 94   
 95   
 96   
100   
101   
105   
106   
107   
108   
112   
113   
115   
116      """Satellite certificate class 
117      Usage: 
118      c = SatelliteCert() 
119      c.load('<rhn-cert><rhn-cert-field name="owner">John Doe</rhn-cert-field></rhn-cert>') 
120      print c.owner 
121      """ 
122   
123      fields_scalar = ['product', 'owner', 'issued', 'expires', 'slots', 
124                       'provisioning-slots', 'nonlinux-slots', 
125                       'monitoring-slots', 'virtualization_host', 
126                       'virtualization_host_platform', 'satellite-version', 
127                       'generation', ] 
128      fields_list = {'channel-families': ChannelFamily} 
129   
130       
131      datesFormat_cert = '%Y-%m-%d %H:%M:%S' 
132      datesFormat_db = '%Y-%m-%d %H:%M:%S' 
133   
142   
144          try: 
145              self._load(s) 
146          except SAXParseException: 
147              raise ParseException(None, sys.exc_info()[2]) 
148           
149          self._slots.clear() 
150          for slot_name, (slot_attr, factory) in self._slot_maps.items(): 
151              quantity = getattr(self, slot_attr) 
152              self._slots[slot_name] = factory(quantity) 
153   
154          return self 
 155   
157          dom_element = parseString(s) 
158          certs = dom_element.getElementsByTagName("rhn-cert") 
159          if not certs: 
160              self._root = None 
161          else: 
162              self._root = certs[0] 
163          for child in self._root.childNodes: 
164              if child.nodeType != child.ELEMENT_NODE: 
165                   
166                  continue 
167              if child.nodeName == 'rhn-cert-field': 
168                  field_name = child.getAttribute("name") 
169                  if not field_name: 
170                       
171                      continue 
172                  if field_name in self.fields_scalar: 
173                      val = get_text(child) 
174                      if not val: 
175                          continue 
176                      setattr(self, field_name, val) 
177                      continue 
178                  if field_name in self.fields_list: 
179                      val = self.fields_list[field_name](child) 
180                      l = getattr(self, val.attribute_name) 
181                      l.append(val) 
182              elif child.nodeName == 'rhn-cert-signature': 
183                  self.signature = get_text(child) 
184           
185           
186           
187           
188           
189           
190          dom_element.unlink() 
 191   
192      _slot_maps = { 
193          'management': ('slots', ManagementSlots), 
194          'provisioning': ('provisioning-slots', ProvisioningSlots), 
195          'monitoring': ('monitoring-slots', MonitoringSlots), 
196          'virtualization': ('virtualization_host', VirtualizationSlots), 
197          'virtualization_platform': ('virtualization_host_platform', VirtualizationPlatformSlots) 
198      } 
199   
201          if slot_type not in self._slots: 
202              raise AttributeError(slot_type) 
203          return self._slots[slot_type] 
 204   
207   
209           
210          for label, (_, slot_class) in self._slot_maps.items(): 
211              if slot_class._db_label == db_label: 
212                  return label 
213          return None 
  214   
215   
217      return string.join([x.data for x in node.childNodes if x.nodeType == x.TEXT_NODE], "") 
 218