1 karl 1.84 //%2006////////////////////////////////////////////////////////////////////////
|
2 kumpf 1.1 //
|
3 karl 1.73 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 karl 1.57 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.73 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.75 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.84 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 kumpf 1.1 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
15 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
18 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
|
20 karl 1.57 //
|
21 kumpf 1.1 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
22 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 // Author: Yi Zhou (yi_zhou@hp.com)
33 //
34 // Modified By: Chip Vincent (cvincent@us.ibm.com)
35 // Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
36 // Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
|
37 kumpf 1.20 // Carol Ann Krug Graves, Hewlett-Packard Company
38 // (carolann_graves@hp.com)
|
39 kumpf 1.71 // Seema Gupta (gseema@in.ibm.com) for PEP135
|
40 kumpf 1.1 //
41 //%/////////////////////////////////////////////////////////////////////////////
42
|
43 kumpf 1.5 #include "ProviderRegistrationProvider.h"
44
|
45 kumpf 1.4 #include <Pegasus/Common/PegasusVersion.h>
|
46 kumpf 1.5 #include <Pegasus/Common/XmlWriter.h>
|
47 kumpf 1.6 #include <Pegasus/Common/Constants.h>
48 #include <Pegasus/Common/CIMMessage.h>
|
49 se.gupta 1.67 #include <Pegasus/Common/OperationContextInternal.h>
|
50 kumpf 1.15 #include <Pegasus/Common/System.h>
|
51 humberto 1.48 #include <Pegasus/Common/MessageLoader.h> //l10n
|
52 kumpf 1.68 #include <Pegasus/Common/Constants.h>
|
53 kumpf 1.1
54 PEGASUS_NAMESPACE_BEGIN
55
56 /**
57 The name of the CapabilityID property for provider capabilities class
58 */
|
59 kumpf 1.36 static const CIMName _PROPERTY_CAPABILITYID = CIMName ("CapabilityID");
|
60 kumpf 1.1
61 /**
62 stopping provider method
63 */
|
64 kumpf 1.36 static const CIMName _STOP_PROVIDER = CIMName ("Stop");
|
65 kumpf 1.1
66 /**
67 starting provider method
68 */
|
69 kumpf 1.36 static const CIMName _START_PROVIDER = CIMName ("Start");
|
70 kumpf 1.1
71 ProviderRegistrationProvider::ProviderRegistrationProvider(
72 ProviderRegistrationManager * providerRegistrationManager)
|
73 kumpf 1.6 :_id(peg_credential_types::PROVIDER)
|
74 kumpf 1.1 {
75 _providerRegistrationManager = providerRegistrationManager;
|
76 kumpf 1.6
77 _controller = &(ModuleController::get_client_handle(_id, &_client_handle));
78 if(_client_handle == NULL)
|
79 kumpf 1.32 throw UninitializedObjectException();
|
80 kumpf 1.1 }
81
82 ProviderRegistrationProvider::~ProviderRegistrationProvider(void)
83 {
|
84 kumpf 1.6 if (_client_handle)
85 {
86 delete _client_handle;
87 }
88
|
89 kumpf 1.1 }
90
91 void ProviderRegistrationProvider::initialize(CIMOMHandle & cimom)
92 {
93 // This method should not be called because this is a control provider
94 // and is not dynamically loaded through the provider manager
95 }
96
97 void ProviderRegistrationProvider::terminate(void)
98 {
|
99 konrad.r 1.79 // delete self. this is necessary because the entry point for this object allocated it, and
100 // the module is responsible for its memory management.
101 delete this;
|
102 kumpf 1.1 }
103
104 // get registered provider
105 void ProviderRegistrationProvider::getInstance(
106 const OperationContext & context,
|
107 kumpf 1.13 const CIMObjectPath & instanceReference,
|
108 kumpf 1.34 const Boolean includeQualifiers,
109 const Boolean includeClassOrigin,
|
110 kumpf 1.2 const CIMPropertyList & propertyList,
|
111 kumpf 1.33 InstanceResponseHandler & handler)
|
112 kumpf 1.1 {
113
|
114 kumpf 1.36 if(!instanceReference.getNameSpace().equal (PEGASUS_NAMESPACENAME_INTEROP))
|
115 kumpf 1.10 {
|
116 kumpf 1.30 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
|
117 kumpf 1.36 instanceReference.getNameSpace().getString());
|
118 kumpf 1.10 }
119
|
120 kumpf 1.1 // ensure the class existing in the specified namespace
|
121 kumpf 1.36 CIMName className = instanceReference.getClassName();
|
122 kumpf 1.1
|
123 kumpf 1.36 if(!className.equal (PEGASUS_CLASSNAME_PROVIDER) &&
124 !className.equal (PEGASUS_CLASSNAME_PROVIDERCAPABILITIES) &&
|
125 kumpf 1.46 !className.equal (PEGASUS_CLASSNAME_CONSUMERCAPABILITIES) &&
|
126 kumpf 1.36 !className.equal (PEGASUS_CLASSNAME_PROVIDERMODULE))
|
127 kumpf 1.1 {
|
128 kumpf 1.36 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
129 className.getString());
|
130 kumpf 1.1 }
131
132 // begin processing the request
133 handler.processing();
134
135 CIMInstance instance;
136
137 try
138 {
|
139 kumpf 1.60 instance = _providerRegistrationManager->getInstance(instanceReference,
140 includeQualifiers,
141 includeClassOrigin,
142 propertyList);
|
143 kumpf 1.1 }
|
144 david.dillard 1.78 catch(const CIMException&)
|
145 kumpf 1.1 {
|
146 david.dillard 1.78 throw;
|
147 kumpf 1.1 }
148
149 handler.deliver(instance);
150
151 // complete processing the request
152 handler.complete();
153 }
154
155 // get all registered providers
156 void ProviderRegistrationProvider::enumerateInstances(
157 const OperationContext & context,
|
158 kumpf 1.13 const CIMObjectPath & classReference,
|
159 kumpf 1.34 const Boolean includeQualifiers,
160 const Boolean includeClassOrigin,
|
161 kumpf 1.2 const CIMPropertyList & propertyList,
|
162 kumpf 1.33 InstanceResponseHandler & handler)
|
163 kumpf 1.1 {
|
164 kumpf 1.36 if(!classReference.getNameSpace().equal (PEGASUS_NAMESPACENAME_INTEROP))
|
165 kumpf 1.10 {
|
166 kumpf 1.36 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
167 classReference.getNameSpace().getString());
|
168 kumpf 1.10 }
169
|
170 kumpf 1.1 // ensure the class existing in the specified namespace
|
171 kumpf 1.36 CIMName className = classReference.getClassName();
|
172 kumpf 1.1
|
173 kumpf 1.36 if(!className.equal (PEGASUS_CLASSNAME_PROVIDER) &&
174 !className.equal (PEGASUS_CLASSNAME_PROVIDERCAPABILITIES) &&
|
175 kumpf 1.46 !className.equal (PEGASUS_CLASSNAME_CONSUMERCAPABILITIES) &&
|
176 kumpf 1.36 !className.equal (PEGASUS_CLASSNAME_PROVIDERMODULE))
|
177 kumpf 1.1 {
|
178 kumpf 1.36 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
179 className.getString());
|
180 kumpf 1.1 }
181
182 // begin processing the request
183 handler.processing();
184
|
185 kumpf 1.20 Array<CIMInstance> enumInstances;
|
186 kumpf 1.1
187 try
188 {
|
189 kumpf 1.60 enumInstances =
190 _providerRegistrationManager->enumerateInstances(classReference,
191 includeQualifiers,
192 includeClassOrigin,
193 propertyList);
|
194 kumpf 1.1 }
|
195 david.dillard 1.78 catch(const CIMException&)
|
196 kumpf 1.1 {
|
197 david.dillard 1.78 throw;
|
198 kumpf 1.1 }
199
|
200 kumpf 1.21 handler.deliver(enumInstances);
|
201 kumpf 1.1
202 // complete processing the request
203 handler.complete();
204 }
205
206 // get all registered provider names
207 void ProviderRegistrationProvider::enumerateInstanceNames(
208 const OperationContext & context,
|
209 kumpf 1.13 const CIMObjectPath & classReference,
|
210 kumpf 1.33 ObjectPathResponseHandler & handler)
|
211 kumpf 1.1 {
|
212 kumpf 1.36 if(!classReference.getNameSpace().equal (PEGASUS_NAMESPACENAME_INTEROP))
|
213 kumpf 1.10 {
|
214 kumpf 1.36 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
215 classReference.getNameSpace().getString());
|
216 kumpf 1.10 }
217
|
218 kumpf 1.1 // ensure the class existing in the specified namespace
|
219 kumpf 1.36 CIMName className = classReference.getClassName();
|
220 kumpf 1.1
|
221 kumpf 1.36 if(!className.equal (PEGASUS_CLASSNAME_PROVIDER) &&
222 !className.equal (PEGASUS_CLASSNAME_PROVIDERCAPABILITIES) &&
|
223 kumpf 1.46 !className.equal (PEGASUS_CLASSNAME_CONSUMERCAPABILITIES) &&
|
224 kumpf 1.36 !className.equal (PEGASUS_CLASSNAME_PROVIDERMODULE))
|
225 kumpf 1.1 {
|
226 kumpf 1.36 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
227 className.getString());
|
228 kumpf 1.1 }
229
230 // begin processing the request
231 handler.processing();
232
|
233 kumpf 1.13 Array<CIMObjectPath> enumInstanceNames;
|
234 kumpf 1.1
235 // get all instance names from repository
236 try
237 {
|
238 david.dillard 1.78 enumInstanceNames =
239 _providerRegistrationManager->enumerateInstanceNames(classReference);
|
240 kumpf 1.1 }
|
241 david.dillard 1.78 catch(const CIMException&)
|
242 kumpf 1.1 {
|
243 david.dillard 1.78 throw;
|
244 kumpf 1.1 }
245
246 handler.deliver(enumInstanceNames);
247
248 // complete processing the request
249 handler.complete();
250 }
251
252 // change properties for the registered provider
|
253 chip 1.24 // only support to change property of Namespaces, property of
|
254 kumpf 1.1 // SupportedProperties, and property of SupportedMethods
255 void ProviderRegistrationProvider::modifyInstance(
|
256 kumpf 1.15 const OperationContext & context,
|
257 kumpf 1.13 const CIMObjectPath & instanceReference,
|
258 kumpf 1.1 const CIMInstance & instanceObject,
|
259 kumpf 1.34 const Boolean includeQualifiers,
|
260 kumpf 1.2 const CIMPropertyList & propertyList,
|
261 kumpf 1.33 ResponseHandler & handler)
|
262 kumpf 1.1 {
|
263 kumpf 1.15 // get userName and only privileged user can execute this operation
|
264 kumpf 1.19 String userName;
265 try
266 {
|
267 kumpf 1.37 IdentityContainer container = context.get(IdentityContainer::NAME);
|
268 kumpf 1.19 userName = container.getUserName();
269 }
270 catch (...)
271 {
272 userName = String::EMPTY;
273 }
|
274 kumpf 1.15
|
275 chip 1.24 if ((userName != String::EMPTY) && !System::isPrivilegedUser(userName))
|
276 kumpf 1.15 {
|
277 humberto 1.48 //l10n
278 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_ACCESS_DENIED,
279 //"You must have superuser privilege to modify the registration.");
280 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_ACCESS_DENIED,MessageLoaderParms(
281 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.SUPERUSER_PRIVILEGE_REQUIRED_MODIFY_REGISTRATION",
282 "You must have superuser privilege to modify the registration."));
|
283 kumpf 1.15 }
284
|
285 kumpf 1.36 if(!instanceReference.getNameSpace().equal (PEGASUS_NAMESPACENAME_INTEROP))
|
286 kumpf 1.10 {
|
287 kumpf 1.36 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
288 instanceReference.getNameSpace().getString());
|
289 kumpf 1.10 }
290
|
291 kumpf 1.1 //
292 // only support to modify the instance of PG_ProviderCapabilities
293 //
|
294 kumpf 1.36 if (!instanceReference.getClassName().equal
295 (PEGASUS_CLASSNAME_PROVIDERCAPABILITIES))
|
296 kumpf 1.1 {
|
297 kumpf 1.36 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
298 instanceReference.getClassName().getString());
|
299 kumpf 1.1 }
300
301 //
|
302 kumpf 1.2 // only can modify the property of Namespaces, property of
|
303 kumpf 1.1 // SupportedProperties, and property of SupportedMethods
304 //
|
305 kumpf 1.2 if (propertyList.isNull())
|
306 kumpf 1.1 {
|
307 humberto 1.48 //l10n
308 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
309 //"Only can modify Namespaces, SupportedProperties, and SupportedMethods.");
310 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED, MessageLoaderParms(
311 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.CAN_ONLY_MODIFY_ERR",
|
312 humberto 1.50 "Only can modify Namespaces, SupportedProperties, and SupportedMethods."));
|
313 kumpf 1.2 }
314
|
315 kumpf 1.28 Array<CIMName> propertyArray = propertyList.getPropertyNameArray();
|
316 kumpf 1.2 for (Uint32 i=0; i<propertyArray.size(); i++)
317 {
|
318 kumpf 1.36 if (!propertyArray[i].equal (_PROPERTY_NAMESPACES) &&
319 !propertyArray[i].equal (_PROPERTY_SUPPORTEDPROPERTIES) &&
320 !propertyArray[i].equal (_PROPERTY_SUPPORTEDMETHODS))
|
321 kumpf 1.1 {
|
322 kumpf 1.36 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
323 propertyArray[i].getString());
|
324 kumpf 1.2 }
|
325 kumpf 1.1 }
326
327 // begin processing the request
328 handler.processing();
329
330 try
331 {
|
332 kumpf 1.60 _providerRegistrationManager->modifyInstance(instanceReference,
333 instanceObject,
334 includeQualifiers,
335 propertyArray);
|
336 kumpf 1.1 }
|
337 david.dillard 1.78 catch(const CIMException& e)
|
338 kumpf 1.1 {
|
339 david.dillard 1.78 throw;
|
340 kumpf 1.1 }
341
342 // complete processing the request
343 handler.complete();
344 }
345
346 // register a provider
347 void ProviderRegistrationProvider::createInstance(
348 const OperationContext & context,
|
349 kumpf 1.13 const CIMObjectPath & instanceReference,
|
350 kumpf 1.1 const CIMInstance & instanceObject,
|
351 kumpf 1.33 ObjectPathResponseHandler & handler)
|
352 kumpf 1.1 {
|
353 kumpf 1.15 // get userName and only privileged user can execute this operation
|
354 kumpf 1.19 String userName;
355 try
356 {
|
357 kumpf 1.37 IdentityContainer container = context.get(IdentityContainer::NAME);
|
358 kumpf 1.19 userName = container.getUserName();
359 }
360 catch (...)
361 {
362 userName = String::EMPTY;
363 }
|
364 kumpf 1.15
|
365 chip 1.24 if ((userName != String::EMPTY) && !System::isPrivilegedUser(userName))
|
366 kumpf 1.15 {
|
367 humberto 1.48 //l10n
368 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_ACCESS_DENIED,
369 //"You must have superuser privilege to register providers.");
370 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_ACCESS_DENIED, MessageLoaderParms(
371 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.SUPERUSER_PRIVILEGE_REQUIRED_REGISTER_PROVIDERS",
372 "You must have superuser privilege to register providers."));
|
373 kumpf 1.15 }
374
|
375 kumpf 1.36 CIMName className = instanceReference.getClassName();
376 CIMNamespaceName nameSpace = instanceReference.getNameSpace();
|
377 kumpf 1.1
|
378 kumpf 1.13 CIMObjectPath returnReference;
|
379 kumpf 1.1
380 CIMInstance instance = instanceObject;
381
|
382 kumpf 1.36 if(!nameSpace.equal (PEGASUS_NAMESPACENAME_INTEROP))
|
383 kumpf 1.10 {
|
384 kumpf 1.36 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
385 nameSpace.getString());
|
386 kumpf 1.10 }
387
|
388 kumpf 1.1 // ensure the class existing in the specified namespace
|
389 kumpf 1.36 if(!className.equal (PEGASUS_CLASSNAME_PROVIDER) &&
390 !className.equal (PEGASUS_CLASSNAME_PROVIDERCAPABILITIES) &&
|
391 kumpf 1.46 !className.equal (PEGASUS_CLASSNAME_CONSUMERCAPABILITIES) &&
|
392 kumpf 1.36 !className.equal (PEGASUS_CLASSNAME_PROVIDERMODULE))
|
393 kumpf 1.1 {
|
394 kumpf 1.36 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
395 className.getString());
|
396 kumpf 1.1 }
397
398 //
399 // Check all required properties are set
400 //
|
401 kumpf 1.36 if (className.equal (PEGASUS_CLASSNAME_PROVIDERMODULE))
|
402 kumpf 1.1 {
403 //
404 // Name, Version, InterfaceType, InterfaceVersion, and Location
405 // properties must be set
406 // OperationalStatus property needs to be set. If not, set to default
407 //
|
408 kumpf 1.27 if (instanceObject.findProperty(_PROPERTY_PROVIDERMODULE_NAME) ==
409 PEG_NOT_FOUND)
|
410 kumpf 1.1 {
|
411 humberto 1.53 //l10n 485
|
412 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
413 //"Missing Name which is required property in PG_ProviderModule class.");
414 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
|
415 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_NAME_IN_PG_PROVIDERMODULE",
416 "Missing Name which is required property in PG_ProviderModule class."));
|
417 kumpf 1.12 }
418
|
419 kumpf 1.27 if (instanceObject.findProperty(_PROPERTY_VENDOR) == PEG_NOT_FOUND)
|
420 kumpf 1.12 {
|
421 humberto 1.53 //l10n 485
|
422 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
423 //"Missing Vendor which is required property in PG_ProviderModule class.");
424 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
|
425 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_VENDOR_IN_PG_PROVIDERMODULE",
426 "Missing Vendor which is required property in PG_ProviderModule class."));
|
427 kumpf 1.1 }
428
|
429 kumpf 1.27 if (instanceObject.findProperty(_PROPERTY_VERSION) == PEG_NOT_FOUND)
|
430 kumpf 1.1 {
|
431 humberto 1.53 //l10n 485
|
432 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
433 //"Missing Version which is required property in PG_ProviderModule class.");
434 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
|
435 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_VERSION_IN_PG_PROVIDERMODULE",
436 "Missing Version which is required property in PG_ProviderModule class."));
|
437 kumpf 1.1 }
438
|
439 kumpf 1.41 Uint32 ifcTypeIndex =
440 instanceObject.findProperty(_PROPERTY_INTERFACETYPE);
441 if (ifcTypeIndex == PEG_NOT_FOUND)
|
442 kumpf 1.1 {
|
443 humberto 1.53 //l10n 485
|
444 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
445 //"Missing InterfaceType which is required property in PG_ProviderModule class.");
446 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
|
447 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_INTERFACETYPE_IN_PG_PROVIDERMODULE",
|
448 humberto 1.54 "Missing InterfaceType which is required property in PG_ProviderModule class."));
|
449 kumpf 1.1 }
|
450 kumpf 1.41 String ifcTypeString;
451 instanceObject.getProperty(ifcTypeIndex).getValue().
452 get(ifcTypeString);
|
453 mday 1.45
|
454 schuur 1.63 if (ifcTypeString != "C++Default"
|
455 se.gupta 1.72 #ifdef PEGASUS_ENABLE_CMPI_PROVIDER_MANAGER
|
456 schuur 1.63 && ifcTypeString != "CMPI"
457 #endif
|
458 mark.hamzy 1.85 #ifdef PEGASUS_ENABLE_JMPI_PROVIDER_MANAGER
459 && (ifcTypeString != "JMPI")
460 && (ifcTypeString != "JMPIExperimental")
461 #endif
|
462 schuur 1.63 )
|
463 kumpf 1.41 {
|
464 humberto 1.53 //l10n 485
|
465 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
466 //"Unsupported InterfaceType value: \"" + ifcTypeString + "\"");
467 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED,MessageLoaderParms(
|
468 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.UNSUPPORTED_INTERFACETYPE_VALUE",
469 "Unsupported InterfaceType value: \"$0\"",ifcTypeString));
|
470 kumpf 1.41 }
|
471 kumpf 1.1
|
472 kumpf 1.41 Uint32 ifcVersionIndex =
473 instanceObject.findProperty(_PROPERTY_INTERFACEVERSION);
474 if (ifcVersionIndex == PEG_NOT_FOUND)
|
475 kumpf 1.1 {
|
476 humberto 1.53 //l10n 485
|
477 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
478 //"Missing InterfaceVersion which is required property in PG_ProviderModule class.");
479 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
|
480 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_INTERFACEVERSION_IN_PG_PROVIDERMODULE",
481 "Missing InterfaceVersion which is required property in PG_ProviderModule class."));
|
482 kumpf 1.41 }
483 String ifcVersionString;
484 instanceObject.getProperty(ifcVersionIndex).getValue().
485 get(ifcVersionString);
|
486 schuur 1.63 if (
|
487 se.gupta 1.72 #ifdef PEGASUS_ENABLE_CMPI_PROVIDER_MANAGER
|
488 schuur 1.63 (ifcTypeString == "CMPI" &&
489 ifcVersionString != "2.0.0") ||
490 #endif
|
491 mark.hamzy 1.85 #ifdef PEGASUS_ENABLE_JMPI_PROVIDER_MANAGER
492 (ifcTypeString == "JMPI" &&
493 ifcVersionString != "1.0.0" &&
494 ifcVersionString != "2.0.0" &&
495 ifcVersionString != "2.2.0") ||
496 (ifcTypeString == "JMPIExperimental" &&
497 ifcVersionString != "0.0.1") ||
498 #endif
|
499 schuur 1.63 (ifcTypeString == "C++Default" &&
500 ifcVersionString != "2.1.0" &&
501 ifcVersionString != "2.2.0" &&
|
502 kumpf 1.74 ifcVersionString != "2.3.0" &&
503 ifcVersionString != "2.5.0"))
|
504 kumpf 1.41 {
|
505 humberto 1.53 //l10n 485
|
506 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
507 //"Unsupported InterfaceVersion value: \"" + ifcVersionString +
508 // "\"");
509 String unsupported = "InterfaceVersion";
510 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED,MessageLoaderParms(
|
511 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.UNSUPPORTED_INTERFACEVERSION_VALUE",
512 "Unsupported InterfaceVersion value: \"$0\"",ifcVersionString));
|
513 kumpf 1.1 }
514
|
515 kumpf 1.27 if (instanceObject.findProperty(_PROPERTY_LOCATION) == PEG_NOT_FOUND)
|
516 kumpf 1.1 {
|
517 humberto 1.53 //l10n 485
|
518 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
519 //"Missing Location which is required property in PG_ProviderModule class.");
520 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
|
521 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_LOCATION_IN_PG_PROVIDERMODULE",
522 "Missing Location which is required property in PG_ProviderModule class."));
|
523 kumpf 1.1 }
524
|
525 kumpf 1.27 if (instanceObject.findProperty(_PROPERTY_OPERATIONALSTATUS) ==
526 PEG_NOT_FOUND)
|
527 kumpf 1.1 {
528 Array<Uint16> _operationalStatus;
|
529 kumpf 1.68 _operationalStatus.append(CIM_MSE_OPSTATUS_VALUE_OK);
|
530 kumpf 1.1 instance.addProperty (CIMProperty
531 (_PROPERTY_OPERATIONALSTATUS, _operationalStatus));
532 }
|
533 kumpf 1.74
534 //
535 // Validate the UserContext property
536 //
|
537 kumpf 1.76 CIMValue userContextValue;
|
538 kumpf 1.74 Uint32 userContextIndex = instanceObject.findProperty(
539 PEGASUS_PROPERTYNAME_MODULE_USERCONTEXT);
|
540 kumpf 1.76
|
541 kumpf 1.74 if (userContextIndex != PEG_NOT_FOUND)
542 {
|
543 kumpf 1.76 userContextValue =
544 instanceObject.getProperty(userContextIndex).getValue();
545 }
546
547 if (!userContextValue.isNull())
548 {
|
549 kumpf 1.74 #ifdef PEGASUS_DISABLE_PROV_USERCTXT
550 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, MessageLoaderParms(
551 "ControlProviders.ProviderRegistrationProvider."
552 "ProviderRegistrationProvider.USERCONTEXT_UNSUPPORTED",
553 "The UserContext property in the PG_ProviderModule class is "
554 "not supported."));
555 #else
|
556 kumpf 1.76 Uint16 userContext;
557 userContextValue.get(userContext);
|
558 kumpf 1.74
559 if (!(
560 # ifndef PEGASUS_DISABLE_PROV_USERCTXT_REQUESTOR
|
561 kumpf 1.76 (userContext == PG_PROVMODULE_USERCTXT_REQUESTOR) ||
|
562 kumpf 1.74 # endif
563 # ifndef PEGASUS_DISABLE_PROV_USERCTXT_DESIGNATED
|
564 kumpf 1.76 (userContext == PG_PROVMODULE_USERCTXT_DESIGNATED) ||
|
565 kumpf 1.74 # endif
566 # ifndef PEGASUS_DISABLE_PROV_USERCTXT_PRIVILEGED
|
567 kumpf 1.76 (userContext == PG_PROVMODULE_USERCTXT_PRIVILEGED) ||
|
568 kumpf 1.74 # endif
569 # ifndef PEGASUS_DISABLE_PROV_USERCTXT_CIMSERVER
|
570 kumpf 1.76 (userContext == PG_PROVMODULE_USERCTXT_CIMSERVER) ||
|
571 kumpf 1.74 # endif
572 0))
573 {
574 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED,
575 MessageLoaderParms(
576 "ControlProviders.ProviderRegistrationProvider."
577 "ProviderRegistrationProvider."
578 "UNSUPPORTED_USERCONTEXT_VALUE",
579 "Unsupported UserContext value: \"$0\".",
|
580 kumpf 1.76 userContext));
|
581 kumpf 1.74 }
582
583 // DesignatedUserContext property is required when UserContext == 3
|
584 kumpf 1.76 if (userContext == PG_PROVMODULE_USERCTXT_DESIGNATED)
|
585 kumpf 1.74 {
586 Uint32 designatedUserIndex = instanceObject.findProperty(
587 PEGASUS_PROPERTYNAME_MODULE_DESIGNATEDUSER);
588 if ((designatedUserIndex == PEG_NOT_FOUND) ||
589 instanceObject.getProperty(designatedUserIndex).getValue()
590 .isNull())
591 {
592 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,
593 MessageLoaderParms(
594 "ControlProviders.ProviderRegistrationProvider."
595 "ProviderRegistrationProvider."
596 "MISSING_DESIGNATEDUSER_IN_PG_PROVIDERMODULE",
597 "Missing DesignatedUserContext property in "
598 "PG_ProviderModule instance."));
599 }
600 else
601 {
602 // Validate that DesignatedUserContext is of String type
603 String designatedUser;
604 instanceObject.getProperty(designatedUserIndex).getValue()
605 .get(designatedUser);
606 kumpf 1.74 }
607 }
608 #endif
609 }
|
610 kumpf 1.1 }
|
611 kumpf 1.36 else if (className.equal (PEGASUS_CLASSNAME_PROVIDERCAPABILITIES))
|
612 kumpf 1.1 {
613 //
614 // ProviderModuleName, ProviderName, InstanceID, ClassName,
615 // Namespaces, and ProviderType properties must be set
616 //
617
|
618 kumpf 1.27 if (instanceObject.findProperty(_PROPERTY_PROVIDERMODULENAME) ==
619 PEG_NOT_FOUND)
|
620 kumpf 1.1 {
|
621 humberto 1.53 //l10n 485
|
622 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
623 //"Missing ProviderModuleName which is required property in PG_ProviderCapabilities class.");
624 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
|
625 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_PROVIDERMODULENAME_IN_PG_PROVIDERCAPABILITIES",
626 "Missing ProviderModuleName which is required property in PG_ProviderCapabilities class."));
|
627 kumpf 1.1 }
628
|
629 kumpf 1.27 if (instanceObject.findProperty(_PROPERTY_PROVIDERNAME) ==
630 PEG_NOT_FOUND)
|
631 kumpf 1.1 {
|
632 humberto 1.53 //l10n 485
|
633 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
634 //"Missing ProviderName which is required property in PG_ProviderCapabilities class.");
635 String missing = "ProviderName";
636 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
637 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_REQUIRED_PROPERTY",
|
638 humberto 1.53 "Missing ProviderName which is required property in PG_ProviderCapabilities class."));
|
639 kumpf 1.1 }
640
|
641 kumpf 1.27 if (instanceObject.findProperty(_PROPERTY_CAPABILITYID) ==
642 PEG_NOT_FOUND)
|
643 kumpf 1.1 {
|
644 humberto 1.53 //l10n 485
|
645 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
646 //"Missing CapabilityID which is required property in PG_ProviderCapabilities class.");
647 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
|
648 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSINGCAPABILITYID_IN_PG_PROVIDERCAPABILITIES",
649 "Missing CapabilityID which is required property in PG_ProviderCapabilities class."));
|
650 kumpf 1.1 }
651
|
652 kumpf 1.27 if (instanceObject.findProperty(_PROPERTY_CLASSNAME) == PEG_NOT_FOUND)
|
653 kumpf 1.1 {
|
654 humberto 1.53 //l10n 485
|
655 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
656 //"Missing ClassName which is required property in PG_ProviderCapabilities class.");
657 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
|
658 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_CLASSNAME_IN_PG_PROVIDERCAPABILITIES",
659 "Missing ClassName which is required property in PG_ProviderCapabilities class."));
|
660 kumpf 1.1 }
661
|
662 kumpf 1.80 // Validate the Namespaces property
663
664 Uint32 namespacesIndex =
665 instanceObject.findProperty(_PROPERTY_NAMESPACES);
666 Array<String> namespacesArray;
667 if (namespacesIndex != PEG_NOT_FOUND)
668 {
669 CIMValue namespacesValue =
670 instanceObject.getProperty(namespacesIndex).getValue();
671 if (!namespacesValue.isNull())
672 {
673 namespacesValue.get(namespacesArray);
674 }
675 }
676
677 if (namespacesArray.size() == 0)
|
678 kumpf 1.1 {
|
679 kumpf 1.80 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, MessageLoaderParms(
680 "ControlProviders.ProviderRegistrationProvider."
681 "ProviderRegistrationProvider."
682 "MISSING_NAMESPACES_IN_PG_PROVIDERCAPABILITIES",
683 "Missing Namespaces which is required property in "
684 "PG_ProviderCapabilities class."));
|
685 kumpf 1.1 }
686
|
687 kumpf 1.77 // Validate the ProviderType property
688
689 Uint32 providerTypeIndex =
690 instanceObject.findProperty(_PROPERTY_PROVIDERTYPE);
691 Array<Uint16> providerTypeArray;
692 if (providerTypeIndex != PEG_NOT_FOUND)
693 {
|
694 kumpf 1.80 CIMValue providerTypeValue =
695 instanceObject.getProperty(providerTypeIndex).getValue();
696 if (!providerTypeValue.isNull())
697 {
698 providerTypeValue.get(providerTypeArray);
699 }
|
700 kumpf 1.77 }
701
|
702 kumpf 1.80 if (providerTypeArray.size() == 0)
|
703 kumpf 1.77 {
704 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,
705 MessageLoaderParms(
706 "ControlProviders.ProviderRegistrationProvider."
707 "ProviderRegistrationProvider."
708 "MISSING_PROVIDERTYPE_IN_PG_PROVIDERCAPABILITIES",
709 "Missing ProviderType which is required property in "
710 "PG_ProviderCapabilities class."));
711 }
712
713 for (Uint32 i = 0; i < providerTypeArray.size(); i++)
714 {
715 if ((providerTypeArray[i] < 2) ||
716 #ifdef PEGASUS_DISABLE_EXECQUERY
717 (providerTypeArray[i] > 6)
718 #else
719 (providerTypeArray[i] > 7)
720 #endif
721 )
722 {
723 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,
724 kumpf 1.77 MessageLoaderParms(
725 "ControlProviders.ProviderRegistrationProvider."
726 "ProviderRegistrationProvider.UNSUPPORTED_"
727 "PROVIDERTYPE_IN_PG_PROVIDERCAPABILITIES",
728 "Unsupported ProviderType value \"$0\" in "
729 "PG_ProviderCapabilities instance.",
730 providerTypeArray[i]));
731 }
732 }
|
733 kumpf 1.1 }
|
734 kumpf 1.46 else if (className.equal (PEGASUS_CLASSNAME_CONSUMERCAPABILITIES))
735 {
736 //
737 // ProviderModuleName, ProviderName, CapabilityID, ProviderType,
738 // and Destinations properties must be set
739 //
740
741 if (instanceObject.findProperty(_PROPERTY_PROVIDERMODULENAME) ==
742 PEG_NOT_FOUND)
743 {
|
744 humberto 1.49 //L10N_ TODO DONE
745 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
746 //"Missing ProviderModuleName which is required property in PG_ConsumerCapabilities class.");
747 MessageLoaderParms parms(
748 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_PROVIDER_MODULE_NAME_WHICH_IS_REQUIRED",
|
749 kumpf 1.46 "Missing ProviderModuleName which is required property in PG_ConsumerCapabilities class.");
|
750 humberto 1.49
751 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, parms);
|
752 kumpf 1.46 }
753
754 if (instanceObject.findProperty(_PROPERTY_PROVIDERNAME) ==
755 PEG_NOT_FOUND)
756 {
|
757 humberto 1.49 //L10N_ TODO DONE
758 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
759 //"Missing ProviderName which is required property in PG_ConsumerCapabilities class.");
760
761 MessageLoaderParms parms(
762 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_PROVIDER_NAME_WHICH_IS_REQUIRED",
|
763 kumpf 1.46 "Missing ProviderName which is required property in PG_ConsumerCapabilities class.");
|
764 humberto 1.49
765 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, parms);
|
766 kumpf 1.46 }
767
768 if (instanceObject.findProperty(_PROPERTY_CAPABILITYID) ==
769 PEG_NOT_FOUND)
770 {
|
771 humberto 1.49 //L10N_ TODO DONE
772 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
773 //"Missing CapabilityID which is required property in PG_ConsumerCapabilities class.");
774
775 MessageLoaderParms parms(
776 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_CAPABILITY_ID_WHICH_IS_REQUIRED",
|
777 kumpf 1.46 "Missing CapabilityID which is required property in PG_ConsumerCapabilities class.");
|
778 humberto 1.49
779 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, parms);
|
780 kumpf 1.46 }
781
782 if (instanceObject.findProperty(_PROPERTY_PROVIDERTYPE) == PEG_NOT_FOUND)
783 {
|
784 humberto 1.49 //L10N_ TODO DONE
785 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
786 //"Missing ProviderType which is required property in PG_ConsumerCapabilities class.");
787
788 MessageLoaderParms parms(
789 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_PROVIDER_TYPE_WHICH_IS_REQUIRED",
|
790 kumpf 1.46 "Missing ProviderType which is required property in PG_ConsumerCapabilities class.");
|
791 humberto 1.49
792 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, parms);
|
793 kumpf 1.46 }
794
795 if (instanceObject.findProperty(_PROPERTY_INDICATIONDESTINATIONS) ==
796 PEG_NOT_FOUND)
797 {
|
798 humberto 1.49 //L10N_ TODO DONE
799 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
800 //"Missing Destinations which is required property in PG_ConsumerCapabilities class.");
801
802 MessageLoaderParms parms(
803 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_DESTINATIONS_TYPE_WHICH_IS_REQUIRED",
|
804 kumpf 1.46 "Missing Destinations which is required property in PG_ConsumerCapabilities class.");
|
805 humberto 1.49
806 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, parms);
|
807 kumpf 1.46 }
808 }
|
809 kumpf 1.10 else // PEGASUS_CLASSNAME_PROVIDER
|
810 kumpf 1.1 {
811 //
812 // Name and ProviderModuleName properties must be set
813 //
|
814 kumpf 1.27 if (instanceObject.findProperty(_PROPERTY_PROVIDER_NAME) == PEG_NOT_FOUND)
|
815 kumpf 1.1 {
|
816 humberto 1.53 //l10n 485
|
817 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
818 //"Missing Name which is required property in PG_Provider class.");
819 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
820 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_REQUIRED_PROPERTY",
|
821 humberto 1.53 "Missing Name which is required property in PG_Provider class."));
|
822 kumpf 1.1 }
823
|
824 kumpf 1.27 if (instanceObject.findProperty(_PROPERTY_PROVIDERMODULENAME) ==
825 PEG_NOT_FOUND)
|
826 kumpf 1.1 {
|
827 humberto 1.53 //l10n 485
|
828 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
829 //"Missing ProviderModuleName which is required property in PG_Provider class.");
830 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
|
831 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.MISSING_PROVIDERMODULENAME_IN_PG_PROVIDER",
832 "Missing ProviderModuleName which is required property in PG_Provider class."));
|
833 kumpf 1.1 }
834 }
835
836 // begin processing the request
837 handler.processing();
838
839 try
840 {
|
841 david.dillard 1.78 returnReference =
842 _providerRegistrationManager->createInstance(instanceReference, instance);
|
843 kumpf 1.1 }
|
844 david.dillard 1.78 catch(const CIMException&)
|
845 kumpf 1.1 {
|
846 david.dillard 1.78 throw;
|
847 kumpf 1.1 }
848
849 handler.deliver(returnReference);
850
851 // complete processing request
852 handler.complete();
853 }
854
855 // Unregister a provider
856 void ProviderRegistrationProvider::deleteInstance(
857 const OperationContext & context,
|
858 kumpf 1.13 const CIMObjectPath & instanceReference,
|
859 kumpf 1.33 ResponseHandler & handler)
|
860 kumpf 1.1 {
|
861 kumpf 1.15 // get userName and only privileged user can execute this operation
|
862 kumpf 1.19 String userName;
863 try
864 {
|
865 kumpf 1.37 IdentityContainer container = context.get(IdentityContainer::NAME);
|
866 kumpf 1.19 userName = container.getUserName();
867 }
868 catch (...)
869 {
870 userName = String::EMPTY;
871 }
|
872 kumpf 1.15
|
873 chip 1.24 if ((userName != String::EMPTY) && !System::isPrivilegedUser(userName))
|
874 kumpf 1.15 {
|
875 humberto 1.48 //l10n
876 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_ACCESS_DENIED,
877 //"You must have superuser privilege to unregister providers.");
878 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_ACCESS_DENIED,MessageLoaderParms(
879 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.SUPERUSER_PRIVILEGE_REQUIRED_UNREGISTER_PROVIDERS",
880 "You must have superuser privilege to unregister providers."));
|
881 kumpf 1.15 }
882
|
883 kumpf 1.36 if(!instanceReference.getNameSpace().equal (PEGASUS_NAMESPACENAME_INTEROP))
|
884 kumpf 1.10 {
|
885 kumpf 1.36 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
886 instanceReference.getNameSpace().getString());
|
887 kumpf 1.10 }
888
|
889 chuck 1.47
890 // l10n
891 // Get the client's list of preferred languages for the response
|
892 kumpf 1.83 AcceptLanguageList al;
|
893 chuck 1.47 try
894 {
895 AcceptLanguageListContainer al_container =
896 (AcceptLanguageListContainer)context.get(AcceptLanguageListContainer::NAME);
897 al = al_container.getLanguages();
898 }
899 catch (...)
900 {
|
901 kumpf 1.83 ; // Leave AcceptLanguageList empty
|
902 chuck 1.47 }
903
|
904 kumpf 1.36 CIMName className = instanceReference.getClassName();
|
905 kumpf 1.1
906 // ensure the class existing in the specified namespace
|
907 kumpf 1.36 if(!className.equal (PEGASUS_CLASSNAME_PROVIDER) &&
908 !className.equal (PEGASUS_CLASSNAME_PROVIDERCAPABILITIES) &&
|
909 kumpf 1.46 !className.equal (PEGASUS_CLASSNAME_CONSUMERCAPABILITIES) &&
|
910 kumpf 1.36 !className.equal (PEGASUS_CLASSNAME_PROVIDERMODULE))
|
911 kumpf 1.1 {
|
912 kumpf 1.36 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
913 className.getString());
|
914 kumpf 1.1 }
915
916 // begin processing the request
917 handler.processing();
918
|
919 kumpf 1.43 String moduleName;
920 Boolean moduleFound = false;
921 Array<CIMKeyBinding> keys = instanceReference.getKeyBindings();
922
923 //
924 // disable provider before delete provider
925 // registration if the class is PG_Provider
926 //
927 if (className.equal (PEGASUS_CLASSNAME_PROVIDER))
928 {
929 // get module name from reference
930
931 for(Uint32 i=0; i<keys.size() ; i++)
932 {
933 if(keys[i].getName().equal (_PROPERTY_PROVIDERMODULENAME))
934 {
935 moduleName = keys[i].getValue();
936 moduleFound = true;
937 }
938 }
939
940 kumpf 1.43 // if _PROPERTY_PROVIDERMODULENAME key not found
941 if( !moduleFound)
942 {
|
943 humberto 1.53 //l10n 485
|
944 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
945 //"key ProviderModuleName was not found");
946 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED,MessageLoaderParms(
|
947 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.PROVIDERMODULENAME_KEY_NOT_FOUND",
948 "key ProviderModuleName was not found"));
|
949 kumpf 1.43 }
950
951 //
952 // disable the provider
953 //
954 try
955 {
|
956 kumpf 1.51 Sint16 ret_value = _disableModule(instanceReference, moduleName, true, al);
957
|
958 kumpf 1.43 //
959 // if the provider disable failed
960 //
|
961 chuck 1.47 // l10n
|
962 kumpf 1.51 if (ret_value == -1)
|
963 kumpf 1.43 {
|
964 humberto 1.48 //l10n
965 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
966 //"disable the provider failed.");
967 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
968 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.DISABLE_PROVIDER_FAILED",
969 "disable the provider failed."));
|
970 kumpf 1.43 }
|
971 kumpf 1.51 //
972 // The provider disable failed since there are pending requests
973 //
974 if (ret_value == -2)
975 {
976 //L10N TODO
|
977 humberto 1.52 // throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
978 //"disable the provider failed: Provider is busy.");
979 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
980 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.DISABLE_PROVIDER_FAILED_PROVIDER_BUSY",
981 "disable the provider failed: Provider is busy."));
|
982 kumpf 1.51 }
|
983 kumpf 1.43 }
984 catch(CIMException&)
985 {
986 throw;
987 }
988 }
989
990 //
991 // disable provider module before remove provider registration
992 // if the class is PG_ProviderModule
993 //
994
995 if (className.equal (PEGASUS_CLASSNAME_PROVIDERMODULE))
996 {
997 // get module name from reference
998
999 for(Uint32 i=0; i<keys.size() ; i++)
1000 {
1001 if(keys[i].getName().equal (_PROPERTY_PROVIDERMODULE_NAME))
1002 {
1003 moduleName = keys[i].getValue();
1004 kumpf 1.43 moduleFound = true;
1005 }
1006 }
1007
1008 // if _PROPERTY_PROVIDERMODULE_NAME key not found
1009 if( !moduleFound)
1010 {
|
1011 humberto 1.53 //l10n 485
|
1012 humberto 1.48 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
1013 //"key Name was not found");
1014 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED,MessageLoaderParms(
|
1015 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.NAME_KEY_NOT_FOUND",
1016 "key Name was not found"));
|
1017 kumpf 1.43 }
1018
1019 //
1020 // disable the provider module
1021 //
1022 try
1023 {
|
1024 kumpf 1.51 Sint16 ret_value = _disableModule(instanceReference, moduleName, false, al);
1025
|
1026 kumpf 1.43 //
1027 // if the provider module disable failed
1028 //
|
1029 chuck 1.47 // l10n
|
1030 kumpf 1.51 if (ret_value == -1)
|
1031 kumpf 1.43 {
|
1032 humberto 1.48 //l10n
1033 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
1034 //"disable the provider module failed.");
1035 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
1036 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.DISABLE_PROVIDER_MODULE_FAILED",
1037 "disable the provider module failed."));
|
1038 kumpf 1.43 }
|
1039 kumpf 1.51
1040 //
1041 // The provider module disable failed since there are pending requests
1042 //
1043 if (ret_value == -2)
1044 {
1045 //L10N TODO
|
1046 humberto 1.52 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
1047 // "disable the provider module failed: Provider is busy.");
1048 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,MessageLoaderParms(
1049 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.DISABLE_PROVIDER_MODULE_FAILED_PROVIDER_BUSY",
1050 "disable the provider module failed: Provider is busy."));
|
1051 kumpf 1.51 }
|
1052 david.dillard 1.78 }
1053 catch(const CIMException&)
1054 {
1055 throw;
1056 }
|
1057 kumpf 1.43 }
1058
|
1059 kumpf 1.1 try
1060 {
|
1061 david.dillard 1.78 _providerRegistrationManager->deleteInstance(instanceReference);
|
1062 kumpf 1.1 }
|
1063 david.dillard 1.78 catch(const CIMException&)
|
1064 kumpf 1.1 {
|
1065 david.dillard 1.78 throw;
|
1066 kumpf 1.1 }
1067
1068 // complete processing the request
1069 handler.complete();
1070 }
1071
1072 // Block a provider, unblock a provider, and stop a provider
1073 void ProviderRegistrationProvider::invokeMethod(
1074 const OperationContext & context,
|
1075 kumpf 1.13 const CIMObjectPath & objectReference,
|
1076 kumpf 1.28 const CIMName & methodName,
|
1077 kumpf 1.1 const Array<CIMParamValue> & inParameters,
|
1078 kumpf 1.33 MethodResultResponseHandler & handler)
|
1079 kumpf 1.1 {
|
1080 kumpf 1.15 // get userName and only privileged user can execute this operation
|
1081 kumpf 1.19 String userName;
1082 try
1083 {
|
1084 kumpf 1.37 IdentityContainer container = context.get(IdentityContainer::NAME);
|
1085 kumpf 1.19 userName = container.getUserName();
1086 }
1087 catch (...)
1088 {
1089 userName = String::EMPTY;
1090 }
|
1091 kumpf 1.15
|
1092 chip 1.24 if ((userName != String::EMPTY) && !System::isPrivilegedUser(userName))
|
1093 mday 1.17 {
|
1094 humberto 1.48 //l10n
1095 //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_ACCESS_DENIED,
1096 //"You must have superuser privilege to disable or enable providers.");
1097 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_ACCESS_DENIED,MessageLoaderParms(
1098 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.SUPERUSER_PRIVILEGE_REQUIRED_DISABLE_ENABLE_PROVIDERS",
1099 "You must have superuser privilege to disable or enable providers."));
|
1100 mday 1.17 }
|
1101 kumpf 1.15
|
1102 kumpf 1.36 if(!objectReference.getNameSpace().equal (PEGASUS_NAMESPACENAME_INTEROP))
|
1103 kumpf 1.10 {
|
1104 kumpf 1.36 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
1105 objectReference.getNameSpace().getString());
|
1106 kumpf 1.10 }
1107
|
1108 chuck 1.47
1109 // l10n
1110 // Get the client's list of preferred languages for the response
|
1111 kumpf 1.83 AcceptLanguageList al;
|
1112 chuck 1.47 try
1113 {
1114 AcceptLanguageListContainer al_container =
1115 (AcceptLanguageListContainer)context.get(AcceptLanguageListContainer::NAME);
1116 al = al_container.getLanguages();
1117 }
1118 catch (...)
1119 {
|
1120 kumpf 1.83 ; // Leave AcceptLanguageList empty
|
1121 chuck 1.47 }
1122
|
1123 kumpf 1.5 String moduleName;
1124 Boolean moduleFound = false;
|
1125 kumpf 1.3
|
1126 kumpf 1.5 // get module name from reference
|
1127 kumpf 1.35 Array<CIMKeyBinding> keys = objectReference.getKeyBindings();
|
1128 kumpf 1.1
|
1129 kumpf 1.5 for(Uint32 i=0; i<keys.size() ; i++)
|
1130 kumpf 1.1 {
|
1131 kumpf 1.36 if(keys[i].getName().equal (_PROPERTY_PROVIDERMODULE_NAME))
|
1132 kumpf 1.1 {
|
1133 kumpf 1.5 moduleName = keys[i].getValue();
1134 moduleFound = true;
|
1135 kumpf 1.1 }
1136 }
1137
|
1138 kumpf 1.5 // if _PROPERTY_PROVIDERMODULE_NAME key not found
1139 if( !moduleFound)
|
1140 kumpf 1.1 {
|
1141 humberto 1.53 //l10n 485
|
1142 humberto 1.48 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED,MessageLoaderParms(
|
1143 humberto 1.53 "ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.NAME_KEY_NOT_FOUND",
1144 "key Name was not found"));
|
1145 kumpf 1.1 }
1146
|
1147 kumpf 1.5 handler.processing();
1148
1149 Sint16 ret_value;
|
1150 kumpf 1.1
|
1151 kumpf 1.56 try
|
1152 kumpf 1.1 {
|
1153 kumpf 1.56 if(methodName.equal(_STOP_PROVIDER))
1154 {
1155 // disable module
|
1156 chuck 1.47 ret_value = _disableModule(objectReference, moduleName, false, al);
|
1157 kumpf 1.8 }
|
1158 kumpf 1.56 else if(methodName.equal(_START_PROVIDER))
|
1159 kumpf 1.43 {
|
1160 kumpf 1.56 // enable module
1161 ret_value = _enableModule(objectReference, moduleName, al);
|
1162 kumpf 1.1 }
|
1163 kumpf 1.56 else
|
1164 david.dillard 1.78 {
1165 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_METHOD_NOT_AVAILABLE, String::EMPTY);
1166 }
|
1167 kumpf 1.1 }
|
1168 david.dillard 1.78 catch(const CIMException&)
|
1169 kumpf 1.1 {
|
1170 david.dillard 1.78 throw;
|
1171 kumpf 1.1 }
|
1172 kumpf 1.56
1173 CIMValue retValue(ret_value);
1174 handler.deliver(retValue);
1175 handler.complete();
|
1176 kumpf 1.5 }
1177
1178 // get provider manager service
1179 MessageQueueService * ProviderRegistrationProvider::_getProviderManagerService()
1180 {
1181 MessageQueue * queue = MessageQueue::lookup(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP);
1182 MessageQueueService * _service = dynamic_cast<MessageQueueService *>(queue);
1183
|
1184 chip 1.24 return(_service);
|
1185 kumpf 1.5 }
1186
1187 ProviderRegistrationProvider & ProviderRegistrationProvider::operator=(const ProviderRegistrationProvider & handle)
1188 {
1189 if(this == &handle)
1190 {
1191 return(*this);
1192 }
1193
1194 return(*this);
1195 }
|
1196 kumpf 1.1
|
1197 kumpf 1.5 Array<Uint16> ProviderRegistrationProvider::_sendDisableMessageToProviderManager(
1198 CIMDisableModuleRequestMessage * disable_req)
1199 {
1200 MessageQueueService * _service = _getProviderManagerService();
1201 Uint32 _queueId = _service->getQueueId();
1202
1203 // create request envelope
1204 AsyncLegacyOperationStart * asyncRequest =
1205 new AsyncLegacyOperationStart (
1206 _service->get_next_xid(),
1207 NULL,
1208 _queueId,
1209 disable_req,
1210 _queueId);
1211
|
1212 kumpf 1.8 AsyncReply * asyncReply = _controller->ClientSendWait(*_client_handle,
1213 _queueId,
1214 asyncRequest);
|
1215 kumpf 1.10 CIMDisableModuleResponseMessage * response =
1216 reinterpret_cast<CIMDisableModuleResponseMessage *>(
|
1217 kumpf 1.70 (dynamic_cast<AsyncLegacyOperationResult *>(asyncReply))->get_result());
|
1218 kumpf 1.8 if (response->cimException.getCode() != CIM_ERR_SUCCESS)
1219 {
|
1220 david.dillard 1.78 CIMException e = response->cimException;
|
1221 kumpf 1.8 delete asyncRequest;
1222 delete asyncReply;
1223 delete response;
|
1224 david.dillard 1.78 throw e;
|
1225 kumpf 1.8 }
|
1226 kumpf 1.5
|
1227 chip 1.24 Array<Uint16> operationalStatus = response->operationalStatus;
|
1228 kumpf 1.8
1229 delete asyncRequest;
1230 delete asyncReply;
1231 delete response;
|
1232 mday 1.16
|
1233 kumpf 1.5 return(operationalStatus);
1234 }
1235
1236 Array<Uint16> ProviderRegistrationProvider::_sendEnableMessageToProviderManager(
1237 CIMEnableModuleRequestMessage * enable_req)
1238 {
1239 MessageQueueService * _service = _getProviderManagerService();
1240 Uint32 _queueId = _service->getQueueId();
1241
1242 // create request envelope
1243 AsyncLegacyOperationStart * asyncRequest =
1244 new AsyncLegacyOperationStart (
1245 _service->get_next_xid(),
1246 NULL,
1247 _queueId,
1248 enable_req,
1249 _queueId);
1250
|
1251 kumpf 1.8 AsyncReply * asyncReply = _controller->ClientSendWait(*_client_handle,
1252 _queueId,
1253 asyncRequest);
1254 CIMEnableModuleResponseMessage * response =
1255 reinterpret_cast<CIMEnableModuleResponseMessage *>(
|
1256 kumpf 1.70 (dynamic_cast<AsyncLegacyOperationResult *>(asyncReply))->get_result());
|
1257 kumpf 1.8 if (response->cimException.getCode() != CIM_ERR_SUCCESS)
1258 {
1259 CIMException e = response->cimException;
1260 delete asyncRequest;
1261 delete asyncReply;
1262 delete response;
1263 throw (e);
1264 }
1265
|
1266 chip 1.24 Array<Uint16> operationalStatus = response->operationalStatus;
|
1267 kumpf 1.8
1268 delete asyncRequest;
1269 delete asyncReply;
1270 delete response;
|
1271 mday 1.16
|
1272 kumpf 1.5 return(operationalStatus);
|
1273 kumpf 1.6 }
1274
1275 // send termination message to subscription service
1276 void ProviderRegistrationProvider::_sendTerminationMessageToSubscription(
|
1277 kumpf 1.43 const CIMObjectPath & ref, const String & moduleName,
|
1278 chuck 1.47 const Boolean disableProviderOnly,
|
1279 kumpf 1.83 const AcceptLanguageList & al)
|
1280 kumpf 1.6 {
1281 CIMInstance instance;
1282 String _moduleName;
1283 Array<CIMInstance> instances;
1284
|
1285 kumpf 1.43 if (!disableProviderOnly)
1286 {
1287 CIMObjectPath reference("", PEGASUS_NAMESPACENAME_INTEROP,
1288 PEGASUS_CLASSNAME_PROVIDER, ref.getKeyBindings());
|
1289 chip 1.24
|
1290 kumpf 1.43 Array<CIMObjectPath> instanceNames =
1291 _providerRegistrationManager->enumerateInstanceNames(reference);
|
1292 kumpf 1.6
|
1293 kumpf 1.43 // find all the instances which have same module name as moduleName
1294 for (Uint32 i = 0, n=instanceNames.size(); i < n; i++)
1295 {
|
1296 kumpf 1.42 //
1297 // get provider module name from reference
1298 //
1299
1300 Array<CIMKeyBinding> keys = instanceNames[i].getKeyBindings();
1301
1302 for(Uint32 j=0; j < keys.size(); j++)
1303 {
1304 if(keys[j].getName().equal (_PROPERTY_PROVIDERMODULENAME))
1305 {
1306 _moduleName = keys[j].getValue();
1307 }
1308 }
|
1309 kumpf 1.6
|
1310 kumpf 1.43 if (String::equalNoCase(moduleName, _moduleName))
1311 {
1312 reference.setKeyBindings(keys);
1313 instance = _providerRegistrationManager->getInstance(reference);
|
1314 kumpf 1.55 //
1315 // if the provider is indication provider
1316 //
|
1317 kumpf 1.70 if (_isIndicationProvider(moduleName, instance))
|
1318 kumpf 1.55 {
1319 instances.append(instance);
1320 }
|
1321 kumpf 1.43 }
1322 }
1323 }
1324 else
1325 {
|
1326 kumpf 1.55 instance = _providerRegistrationManager->getInstance(ref);
1327
1328 //
1329 // if the provider is indication provider
1330 //
|
1331 kumpf 1.70 if (_isIndicationProvider(moduleName, instance))
|
1332 kumpf 1.55 {
|
1333 kumpf 1.6 instances.append(instance);
|
1334 kumpf 1.55 }
|
1335 kumpf 1.6 }
1336
1337 //
1338 // get indication server queueId
1339 //
1340 MessageQueueService * _service = _getIndicationService();
1341
|
1342 kumpf 1.15 if (_service != NULL)
1343 {
1344 Uint32 _queueId = _service->getQueueId();
|
1345 kumpf 1.6
|
1346 kumpf 1.15 CIMNotifyProviderTerminationRequestMessage * termination_req =
1347 new CIMNotifyProviderTerminationRequestMessage(
1348 XmlWriter::getNextMessageId (),
1349 instances,
1350 QueueIdStack(_service->getQueueId()));
1351
|
1352 chuck 1.47 // l10n
|
1353 se.gupta 1.69 termination_req->operationContext.set(AcceptLanguageListContainer(al));
|
1354 chuck 1.47
|
1355 kumpf 1.15 // create request envelope
|
1356 kumpf 1.71 AsyncLegacyOperationStart asyncRequest
1357 (_service->get_next_xid(),
1358 NULL,
1359 _queueId,
1360 termination_req,
1361 _queueId);
|
1362 kumpf 1.6
|
1363 kumpf 1.71 AutoPtr <AsyncReply> asyncReply
1364 (_controller->ClientSendWait (* _client_handle, _queueId,
1365 &asyncRequest));
1366
1367 AutoPtr <CIMNotifyProviderTerminationResponseMessage> response
1368 (reinterpret_cast <CIMNotifyProviderTerminationResponseMessage *>
1369 ((dynamic_cast <AsyncLegacyOperationResult *>
1370 (asyncReply.get ()))->get_result ()));
1371
1372 if (response->cimException.getCode () != CIM_ERR_SUCCESS)
|
1373 kumpf 1.15 {
|
1374 kumpf 1.71 CIMException e = response->cimException;
|
1375 david.dillard 1.78 throw e;
|
1376 kumpf 1.15 }
|
1377 kumpf 1.6 }
1378 }
1379
1380 // get indication service
1381 MessageQueueService * ProviderRegistrationProvider::_getIndicationService()
1382 {
1383 MessageQueue * queue = MessageQueue::lookup(
1384 PEGASUS_QUEUENAME_INDICATIONSERVICE);
1385
1386 MessageQueueService * _service =
1387 dynamic_cast<MessageQueueService *>(queue);
1388 return(_service);
|
1389 kumpf 1.43 }
1390
1391 // disable provider module, return 0 if module is disabled successfully,
|
1392 kumpf 1.51 // return 1 if module is already disabled, return -2 if module can not be
1393 // disabled since there are pending requests, otherwise, return -1
|
1394 kumpf 1.43 Sint16 ProviderRegistrationProvider::_disableModule(
1395 const CIMObjectPath & objectReference,
1396 const String & moduleName,
|
1397 chuck 1.47 Boolean disableProviderOnly,
|
1398 kumpf 1.83 const AcceptLanguageList & al)
|
1399 kumpf 1.43 {
1400 //
1401 // get module status
1402 //
1403 Array<Uint16> _OperationalStatus =
1404 _providerRegistrationManager->getProviderModuleStatus( moduleName);
1405
1406 for (Uint32 i = 0; i<_OperationalStatus.size(); i++)
1407 {
1408 // retValue equals 1 if module is already disabled
|
1409 kumpf 1.68 if (_OperationalStatus[i] == CIM_MSE_OPSTATUS_VALUE_STOPPED ||
1410 _OperationalStatus[i] == CIM_MSE_OPSTATUS_VALUE_STOPPING)
|
1411 kumpf 1.43 {
1412 return (1);
1413 }
1414 }
1415
1416 CIMInstance instance;
1417 Array<CIMInstance> instances;
1418 CIMInstance mInstance;
1419 String _moduleName;
1420 Uint16 providers;
1421 CIMObjectPath providerRef;
|
1422 kumpf 1.55 Boolean indProvider = false;
1423 Array<Boolean> indicationProviders;
|
1424 kumpf 1.43
1425 // disable a provider module or delete a provider module
1426 if (!disableProviderOnly)
1427 {
1428 providerRef = CIMObjectPath(objectReference.getHost(),
1429 objectReference.getNameSpace(),
1430 PEGASUS_CLASSNAME_PROVIDER,
1431 objectReference.getKeyBindings());
1432
1433 // get module instance
1434 mInstance =
1435 _providerRegistrationManager->getInstance(objectReference);
1436
1437 }
1438 else // disable a provider
1439 {
1440 // get module instance
1441 Array <CIMKeyBinding> moduleKeyBindings;
1442 moduleKeyBindings.append (CIMKeyBinding
1443 (_PROPERTY_PROVIDERMODULE_NAME, moduleName,
1444 CIMKeyBinding::STRING));
1445 kumpf 1.43
1446 CIMObjectPath moduleRef(objectReference.getHost(),
1447 objectReference.getNameSpace(),
1448 PEGASUS_CLASSNAME_PROVIDERMODULE,
1449 moduleKeyBindings);
1450
1451 mInstance =
1452 _providerRegistrationManager->getInstance(moduleRef);
1453 }
1454
1455 if (!disableProviderOnly)
1456 {
1457 // get all provider instances which have same module name as
1458 // moduleName
1459 Array<CIMObjectPath> instanceNames =
1460 _providerRegistrationManager->enumerateInstanceNames(providerRef);
1461
1462 for(Uint32 i = 0, n=instanceNames.size(); i < n; i++)
1463 {
1464 //
1465 // get provider module name from reference
1466 kumpf 1.43 //
1467
1468 Array<CIMKeyBinding> keys = instanceNames[i].getKeyBindings();
1469
1470 for(Uint32 j=0; j < keys.size(); j++)
1471 {
1472 if(keys[j].getName().equal (_PROPERTY_PROVIDERMODULENAME))
1473 {
1474 _moduleName = keys[j].getValue();
1475 }
1476 }
1477
1478 if (String::equalNoCase(_moduleName, moduleName))
1479 {
1480 providerRef.setKeyBindings(keys);
1481 instance = _providerRegistrationManager->getInstance
1482 (providerRef);
|
1483 kumpf 1.70 if (_isIndicationProvider(moduleName, instance))
|
1484 kumpf 1.55 {
1485 indProvider = true;
1486 indicationProviders.append(true);
1487 }
1488 else
1489 {
1490 indicationProviders.append(false);
1491 }
|
1492 kumpf 1.43 instances.append(instance);
1493 }
1494
1495 }
1496 }
1497 else
1498 {
|
1499 kumpf 1.55 instance = _providerRegistrationManager->getInstance(objectReference);
|
1500 kumpf 1.70 if (_isIndicationProvider(moduleName, instance))
|
1501 kumpf 1.55 {
1502 indProvider = true;
1503 indicationProviders.append(true);
1504 }
1505 else
1506 {
1507 indicationProviders.append(false);
1508 }
1509
1510 instances.append(instance);
|
1511 kumpf 1.43 }
1512
1513 //
1514 // get provider manager service
1515 //
1516 MessageQueueService * _service = _getProviderManagerService();
1517
1518 if (_service != NULL)
1519 {
1520 // create CIMDisableModuleRequestMessage
1521 CIMDisableModuleRequestMessage * disable_req =
1522 new CIMDisableModuleRequestMessage(
1523 XmlWriter::getNextMessageId (),
1524 mInstance,
1525 instances,
1526 disableProviderOnly,
|
1527 kumpf 1.55 indicationProviders,
|
1528 kumpf 1.43 QueueIdStack(_service->getQueueId()));
|
1529 chuck 1.47 // l10n
|
1530 se.gupta 1.66 disable_req->operationContext.set(AcceptLanguageListContainer(al));;
|
1531 kumpf 1.43
1532 Array<Uint16> _opStatus =
1533 _sendDisableMessageToProviderManager(disable_req);
1534
1535 if (!disableProviderOnly) // disable provider module
1536 {
1537 for (Uint32 i = 0; i<_opStatus.size(); i++)
1538 {
1539 // module was disabled successfully
|
1540 kumpf 1.68 if (_opStatus[i] == CIM_MSE_OPSTATUS_VALUE_STOPPED)
|
1541 kumpf 1.43 {
|
1542 kumpf 1.55 if (indProvider)
1543 {
1544 // send termination message to subscription service
1545 _sendTerminationMessageToSubscription(objectReference,
1546 moduleName, false, al);
1547 }
|
1548 kumpf 1.43 return (0);
1549 }
|
1550 kumpf 1.51
1551 // module is not disabled since there are pending
1552 // requests for the providers in the module
|
1553 kumpf 1.68 if (_opStatus[i] == CIM_MSE_OPSTATUS_VALUE_OK)
|
1554 kumpf 1.51 {
1555 return (-2);
1556 }
|
1557 kumpf 1.43 }
1558 }
1559 else // disable provider
1560 {
|
1561 kumpf 1.55 if (indProvider)
1562 {
1563 _sendTerminationMessageToSubscription(objectReference,
|
1564 chuck 1.47 moduleName, true, al);
|
1565 kumpf 1.55 }
|
1566 kumpf 1.43 return (0);
1567 }
1568 }
1569
1570 // disable failed
1571 return (-1);
|
1572 kumpf 1.55 }
1573
|
1574 kumpf 1.56 // enable provider module
1575 // return 0 if module is enabled successfully,
1576 // return 1 if module is already enabled,
1577 // return 2 if module can not be enabled since module is stopping,
1578 // otherwise, return -1
1579 Sint16 ProviderRegistrationProvider::_enableModule(
1580 const CIMObjectPath & moduleRef,
1581 const String & moduleName,
|
1582 kumpf 1.83 const AcceptLanguageList & al)
|
1583 kumpf 1.56 {
1584 //
1585 // get module status
1586 //
1587 Array<Uint16> _OperationalStatus =
1588 _providerRegistrationManager->getProviderModuleStatus( moduleName);
1589
1590 for (Uint32 i = 0; i<_OperationalStatus.size(); i++)
1591 {
1592 // retValue equals 1 if module is already enabled
|
1593 kumpf 1.68 if (_OperationalStatus[i] == CIM_MSE_OPSTATUS_VALUE_OK)
|
1594 kumpf 1.56 {
1595 return (1);
1596 }
1597
1598 // retValue equals 2 if module is stopping
1599 // at this stage, module can not be started
|
1600 kumpf 1.68 if (_OperationalStatus[i] == CIM_MSE_OPSTATUS_VALUE_STOPPING)
|
1601 kumpf 1.56 {
1602 return (2);
1603 }
1604 }
1605
1606 // get module instance
1607 CIMInstance mInstance =
1608 _providerRegistrationManager->getInstance(moduleRef);
1609
1610 //
1611 // get provider manager service
1612 //
1613 MessageQueueService * _service = _getProviderManagerService();
1614 Boolean enabled = false;
1615
|
1616 kumpf 1.65 if (_service != NULL)
|
1617 kumpf 1.56 {
1618 // create CIMEnableModuleRequestMessage
1619 CIMEnableModuleRequestMessage * enable_req =
1620 new CIMEnableModuleRequestMessage(
1621 XmlWriter::getNextMessageId (),
1622 mInstance,
1623 QueueIdStack(_service->getQueueId()));
1624 // l10n
|
1625 se.gupta 1.66 enable_req->operationContext.set(AcceptLanguageListContainer(al));;
1626
|
1627 kumpf 1.56 Array<Uint16> _opStatus;
1628 _opStatus = _sendEnableMessageToProviderManager(enable_req);
1629
1630 for (Uint32 i = 0; i<_opStatus.size(); i++)
1631 {
1632 // module is enabled successfully
|
1633 kumpf 1.68 if (_opStatus[i] == CIM_MSE_OPSTATUS_VALUE_OK)
|
1634 kumpf 1.56 {
1635 enabled = true;
1636 }
1637 }
1638 }
1639
1640 if (enabled)
1641 {
1642 //
|
1643 kumpf 1.59 // Since module is enabled, need get updated module instance
1644 //
|
1645 kumpf 1.65 CIMInstance updatedModuleInstance =
|
1646 kumpf 1.59 _providerRegistrationManager->getInstance(moduleRef);
1647
|
1648 kumpf 1.65 // module is enabled, initialize providers as necessary
1649 _providerRegistrationManager->initializeProviders(
1650 updatedModuleInstance);
1651
|
1652 kumpf 1.59 //
1653 // The module is enabled, need to send enable message to
|
1654 kumpf 1.56 // subscription service if the provider is an indication provider
1655 //
1656
1657 CIMObjectPath providerRef = CIMObjectPath(String::EMPTY,
1658 moduleRef.getNameSpace(),
1659 PEGASUS_CLASSNAME_PROVIDER,
1660 Array<CIMKeyBinding>());
1661
1662 //
1663 // get all provider instances which have same module name as
1664 // moduleName
1665 //
1666 Array<CIMObjectPath> instanceNames =
1667 _providerRegistrationManager->enumerateInstanceNames(providerRef);
1668 CIMInstance pInstance;
1669 String _moduleName;
1670 String _providerName;
1671 Array<CIMInstance> capInstances;
1672
1673 for(Uint32 i = 0, n=instanceNames.size(); i < n; i++)
1674 {
1675 kumpf 1.56
1676 Array<CIMKeyBinding> keys = instanceNames[i].getKeyBindings();
1677
1678 for(Uint32 j=0; j < keys.size(); j++)
1679 {
1680 //
1681 // get provider module name from reference
1682 //
1683 if(keys[j].getName().equal (_PROPERTY_PROVIDERMODULENAME))
1684 {
1685 _moduleName = keys[j].getValue();
1686 }
1687
1688 //
1689 // get provider name from reference
1690 //
1691 if(keys[j].getName().equal (_PROPERTY_PROVIDER_NAME))
1692 {
1693 _providerName = keys[j].getValue();
1694 }
1695 }
1696 kumpf 1.56
1697 if (String::equalNoCase(_moduleName, moduleName))
1698 {
1699 providerRef.setKeyBindings(keys);
1700 pInstance = _providerRegistrationManager->getInstance
1701 (providerRef);
1702 //
1703 // get all the indication capability instances which belongs
1704 // to this provider
1705 //
1706 capInstances = _getIndicationCapInstances(
1707 moduleName, pInstance, providerRef);
1708
1709 //
1710 // if there are indication capability instances
1711 //
|
1712 kumpf 1.71 if (capInstances.size() != 0)
|
1713 kumpf 1.56 {
|
1714 kumpf 1.65 _sendEnableMessageToSubscription(updatedModuleInstance,
|
1715 kumpf 1.56 pInstance,
1716 capInstances,
1717 al);
1718 }
1719 }
1720 }
1721 return (0);
1722 }
1723
1724
1725 // enable failed
1726 return (-1);
1727 }
1728
1729 // send enable message to indication service
1730 void ProviderRegistrationProvider::_sendEnableMessageToSubscription(
1731 const CIMInstance & mInstance,
1732 const CIMInstance & pInstance,
1733 const Array<CIMInstance> & capInstances,
|
1734 kumpf 1.83 const AcceptLanguageList & al)
|
1735 kumpf 1.56 {
1736 //
1737 // get indication server queueId
1738 //
1739 MessageQueueService * _service = _getIndicationService();
1740
1741 if (_service != NULL)
1742 {
1743 Uint32 _queueId = _service->getQueueId();
1744
1745 CIMNotifyProviderEnableRequestMessage * enable_req =
1746 new CIMNotifyProviderEnableRequestMessage (
1747 XmlWriter::getNextMessageId (),
1748 capInstances,
1749 QueueIdStack(_service->getQueueId()));
1750
|
1751 se.gupta 1.66 enable_req->operationContext.set(AcceptLanguageListContainer(al));
|
1752 se.gupta 1.67 enable_req->operationContext.insert(ProviderIdContainer(mInstance,pInstance));
|
1753 se.gupta 1.66
|
1754 kumpf 1.56 // create request envelope
1755 AsyncLegacyOperationStart * asyncRequest =
1756 new AsyncLegacyOperationStart (
1757 _service->get_next_xid(),
1758 NULL,
1759 _queueId,
1760 enable_req,
1761 _queueId);
1762
|
1763 kumpf 1.64 AsyncReply * asyncReply =
1764 _controller->ClientSendWait(*_client_handle,
1765 _queueId,
1766 asyncRequest);
|
1767 kumpf 1.56
|
1768 kumpf 1.64 CIMNotifyProviderEnableResponseMessage * response =
1769 reinterpret_cast<CIMNotifyProviderEnableResponseMessage *>(
|
1770 kumpf 1.70 (dynamic_cast<AsyncLegacyOperationResult *>(asyncReply))->get_result());
|
1771 kumpf 1.64
1772 if (response->cimException.getCode() != CIM_ERR_SUCCESS)
|
1773 david.dillard 1.78 {
1774 CIMException e = response->cimException;
1775 delete asyncRequest;
1776 delete asyncReply;
1777 delete response;
1778 throw e;
1779 }
|
1780 kumpf 1.64
1781 delete asyncRequest;
1782 delete asyncReply;
1783 delete response;
|
1784 kumpf 1.56 }
1785 }
1786
|
1787 kumpf 1.70 // If provider is an indication provider, return true,
|
1788 kumpf 1.55 // otherwise, return false
1789 Boolean ProviderRegistrationProvider::_isIndicationProvider(
1790 const String & moduleName,
|
1791 kumpf 1.70 const CIMInstance & instance)
|
1792 kumpf 1.55 {
1793 // get provider name
1794 String providerName;
|
1795 kumpf 1.70 Uint32 pos = instance.findProperty(_PROPERTY_PROVIDER_NAME);
|
1796 kumpf 1.55 if (pos != PEG_NOT_FOUND)
1797 {
1798 instance.getProperty(pos).getValue().get(providerName);
1799 }
1800
|
1801 kumpf 1.70 return (_providerRegistrationManager->isIndicationProvider(
1802 moduleName, providerName));
|
1803 kumpf 1.56 }
1804
1805 //
1806 // get all the capability instances whose provider type is indication
1807 //
1808 Array<CIMInstance> ProviderRegistrationProvider::_getIndicationCapInstances(
1809 const String & moduleName,
1810 const CIMInstance & instance,
1811 const CIMObjectPath & providerRef)
1812 {
1813 // get provider name
1814 String providerName;
1815 Uint32 pos = instance.findProperty(CIMName (_PROPERTY_PROVIDER_NAME));
1816 if (pos != PEG_NOT_FOUND)
1817 {
1818 instance.getProperty(pos).getValue().get(providerName);
1819 }
1820
1821 CIMObjectPath capabilityRef;
1822
1823 capabilityRef = CIMObjectPath(providerRef.getHost(),
1824 kumpf 1.56 providerRef.getNameSpace(),
1825 PEGASUS_CLASSNAME_CAPABILITIESREGISTRATION,
1826 providerRef.getKeyBindings());
1827
1828 // get all Capabilities instances
1829 Array<CIMObjectPath> instanceNames =
1830 _providerRegistrationManager->enumerateInstanceNames(capabilityRef);
1831
1832 String _moduleName, _providerName;
1833 CIMInstance capInstance;
1834 Array<Uint16> providerTypes;
1835 Array<CIMInstance> indCapInstances = 0;
1836 for(Uint32 i = 0, n=instanceNames.size(); i < n; i++)
1837 {
1838 Array<CIMKeyBinding> keys = instanceNames[i].getKeyBindings();
1839
1840 for(Uint32 j=0; j < keys.size(); j++)
1841 {
1842 if(keys[j].getName().equal (_PROPERTY_PROVIDERMODULENAME))
1843 {
1844 _moduleName = keys[j].getValue();
1845 kumpf 1.56 }
1846
1847 if(keys[j].getName().equal (_PROPERTY_PROVIDERNAME))
1848 {
1849 _providerName = keys[j].getValue();
1850 }
|
1851 kumpf 1.58 }
|
1852 kumpf 1.56
|
1853 kumpf 1.58 //
1854 // if capability instance has same module name as moduleName
1855 // and same provider name as providerName, get provider type
1856 //
1857 if(String::equal(_moduleName, moduleName) &&
1858 String::equal(_providerName, providerName))
1859 {
1860 capInstance = _providerRegistrationManager->getInstance
|
1861 kumpf 1.56 (instanceNames[i]);
1862
|
1863 kumpf 1.58 Uint32 pos = capInstance.findProperty(CIMName (_PROPERTY_PROVIDERTYPE));
1864 if (pos != PEG_NOT_FOUND)
1865 {
1866 capInstance.getProperty(pos).getValue().get(providerTypes);
|
1867 kumpf 1.56
|
1868 kumpf 1.58 for (Uint32 k=0; k < providerTypes.size(); k++)
1869 {
1870 //
1871 // if provider type of the instance is indication,
1872 // append the instance
1873 //
1874 if (providerTypes[k] == _INDICATION_PROVIDER)
1875 {
1876 indCapInstances.append(capInstance);
1877 }
1878 }
1879 }
1880 }
|
1881 kumpf 1.56 }
1882
1883 return (indCapInstances);
|
1884 kumpf 1.1 }
1885
1886 PEGASUS_NAMESPACE_END
|