/*
 * Execute an extrinsic method
 */
wbem::framework::UINT32 wbem::pmem_config::PersistentMemoryCapabilitiesFactory::executeMethod(
		wbem::framework::UINT32 &wbemRc,
		const std::string method,
		wbem::framework::ObjectPath &object,
		wbem::framework::attributes_t &inParms,
		wbem::framework::attributes_t &outParms)
{
	framework::UINT32 httpRc = framework::MOF_ERR_SUCCESS;
	wbemRc = framework::MOF_ERR_SUCCESS;
	struct pool *pPool = NULL;

	COMMON_LOG_ENTRY_PARAMS("methodName: %s, number of in params: %d", method.c_str(), (int)(inParms.size()));

	try
	{
		if (method == PMCAP_GETBLOCKSIZES)
		{
			// get the supported block sizes for this pool
			wbem::framework::UINT64_LIST blockSizes;
			pPool = getPool(object);
			// if pool is block capable, then retrieve supported block sizes, else empty
			if (pPool->type == POOL_TYPE_PERSISTENT)
			{
				// get system supported block sizes
				getSupportedBlockSizes(blockSizes);
			}
			// return in outParams
			outParms[PMCAP_BLOCKSIZES_PARAMNAME] = framework::Attribute(blockSizes, false);
		}
		else
		{
			httpRc = framework::CIM_ERR_METHOD_NOT_AVAILABLE;
		}
	}
	catch (framework::ExceptionBadParameter &)
	{
		wbemRc = PMCAP_ERR_INVALID_PARAMETER;
	}
	catch(exception::NvmExceptionLibError &e)
	{
		wbemRc = getReturnCodeFromLibException(e);
	}
	catch(framework::Exception &)
	{
		wbemRc = PMCAP_ERR_UNKNOWN;
	}
	if (pPool)
	{
		delete pPool;
	}

	COMMON_LOG_EXIT_RETURN("httpRc: %u, wbemRc: %u", httpRc, wbemRc);
	return httpRc;
}
/*
 * entry point for CIMOM to execute an extrinsic method
 */
