1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 import re
18 import string
19 import sys
20
21
22 from spacewalk.common import rhnFlags
23 from spacewalk.common.rhnLog import log_debug
24
25
26 import rhnSQL
27
28
29
30
56
57
60
61
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
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
104 deletes['server_id'].append(server_id)
105 deletes['capability_name_id'].append(capability_name_id)
106
107
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
143
144 rhnSQL.commit()
145
146
157
158
160
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