in source/fleetprovisioning/FleetProvisioning.cpp [490:559]
bool FleetProvisioning::ProvisionDevice(shared_ptr<SharedCrtResourceManager> fpConnection, PlainConfig &config)
{
LOG_INFO(TAG, "Fleet Provisioning Feature has been started.");
bool didSetup = FileUtils::CreateDirectoryWithPermissions(keyDir.c_str(), S_IRWXU) &&
FileUtils::CreateDirectoryWithPermissions(Config::DEFAULT_CONFIG_DIR, S_IRWXU);
if (!didSetup)
{
LOGM_ERROR(
TAG,
"*** %s: Failed to access/create directories required for storage of provisioned certificates, cannot "
"continue ***",
DeviceClient::DC_FATAL_ERROR);
return false;
}
IotIdentityClient identityClient(fpConnection.get()->getConnection());
templateName = config.fleetProvisioning.templateName.value().c_str();
if (!MapParameters(config.fleetProvisioning.templateParameters))
{
return false;
}
if (config.fleetProvisioning.csrFile.has_value() && !config.fleetProvisioning.csrFile->empty() &&
config.fleetProvisioning.deviceKey.has_value() && !config.fleetProvisioning.deviceKey->empty())
{
if (!GetCsrFileContent(config.fleetProvisioning.csrFile->c_str()) ||
!LocateDeviceKey(config.fleetProvisioning.deviceKey->c_str()) || !CreateCertificateUsingCSR(identityClient))
{
LOGM_ERROR(
TAG,
"*** %s: Fleet Provisioning Feature failed to generate a certificate from a certificate signing "
"request (CSR) ***",
DeviceClient::DC_FATAL_ERROR);
return false;
}
keyPath = config.fleetProvisioning.deviceKey->c_str();
}
else
{
if (!CreateCertificateAndKey(identityClient))
{
LOGM_ERROR(
TAG,
"*** %s: Fleet Provisioning Feature failed to create a new certificate and private key ***",
DeviceClient::DC_FATAL_ERROR);
return false;
}
}
if (RegisterThing(identityClient))
{
/*
* Store data in runtime conf file and update @config object.
*/
if (!ExportRuntimeConfig(
Config::DEFAULT_FLEET_PROVISIONING_RUNTIME_CONFIG_FILE,
certPath.c_str(),
keyPath.c_str(),
thingName.c_str(),
deviceConfig.c_str()))
{
return false;
}
LOGM_INFO(TAG, "Successfully provisioned thing: %s", thingName.c_str());
return true;
}
LOGM_ERROR(TAG, "*** %s: Fleet Provisioning Feature failed to provision device. ***", DeviceClient::DC_FATAL_ERROR);
return false;
}