Aktualizr
C++ SOTA Client
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
provision.cc
1 #include "provision.h"
2 
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>
7 
8 #include "config/config.h"
9 #include "context.h"
10 #include "executor.h"
11 #include "http/httpclient.h"
12 #include "logging/logging.h"
13 #include "primary/events.h"
14 #include "primary/reportqueue.h"
15 #include "primary/sotauptaneclient.h"
16 #include "uptane/uptanerepository.h"
17 #include "utilities/utils.h"
18 
19 using namespace boost::filesystem;
20 using ptree = boost::property_tree::ptree;
21 
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);
27  return deviceBaseDir;
28 }
29 
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);
38  return cfgFilePath;
39 }
40 
42  Config config;
43  std::unique_ptr<Aktualizr> aktualizr_ptr;
44 
45  public:
46  explicit ProvisionDeviceTask(const Config cfg) : config{cfg}, aktualizr_ptr{std_::make_unique<Aktualizr>(config)} {
47  logger_set_threshold(boost::log::trivial::severity_level::trace);
48  }
49 
50  ProvisionDeviceTask(const ProvisionDeviceTask &) = delete;
52 
53  void operator()() {
54  try {
55  aktualizr_ptr->Initialize();
56  } catch (std::exception &err) {
57  LOG_ERROR << "Failed to register device " << config.storage.path << ": " << err.what();
58  } catch (...) {
59  LOG_ERROR << "Failed to register device " << config.storage.path;
60  }
61  }
62 };
63 
65  boost::uuids::basic_random_generator<boost::random::mt19937> gen;
66  const path &dstDir;
67  const ptree &cfgTemplate;
68  const int logLevel;
69 
70  public:
71  ProvisionDeviceTaskStream(const path &dstDir_, const ptree &ct, const int ll)
72  : gen{}, dstDir{dstDir_}, cfgTemplate{ct}, logLevel{ll} {}
73 
74  ProvisionDeviceTask nextTask() {
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);
80  return ProvisionDeviceTask{config};
81  }
82 };
83 
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();
87  ptree cfgTemplate{};
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() + "\""));
91  // cfgTemplate.put_child("pacman.sysroot", ptree("\"/sysroot\""));
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);
96  }
97  std::unique_ptr<ExecutionController> execController = std_::make_unique<FixedExecutionController>(nr);
98  Executor<ProvisionDeviceTaskStream> exec{feeds, rate, std::move(execController), "Provision"};
99  exec.run();
100 }
Executor
Definition: executor.h:98
Aktualizr::Initialize
void Initialize()
Initialize aktualizr.
Definition: aktualizr.cc:28
Config
Configuration object for an aktualizr instance running on a primary ECU.
Definition: config.h:74
events.h
ProvisionDeviceTask
Definition: provision.cc:41
ProvisionDeviceTaskStream
Definition: provision.cc:64