Aktualizr
C++ SOTA Client
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
check.cc
1 #include "check.h"
2 
3 #include <primary/aktualizr.h>
4 #include <random>
5 #include <string>
6 #include "utilities/utils.h"
7 
8 #include "context.h"
9 #include "executor.h"
10 #include "primary/events.h"
11 #include "primary/reportqueue.h"
12 #include "primary/sotauptaneclient.h"
13 #include "storage/invstorage.h"
14 #include "storage/sqlstorage.h"
15 #include "uptane/uptanerepository.h"
16 
17 namespace fs = boost::filesystem;
18 
19 class EphemeralStorage : public SQLStorage {
20  public:
21  EphemeralStorage(const StorageConfig &config, bool readonly) : SQLStorage(config, readonly) {}
22  void storeRoot(const std::string &data, Uptane::RepositoryType repo, Uptane::Version version) override {
23  (void)data;
24  (void)repo;
25  (void)version;
26  };
27  void storeNonRoot(const std::string &data, Uptane::RepositoryType repo, Uptane::Role role) override {
28  (void)data;
29  (void)repo;
30  (void)role;
31  };
32 
33  static std::shared_ptr<INvStorage> newStorage(const StorageConfig &config) {
34  return std::make_shared<EphemeralStorage>(config, false);
35  }
36 };
37 
39  Config config;
40 
41  std::unique_ptr<Aktualizr> aktualizr_ptr;
42 
43  public:
44  CheckForUpdate(Config config_) : config{config_}, aktualizr_ptr{std_::make_unique<Aktualizr>(config)} {
45  try {
46  aktualizr_ptr->Initialize();
47  } catch (...) {
48  LOG_ERROR << "Unable to initialize a device: " << config.storage.path;
49  }
50  }
51 
52  void operator()() {
53  LOG_DEBUG << "Updating a device in " << config.storage.path.native();
54  try {
55  aktualizr_ptr->CheckUpdates().get();
56  } catch (const Uptane::MissingRepo &e) {
57  LOG_DEBUG << e.what();
58  } catch (const std::exception &e) {
59  LOG_ERROR << "Unable to get new targets: " << e.what();
60  } catch (...) {
61  LOG_ERROR << "Unknown error occured while checking for updates";
62  }
63  }
64 };
65 
67  std::vector<Config> configs;
68 
69  std::mt19937 rng;
70 
71  std::uniform_int_distribution<size_t> gen;
72 
73  public:
74  CheckForUpdateTasks(const boost::filesystem::path baseDir)
75  : configs{loadDeviceConfigurations(baseDir)}, gen(0UL, configs.size() - 1) {
76  std::random_device seedGen;
77  rng.seed(seedGen());
78  }
79 
80  CheckForUpdate nextTask() {
81  auto srcConfig = configs[gen(rng)];
82  auto config{srcConfig};
83  config.storage.path = fs::temp_directory_path() / fs::unique_path();
84  LOG_DEBUG << "Copy device " << srcConfig.storage.path << " into " << config.storage.path;
85  fs::create_directory(config.storage.path);
86  fs::permissions(config.storage.path, fs::remove_perms | fs::group_write | fs::others_write);
87  fs::copy_file(srcConfig.storage.sqldb_path.get(srcConfig.storage.path),
88  config.storage.sqldb_path.get(config.storage.path));
89  return CheckForUpdate{config};
90  }
91 };
92 
93 void checkForUpdates(const boost::filesystem::path &baseDir, const unsigned int rate, const unsigned int nr,
94  const unsigned int parallelism) {
95  LOG_INFO << "Target rate: " << rate << "op/s, operations: " << nr << ", workers: " << parallelism;
96  std::vector<CheckForUpdateTasks> feeds(parallelism, CheckForUpdateTasks{baseDir});
97  std::unique_ptr<ExecutionController> execController;
98  if (nr == 0) {
99  execController = std_::make_unique<InterruptableExecutionController>();
100  } else {
101  execController = std_::make_unique<FixedExecutionController>(nr);
102  }
103  Executor<CheckForUpdateTasks> exec{feeds, rate, std::move(execController), "Check for updates"};
104  exec.run();
105 }
Executor
Definition: executor.h:98
Uptane::Version
Metadata version numbers.
Definition: tuf.h:116
EphemeralStorage
Definition: check.cc:19
StorageConfig
Definition: storage_config.h:15
Aktualizr::Initialize
void Initialize()
Initialize aktualizr.
Definition: aktualizr.cc:28
Aktualizr::CheckUpdates
std::future< result::UpdateCheck > CheckUpdates()
Fetch Uptane metadata and check for updates.
Definition: aktualizr.cc:144
data
General data structures.
Definition: types.cc:55
Config
Configuration object for an aktualizr instance running on a primary ECU.
Definition: config.h:74
events.h
Uptane::MissingRepo
Definition: exceptions.h:47
Uptane::RepositoryType
Definition: tuf.h:20
CheckForUpdate
Definition: check.cc:38
CheckForUpdateTasks
Definition: check.cc:66
Uptane::Role
TUF Roles.
Definition: tuf.h:57
SQLStorage
Definition: sqlstorage.h:18