Aktualizr
C++ SOTA Client
aktualizr.cc
1 #include "aktualizr.h"
2 
3 #include <chrono>
4 
5 #include <openssl/evp.h>
6 #include <openssl/rand.h>
7 #include <sodium.h>
8 
9 #include "utilities/timer.h"
10 
11 using std::make_shared;
12 using std::shared_ptr;
13 
14 Aktualizr::Aktualizr(Config &config) : config_(config) {
15  systemSetup();
16  sig_ = make_shared<boost::signals2::signal<void(shared_ptr<event::BaseEvent>)>>();
17  storage_ = INvStorage::newStorage(config_.storage);
18  storage_->importData(config_.import);
19  uptane_client_ = SotaUptaneClient::newDefaultClient(config_, storage_, sig_);
20 }
21 
22 Aktualizr::Aktualizr(Config &config, std::shared_ptr<INvStorage> storage_in,
23  std::shared_ptr<SotaUptaneClient> uptane_client_in, std::shared_ptr<event::Channel> sig_in)
24  : config_(config) {
25  systemSetup();
26  storage_ = std::move(storage_in);
27  uptane_client_ = std::move(uptane_client_in);
28  sig_ = std::move(sig_in);
29 }
30 
31 void Aktualizr::systemSetup() {
32  if (sodium_init() == -1) { // Note that sodium_init doesn't require a matching 'sodium_deinit'
33  throw std::runtime_error("Unable to initialize libsodium");
34  }
35 
36  LOG_TRACE << "Seeding random number generator from /dev/urandom...";
37  Timer timer;
38  unsigned int seed;
39  std::ifstream urandom("/dev/urandom", std::ios::in | std::ios::binary);
40  urandom.read(reinterpret_cast<char *>(&seed), sizeof(seed));
41  urandom.close();
42  std::srand(seed); // seeds pseudo random generator with random number
43  LOG_TRACE << "... seeding complete in " << timer;
44 }
45 
46 void Aktualizr::Initialize() { uptane_client_->initialize(); }
47 
49  RunningMode running_mode = config_.uptane.running_mode;
50  UpdateCheckResult update_result = CheckUpdates();
51  if (running_mode == RunningMode::kCheck || update_result.updates.size() == 0) {
52  return;
53  } else if (running_mode == RunningMode::kInstall) {
54  Install(update_result.updates);
55  uptane_client_->putManifest();
56  return;
57  }
58 
59  DownloadResult download_result = Download(update_result.updates);
60  if (running_mode == RunningMode::kDownload || download_result.status != DownloadStatus::kSuccess ||
61  download_result.updates.size() == 0) {
62  return;
63  }
64 
65  Install(download_result.updates);
66  uptane_client_->putManifest();
67 }
68 
71  while (!shutdown_) {
72  UptaneCycle();
73  std::this_thread::sleep_for(std::chrono::seconds(config_.uptane.polling_sec));
74  }
75  return EXIT_SUCCESS;
76 }
77 
78 void Aktualizr::AddSecondary(const std::shared_ptr<Uptane::SecondaryInterface> &secondary) {
79  uptane_client_->addNewSecondary(secondary);
80 }
81 
82 void Aktualizr::Shutdown() { shutdown_ = true; }
83 
84 CampaignCheckResult Aktualizr::CampaignCheck() { return uptane_client_->campaignCheck(); }
85 
86 void Aktualizr::CampaignAccept(const std::string &campaign_id) { uptane_client_->campaignAccept(campaign_id); }
87 
88 void Aktualizr::SendDeviceData() { uptane_client_->sendDeviceData(); }
89 
90 UpdateCheckResult Aktualizr::CheckUpdates() { return uptane_client_->fetchMeta(); }
91 
92 DownloadResult Aktualizr::Download(const std::vector<Uptane::Target> &updates) {
93  return uptane_client_->downloadImages(updates);
94 }
95 
96 InstallResult Aktualizr::Install(const std::vector<Uptane::Target> &updates) {
97  return uptane_client_->uptaneInstall(updates);
98 }
99 
100 PauseResult Aktualizr::Pause() { return uptane_client_->pause(); }
101 
102 PauseResult Aktualizr::Resume() { return uptane_client_->resume(); }
103 
104 boost::signals2::connection Aktualizr::SetSignalHandler(std::function<void(shared_ptr<event::BaseEvent>)> &handler) {
105  return sig_->connect(handler);
106 }
107 
108 std::unique_ptr<StorageTargetRHandle> Aktualizr::GetStoredTarget(const std::string &filename) {
109  try {
110  return storage_->openTargetFile(filename);
111  } catch (...) {
112  return std::unique_ptr<StorageTargetRHandle>();
113  }
114 }
void CampaignAccept(const std::string &campaign_id)
Accept a campaign for the current device.
Definition: aktualizr.cc:86
Elapsed time measurement.
Definition: timer.h:10
Download any available updates and then shut down.
void AddSecondary(const std::shared_ptr< Uptane::SecondaryInterface > &secondary)
Add new secondary to aktualizr.
Definition: aktualizr.cc:78
PauseResult
Result of an attempt to pause or resume a download.
Definition: results.h:55
boost::signals2::connection SetSignalHandler(std::function< void(std::shared_ptr< event::BaseEvent >)> &handler)
Provide a function to receive event notifications.
Definition: aktualizr.cc:104
void SendDeviceData()
Send local device data to the server.
Definition: aktualizr.cc:88
PauseResult Resume()
Resume a paused download.
Definition: aktualizr.cc:102
void UptaneCycle()
Synchronously run an uptane cycle.
Definition: aktualizr.cc:48
RunningMode
Execution mode to run aktualizr in.
Definition: types.h:63
Container for information about downloading an update.
Definition: results.h:87
Configuration object for an aktualizr instance running on a primary ECU.
Definition: config.h:97
void Shutdown()
Asynchronously shut aktualizr down if it is running indefinitely with the Full RunningMode.
Definition: aktualizr.cc:82
Container for information about available campaigns.
Definition: results.h:14
InstallResult Install(const std::vector< Uptane::Target > &updates)
Install targets.
Definition: aktualizr.cc:96
int RunForever()
Run aktualizr indefinitely until Shutdown is called.
Definition: aktualizr.cc:69
UpdateCheckResult CheckUpdates()
Fetch Uptane metadata and check for updates.
Definition: aktualizr.cc:90
Container for information about available updates.
Definition: results.h:35
Only check for updates.
Aktualizr(Config &config)
Aktualizr requires a configuration object.
Definition: aktualizr.cc:14
PauseResult Pause()
Pause a download current in progress.
Definition: aktualizr.cc:100
DownloadResult Download(const std::vector< Uptane::Target > &updates)
Download targets.
Definition: aktualizr.cc:92
CampaignCheckResult CampaignCheck()
Check for campaigns.
Definition: aktualizr.cc:84
Container for information about installing an update.
Definition: results.h:112
std::unique_ptr< StorageTargetRHandle > GetStoredTarget(const std::string &filename)
Get target downloaded in Download call.
Definition: aktualizr.cc:108
Install any available updates and then shut down.