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

Source Code for Module backend.server.rhnCapability

  1  # 
  2  # Copyright (c) 2008--2016 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  # 
 16   
 17  import re 
 18  import string 
 19  import sys 
 20   
 21  # common module 
 22  from spacewalk.common import rhnFlags 
 23  from spacewalk.common.rhnLog import log_debug 
 24   
 25  # local module 
 26  import rhnSQL 
 27   
 28  # Globally store the parsed capabilities in rhnFlags 
 29   
 30   
31 -def set_client_capabilities(capabilities):
32 if not capabilities: 33 # No capabilities presented; don't set the global flag 34 return 35 36 caps = {} 37 regexp = re.compile( 38 r"^(?P<name>[^(]*)\((?P<version>[^)]*)\)\s*=\s*(?P<value>.*)$") 39 for cap in capabilities: 40 mo = regexp.match(cap) 41 if not mo: 42 # XXX Just ignoring it, for now 43 continue 44 dict = mo.groupdict() 45 name = string.strip(dict['name']) 46 version = string.strip(dict['version']) 47 value = string.strip(dict['value']) 48 49 caps[name] = { 50 'version': version, 51 'value': value, 52 } 53 54 rhnFlags.set('client-capabilities', caps) 55 log_debug(4, "Client capabilities", caps)
56 57
58 -def get_client_capabilities():
59 return rhnFlags.get('client-capabilities')
60 61
62 -def update_client_capabilities(server_id):
63 caps = get_client_capabilities() 64 65 if caps is None: 66 caps = {} 67 68 caps = caps.copy() 69 70 h = rhnSQL.prepare(""" 71 select cc.capability_name_id, ccn.name capability, cc.version 72 from rhnClientCapability cc, rhnClientCapabilityName ccn 73 where cc.server_id = :server_id 74 and cc.capability_name_id = ccn.id 75 """) 76 77 updates = {'server_id': [], 'capability_name_id': [], 'version': []} 78 deletes = {'server_id': [], 'capability_name_id': []} 79 inserts = {'server_id': [], 'capability': [], 'version': []} 80 81 h.execute(server_id=server_id) 82 while 1: 83 row = h.fetchone_dict() 84 if not row: 85 break 86 87 name = row['capability'] 88 version = row['version'] 89 capability_name_id = row['capability_name_id'] 90 91 if name in caps: 92 local_ver = caps[name]['version'] 93 del caps[name] 94 if local_ver == version: 95 # Nothing to do - same version 96 continue 97 98 updates['server_id'].append(server_id) 99 updates['capability_name_id'].append(capability_name_id) 100 updates['version'].append(local_ver) 101 continue 102 103 # Have to delete it 104 deletes['server_id'].append(server_id) 105 deletes['capability_name_id'].append(capability_name_id) 106 107 # Everything else has to be inserted 108 for name, hash in caps.items(): 109 inserts['server_id'].append(server_id) 110 inserts['capability'].append(name) 111 inserts['version'].append(hash['version']) 112 113 log_debug(5, "Deletes:", deletes) 114 log_debug(5, "Updates:", updates) 115 log_debug(5, "Inserts:", inserts) 116 117 if deletes['server_id']: 118 h = rhnSQL.prepare(""" 119 delete from rhnClientCapability 120 where server_id = :server_id 121 and capability_name_id = :capability_name_id 122 """) 123 h.executemany(**deletes) 124 125 if updates['server_id']: 126 h = rhnSQL.prepare(""" 127 update rhnClientCapability 128 set version = :version 129 where server_id = :server_id 130 and capability_name_id = :capability_name_id 131 """) 132 h.executemany(**updates) 133 134 if inserts['server_id']: 135 h = rhnSQL.prepare(""" 136 insert into rhnClientCapability 137 (server_id, capability_name_id, version) 138 values (:server_id, LOOKUP_CLIENT_CAPABILITY(:capability), :version) 139 """) 140 h.executemany(**inserts) 141 142 # Commit work. This can be dangerous if there is previously uncommited 143 # work 144 rhnSQL.commit()
145 146
147 -def set_server_capabilities():
148 try: 149 _set_server_capabilities() 150 except rhnSQL.SQLError: 151 e = sys.exc_info()[1] 152 if e.args[0] != 1: 153 # Not a unique constraint violation 154 raise 155 # Try again 156 _set_server_capabilities()
157 158
159 -def _set_server_capabilities():
160 # XXX Will have to figure out how to define this 161 capabilities = { 162 'registration.register_osad': {'version': 1, 'value': 1}, 163 'registration.finish_message': {'version': 1, 'value': 1}, 164 'registration.remaining_subscriptions': {'version': 1, 'value': 1}, 165 'registration.update_contact_info': {'version': 1, 'value': 1}, 166 'registration.delta_packages': {'version': 1, 'value': 1}, 167 'registration.extended_update_support': {'version': 1, 'value': 1}, 168 'registration.smbios': {'version': 1, 'value': 1}, 169 'registration.update_systemid': {'version': 1, 'value': 1}, 170 'applet.has_base_channel': {'version': 1, 'value': 1}, 171 'xmlrpc.login.extra_data': {'version': 1, 'value': 1}, 172 'rhncfg.content.base64_decode': {'version': 1, 'value': 1}, 173 'rhncfg.filetype.directory': {'version': 1, 'value': 1}, 174 'xmlrpc.packages.extended_profile': {'version': '1-2', 'value': 1}, 175 'xmlrpc.packages.checksums': {'version': 1, 'value': 1}, 176 'xmlrpc.errata.patch_names': {'version': 1, 'value': 1}, 177 'staging_content': {'version': 1, 'value': 1}, 178 'ipv6': {'version': 1, 'value': 1}, 179 'abrt': {'version': 1, 'value': 1}, 180 'cpu_sockets': {'version': 1, 'value': 1}, 181 } 182 l = [] 183 for name, hashval in capabilities.items(): 184 l.append("%s(%s)=%s" % (name, hashval['version'], hashval['value'])) 185 186 log_debug(4, "Setting capabilities", l) 187 rhnFlags.get("outputTransportOptions")['X-RHN-Server-Capability'] = l
188