Aktualizr
C++ SOTA Client
aktualizr.cc
1 #include "aktualizr.h"
2 
3 #include <chrono>
4 
5 #include "utilities/timer.h"
6 
7 #include <openssl/evp.h>
8 #include <openssl/rand.h>
9 #include <sodium.h>
10 
11 using std::make_shared;
12 using std::shared_ptr;
13 
14 Aktualizr::Aktualizr(Config &config) : config_(config) {
15  if (sodium_init() == -1) { // Note that sodium_init doesn't require a matching 'sodium_deinit'
16  throw std::runtime_error("Unable to initialize libsodium");
17  }
18 
19  LOG_TRACE << "Seeding random number generator from /dev/urandom...";
20  Timer timer;
21  unsigned int seed;
22  std::ifstream urandom("/dev/urandom", std::ios::in | std::ios::binary);
23  urandom.read(reinterpret_cast<char *>(&seed), sizeof(seed));
24  urandom.close();
25  std::srand(seed); // seeds pseudo random generator with random number
26  LOG_TRACE << "... seeding complete in " << timer;
27 
28  sig_ = make_shared<boost::signals2::signal<void(shared_ptr<event::BaseEvent>)>>();
29  storage_ = INvStorage::newStorage(config_.storage);
30  storage_->importData(config_.import);
31  uptane_client_ = SotaUptaneClient::newDefaultClient(config_, storage_, sig_);
32  uptane_client_->initialize();
33 }
34 
37  while (!shutdown_) {
38  FetchMetadata();
39  std::this_thread::sleep_for(std::chrono::seconds(config_.uptane.polling_sec));
40  }
41  return EXIT_SUCCESS;
42 }
43 
44 void Aktualizr::AddSecondary(const std::shared_ptr<Uptane::SecondaryInterface> &secondary) {
45  uptane_client_->addNewSecondary(secondary);
46 }
47 
48 void Aktualizr::Shutdown() { shutdown_ = true; }
49 
50 void Aktualizr::CampaignCheck() { uptane_client_->campaignCheck(); }
51 
52 void Aktualizr::CampaignAccept(const std::string &campaign_id) { uptane_client_->campaignAccept(campaign_id); }
53 
54 void Aktualizr::SendDeviceData() { uptane_client_->sendDeviceData(); }
55 
56 void Aktualizr::FetchMetadata() { uptane_client_->fetchMeta(); }
57 
58 void Aktualizr::CheckUpdates() { uptane_client_->checkUpdates(); }
59 
60 void Aktualizr::Download(const std::vector<Uptane::Target> &updates) { uptane_client_->downloadImages(updates); }
61 
62 void Aktualizr::Install(const std::vector<Uptane::Target> &updates) { uptane_client_->uptaneInstall(updates); }
63 
64 boost::signals2::connection Aktualizr::SetSignalHandler(std::function<void(shared_ptr<event::BaseEvent>)> &handler) {
65  return sig_->connect(handler);
66 }
void Install(const std::vector< Uptane::Target > &updates)
Asynchronously install targets.
Definition: aktualizr.cc:62
void CampaignAccept(const std::string &campaign_id)
Asynchronously accept a campaign for the current device Campaigns are a concept outside of Uptane...
Definition: aktualizr.cc:52
void Download(const std::vector< Uptane::Target > &updates)
Asynchronously download targets.
Definition: aktualizr.cc:60
Elapsed time measurement.
Definition: timer.h:10
void AddSecondary(const std::shared_ptr< Uptane::SecondaryInterface > &secondary)
Add new secondary to aktualizr.
Definition: aktualizr.cc:44
boost::signals2::connection SetSignalHandler(std::function< void(std::shared_ptr< event::BaseEvent >)> &handler)
Provide a function to receive event notifications.
Definition: aktualizr.cc:64
void CheckUpdates()
Asynchronously load already-fetched Uptane metadata from disk.
Definition: aktualizr.cc:58
void SendDeviceData()
Asynchronously send local device data to the server.
Definition: aktualizr.cc:54
int Run()
Launch aktualizr.
Definition: aktualizr.cc:35
void FetchMetadata()
Asynchronously fetch Uptane metadata.
Definition: aktualizr.cc:56
Configuration object for an aktualizr instance running on a primary ECU.
Definition: config.h:100
void Shutdown()
Asynchronously shutdown Aktualizr.
Definition: aktualizr.cc:48
Aktualizr(Config &config)
Aktualizr requires a configuration object.
Definition: aktualizr.cc:14
void CampaignCheck()
Asynchronously perform a check for campaigns.
Definition: aktualizr.cc:50