wbem::framework::UINT32 wbem::software::NVDIMMSoftwareInstallationServiceFactory::executeMethod(
		wbem::framework::UINT32& wbemRc, const std::string method,
		wbem::framework::ObjectPath& object,
		wbem::framework::attributes_t& inParms,
		wbem::framework::attributes_t& outParms)
{
	LogEnterExit logging(__FUNCTION__, __FILE__, __LINE__);
	wbem::framework::UINT32 httpRc = framework::MOF_ERR_SUCCESS;
	wbemRc = framework::MOF_ERR_SUCCESS;
	// valid InstallOptions for InstallFromURI
	const NVM_UINT16 DEFER = 2; 
	const NVM_UINT16 FORCE = 3;
	const NVM_UINT16 REBOOT = 7;
	const NVM_UINT16 EXAMINE = 32768;

	if (method == NVDIMMSOFTWAREINSTALLATIONSERVICE_INSTALLFROMURI)
	{
		/*
		 * uint32 InstallFromURI(CIM_ConcreateJob REF Job, string URI,
		 * 		CIM_ManagedElement REF Target, uint16 InstallOptions[],
		 * 		string InstallOptionsValues[])
		 *
		 * Returns one of:
		 * 		0 		- Job Completed with No Error
		 * 		2 		- Unspecified Error
		 * 		4 		- Failed
		 * 		5 		- Invalid Parameter
		 * 		4097 	- Unsupported Target Type
		 * 		4099 	- Downgrade/reinstall not supported
		 * 		4100	- Not enough memory
		 * 		4107 	- URI not accessible
		 *
		 */

		std::string uri = inParms[NVDIMMSOFTWAREINSTALLATIONSERVICE_INSTALLFROMURI_PARAM_URI].stringValue();
		std::string target = inParms[NVDIMMSOFTWAREINSTALLATIONSERVICE_INSTALLFROMURI_PARAM_TARGET].stringValue();
		framework::UINT16_LIST installOptions = inParms[NVDIMMSOFTWAREINSTALLATIONSERVICE_INSTALLFROMURI_INSTALLOPTIONS].uint16ListValue();
		// get valid install options
		bool rebootOption =
				std::find(installOptions.begin(), installOptions.end(), REBOOT) != installOptions.end();
		bool deferOption =
				std::find(installOptions.begin(), installOptions.end(), DEFER) != installOptions.end();
		bool forceOption =
				std::find(installOptions.begin(), installOptions.end(), FORCE) != installOptions.end();
		bool examineOption =
				std::find(installOptions.begin(), installOptions.end(), EXAMINE) != installOptions.end();

		// count invalid install options
		int invalidOptions = 0;
		for (size_t i = 0; i < installOptions.size(); i++)
		{
			if (!(installOptions[i] == DEFER ||
					installOptions[i] == REBOOT ||
					installOptions[i] == FORCE ||
					installOptions[i] == EXAMINE))
			{
				invalidOptions++;
			}
		}
		try
		{
			COMMON_PATH absPath;
			if (uri.empty())
			{
				httpRc = framework::CIM_ERR_INVALID_PARAMETER;
				COMMON_LOG_ERROR("URI parameter was missing");
			}
			else if (target.empty())
			{
				httpRc = framework::CIM_ERR_INVALID_PARAMETER;
				COMMON_LOG_ERROR("Target parameter was missing");
			}
			else if (get_absolute_path(uri.c_str(), uri.length() + 1, absPath) != COMMON_SUCCESS)
			{
				httpRc = framework::CIM_ERR_INVALID_PARAMETER;
				COMMON_LOG_ERROR("URI parameter is not valid");
			}
			else if (invalidOptions > 0)
			{
				httpRc = framework::CIM_ERR_INVALID_PARAMETER;
				COMMON_LOG_ERROR_F("Only %d, %d, %d and/or %d are valid InstallOptions",
						DEFER, REBOOT, FORCE, EXAMINE);
			}
			else if (rebootOption && deferOption)
			{
				httpRc = framework::CIM_ERR_INVALID_PARAMETER;
				COMMON_LOG_ERROR_F("%d and %d cannot be used together as InstallOptions",
						DEFER, REBOOT);
			}
			else
			{
				framework::ObjectPathBuilder targetBuilder(target);
				framework::ObjectPath targetObject;
				targetBuilder.Build(&targetObject);

				if (targetObject.getClass() == NVDIMMCOLLECTION_CREATIONCLASSNAME)
				{
					// all devices on system
					if (examineOption)
					{
						std::string version;

						framework::return_codes rc = examineFwImage(absPath, version);
						if (rc == framework::REQUIRES_FORCE)
						{
							wbemRc = SWINSTALLSERVICE_ERR_DOWNGRADE_NOT_SUPPORTED;
						}
						else if (rc != framework::SUCCESS)
						{
							wbemRc = SWINSTALLSERVICE_ERR_NOT_APPLICABLE_TO_TARGET;
						}
					}
					else
					{
						installFromPath(absPath, rebootOption, forceOption);
					}
				}
				else if (targetObject.getClass() == physical_asset::NVDIMM_CREATIONCLASSNAME)
				{
					// single device
					if (examineOption)
					{
						std::string version;
						framework::return_codes rc = examineFwImage(
								targetObject.getKeyValue(TAG_KEY).stringValue(),
								absPath, version);
						if (rc == framework::REQUIRES_FORCE)
						{
							wbemRc = SWINSTALLSERVICE_ERR_DOWNGRADE_NOT_SUPPORTED;
						}
						else if (rc != framework::SUCCESS)
						{
							wbemRc = SWINSTALLSERVICE_ERR_NOT_APPLICABLE_TO_TARGET;
						}
					}
					else
					{
						installFromPath(targetObject.getKeyValue(TAG_KEY).stringValue(),
								absPath, rebootOption, forceOption);
					}
				}
				else
				{
					httpRc = framework::CIM_ERR_INVALID_PARAMETER;
				}
			}
		}
		catch (wbem::framework::ExceptionBadParameter &)
		{
			wbemRc = SWINSTALLSERVICE_ERR_INVALID_PARAMETER;
		}
		catch (wbem::exception::NvmExceptionLibError &e)
		{
			wbemRc = getReturnCodeFromLibException(e);
		}
		catch (wbem::framework::ExceptionNoMemory &)
		{
			wbemRc = SWINSTALLSERVICE_ERR_NOT_ENOUGH_MEMORY;
		}
		catch (wbem::framework::ExceptionNotSupported &)
		{
			wbemRc = SWINSTALLSERVICE_ERR_FAILED;
		}
		catch (wbem::framework::Exception &)
		{
			wbemRc = SWINSTALLSERVICE_ERR_FAILED;
		}
	}
	else
	{
		httpRc = framework::CIM_ERR_METHOD_NOT_AVAILABLE;
	}
	return httpRc;
}
Пример #3
0
wbem::framework::UINT32 wbem::erasure::ErasureServiceFactory::executeMethod(
		wbem::framework::UINT32 &wbemRc,
		const std::string method,
		wbem::framework::ObjectPath &object,
		wbem::framework::attributes_t &inParms,
		wbem::framework::attributes_t &outParms)
{
	LogEnterExit logging(__FUNCTION__, __FILE__, __LINE__);
	framework::UINT32 httpRc = framework::MOF_ERR_SUCCESS;
	wbemRc = framework::MOF_ERR_SUCCESS;

	if (method == ERASURESERVICE_ERASEDEVICE)
	{
		// uint32 EraseDevice(CIM_Job REF Job, CIM_ManagedElement REF Element,
		//						string ErasureMethod, string Password)

		// get parameters from inParms
		std::string elementObjectString = inParms[ERASURESERVICE_ERASEDEVICE_ELEMENT].stringValue();
		std::string erasureMethod = inParms[ERASURESERVICE_ERASEDEVICE_ERASUREMETHOD].stringValue();
		std::string password = inParms[ERASURESERVICE_ERASEDEVICE_PASSWORD].stringValue();

		enum eraseType eraseType = getEraseType(erasureMethod);

		if (elementObjectString.empty())
		{
			COMMON_LOG_ERROR_F("%s is required.", ERASURESERVICE_ERASEDEVICE_ELEMENT.c_str());
			httpRc = framework::CIM_ERR_INVALID_PARAMETER;
		}
		else if (erasureMethod.empty())
		{
			COMMON_LOG_ERROR_F("%s is required.", ERASURESERVICE_ERASEDEVICE_ERASUREMETHOD.c_str());
			httpRc = framework::CIM_ERR_INVALID_PARAMETER;
		}
		else if (eraseType == ERASETYPE_UNKNOWN)
		{
			COMMON_LOG_ERROR_F("Erasure Method %s is not supported", erasureMethod.c_str());
			httpRc = framework::CIM_ERR_INVALID_PARAMETER;
		}
		// Note: Password will get checked by eraseDevice
		else
		{
			// Build the object path from the attribute
			framework::ObjectPathBuilder builder(elementObjectString);
			framework::ObjectPath elementObject;
			builder.Build(&elementObject);

			try
			{
				if (elementObject.getClass() == physical_asset::NVDIMM_CREATIONCLASSNAME)
				{
					std::string deviceUidStr = elementObject.getKeyValue(TAG_KEY).stringValue();
					if (deviceUidStr.length() != NVM_MAX_UID_LEN - 1)
					{
						throw framework::ExceptionBadParameter("Tag");
					}
					NVM_UID deviceUid;
					uid_copy(deviceUidStr.c_str(), deviceUid);
					eraseDevice(deviceUidStr, password);
				}
				else if (elementObject.getClass() == software::NVDIMMCOLLECTION_CREATIONCLASSNAME)
				{
					eraseDevice(password);
				}
			}
			catch (wbem::exception::NvmExceptionLibError &e)
			{
				wbemRc = getReturnCodeFromLibException(e);
			}
			catch (wbem::framework::ExceptionBadParameter &)
			{
				httpRc = framework::CIM_ERR_INVALID_PARAMETER;
			}
		}
	}
	else if (method == ERASURESERVICE_ERASE)
	{
		// specific "Erase()" return code for "Not Supported"
		// don't use httpRc here because it's a valid method,
		// just not supported by our implementation
		wbemRc = ERASURESERVICE_ERR_NOT_SUPPORTED;
	}
	else
	{
		// all others are unsupported, including "Erase"
		httpRc = framework::CIM_ERR_METHOD_NOT_AVAILABLE;
	}

	return httpRc;
}