3 #include <primary/aktualizr.h>
4 #include <boost/property_tree/ini_parser.hpp>
5 #include <boost/uuid/random_generator.hpp>
6 #include <boost/uuid/uuid_io.hpp>
8 #include "config/config.h"
11 #include "http/httpclient.h"
12 #include "logging/logging.h"
14 #include "primary/reportqueue.h"
15 #include "primary/sotauptaneclient.h"
16 #include "uptane/uptanerepository.h"
17 #include "utilities/utils.h"
19 using namespace boost::filesystem;
20 using ptree = boost::property_tree::ptree;
22 path mkDeviceBaseDir(
const boost::uuids::uuid &deviceId,
const path &dstDir) {
23 path deviceBaseDir{dstDir};
24 deviceBaseDir /= to_string(deviceId);
25 create_directory(deviceBaseDir);
26 permissions(deviceBaseDir, remove_perms | group_write | others_write);
30 path writeDeviceConfig(
const ptree &cfgTemplate,
const path &deviceBaseDir,
const boost::uuids::uuid &deviceId) {
31 ptree deviceCfg{cfgTemplate};
32 path cfgFilePath{deviceBaseDir};
33 cfgFilePath /=
"sota.toml";
34 deviceCfg.put_child(
"storage.path", ptree(
"\"" + deviceBaseDir.native() +
"\""));
35 deviceCfg.put_child(
"storage.type", ptree(
"\"sqlite\""));
36 deviceCfg.put_child(
"provision.primary_ecu_serial", ptree(
"\"" + to_string(deviceId) +
"\""));
37 boost::property_tree::ini_parser::write_ini(cfgFilePath.native(), deviceCfg);
43 std::unique_ptr<Aktualizr> aktualizr_ptr;
47 logger_set_threshold(boost::log::trivial::severity_level::trace);
56 }
catch (std::exception &err) {
57 LOG_ERROR <<
"Failed to register device " << config.storage.path <<
": " << err.what();
59 LOG_ERROR <<
"Failed to register device " << config.storage.path;
65 boost::uuids::basic_random_generator<boost::random::mt19937> gen;
67 const ptree &cfgTemplate;
72 : gen{}, dstDir{dstDir_}, cfgTemplate{ct}, logLevel{ll} {}
75 LOG_INFO <<
"Creating provision device task";
76 const boost::uuids::uuid deviceId = gen();
77 const path deviceBaseDir = mkDeviceBaseDir(deviceId, dstDir);
78 const path deviceCfgPath = writeDeviceConfig(cfgTemplate, deviceBaseDir, deviceId);
79 Config config = configure(deviceCfgPath, logLevel);
84 void mkDevices(
const path &dstDir,
const path &bootstrapCredentials,
const std::string &gw_uri,
85 const size_t parallelism,
const unsigned int nr,
const unsigned int rate) {
86 const int severity = loggerGetSeverity();
88 cfgTemplate.put_child(
"tls.server", ptree(
"\"https://" + gw_uri +
"\""));
89 cfgTemplate.put_child(
"provision.server", ptree(
"\"https://" + gw_uri +
"\""));
90 cfgTemplate.put_child(
"provision.provision_path", ptree(
"\"" + bootstrapCredentials.native() +
"\""));
92 cfgTemplate.put_child(
"pacman.type", ptree(
"\"none\""));
93 std::vector<ProvisionDeviceTaskStream> feeds;
94 for (
size_t i = 0; i < parallelism; i++) {
95 feeds.emplace_back(dstDir, cfgTemplate, severity);
97 std::unique_ptr<ExecutionController> execController = std_::make_unique<FixedExecutionController>(nr);